<?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>121361</bug_id>
          
          <creation_ts>2013-09-14 11:27:19 -0700</creation_ts>
          <short_desc>Add a not completely unrealistic DOM Benchmark</short_desc>
          <delta_ts>2024-02-24 15:23:43 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>ahmad.saleem792</cc>
    
    <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>kling</cc>
    
    <cc>koivisto</cc>
    
    <cc>mjs</cc>
    
    <cc>sam</cc>
    
    <cc>slewis</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>929262</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2013-09-14 11:27:19 -0700</bug_when>
    <thetext>I have done some researches but I couldn&apos;t find any benchmark that realistically test what real apps are doing.

As mentioned in https://blog.mozilla.org/nnethercote/2012/08/24/octane-minus-v8/
we shouldn&apos;t be testing what we think is a representative of a real app; we should test the real app.

Here, I propose to create a benchmark based on demo apps various JS frameworks have.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930512</commentid>
    <comment_count>1</comment_count>
      <attachid>211971</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2013-09-17 21:43:58 -0700</bug_when>
    <thetext>Created attachment 211971
First cut</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930515</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-09-17 21:58:48 -0700</bug_when>
    <thetext>I think we need a better name!

How about calling it DOMBench?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930521</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2013-09-17 22:44:33 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; I think we need a better name!

Yes!

&gt; How about calling it DOMBench?

That might be too generic?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930522</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-09-17 22:47:49 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; I think we need a better name!
&gt; 
&gt; Yes!
&gt; 
&gt; &gt; How about calling it DOMBench?
&gt; 
&gt; That might be too generic?

But doesn&apos;t it describe what this benchmark is meant to do?

If in the future we think it&apos;s not good enough, we can add things to it.

Ideally, a DOM benchmark ought to measure how real programs use the DOM, JS, and other parts of the engine.  This is what this benchmark aspires to do, and it feels like it does it better than other benchmarks.

So, to me, DOMBench feels like an accurate description.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930523</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-09-17 22:49:03 -0700</bug_when>
    <thetext>RS=me except for the name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930524</commentid>
    <comment_count>6</comment_count>
      <attachid>211971</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-09-17 22:49:41 -0700</bug_when>
    <thetext>Comment on attachment 211971
First cut

RS=me except for the name.  Land it after we have a better name.  I recommend DOMBench.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>930541</commentid>
    <comment_count>7</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-09-17 23:59:47 -0700</bug_when>
    <thetext>DOMBench sounds good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2016654</commentid>
    <comment_count>8</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2024-02-24 15:22:47 -0800</bug_when>
    <thetext>@rniwa - do we need this bug or Speedometer 3 takes care of it now? :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2016655</commentid>
    <comment_count>9</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2024-02-24 15:23:43 -0800</bug_when>
    <thetext>This is clearly fixed now.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>211971</attachid>
            <date>2013-09-17 21:43:58 -0700</date>
            <delta_ts>2013-09-17 22:49:41 -0700</delta_ts>
            <desc>First cut</desc>
            <filename>bug-121361-20130917214352.patch</filename>
            <type>text/plain</type>
            <size>2355201</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxNTYwMjIpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzOCBAQAorMjAxMy0wOS0xNyAg
Unlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KKworICAgICAgICBBZGQgYSBub3QgY29t
cGxldGVseSB1bnJlYWxpc3RpYyBET00gQmVuY2htYXJrCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjEzNjEKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgYSBET00gYmVuY2htYXJrIGJhc2VkIG9uIFRv
ZG9NVkMgZm9yIHZhbmlsbGEgSlMsIEVtYmVyLmpzLCBCYWNrYm9uZS5qcywgYW5kIGpRdWVyeS4K
KyAgICAgICAgV2UnbGwgYWRkIG1vcmUgZnJhbWV3b3JrcyBhbmQgZGVtbyBhcHBzIGFzIHdlIGdv
LgorCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2g6IEFkZGVkLgor
ICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL2JlbmNobWFyay5odG1s
OiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC9iZW5j
aG1hcmsuanM6IEFkZGVkLgorICAgICAgICAoU2ltcGxlUHJvbWlzZSk6IAorICAgICAgICAoU2lt
cGxlUHJvbWlzZS5wcm90b3R5cGUudGhlbik6CisgICAgICAgIChTaW1wbGVQcm9taXNlLnByb3Rv
dHlwZS5yZXNvbHZlLmVsc2UpOgorICAgICAgICAoU2ltcGxlUHJvbWlzZS5wcm90b3R5cGUucmVz
b2x2ZSk6CisgICAgICAgIChCZW5jaG1hcmtSdW5uZXIuc3VpdGUpOgorICAgICAgICAoQmVuY2ht
YXJrUnVubmVyLndhaXRGb3JFbGVtZW50LnJlc29sdmVJZlJlYWR5KToKKyAgICAgICAgKEJlbmNo
bWFya1J1bm5lci53YWl0Rm9yRWxlbWVudCk6CisgICAgICAgIChCZW5jaG1hcmtSdW5uZXIuX3Jl
bW92ZUZyYW1lKToKKyAgICAgICAgKEJlbmNobWFya1J1bm5lci5fYXBwZW5kRnJhbWUpOgorICAg
ICAgICAoQmVuY2htYXJrUnVubmVyLl93YWl0QW5kV2FybVVwLkZpYm9uYWNjaSk6CisgICAgICAg
IChCZW5jaG1hcmtSdW5uZXIuX3Rlc3ROYW1lKToKKyAgICAgICAgKEJlbmNobWFya1J1bm5lci5f
dGVzdEl0ZW1JZCk6CisgICAgICAgIChCZW5jaG1hcmtSdW5uZXIubGlzdFN1aXRlcy5idXR0b24u
b25jbGljayk6CisgICAgICAgIChCZW5jaG1hcmtSdW5uZXIubGlzdFN1aXRlcy5jYWxsTmV4dFN0
ZXApOgorICAgICAgICAoQmVuY2htYXJrUnVubmVyLmxpc3RTdWl0ZXMpOgorICAgICAgICAoQmVu
Y2htYXJrU3RhdGUpOgorICAgICAgICAoQmVuY2htYXJrU3RhdGUucHJvdG90eXBlLmN1cnJlbnRT
dWl0ZSk6CisgICAgICAgIChCZW5jaG1hcmtTdGF0ZS5wcm90b3R5cGUuY3VycmVudFRlc3QpOgor
ICAgICAgICAoQmVuY2htYXJrU3RhdGUucHJvdG90eXBlLm5leHQpOgorICAgICAgICAoQmVuY2ht
YXJrU3RhdGUucHJvdG90eXBlLmlzRmlyc3RUZXN0KToKKyAgICAgICAgKEJlbmNobWFya1N0YXRl
LnByb3RvdHlwZS5wcmVwYXJlQ3VycmVudFN1aXRlLmZyYW1lLm9ubG9hZCk6CisgICAgICAgIChC
ZW5jaG1hcmtSdW5uZXIuc3RlcCk6CisgICAgICAgIChCZW5jaG1hcmtSdW5uZXIuX3J1blRlc3RB
bmRSZWNvcmRSZXN1bHRzKToKKyAgICAgICAgKEJlbmNobWFya1J1bm5lci5fZmluYWxpemUpOgor
ICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmM6IEFkZGVk
LgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFs
aXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZTogQWRk
ZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXIuanNvbjogQWRkZWQuCisgICAgICAg
ICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50czogQWRkZWQuCisgICAgICAgICogTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy9iYWNrYm9uZTogQWRkZWQuCisgICAgICAgICog
Tm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy9iYWNrYm9uZS5sb2NhbFN0b3JhZ2U6IEFk
ZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBvbmVudHMvYmFja2JvbmUu
bG9jYWxTdG9yYWdlL2JhY2tib25lLmxvY2FsU3RvcmFnZS5qczogQWRkZWQuCisgICAgICAgICog
Tm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy9iYWNrYm9uZS9iYWNrYm9uZS5qczogQWRk
ZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy9qcXVlcnk6IEFk
ZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2px
dWVyeS5qczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50
cy90b2RvbXZjLWNvbW1vbjogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlz
dGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJf
Y29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzczogQWRkZWQuCisgICAgICAgICogTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzOiBBZGRl
ZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29t
bW9uL2JnLnBuZzogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9N
QmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9u
ZW50cy91bmRlcnNjb3JlOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0
aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlcl9j
b21wb25lbnRzL3VuZGVyc2NvcmUvdW5kZXJzY29yZS5qczogQWRkZWQuCisgICAgICAgICogTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvYmFja2JvbmUvaW5kZXguaHRtbDogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVu
cmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUv
anM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2pzL2FwcC5qczogQWRkZWQuCisg
ICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvanMvY29sbGVjdGlvbnM6IEFkZGVkLgorICAgICAgICAq
IE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2JhY2tib25lL2pzL2NvbGxlY3Rpb25zL3RvZG9zLmpzOiBBZGRlZC4KKyAgICAgICAg
KiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9iYWNrYm9uZS9qcy9tb2RlbHM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2ti
b25lL2pzL21vZGVscy90b2RvLmpzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5y
ZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9q
cy9yb3V0ZXJzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01C
ZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9qcy9yb3V0ZXJzL3Jv
dXRlci5qczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvanMvdmlld3M6IEFkZGVk
LgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2pzL3ZpZXdzL2FwcC12aWV3LmpzOiBBZGRlZC4K
KyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9qcy92aWV3cy90b2RvLXZpZXcuanM6IEFkZGVkLgor
ICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL3JlYWRtZS5tZDogQWRkZWQuCisgICAgICAgICogTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9N
QmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlci5qc29uOiBB
ZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHM6IEFkZGVkLgor
ICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlcjogQWRkZWQuCisg
ICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFn
ZS1hZGFwdGVyOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01C
ZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVu
dHMvZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIvbG9jYWxzdG9yYWdlX2FkYXB0ZXIuanM6IEFk
ZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci9lbWJl
ci5qczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hh
bmRsZWJhcnM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJl
bmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50
cy9oYW5kbGViYXJzL2hhbmRsZWJhcnMuanM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvYm93ZXJfY29tcG9uZW50cy9qcXVlcnk6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzOiBBZGRlZC4KKyAgICAgICAgKiBO
b3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb246IEFkZGVkLgorICAg
ICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNl
LmNzczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL3Rv
ZG9tdmMtY29tbW9uL2Jhc2UuanM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJl
YWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93
ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmc6IEFkZGVkLgorICAgICAgICAqIE5v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvaW5kZXguaHRtbDogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVu
cmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9q
czogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9hcHAuanM6IEFkZGVkLgorICAg
ICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnM6IEFkZGVkLgorICAgICAgICAqIE5v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb19jb250cm9sbGVyLmpzOiBBZGRlZC4KKyAg
ICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanM6
IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvbGliczogQWRkZWQuCisgICAgICAg
ICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9qcy9saWJzL2VtYmVyLWRhdGEuanM6IEFkZGVkLgorICAgICAgICAq
IE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2pzL21vZGVscy9zdG9yZS5qczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVh
bGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9t
b2RlbHMvdG9kby5qczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3czog
QWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3cy9lZGl0X3RvZG9fdmlldy5q
czogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQ6IEFkZGVkLgorICAg
ICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21w
bGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9q
cXVlcnk6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9ib3dlci5qc29uOiBBZGRlZC4K
KyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93ZXJfY29tcG9uZW50czogQWRkZWQuCisgICAgICAg
ICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFyczogQWRkZWQuCisgICAg
ICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJz
LmpzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93ZXJfY29tcG9uZW50cy9qcXVl
cnk6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9ib3dlcl9jb21wb25lbnRzL2pxdWVy
eS9qcXVlcnkuanM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RP
TUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9ib3dlcl9jb21wb25l
bnRzL3RvZG9tdmMtY29tbW9uOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFs
aXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93ZXJf
Y29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzczogQWRkZWQuCisgICAgICAgICogTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5qczogQWRkZWQu
CisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24v
YmcucG5nOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvY3NzOiBBZGRlZC4KKyAgICAg
ICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9qcXVlcnkvY3NzL2FwcC5jc3M6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBs
ZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2px
dWVyeS9pbmRleC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0
aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvanM6IEFkZGVk
LgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9qcy9hcHAuanM6IEFkZGVkLgorICAgICAgICAqIE5v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2pxdWVyeS9yZWFkbWUubWQ6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJl
YWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvbGljZW5zZS5tZDogQWRkZWQuCisgICAgICAgICogTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9yZWFkbWUubWQ6IEFkZGVkLgor
ICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxs
YS1leGFtcGxlczogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9N
QmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqczogQWRkZWQuCisgICAgICAg
ICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1w
bGVzL3ZhbmlsbGFqcy9ib3dlci5qc29uOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2Jv
d2VyX2NvbXBvbmVudHM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvYm93ZXJfY29tcG9u
ZW50cy90b2RvbXZjLWNvbW1vbjogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVh
bGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9ib3dlcl9j
b21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RD
b21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFu
aWxsYWpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5qczogQWRkZWQuCisg
ICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxh
LWV4YW1wbGVzL3ZhbmlsbGFqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2JnLnBu
ZzogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9pbmRleC5odG1sOiBBZGRlZC4KKyAgICAg
ICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhh
bXBsZXMvdmFuaWxsYWpzL2pzOiBBZGRlZC4KKyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFs
aXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pzL2FwcC5q
czogQWRkZWQuCisgICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9qcy9jb250cm9sbGVyLmpzOiBBZGRlZC4K
KyAgICAgICAgKiBOb3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3Zhbmls
bGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pzL2hlbHBlcnMuanM6IEFkZGVkLgorICAgICAgICAqIE5v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92
YW5pbGxhanMvanMvbW9kZWwuanM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJl
YWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvanMvc3Rv
cmUuanM6IEFkZGVkLgorICAgICAgICAqIE5vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvanMvdmlldy5qczogQWRkZWQuCisg
ICAgICAgICogTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxh
LWV4YW1wbGVzL3ZhbmlsbGFqcy9yZWFkbWUubWQ6IEFkZGVkLgorICAgICAgICAqIFNraXBwZWQ6
CisKIDIwMTMtMDktMDQgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KIAogICAgICAg
ICBJbnRyb2R1Y2UgYSB2ZXJzaW9uIG9mIFN1blNwaWRlciB0aGF0IHJ1bnMgZm9yIGEgcmVhbGx5
IGxvbmcgdGltZSAoYWJvdXQgMSBzZWMgb24gbXkgbWFjaGluZSkKSW5kZXg6IFBlcmZvcm1hbmNl
VGVzdHMvU2tpcHBlZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL1NraXBwZWQJKHJl
dmlzaW9uIDE1NjAyMikKKysrIFBlcmZvcm1hbmNlVGVzdHMvU2tpcHBlZAkod29ya2luZyBjb3B5
KQpAQCAtODQsMyArODQsNSBAQCBMYXlvdXQvUmVnaW9uc0ZpeGVkU2hvcnQuaHRtbAogIyBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEzODExI2MyCiBMYXlvdXQvTGlu
ZUxheW91dEphcGFuZXNlLmh0bWwKIAorIyBOZXcgRE9NIGJlbmNobWFyayBpcyBub3QgcmVhZHkg
Zm9yIHRoZSBwcmltZSB0aW1lIHlldC4KK05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L2JlbmNobWFyay5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxl
dGVseVVucmVhbGlzdGljRE9NQmVuY2gvYmVuY2htYXJrLmh0bWwJKHJldmlzaW9uIDApCisrKyBQ
ZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL2JlbmNobWFy
ay5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTUxIEBACis8IURPQ1RZUEUgaHRtbD4K
KzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+Tm90IENvbXBsZXRlbHkgVW5yZWFsaXN0aWMgRE9NIEJl
bmNobWFyazwvdGl0bGU+Cis8c2NyaXB0IHNyYz0iYmVuY2htYXJrLmpzIj48L3NjcmlwdD4KKzxz
Y3JpcHQ+CisKK3ZhciBudW1iZXJPZkl0ZW1zVG9BZGQgPSAxMDA7CisKK0JlbmNobWFya1J1bm5l
ci5zdWl0ZSh7CisgICAgbmFtZTogJ1ZhbmlsbGFKUy9Ub2RvTVZDJywKKyAgICB1cmw6ICd0b2Rv
bXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2luZGV4Lmh0bWwnLAorICAgIHByZXBhcmU6
IGZ1bmN0aW9uIChjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsKKyAgICAgICAgcmV0
dXJuIEJlbmNobWFya1J1bm5lci53YWl0Rm9yRWxlbWVudCgnI25ldy10b2RvJykudGhlbihmdW5j
dGlvbiAoZWxlbWVudCkgeworICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpOworICAgICAgICAg
ICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0pOworICAgIH0sCisgICAgdGVzdHM6IFsKKyAg
ICAgICAgWydBZGRpbmcnICsgbnVtYmVyT2ZJdGVtc1RvQWRkICsgJ0l0ZW1zJywgZnVuY3Rpb24g
KG5ld1RvZG8sIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgICAgICAgICAg
dmFyIHRvZG9Db250cm9sbGVyID0gY29udGVudFdpbmRvdy50b2RvLmNvbnRyb2xsZXI7CisgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkl0ZW1zVG9BZGQ7IGkrKykgeworICAgICAgICBu
ZXdUb2RvLnZhbHVlID0gJ1NvbWV0aGluZyB0byBkbyAnICsgaTsKKyAgICAgICAgdG9kb0NvbnRy
b2xsZXIuYWRkSXRlbSh7a2V5Q29kZTogdG9kb0NvbnRyb2xsZXIuRU5URVJfS0VZLCB0YXJnZXQ6
IG5ld1RvZG99KTsKKyAgICAgICAgfQorICAgIH1dLAorICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1z
JywgZnVuY3Rpb24gKG5ld1RvZG8sIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgewor
ICAgIHZhciBjaGVja2JveGVzID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50
b2dnbGUnKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrYm94ZXMubGVuZ3RoOyBpKysp
CisgICAgICAgIGNoZWNrYm94ZXNbaV0uY2xpY2soKTsKKyAgICB9XSwKKyAgICAgICAgWydEZWxl
dGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKG5ld1RvZG8sIGNvbnRlbnRXaW5kb3csIGNvbnRlbnRE
b2N1bWVudCkgeworICAgIHZhciBkZWxldGVCdXR0b25zID0gY29udGVudERvY3VtZW50LnF1ZXJ5
U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGVC
dXR0b25zLmxlbmd0aDsgaSsrKQorICAgICAgICBkZWxldGVCdXR0b25zW2ldLmNsaWNrKCk7Cisg
ICAgfV0sCisgICAgXQorfSk7CisKK0JlbmNobWFya1J1bm5lci5zdWl0ZSh7CisgICAgbmFtZTog
J0VtYmVySlMvVG9kb01WQycsCisgICAgdXJsOiAndG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9pbmRleC5odG1sJywKKyAgICBwcmVwYXJlOiBmdW5jdGlvbiAoY29udGVudFdp
bmRvdywgY29udGVudERvY3VtZW50KSB7CisgICAgY29udGVudFdpbmRvdy5Ub2Rvcy5TdG9yZSA9
IGNvbnRlbnRXaW5kb3cuRFMuU3RvcmUuZXh0ZW5kKHsKKyAgICByZXZpc2lvbjogMTIsCisgICAg
YWRhcHRlcjogJ1RvZG9zLkxTQWRhcHRlcicsCisgICAgY29tbWl0OiBmdW5jdGlvbiAoKSB7IH0K
KyAgICB9KTsKKworICAgICAgICByZXR1cm4gQmVuY2htYXJrUnVubmVyLndhaXRGb3JFbGVtZW50
KCcjbmV3LXRvZG8nKS50aGVuKGZ1bmN0aW9uIChlbGVtZW50KSB7CisgICAgICAgICAgICBlbGVt
ZW50LmZvY3VzKCk7CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgIHZpZXdz
OiBjb250ZW50V2luZG93LkVtYmVyLlZpZXcudmlld3MsCisgICAgICAgICAgICAgICAgZW1iZXJS
dW46IGNvbnRlbnRXaW5kb3cuRW1iZXIucnVuLAorICAgICAgICAgICAgfQorICAgICAgICB9KTsK
KyAgICB9LAorICAgIHRlc3RzOiBbCisgICAgWydBZGRpbmcnICsgbnVtYmVyT2ZJdGVtc1RvQWRk
ICsgJ0l0ZW1zJywgZnVuY3Rpb24gKHBhcmFtcykgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
bnVtYmVyT2ZJdGVtc1RvQWRkOyBpKyspIHsKKyAgICBwYXJhbXMuZW1iZXJSdW4oZnVuY3Rpb24g
KCkgeyBwYXJhbXMudmlld3NbIm5ldy10b2RvIl0uc2V0KCd2YWx1ZScsICdTb21ldGhpbmcgdG8g
ZG8nICsgaSk7IH0pOworICAgIHBhcmFtcy5lbWJlclJ1bihmdW5jdGlvbiAoKSB7IHBhcmFtcy52
aWV3c1sibmV3LXRvZG8iXS5pbnNlcnROZXdsaW5lKGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVu
dCcpKTsgfSk7CisgICAgfQorICAgIH1dLAorICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1zJywgZnVu
Y3Rpb24gKHBhcmFtcywgY29udGVudFdpbmRvdywgY29udGVudERvY3VtZW50KSB7CisgICAgdmFy
IGNoZWNrYm94ZXMgPSBjb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVtYmVyLWNo
ZWNrYm94Jyk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja2JveGVzLmxlbmd0aDsgaSsr
KSB7CisgICAgdmFyIHZpZXcgPSBwYXJhbXMudmlld3NbY2hlY2tib3hlc1tpXS5pZF07CisgICAg
cGFyYW1zLmVtYmVyUnVuKGZ1bmN0aW9uICgpIHsgdmlldy5zZXQoJ2NoZWNrZWQnLCB0cnVlKTsg
fSk7CisgICAgfQorICAgIH1dLAorICAgIFsnRGVsZXRpbmdJdGVtcycsIGZ1bmN0aW9uIChwYXJh
bXMsIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgIHZhciBkZWxldGVCdXR0
b25zID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7CisgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGVCdXR0b25zLmxlbmd0aDsgaSsrKQorICAgIHBhcmFt
cy5lbWJlclJ1bihmdW5jdGlvbiAoKSB7IGRlbGV0ZUJ1dHRvbnNbaV0uY2xpY2soKTsgfSk7Cisg
ICAgfV0sCisgICAgXQorfSk7CisKK0JlbmNobWFya1J1bm5lci5zdWl0ZSh7CisgICAgbmFtZTog
J0JhY2tib25lSlMvVG9kb01WQycsCisgICAgdXJsOiAndG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvYmFja2JvbmUvaW5kZXguaHRtbCcsCisgICAgcHJlcGFyZTogZnVuY3Rpb24gKGNvbnRl
bnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgIGNvbnRlbnRXaW5kb3cuQmFja2JvbmUu
c3luYyA9IGZ1bmN0aW9uICgpIHt9CisgICAgICAgIHJldHVybiBCZW5jaG1hcmtSdW5uZXIud2Fp
dEZvckVsZW1lbnQoJyNuZXctdG9kbycpLnRoZW4oZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAgICAg
ICAgICAgIGVsZW1lbnQuZm9jdXMoKTsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAg
ICAgICB9KTsKKyAgICB9LAorICAgIHRlc3RzOiBbCisgICAgICAgIFsnQWRkaW5nJyArIG51bWJl
ck9mSXRlbXNUb0FkZCArICdJdGVtcycsIGZ1bmN0aW9uIChuZXdUb2RvLCBjb250ZW50V2luZG93
LCBjb250ZW50RG9jdW1lbnQpIHsKKyAgICB2YXIgYXBwVmlldyA9IGNvbnRlbnRXaW5kb3cuYXBw
VmlldzsKKyAgICB2YXIgZmFrZUV2ZW50ID0ge3doaWNoOiBjb250ZW50V2luZG93LkVOVEVSX0tF
WX07CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkl0ZW1zVG9BZGQ7IGkrKykgewor
ICAgICAgICBuZXdUb2RvLnZhbHVlID0gJ1NvbWV0aGluZyB0byBkbyAnICsgaTsKKyAgICBhcHBW
aWV3LmNyZWF0ZU9uRW50ZXIoZmFrZUV2ZW50KTsKKyAgICAgICAgfQorICAgIH1dLAorICAgIFsn
Q29tcGxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKG5ld1RvZG8sIGNvbnRlbnRXaW5kb3csIGNv
bnRlbnREb2N1bWVudCkgeworICAgIHZhciBjaGVja2JveGVzID0gY29udGVudERvY3VtZW50LnF1
ZXJ5U2VsZWN0b3JBbGwoJy50b2dnbGUnKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNr
Ym94ZXMubGVuZ3RoOyBpKyspCisgICAgICAgIGNoZWNrYm94ZXNbaV0uY2xpY2soKTsKKyAgICB9
XSwKKyAgICAgICAgWydEZWxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKG5ld1RvZG8sIGNvbnRl
bnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgIHZhciBkZWxldGVCdXR0b25zID0gY29u
dGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7CisgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCBkZWxldGVCdXR0b25zLmxlbmd0aDsgaSsrKQorICAgICAgICBkZWxldGVCdXR0
b25zW2ldLmNsaWNrKCk7CisgICAgfV0sCisgICAgXQorfSk7CisKK0JlbmNobWFya1J1bm5lci5z
dWl0ZSh7CisgICAgbmFtZTogJ2pRdWVyeS9Ub2RvTVZDJywKKyAgICB1cmw6ICd0b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvaW5kZXguaHRtbCcsCisgICAgcHJlcGFyZTogZnVu
Y3Rpb24gKGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgIHZhciBzdG9yYWdl
ID0gW107CisgICAgICAgIHJldHVybiBCZW5jaG1hcmtSdW5uZXIud2FpdEZvckVsZW1lbnQoJyNu
ZXctdG9kbycpLnRoZW4oZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAgICAgICAgICAgIGVsZW1lbnQu
Zm9jdXMoKTsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICB9KTsKKyAgICB9
LAorICAgIHRlc3RzOiBbCisgICAgICAgIFsnQWRkaW5nJyArIG51bWJlck9mSXRlbXNUb0FkZCAr
ICdJdGVtcycsIGZ1bmN0aW9uIChuZXdUb2RvLCBjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1l
bnQpIHsKKyAgICB2YXIgYXBwID0gY29udGVudFdpbmRvdy5hcHA7CisgICAgdmFyIGZha2VFdmVu
dCA9IHt3aGljaDogYXBwLkVOVEVSX0tFWX07CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1i
ZXJPZkl0ZW1zVG9BZGQ7IGkrKykgeworICAgICAgICBuZXdUb2RvLnZhbHVlID0gJ1NvbWV0aGlu
ZyB0byBkbyAnICsgaTsKKyAgICBhcHAuY3JlYXRlLmNhbGwobmV3VG9kbywgZmFrZUV2ZW50KTsK
KyAgICAgICAgfQorICAgIH1dLAorICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24g
KG5ld1RvZG8sIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgIHZhciBhcHAg
PSBjb250ZW50V2luZG93LmFwcDsKKyAgICB2YXIgY2hlY2tib3hlcyA9IGNvbnRlbnREb2N1bWVu
dC5xdWVyeVNlbGVjdG9yQWxsKCcudG9nZ2xlJyk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBj
aGVja2JveGVzLmxlbmd0aDsgaSsrKQorICAgIGFwcC50b2dnbGUuY2FsbChjaGVja2JveGVzW2ld
KTsKKyAgICB9XSwKKyAgICAgICAgWydEZWxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKG5ld1Rv
ZG8sIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgeworICAgIHZhciBhcHAgPSBjb250
ZW50V2luZG93LmFwcDsKKyAgICB2YXIgZGVsZXRlQnV0dG9ucyA9IGNvbnRlbnREb2N1bWVudC5x
dWVyeVNlbGVjdG9yQWxsKCcuZGVzdHJveScpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVs
ZXRlQnV0dG9ucy5sZW5ndGg7IGkrKykKKyAgICBhcHAuZGVzdHJveS5jYWxsKGRlbGV0ZUJ1dHRv
bnNbaV0pOworICAgIH1dLAorICAgIF0KK30pOworCis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5
PgorPHA+PC9wPgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RD
b21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC9iZW5jaG1hcmsuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
UGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC9iZW5jaG1h
cmsuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJl
YWxpc3RpY0RPTUJlbmNoL2JlbmNobWFyay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMy
OSBAQAorCisvLyBGSVhNRTogVXNlIHRoZSByZWFsIHByb21pc2UgaWYgYXZhaWxhYmxlLgorLy8g
RklYTUU6IE1ha2Ugc3VyZSB0aGlzIGludGVyZmFjZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJl
YWwgUHJvbWlzZS4KK2Z1bmN0aW9uIFNpbXBsZVByb21pc2UoKSB7CisgICAgdGhpcy5fY2hhaW5l
ZFByb21pc2UgPSBudWxsOworICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKK30KKworU2ltcGxl
UHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeworICAgIGlmICh0
aGlzLl9jYWxsYmFjaykKKyAgICB0aHJvdyAiU2ltcGxlUHJvbWlzZSBkb2Vzbid0IHN1cHBvcnQg
bXVsdGlwbGUgY2FsbHMgdG8gdGhlbiI7CisgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsK
KyAgICB0aGlzLl9jaGFpbmVkUHJvbWlzZSA9IG5ldyBTaW1wbGVQcm9taXNlOworICAgIAorICAg
IGlmICh0aGlzLl9yZXNvbHZlZCkKKyAgICAgICAgdGhpcy5yZXNvbHZlKHRoaXMuX3Jlc29sdmVk
VmFsdWUpOworCisgICAgcmV0dXJuIHRoaXMuX2NoYWluZWRQcm9taXNlOworfQorCitTaW1wbGVQ
cm9taXNlLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgaWYgKCF0
aGlzLl9jYWxsYmFjaykgeworICAgICAgICB0aGlzLl9yZXNvbHZlZCA9IHRydWU7CisgICAgICAg
IHRoaXMuX3Jlc29sdmVkVmFsdWUgPSB2YWx1ZTsKKyAgICByZXR1cm47CisgICAgfQorCisgICAg
dmFyIHJlc3VsdCA9IHRoaXMuX2NhbGxiYWNrKHZhbHVlKTsKKyAgICBpZiAocmVzdWx0IGluc3Rh
bmNlb2YgU2ltcGxlUHJvbWlzZSkgeworICAgIHZhciBjaGFpbmVkUHJvbWlzZSA9IHRoaXMuX2No
YWluZWRQcm9taXNlOworICAgIHJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgY2hhaW5l
ZFByb21pc2UucmVzb2x2ZShyZXN1bHQpOyB9KTsKKyAgICB9IGVsc2UKKyAgICB0aGlzLl9jaGFp
bmVkUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7Cit9CisKK3ZhciBCZW5jaG1hcmtSdW5uZXIgPSB7
X3N1aXRlczogW10sIF9wcmVwYXJlUmV0dXJuVmFsdWU6IG51bGwsIF9tZWFzdXJlZFZhbHVlczog
e319OworCitCZW5jaG1hcmtSdW5uZXIuc3VpdGUgPSBmdW5jdGlvbiAoc3VpdGUpIHsKKyAgICB2
YXIgc2VsZiA9IEJlbmNobWFya1J1bm5lcjsKKyAgICBzZWxmLl9zdWl0ZXMucHVzaChzdWl0ZSk7
Cit9CisKK0JlbmNobWFya1J1bm5lci53YWl0Rm9yRWxlbWVudCA9IGZ1bmN0aW9uIChzZWxlY3Rv
cikgeworICAgIHZhciBzZWxmID0gQmVuY2htYXJrUnVubmVyOworICAgIHZhciBwcm9taXNlID0g
bmV3IFNpbXBsZVByb21pc2U7CisgICAgdmFyIGNvbnRlbnREb2N1bWVudCA9IHNlbGYuX2ZyYW1l
LmNvbnRlbnREb2N1bWVudDsKKworICAgIGZ1bmN0aW9uIHJlc29sdmVJZlJlYWR5KCkgeworICAg
ICAgICB2YXIgZWxlbWVudCA9IGNvbnRlbnREb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9y
KTsKKyAgICBpZiAoZWxlbWVudCkKKyAgICAgICAgcmV0dXJuIHByb21pc2UucmVzb2x2ZShlbGVt
ZW50KTsKKyAgICAgICAgc2V0VGltZW91dChyZXNvbHZlSWZSZWFkeSwgNTApOworICAgIH0KKwor
ICAgIHJlc29sdmVJZlJlYWR5KCk7CisgICAgcmV0dXJuIHByb21pc2U7Cit9CisKK0JlbmNobWFy
a1J1bm5lci5fcmVtb3ZlRnJhbWUgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHNlbGYgPSBCZW5j
aG1hcmtSdW5uZXI7CisgICAgaWYgKHNlbGYuX2ZyYW1lKSB7CisgICAgICAgIHNlbGYuX2ZyYW1l
LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2VsZi5fZnJhbWUpOworICAgICAgICBzZWxmLl9mcmFt
ZSA9IG51bGw7CisgICAgfQorfQorCitCZW5jaG1hcmtSdW5uZXIuX2FwcGVuZEZyYW1lID0gZnVu
Y3Rpb24gKHNyYykgeworICAgIHZhciBzZWxmID0gQmVuY2htYXJrUnVubmVyOworICAgIHZhciBm
cmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOworICAgIGRvY3VtZW50LmJv
ZHkuYXBwZW5kQ2hpbGQoZnJhbWUpOworICAgIHNlbGYuX2ZyYW1lID0gZnJhbWU7CisgICAgcmV0
dXJuIGZyYW1lOworfQorCitCZW5jaG1hcmtSdW5uZXIuX3dhaXRBbmRXYXJtVXAgPSBmdW5jdGlv
biAoKSB7CisgICAgdmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCk7CisKKyAgICBmdW5jdGlvbiBG
aWJvbmFjY2kobikgeworICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gMTAwKQorICAg
IHJldHVybjsKKyAgICBpZiAobiA8PSAwKQorICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKG4g
PT0gMSkKKyAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gRmlib25hY2NpKG4gLSAyKSArIEZpYm9u
YWNjaShuIC0gMSk7CisgICAgfQorCisgICAgdmFyIHByb21pc2UgPSBuZXcgU2ltcGxlUHJvbWlz
ZTsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICBGaWJvbmFjY2koMTAwKTsKKyAg
ICBwcm9taXNlLnJlc29sdmUoKTsKKyAgICB9LCAyMDApOworICAgIHJldHVybiBwcm9taXNlOwor
fQorCisvLyBUaGlzIGZ1bmN0aW9uIG91Z2h0IGJlIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4gRG9u
J3QgZXZlbiB1c2UgU2ltcGxlUHJvbWlzZS4KK0JlbmNobWFya1J1bm5lci5fcnVuVGVzdCA9IGZ1
bmN0aW9uKHN1aXRlLCB0ZXN0RnVuY3Rpb24sIHByZXBhcmVSZXR1cm5WYWx1ZSwgY2FsbGJhY2sp
Cit7CisgICAgdmFyIHNlbGYgPSBCZW5jaG1hcmtSdW5uZXI7CisgICAgdmFyIG5vdyA9IHdpbmRv
dy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID8gZnVuY3Rpb24gKCkgeyBy
ZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpOyB9IDogRGF0ZS5ub3c7CisKKyAgICB2YXIg
Y29udGVudFdpbmRvdyA9IHNlbGYuX2ZyYW1lLmNvbnRlbnRXaW5kb3c7CisgICAgdmFyIGNvbnRl
bnREb2N1bWVudCA9IHNlbGYuX2ZyYW1lLmNvbnRlbnREb2N1bWVudDsKKworICAgIHZhciBzdGFy
dFRpbWUgPSBub3coKTsKKyAgICB0ZXN0RnVuY3Rpb24ocHJlcGFyZVJldHVyblZhbHVlLCBjb250
ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpOworICAgIHZhciBlbmRUaW1lID0gbm93KCk7Cisg
ICAgdmFyIHN5bmNUaW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTsKKworICAgIHZhciBzdGFydFRp
bWUgPSBub3coKTsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZW5kVGlt
ZSA9IG5vdygpOworICAgIGNhbGxiYWNrKHN5bmNUaW1lLCBlbmRUaW1lIC0gc3RhcnRUaW1lKTsK
KyAgICB9LCAwKTsKK30KKworQmVuY2htYXJrUnVubmVyLl90ZXN0TmFtZSA9IGZ1bmN0aW9uIChz
dWl0ZSwgdGVzdE5hbWUsIG1ldHJpYykgeworICAgIGlmICghdGVzdE5hbWUpCisgICAgICAgIHJl
dHVybiBzdWl0ZS5uYW1lOworICAgIHJldHVybiBzdWl0ZS5uYW1lICsgJy8nICsgdGVzdE5hbWUg
KyAobWV0cmljID8gJy8nICsgbWV0cmljIDogJycpOworfQorCitCZW5jaG1hcmtSdW5uZXIuX3Rl
c3RJdGVtSWQgPSBmdW5jdGlvbiAoc3VpdGUsIHRlc3ROYW1lKSB7CisgICAgcmV0dXJuIHN1aXRl
Lm5hbWUgKyAnLScgKyB0ZXN0TmFtZTsKK30KKworQmVuY2htYXJrUnVubmVyLmxpc3RTdWl0ZXMg
PSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHNlbGYgPSBCZW5jaG1hcmtSdW5uZXI7CisKKyAgICB2
YXIgY29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25hdicpOworCisgICAgdmFyIHN1
aXRlcyA9IHNlbGYuX3N1aXRlczsKKyAgICB2YXIgb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdvbCcpOworICAgIHZhciBjaGVja2JveGVzID0gW107CisgICAgZm9yICh2YXIgc3VpdGVJbmRl
eCA9IDA7IHN1aXRlSW5kZXggPCBzdWl0ZXMubGVuZ3RoOyBzdWl0ZUluZGV4KyspIHsKKyAgICAg
ICAgdmFyIHN1aXRlID0gc3VpdGVzW3N1aXRlSW5kZXhdOworICAgICAgICB2YXIgbGkgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOworICAgICAgICB2YXIgY2hlY2tib3ggPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOworICAgICAgICBjaGVja2JveC5pZCA9IHN1aXRlLm5h
bWU7CisgICAgICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnOworICAgICAgICBjaGVja2Jv
eC5jaGVja2VkID0gdHJ1ZTsKKyAgICAgICAgY2hlY2tib3hlcy5wdXNoKGNoZWNrYm94KTsKKwor
ICAgICAgICBsaS5hcHBlbmRDaGlsZChjaGVja2JveCk7CisgICAgICAgIHZhciBsYWJlbCA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CisgICAgICAgIGxhYmVsLmFwcGVuZENoaWxk
KGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlbGYuX3Rlc3ROYW1lKHN1aXRlKSkpOworICAgICAg
ICBsaS5hcHBlbmRDaGlsZChsYWJlbCk7CisgICAgICAgIGxhYmVsLmh0bWxGb3IgPSBjaGVja2Jv
eC5pZDsKKworICAgICAgICB2YXIgdGVzdExpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdv
bCcpOworICAgICAgICBmb3IgKHZhciB0ZXN0SW5kZXggPSAwOyB0ZXN0SW5kZXggPCBzdWl0ZS50
ZXN0cy5sZW5ndGg7IHRlc3RJbmRleCsrKSB7CisgICAgICAgICAgICB2YXIgdGVzdEl0ZW0gPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOworICAgICAgICAgICAgdmFyIHRlc3QgPSBzdWl0
ZS50ZXN0c1t0ZXN0SW5kZXhdOworICAgICAgICAgICAgdmFyIGFuY2hvciA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ2EnKTsKKyAgICAgICAgICAgIGFuY2hvci5pZCA9IHNlbGYuX3Rlc3RJdGVt
SWQoc3VpdGUsIHRlc3RbMF0pOworICAgICAgICAgICAgYW5jaG9yLmFwcGVuZENoaWxkKGRvY3Vt
ZW50LmNyZWF0ZVRleHROb2RlKHNlbGYuX3Rlc3ROYW1lKHN1aXRlLCB0ZXN0WzBdKSkpOworICAg
ICAgICAgICAgdGVzdEl0ZW0uYXBwZW5kQ2hpbGQoYW5jaG9yKTsKKyAgICAgICAgICAgIHRlc3RM
aXN0LmFwcGVuZENoaWxkKHRlc3RJdGVtKTsKKyAgICAgICAgfQorICAgICAgICBsaS5hcHBlbmRD
aGlsZCh0ZXN0TGlzdCk7CisKKyAgICAgICAgb2wuYXBwZW5kQ2hpbGQobGkpOworICAgIH0KKwor
ICAgIGNvbnRyb2wuYXBwZW5kQ2hpbGQob2wpOworCisgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IG51
bGw7CisKKyAgICAvLyBEb24ndCBjYWxsIHN0ZXAgd2hpbGUgc3RlcCBpcyBhbHJlYWR5IGV4ZWN1
dGluZy4KKyAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7
CisgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1N0ZXAnOworICAgIGJ1dHRvbi5vbmNsaWNrID0g
ZnVuY3Rpb24gKCkgeworICAgICAgICBzZWxmLnN0ZXAoY3VycmVudFN0YXRlKS50aGVuKGZ1bmN0
aW9uIChzdGF0ZSkgeyBjdXJyZW50U3RhdGUgPSBzdGF0ZTsgfSk7CisgICAgfQorICAgIGNvbnRy
b2wuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKKworICAgIGZ1bmN0aW9uIGNhbGxOZXh0U3RlcChzdGF0
ZSkgeworICAgICAgICBzZWxmLnN0ZXAoc3RhdGUpLnRoZW4oZnVuY3Rpb24gKG5ld1N0YXRlKSB7
CisgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgIGlmIChu
ZXdTdGF0ZSkKKyAgICAgICAgICAgICAgICBjYWxsTmV4dFN0ZXAobmV3U3RhdGUpOworICAgICAg
ICB9KTsKKyAgICB9CisKKyAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
YnV0dG9uJyk7CisgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1J1bic7CisgICAgYnV0dG9uLm9u
Y2xpY2sgPSBmdW5jdGlvbiAoKSB7IGNhbGxOZXh0U3RlcChjdXJyZW50U3RhdGUpOyB9CisgICAg
Y29udHJvbC5hcHBlbmRDaGlsZChidXR0b24pOworCisgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRD
aGlsZChjb250cm9sKTsKK30KKworZnVuY3Rpb24gQmVuY2htYXJrU3RhdGUoc3VpdGVzKSB7Cisg
ICAgdGhpcy5fc3VpdGVzID0gc3VpdGVzOworICAgIHRoaXMuX3N1aXRlSW5kZXggPSAtMTsKKyAg
ICB0aGlzLl90ZXN0SW5kZXggPSAwOworICAgIHRoaXMubmV4dCgpOworfQorCitCZW5jaG1hcmtT
dGF0ZS5wcm90b3R5cGUuY3VycmVudFN1aXRlID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRo
aXMuX3N1aXRlc1t0aGlzLl9zdWl0ZUluZGV4XTsKK30KKworQmVuY2htYXJrU3RhdGUucHJvdG90
eXBlLmN1cnJlbnRUZXN0ID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBzdWl0ZSA9IHRoaXMuY3Vy
cmVudFN1aXRlKCk7CisgICAgcmV0dXJuIHN1aXRlID8gc3VpdGUudGVzdHNbdGhpcy5fdGVzdElu
ZGV4XSA6IG51bGw7Cit9CisKK0JlbmNobWFya1N0YXRlLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rp
b24gKCkgeworICAgIHRoaXMuX3Rlc3RJbmRleCsrOworCisgICAgdmFyIHN1aXRlID0gdGhpcy5f
c3VpdGVzW3RoaXMuX3N1aXRlSW5kZXhdOworICAgIGlmIChzdWl0ZSAmJiB0aGlzLl90ZXN0SW5k
ZXggPCBzdWl0ZS50ZXN0cy5sZW5ndGgpCisgICAgICAgIHJldHVybiB0aGlzOworCisgICAgdGhp
cy5fdGVzdEluZGV4ID0gMDsKKyAgICBkbyB7CisgICAgICAgIHRoaXMuX3N1aXRlSW5kZXgrKzsK
KyAgICB9IHdoaWxlICh0aGlzLl9zdWl0ZUluZGV4IDwgdGhpcy5fc3VpdGVzLmxlbmd0aCAmJiAh
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fc3VpdGVzW3RoaXMuX3N1aXRlSW5kZXhdLm5h
bWUpLmNoZWNrZWQpOworCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFya1N0YXRlLnBy
b3RvdHlwZS5pc0ZpcnN0VGVzdCA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gIXRoaXMuX3Rl
c3RJbmRleDsKK30KKworQmVuY2htYXJrU3RhdGUucHJvdG90eXBlLnByZXBhcmVDdXJyZW50U3Vp
dGUgPSBmdW5jdGlvbiAoZnJhbWUpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIHN1
aXRlID0gdGhpcy5jdXJyZW50U3VpdGUoKTsKKyAgICB2YXIgcHJvbWlzZSA9IG5ldyBTaW1wbGVQ
cm9taXNlOworICAgIGZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgc3VpdGUu
cHJlcGFyZShmcmFtZS5jb250ZW50V2luZG93LCBmcmFtZS5jb250ZW50RG9jdW1lbnQpLnRoZW4o
ZnVuY3Rpb24gKHJlc3VsdCkgeyBwcm9taXNlLnJlc29sdmUocmVzdWx0KTsgfSk7CisgICAgfQor
ICAgIGZyYW1lLnNyYyA9IHN1aXRlLnVybDsKKyAgICByZXR1cm4gcHJvbWlzZTsKK30KKworQmVu
Y2htYXJrUnVubmVyLnN0ZXAgPSBmdW5jdGlvbiAoc3RhdGUpIHsKKyAgICB2YXIgc2VsZiA9IEJl
bmNobWFya1J1bm5lcjsKKworICAgIGlmICghc3RhdGUpCisgICAgICAgIHN0YXRlID0gbmV3IEJl
bmNobWFya1N0YXRlKHNlbGYuX3N1aXRlcyk7CisKKyAgICB2YXIgc3VpdGUgPSBzdGF0ZS5jdXJy
ZW50U3VpdGUoKTsKKyAgICBpZiAoIXN1aXRlKSB7CisgICAgICAgIHNlbGYuX2ZpbmFsaXplKCk7
CisgICAgICAgIHZhciBwcm9taXNlID0gbmV3IFNpbXBsZVByb21pc2U7CisgICAgICAgIHByb21p
c2UucmVzb2x2ZSgpOworICAgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICB9CisKKyAgICBpZiAo
c3RhdGUuaXNGaXJzdFRlc3QoKSkgeworICAgICAgICBzZWxmLl9tYXN1cmVkVmFsdWVzRm9yQ3Vy
cmVudFN1aXRlID0ge307CisgICAgICAgIHJldHVybiBzdGF0ZS5wcmVwYXJlQ3VycmVudFN1aXRl
KHNlbGYuX2FwcGVuZEZyYW1lKCkpLnRoZW4oZnVuY3Rpb24gKHByZXBhcmVSZXR1cm5WYWx1ZSkg
eworICAgICAgICAgICAgc2VsZi5fcHJlcGFyZVJldHVyblZhbHVlID0gcHJlcGFyZVJldHVyblZh
bHVlOworICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3J1blRlc3RBbmRSZWNvcmRSZXN1bHRzKHN0
YXRlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGYuX3J1blRlc3RBbmRS
ZWNvcmRSZXN1bHRzKHN0YXRlKTsKK30KKworQmVuY2htYXJrUnVubmVyLl9ydW5UZXN0QW5kUmVj
b3JkUmVzdWx0cyA9IGZ1bmN0aW9uIChzdGF0ZSkgeworICAgIHZhciBzZWxmID0gQmVuY2htYXJr
UnVubmVyOworICAgIHZhciBwcm9taXNlID0gbmV3IFNpbXBsZVByb21pc2U7CisgICAgdmFyIHN1
aXRlID0gc3RhdGUuY3VycmVudFN1aXRlKCk7CisgICAgdmFyIHRlc3QgPSBzdGF0ZS5jdXJyZW50
VGVzdCgpOworCisgICAgdmFyIHRlc3ROYW1lID0gdGVzdFswXTsKKyAgICB2YXIgdGVzdEl0ZW0g
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLl90ZXN0SXRlbUlkKHN1aXRlLCB0ZXN0TmFt
ZSkpOworICAgIHRlc3RJdGVtLmNsYXNzTGlzdC5hZGQoJ3J1bm5pbmcnKTsKKyAgICBzZXRUaW1l
b3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgc2VsZi5fcnVuVGVzdChzdWl0ZSwgdGVzdFsxXSwg
c2VsZi5fcHJlcGFyZVJldHVyblZhbHVlLCBmdW5jdGlvbiAoc3luY1RpbWUsIGFzeW5jVGltZSkg
eworICAgICAgICAgICAgc2VsZi5fbWFzdXJlZFZhbHVlc0ZvckN1cnJlbnRTdWl0ZVtzZWxmLl90
ZXN0TmFtZShzdWl0ZSwgdGVzdE5hbWUsICdTeW5jJyldID0gc3luY1RpbWU7CisgICAgICAgICAg
ICBzZWxmLl9tYXN1cmVkVmFsdWVzRm9yQ3VycmVudFN1aXRlW3NlbGYuX3Rlc3ROYW1lKHN1aXRl
LCB0ZXN0TmFtZSwgJ0FzeW5jJyldID0gYXN5bmNUaW1lOworICAgICAgICAgICAgdGVzdEl0ZW0u
Y2xhc3NMaXN0LnJlbW92ZSgncnVubmluZycpOworICAgICAgICAgICAgdGVzdEl0ZW0uY2xhc3NM
aXN0LmFkZCgncmFuJyk7CisgICAgICAgICAgICBzdGF0ZS5uZXh0KCk7CisgICAgICAgICAgICBp
ZiAoc3RhdGUuY3VycmVudFN1aXRlKCkgIT0gc3VpdGUpIHsKKyAgICAgICAgICAgICAgICB2YXIg
dG90YWwgPSAwOworICAgICAgICAgICAgICAgIGZvciAodmFyIHRpdGxlIGluIHNlbGYuX21hc3Vy
ZWRWYWx1ZXNGb3JDdXJyZW50U3VpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVl
ID0gc2VsZi5fbWFzdXJlZFZhbHVlc0ZvckN1cnJlbnRTdWl0ZVt0aXRsZV07CisgICAgICAgICAg
ICAgICAgICAgIHRvdGFsICs9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBzZWxmLl9tZWFz
dXJlZFZhbHVlc1t0aXRsZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgc2VsZi5fbWVhc3VyZWRWYWx1ZXNbc2VsZi5fdGVzdE5hbWUoc3VpdGUpXSA9IHRvdGFs
OworICAgICAgICAgICAgICAgIHNlbGYuX3JlbW92ZUZyYW1lKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBwcm9taXNlLnJlc29sdmUoc3RhdGUpOworICAgICAgICB9KTsKKyAgICB9LCAw
KTsKKyAgICByZXR1cm4gcHJvbWlzZTsKK30KKworQmVuY2htYXJrUnVubmVyLl9maW5hbGl6ZSA9
IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgc2VsZiA9IEJlbmNobWFya1J1bm5lcjsKKworICAgIHZh
ciByZXN1bHRzID0gJyc7CisgICAgdmFyIHRvdGFsID0gMDsgLy8gRklYTUU6IENvbXB1dGUgdGhl
IHRvdGFsIHByb3Blcmx5LgorICAgIGZvciAodmFyIHRpdGxlIGluIHNlbGYuX21lYXN1cmVkVmFs
dWVzKSB7CisgICAgcmVzdWx0cyArPSB0aXRsZSArICcgOiAnICsgc2VsZi5fbWVhc3VyZWRWYWx1
ZXNbdGl0bGVdICsgJyBtc1xuJzsKKyAgICB0b3RhbCArPSBzZWxmLl9tZWFzdXJlZFZhbHVlc1t0
aXRsZV07CisgICAgfQorICAgIHJlc3VsdHMgKz0gJ1RvdGFsIDogJyArICh0b3RhbCAvIDIpICsg
JyBtc1xuJzsKKyAgICBzZWxmLl9tZWFzdXJlZFZhbHVlcyA9IHt9OworCisgICAgc2VsZi5fcmVt
b3ZlRnJhbWUoKTsKKworICAgIGlmICghcmVzdWx0cykKKyAgICAgICAgcmV0dXJuOworCisgICAg
dmFyIHByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpOworICAgIGRvY3VtZW50LmJv
ZHkuYXBwZW5kQ2hpbGQocHJlKTsKKyAgICBwcmUudGV4dENvbnRlbnQgPSByZXN1bHRzOworfQor
Cit3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsgQmVuY2htYXJr
UnVubmVyLmxpc3RTdWl0ZXMoKTsgfSk7CisKKyhmdW5jdGlvbiAoKSB7CisgICAgdmFyIHN0eWxl
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKKyAgICBzdHlsZS5hcHBlbmRDaGls
ZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnaWZyYW1lIHsgd2lkdGg6IDcwMHB4OyBoZWlnaHQ6
IDUwMHB4OyBib3JkZXI6IDJweCBzb2xpZCBibGFjazsgfScKKyAgICAgICAgKyAnb2wgeyBsaXN0
LXN0eWxlOiBub25lOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IH0nCisgICAgICAgICsgJ29sIG9s
IHsgbWFyZ2luLWxlZnQ6IDJlbTsgbGlzdC1wb3NpdGlvbjogb3V0c2lkZTsgfScKKyAgICAgICAg
KyAnLnJ1bm5pbmcgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfScKKyAgICAgICAgKyAn
LnJhbiB7Y29sb3I6IGdyZXl9JworICAgICAgICArICduYXYgeyBwb3NpdGlvbjogYWJzb2x1dGU7
IHJpZ2h0OiAxMHB4OyB9JykpOworICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUp
OworfSkoKTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9saWNlbnNlLm1kCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVz
dHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9saWNlbnNlLm1kCShy
ZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNE
T01CZW5jaC90b2RvbXZjL2xpY2Vuc2UubWQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMCBA
QAorRXZlcnl0aGluZyBpbiB0aGlzIHJlcG8gaXMgTUlUIExpY2Vuc2UgdW5sZXNzIG90aGVyd2lz
ZSBzcGVjaWZpZWQuCisKK0NvcHlyaWdodCAoYykgQWRkeSBPc21hbmksIFNpbmRyZSBTb3JodXMs
IFBhc2NhbCBIYXJ0aWcsIFN0ZXBoZW4gU2F3Y2h1ay4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkg
Z3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBv
ZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUg
IlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KK3RoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u
LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KK3VzZSwgY29weSwg
bW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNl
bGwgY29waWVzIG9mCit0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9t
IHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCitzdWJqZWN0IHRvIHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg
cGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCitjb3BpZXMgb3Igc3Vi
c3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJP
VklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgor
SU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9O
SU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorQ09QWVJJR0hU
IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklM
SVRZLCBXSEVUSEVSCitJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF
LCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS
RSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KSW5kZXg6IFBl
cmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9y
ZWFkbWUubWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5y
ZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3JlYWRtZS5tZAkocmV2aXNpb24gMCkKKysrIFBlcmZv
cm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9yZWFk
bWUubWQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDIgQEAKKyMgIVtUb2RvTVZDXShodHRw
czovL3Jhdy5naXRodWIuY29tL3Rhc3RlanMvdG9kb212Yy9naC1wYWdlcy9tZWRpYS9sb2dvLnBu
ZykKKworIyMgSGVscGluZyB5b3Ugc2VsZWN0IGFuIE1WXCogZnJhbWV3b3JrCisKKworRGV2ZWxv
cGVycyB0aGVzZSBkYXlzIGFyZSBzcG9pbGVkIHdpdGggY2hvaWNlIHdoZW4gaXQgY29tZXMgdG8g
c2VsZWN0aW5nIGFuIE1WXCogZnJhbWV3b3JrIGZvciBzdHJ1Y3R1cmluZyBhbmQgb3JnYW5pemlu
ZyBKYXZhU2NyaXB0IHdlYiBhcHBzLgorCitCYWNrYm9uZSwgRW1iZXIsIEFuZ3VsYXJKUywgU3Bp
bmUuLi4gdGhlIGxpc3Qgb2YgbmV3IGFuZCBzdGFibGUgc29sdXRpb25zIGdvZXMgb24gYW5kIG9u
LCBidXQganVzdCBob3cgZG8geW91IGRlY2lkZSBvbiB3aGljaCB0byB1c2UgaW4gYSBzZWEgb2Yg
c28gbWFueSBvcHRpb25zPworCitUbyBoZWxwIHNvbHZlIHRoaXMgcHJvYmxlbSwgd2UgY3JlYXRl
ZCBUb2RvTVZDIC0gYSBwcm9qZWN0IHdoaWNoIG9mZmVycyB0aGUgc2FtZSBUb2RvIGFwcGxpY2F0
aW9uIGltcGxlbWVudGVkIHVzaW5nIE1WKiBjb25jZXB0cyBpbiBtb3N0IG9mIHRoZSBwb3B1bGFy
IEphdmFTY3JpcHQgTVZcKiBmcmFtZXdvcmtzIG9mIHRvZGF5LgorCisKKyMjIyMgVG9kbyBhcHBz
IGFyZSBpbmNsdWRlZCBmb3I6CisKKy0gW0JhY2tib25lLmpzXShodHRwOi8vZG9jdW1lbnRjbG91
ZC5naXRodWIuY29tL2JhY2tib25lKQorLSBbRW1iZXIuanNdKGh0dHA6Ly9lbWJlcmpzLmNvbSkK
Ky0gW0FuZ3VsYXJKU10oaHR0cDovL2FuZ3VsYXJqcy5vcmcpCistIFtTcGluZV0oaHR0cDovL3Nw
aW5lanMuY29tKQorLSBbS25vY2tvdXRKU10oaHR0cDovL2tub2Nrb3V0anMuY29tKSAoTVZWTSkK
Ky0gW0Rvam9dKGh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcpCistIFtZVUldKGh0dHA6Ly95dWlsaWJy
YXJ5LmNvbSkKKy0gW0JhdG1hbi5qc10oaHR0cDovL2JhdG1hbmpzLm9yZykKKy0gW0Nsb3N1cmVd
KGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vY2xvc3VyZS9saWJyYXJ5LykKKy0gW0FnaWxpdHkuanNd
KGh0dHA6Ly9hZ2lsaXR5anMuY29tKQorLSBbS25vY2tiYWNrLmpzXShodHRwOi8va21hbGFrb2Zm
LmdpdGh1Yi5jb20va25vY2tiYWNrKQorLSBbR29vZ2xlIFdlYiBUb29sa2l0XShodHRwczovL2Rl
dmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWItdG9vbGtpdC8pCisKKworIyMjIyMjIE5vbi1mcmFtZXdv
cmsgSW1wbGVtZW50YXRpb25zCisKKy0gW2pRdWVyeV0oaHR0cDovL2pxdWVyeS5jb20pCistIFtW
YW5pbGxhIEpTXShodHRwOi8vdG9kb212Yy5jb20vdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMv
KQorCisjIyMjIyMgUmVxdWlyZUpTCisKKy0gW0JhY2tib25lLmpzXShodHRwOi8vZG9jdW1lbnRj
bG91ZC5naXRodWIuY29tL2JhY2tib25lKSArIFtSZXF1aXJlSlNdKGh0dHA6Ly9yZXF1aXJlanMu
b3JnKQorLSBbQW5ndWxhckpTXShodHRwOi8vYW5ndWxhcmpzLm9yZykgKyBbUmVxdWlyZUpTXSho
dHRwOi8vcmVxdWlyZWpzLm9yZykKKy0gW0tub2Nrb3V0SlNdKGh0dHA6Ly9rbm9ja291dGpzLmNv
bSkgKyBbUmVxdWlyZUpTXShodHRwOi8vcmVxdWlyZWpzLm9yZykKKy0gW0NhbkpTXShodHRwOi8v
Y2FuanMudXMpICsgW1JlcXVpcmVKU10oaHR0cDovL3JlcXVpcmVqcy5vcmcpCisKKyMjIyMgTGFi
cworCitXZSBhbHNvIGhhdmUgYSBudW1iZXIgb2YgaW4tcHJvZ3Jlc3MgYXBwbGljYXRpb25zIGlu
IExhYnM6CisKKy0gW1JlYWN0XShodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0KQorLSBb
TWV0ZW9yXShodHRwOi8vbWV0ZW9yLmNvbSkKKy0gW0RlcmJ5XShodHRwOi8vZGVyYnlqcy5jb20p
CistIFtDYW5KU10oaHR0cDovL2NhbmpzLnVzKQorLSBbS2VuZG8gVUldKGh0dHA6Ly9rZW5kb3Vp
LmNvbSkKKy0gW0ZsaWdodCBieSBUd2l0dGVyXShodHRwczovL2dpdGh1Yi5jb20vdHdpdHRlci9m
bGlnaHQpCistIFtNYXJpYS5qc10oaHR0cHM6Ly9naXRodWIuY29tL3BldGVybWljaGF1eC9tYXJp
YSkKKy0gW2N1am9KU10oaHR0cDovL2N1am9qcy5jb20pCistIFtNYXJpb25ldHRlSlNdKGh0dHA6
Ly9tYXJpb25ldHRlanMuY29tLykKKy0gW1NvY2tldFN0cmVhbV0oaHR0cDovL3d3dy5zb2NrZXRz
dHJlYW0ub3JnKSArIFtqUXVlcnldKGh0dHA6Ly9qcXVlcnkuY29tKQorLSBbRXh0LmpzXShodHRw
Oi8vd3d3LnNlbmNoYS5jb20vcHJvZHVjdHMvZXh0anMpCistIFtTYW1teS5qc10oaHR0cDovL3Nh
bW15anMub3JnKQorLSBbZGVybWlzXShodHRwczovL2dpdGh1Yi5jb20vd2VhcmVmcmFjdGFsL2Rl
cm1pcykKKy0gW1N0YXBlcy5qc10oaHR0cDovL2hheS5naXRodWIuY29tL3N0YXBlcykKKy0gW0Vw
aXRvbWVdKGh0dHA6Ly9kaW1pdGFyY2hyaXN0b2ZmLmdpdGh1Yi5jb20vRXBpdG9tZSkKKy0gW1Ry
b29wSlNdKGh0dHBzOi8vZ2l0aHViLmNvbS90cm9vcGpzKQorLSBbc29tYS5qc10oaHR0cDovL3Nv
bWFqcy5naXRodWIuY29tL3NvbWFqcykKKy0gW0RVRUxdKGh0dHBzOi8vYml0YnVja2V0Lm9yZy9t
Y2thbWV5L2R1ZWwvd2lraS9Ib21lKQorLSBbT2xpdmVzXShodHRwczovL2dpdGh1Yi5jb20vZmxh
bXMvb2xpdmVzKQorLSBbUGxhc3Ryb25KU10oaHR0cHM6Ly9naXRodWIuY29tL3JoeXNicmV0dGJv
d2VuL1BsYXN0cm9uSlMpCistIFtEaWpvbl0oaHR0cHM6Ly9naXRodWIuY29tL2NyZXluZGVycy9k
aWpvbi1mcmFtZXdvcmspCistIFtyQXBwaWQuanNdKGh0dHA6Ly93d3cucmFwcGlkanMuY29tKQor
LSBbVGhvcmF4XShodHRwOi8vd2FsbWFydGxhYnMuZ2l0aHViLmNvbS90aG9yYXgvKQorLSBbS25v
Y2tvdXRKU10oaHR0cDovL2tub2Nrb3V0anMuY29tKSArIFtDbGFzc0JpbmRpbmdQcm92aWRlcl0o
aHR0cHM6Ly9naXRodWIuY29tL3JuaWVtZXllci9rbm9ja291dC1jbGFzc0JpbmRpbmdQcm92aWRl
cikgKHVzaW5nIFJ5YW4gTmllbWV5ZXIncyBDbGFzcyBCaW5kaW5nIFByb3ZpZGVyKQorLSBbS25v
Y2tvdXRKU10oaHR0cDovL2tub2Nrb3V0anMuY29tKSArIFtSZXF1aXJlSlNdKGh0dHA6Ly9yZXF1
aXJlanMub3JnKSAodXNpbmcgQU1EKQorLSBbQW5ndWxhckpTXShodHRwOi8vYW5ndWxhcmpzLm9y
ZykgKyBbUmVxdWlyZUpTXShodHRwOi8vcmVxdWlyZWpzLm9yZykgKHVzaW5nIEFNRCkKKy0gW0Nh
bkpTXShodHRwOi8vY2FuanMudXMpICsgW1JlcXVpcmVKU10oaHR0cDovL3JlcXVpcmVqcy5vcmcp
ICh1c2luZyBBTUQpCistIFtBbmd1bGFySlNdKGh0dHA6Ly9hbmd1bGFyanMub3JnKSAob3B0aW1p
emVkKQorLSBbQmFja2JvbmUueG1wcF0oaHR0cHM6Ly9naXRodWIuY29tL2dnb3phZC9CYWNrYm9u
ZS54bXBwKQorLSBbRGFydF0oaHR0cDovL2RhcnRsYW5nLm9yZykKKy0gW0NoYXBsaW5dKGh0dHA6
Ly9jaGFwbGluanMub3JnKSArIFtCcnVuY2hdKGh0dHA6Ly9icnVuY2guaW8pCistIFtTZXJlbmFk
ZS5qc10oaHR0cHM6Ly9naXRodWIuY29tL2VsYWJzL3NlcmVuYWRlLmpzKQorLSBbVHlwZVNjcmlw
dF0oaHR0cDovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvKQorLSBbRGVmdEpTXShodHRwOi8vZGVm
dGpzLm9yZy8pCistIFtBcmlhIFRlbXBsYXRlc10oaHR0cDovL2FyaWF0ZW1wbGF0ZXMuY29tLykK
Ky0gW0VueW8gKyBCYWNrYm9uZS5qc10oaHR0cDovL2VueW9qcy5jb20vKQorLSBbU0FQVUk1XSho
dHRwOi8vc2NuLnNhcC5jb20vY29tbXVuaXR5L2RldmVsb3Blci1jZW50ZXIvZnJvbnQtZW5kKQor
CisjIyBMaXZlIGRlbW9zCisKK0xpdmUgZGVtb3MgYXJlIGF2YWlsYWJsZSBvbiBvdXIgW3dlYnNp
dGVdKGh0dHA6Ly90b2RvbXZjLmNvbSkKKworCisjIyBTY3JlZW5zaG90CisKKyFbc2NyZWVuc2hv
dF0oaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS90YXN0ZWpzL3RvZG9tdmMvZ2gtcGFnZXMvc2l0ZS1h
c3NldHMvc2NyZWVuc2hvdC5wbmcpCisKKworIyMgVGVhbQorCitUb2RvTVZDIHdvdWxkIG5vdCBi
ZSBwb3NzaWJsZSB3aXRob3V0IGEgc3Ryb25nIHRlYW0gb2YgW2NvbnRyaWJ1dG9yc10oaHR0cHM6
Ly9naXRodWIuY29tL3Rhc3RlanMvdG9kb212Yy9jb250cmlidXRvcnMpIGhlbHBpbmcgcHVzaCB0
aGUgcHJvamVjdCBmb3J3YXJkIGVhY2ggZGF5LiBJbiBhZGRpdGlvbiwgd2UgaGF2ZSBhIGNvcmUg
cHJvamVjdCB0ZWFtIGNvbXBvc2VkIG9mOgorCisjIyMjIFtBZGR5IE9zbWFuaV0oaHR0cDovL2dp
dGh1Yi5jb20vYWRkeW9zbWFuaSkgLSBGb3VuZGVyL0xlYWQKKworPGltZyBhbGlnbj0ibGVmdCIg
d2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBzcmM9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRh
ci85NjI3MGU0YzNlNWU5ODA2Y2Y3MjQ1NDc1YzAwYjI3NS5wbmc/cz00MCI+CitBZGR5IGlzIGEg
RGV2ZWxvcGVyIFBsYXRmb3JtIEVuZ2luZWVyIGF0IEdvb2dsZSB3aG8gb3JpZ2luYWxseSBjcmVh
dGVkIFRvZG9NVkMuIEhlIG92ZXJzZWVzIHRoZSBwcm9qZWN0IGRpcmVjdGlvbiwgZHJpdmVzIGV4
cGFuc2lvbiBhbmQgaGVscHMgbGVhZCBjb3JlIGRldmVsb3BtZW50IHdpdGggU2luZHJlIFNvcmh1
cyAoYnkgZmFyIG91ciBtb3N0IGFjdGl2ZSBjb250cmlidXRvciEpLgorCisjIyMjIFtTaW5kcmUg
U29yaHVzXShodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzKSAtIExlYWQgRGV2ZWxvcGVy
CisKKzxpbWcgYWxpZ249ImxlZnQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgc3JjPSJodHRwOi8v
d3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvZDM2YTkyMjM3Yzc1YzUzMzdjMTdiNjBkOTA2ODZiZjku
cG5nP3M9NDAiPgorU2luZHJlIGlzIGEgV2ViIERldmVsb3BlciB3aG8gZHJpdmVzIGNvcmUgZGV2
ZWxvcG1lbnQsIHF1YWxpdHkgY29udHJvbCBhbmQgYXBwbGljYXRpb24gZGVzaWduIGZvciB0aGUg
cHJvamVjdC4gSGlzIGNvbnRyaWJ1dGlvbnMgaGF2ZSBoZWxwZWQgdXMgZW5zdXJlIGNvbnNpc3Rl
bmN5IGFuZCBiZXN0IHByYWN0aWNlcyBhcmUgZW5mb3JjZWQgd2hlcmV2ZXIgcG9zc2libGUuCisK
KyMjIyMgW1Bhc2NhbCBIYXJ0aWddKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXNzeSkgLSBEZXZlbG9w
ZXIKKworPGltZyBhbGlnbj0ibGVmdCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBzcmM9Imh0dHA6
Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci9iZTQ1MWZjZGJmMGU1ZmYwN2YyM2VkMTZjYjVjOTBh
My5wbmc/cz00MCI+CitQYXNjYWwgaXMgYSBTb2Z0d2FyZSBFbmdpbmVlciBhdCB3ZWx1c2UgR21i
SCB3aXRoIGEgZGVlcCBwYXNzaW9uIGZvciBjb25zaXN0ZW5jeS4gSGUgd2F0Y2hlcyBwdWxsIHJl
cXVlc3RzIGFuZCBoZWxwcyBkZXZlbG9wZXJzIGdldHRpbmcgdGhlaXIgY29udHJpYnV0aW9ucyBp
bnRlZ3JhdGVkIHdpdGggVG9kb01WQy4KKworIyMjIyBbU3RlcGhlbiBTYXdjaHVrXShodHRwczov
L2dpdGh1Yi5jb20vc3RlcGhlbnBsdXNwbHVzKSAtIERldmVsb3BlcgorCis8aW1nIGFsaWduPSJs
ZWZ0IiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHNyYz0iaHR0cHM6Ly9zZWN1cmUuZ3JhdmF0YXIu
Y29tL2F2YXRhci8wOThjZmUyZDM2MGU3N2MzMjI5ZjJjZDUyOTgzNTRjND9zPTQwIj4KK1N0ZXBo
ZW4gaXMgYSBGcm9udC1lbmQgRW5naW5lZXIgYXQgUXVpY2tlbiBMb2FucyB0aGF0IGNhcmVzIGFi
b3V0IGltcHJvdmluZyB0aGUgbWFpbnRhaW5hYmlsaXR5IGFuZCBkZXZlbG9wZXIgZXhwZXJpZW5j
ZSBvZiBvcGVuLXNvdXJjZSBwcm9qZWN0cy4gSGlzIHJlY2VudCBjb250cmlidXRpb25zIGluY2x1
ZGUgaGVscGluZyB1cyBtb3ZlIGFsbCBhcHBzIG92ZXIgdG8gdXNpbmcgQm93ZXIgYW5kIGltcGxl
bWVudGluZyB0aGUgbmV3IGluZm9ybWF0aW9uIGJhci4KKworIyMjIyBbR2lhbm5pIENoaWFwcGV0
dGFdKGh0dHBzOi8vZ2l0aHViLmNvbS9nZjMpIC0gTG9nbyBkZXNpZ25lcgorCis8aW1nIGFsaWdu
PSJsZWZ0IiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHNyYz0iaHR0cDovL3d3dy5ncmF2YXRhci5j
b20vYXZhdGFyLzRiMDIwOWFlMzY1MmNjNWE3ZDUzNTQ1ZTc1OWZiZTM5LnBuZz9zPTQwIj4KK0dp
YW5uaSBpcyBhIHByb2dyYW1tZXIgYW5kIGRlc2lnbmVyIGN1cnJlbnRseSB3b3JraW5nIGFzIHRo
ZSBDaGllZiBSaWdnZXIgYXQgTWV0YUxhYi4KKworIyMgRGlzY2xhaW1lcgorCis8aW1nIGFsaWdu
PSJyaWdodCIgd2lkdGg9IjIzMCIgaGVpZ2h0PSIyMzAiIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVi
LmNvbS90YXN0ZWpzL3RvZG9tdmMvZ2gtcGFnZXMvbWVkaWEvaWNvbi1zbWFsbC5wbmciPgorCitU
b2RvTVZDIGhhcyBiZWVuIGNhbGxlZCBtYW55IHRoaW5ncyBpbmNsdWRpbmcgdGhlICdTcGVlZC1k
YXRpbmcnIGFuZCAnUm9zZXR0YSBTdG9uZScgb2YgTVYqIGZyYW1ld29ya3MuIFdoaWxzdCB3ZSBo
b3BlIHRoYXQgdGhpcyBwcm9qZWN0IGlzIGFibGUgdG8gb2ZmZXIgYXNzaXN0YW5jZSBpbiBkZWNp
ZGluZyB3aGF0IGZyYW1ld29ya3MgYXJlIHdvcnRoIHNwZW5kaW5nIG1vcmUgdGltZSBsb29raW5n
IGF0LCByZW1lbWJlciB0aGF0IHRoZSBUb2RvIGFwcGxpY2F0aW9uIG9mZmVycyBhIGxpbWl0ZWQg
dmlldyBvZiB3aGF0IGEgZnJhbWV3b3JrIG1heSBiZSBjYXBhYmxlIG9mLgorCitJdCBpcyBtZWFu
dCB0byBiZSB1c2VkIGFzIGEgZ2F0ZXdheSB0byByZXZpZXdpbmcgaG93IGEgYmFzaWMgYXBwbGlj
YXRpb24gdXNpbmcgYSBmcmFtZXdvcmsgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHdlIGhlYXZpbHkg
cmVjb21tZW5kIGludmVzdGluZyB0aW1lIHJlc2VhcmNoaW5nIGEgc29sdXRpb24gaW4gbW9yZSBk
ZXB0aCBiZWZvcmUgb3B0aW5nIHRvIHVzZSBpdC4KKworCisjIyBHZXR0aW5nIEludm9sdmVkCisK
K1doaWxzdCB3ZSBlbmpveSBpbXBsZW1lbnRpbmcgYW5kIGltcHJvdmluZyBleGlzdGluZyBUb2Rv
IGFwcHMsIHdlJ3JlIGFsd2F5cyBpbnRlcmVzdGVkIGluIHNwZWFraW5nIHRvIGZyYW1ld29yayBh
dXRob3JzIChhbmQgdXNlcnMpIHdpc2hpbmcgdG8gc2hhcmUgVG9kbyBhcHAgaW1wbGVtZW50YXRp
b25zIGluIHRoZWlyIGZyYW1ld29yay9zb2x1dGlvbiBvZiBjaG9pY2UuCisKK0NoZWNrIG91dCBv
dXIgW2NvbnRyaWJ1dGlvbiBkb2NzXShjb250cmlidXRpbmcubWQpIGZvciBtb3JlIGluZm8uCisK
KworIyMgTGljZW5zZQorCitFdmVyeXRoaW5nIGluIHRoaXMgcmVwbyBpcyBNSVQgTGljZW5zZSB1
bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4KKworTUlUIMKpIEFkZHkgT3NtYW5pLCBTaW5kcmUg
U29yaHVzLCBQYXNjYWwgSGFydGlnLCBTdGVwaGVuIFNhd2NodWsuCkluZGV4OiBQZXJmb3JtYW5j
ZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyLmpzb24KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFu
Y2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlci5qc29uCShyZXZpc2lvbiAwKQorKysgUGVyZm9y
bWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlci5qc29uCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTEgQEAKK3sKKyAgIm5hbWUiOiAidG9kb212Yy1iYWNrYm9uZSIsCisgICJ2ZXJzaW9u
IjogIjAuMC4wIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYmFja2JvbmUiOiAifjEuMC4w
IiwKKyAgICAidW5kZXJzY29yZSI6ICJ+MS40LjQiLAorICAgICJqcXVlcnkiOiAifjEuOS4xIiwK
KyAgICAidG9kb212Yy1jb21tb24iOiAifjAuMS40IiwKKyAgICAiYmFja2JvbmUubG9jYWxTdG9y
YWdlIjogIn4xLjEuMCIKKyAgfQorfQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0
ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNr
Ym9uZS9pbmRleC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxl
dGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFj
a2JvbmUvaW5kZXguaHRtbAkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29t
cGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
YmFja2JvbmUvaW5kZXguaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0IEBACis8IWRv
Y3R5cGUgaHRtbD4KKzxodG1sIGxhbmc9ImVuIiBkYXRhLWZyYW1ld29yaz0iYmFja2JvbmVqcyI+
CisgICAgPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAt
ZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPHRpdGxlPkJh
Y2tib25lLmpzIOKAoiBUb2RvTVZDPC90aXRsZT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQi
IGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MiPgorICAgIDwv
aGVhZD4KKyAgICA8Ym9keT4KKyAgICA8c2VjdGlvbiBpZD0idG9kb2FwcCI+CisgICAgPGhlYWRl
ciBpZD0iaGVhZGVyIj4KKyAgICA8aDE+dG9kb3M8L2gxPgorICAgIDxpbnB1dCBpZD0ibmV3LXRv
ZG8iIHBsYWNlaG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/IiBhdXRvZm9jdXM+CisgICAg
PC9oZWFkZXI+CisgICAgPHNlY3Rpb24gaWQ9Im1haW4iPgorICAgIDxpbnB1dCBpZD0idG9nZ2xl
LWFsbCIgdHlwZT0iY2hlY2tib3giPgorICAgIDxsYWJlbCBmb3I9InRvZ2dsZS1hbGwiPk1hcmsg
YWxsIGFzIGNvbXBsZXRlPC9sYWJlbD4KKyAgICA8dWwgaWQ9InRvZG8tbGlzdCI+PC91bD4KKyAg
ICA8L3NlY3Rpb24+CisgICAgPGZvb3RlciBpZD0iZm9vdGVyIj48L2Zvb3Rlcj4KKyAgICA8L3Nl
Y3Rpb24+CisgICAgPGZvb3RlciBpZD0iaW5mbyI+CisgICAgPHA+RG91YmxlLWNsaWNrIHRvIGVk
aXQgYSB0b2RvPC9wPgorICAgIDxwPldyaXR0ZW4gYnkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu
Y29tL2FkZHlvc21hbmkiPkFkZHkgT3NtYW5pPC9hPjwvcD4KKyAgICA8cD5QYXJ0IG9mIDxhIGhy
ZWY9Imh0dHA6Ly90b2RvbXZjLmNvbSI+VG9kb01WQzwvYT48L3A+CisgICAgPC9mb290ZXI+Cisg
ICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3RlbXBsYXRlIiBpZD0iaXRlbS10ZW1wbGF0ZSI+CisgICAg
PGRpdiBjbGFzcz0idmlldyI+CisgICAgPGlucHV0IGNsYXNzPSJ0b2dnbGUiIHR5cGU9ImNoZWNr
Ym94IiA8JT0gY29tcGxldGVkID8gJ2NoZWNrZWQnIDogJycgJT4+CisgICAgPGxhYmVsPjwlLSB0
aXRsZSAlPjwvbGFiZWw+CisgICAgPGJ1dHRvbiBjbGFzcz0iZGVzdHJveSI+PC9idXR0b24+Cisg
ICAgPC9kaXY+CisgICAgPGlucHV0IGNsYXNzPSJlZGl0IiB2YWx1ZT0iPCUtIHRpdGxlICU+Ij4K
KyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvdGVtcGxhdGUiIGlkPSJzdGF0
cy10ZW1wbGF0ZSI+CisgICAgPHNwYW4gaWQ9InRvZG8tY291bnQiPjxzdHJvbmc+PCU9IHJlbWFp
bmluZyAlPjwvc3Ryb25nPiA8JT0gcmVtYWluaW5nID09PSAxID8gJ2l0ZW0nIDogJ2l0ZW1zJyAl
PiBsZWZ0PC9zcGFuPgorICAgIDx1bCBpZD0iZmlsdGVycyI+CisgICAgPGxpPgorICAgIDxhIGNs
YXNzPSJzZWxlY3RlZCIgaHJlZj0iIy8iPkFsbDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAg
ICA8YSBocmVmPSIjL2FjdGl2ZSI+QWN0aXZlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAg
IDxhIGhyZWY9IiMvY29tcGxldGVkIj5Db21wbGV0ZWQ8L2E+CisgICAgPC9saT4KKyAgICA8L3Vs
PgorICAgIDwlIGlmIChjb21wbGV0ZWQpIHsgJT4KKyAgICA8YnV0dG9uIGlkPSJjbGVhci1jb21w
bGV0ZWQiPkNsZWFyIGNvbXBsZXRlZCAoPCU9IGNvbXBsZXRlZCAlPik8L2J1dHRvbj4KKyAgICA8
JSB9ICU+CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMv
dG9kb212Yy1jb21tb24vYmFzZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJvd2Vy
X2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
ImJvd2VyX2NvbXBvbmVudHMvdW5kZXJzY29yZS91bmRlcnNjb3JlLmpzIj48L3NjcmlwdD4KKyAg
ICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9iYWNrYm9uZS9iYWNrYm9uZS5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYmFja2JvbmUubG9jYWxT
dG9yYWdlL2JhY2tib25lLmxvY2FsU3RvcmFnZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9ImpzL21vZGVscy90b2RvLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0ianMvY29s
bGVjdGlvbnMvdG9kb3MuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJqcy92aWV3cy90
b2RvLXZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJqcy92aWV3cy9hcHAtdmll
dy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImpzL3JvdXRlcnMvcm91dGVyLmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0ianMvYXBwLmpzIj48L3NjcmlwdD4KKyAgICA8L2Jv
ZHk+Cis8L2h0bWw+CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxp
c3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL3JlYWRt
ZS5tZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxp
c3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL3JlYWRt
ZS5tZAkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVh
bGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvcmVh
ZG1lLm1kCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjkgQEAKKyMgQmFja2JvbmUuanMgVG9k
b01WQyBFeGFtcGxlCisKKz4gQmFja2JvbmUuanMgZ2l2ZXMgc3RydWN0dXJlIHRvIHdlYiBhcHBs
aWNhdGlvbnMgYnkgcHJvdmlkaW5nIG1vZGVscyB3aXRoIGtleS12YWx1ZSBiaW5kaW5nIGFuZCBj
dXN0b20gZXZlbnRzLCBjb2xsZWN0aW9ucyB3aXRoIGEgcmljaCBBUEkgb2YgZW51bWVyYWJsZSBm
dW5jdGlvbnMsIHZpZXdzIHdpdGggZGVjbGFyYXRpdmUgZXZlbnQgaGFuZGxpbmcsIGFuZCBjb25u
ZWN0cyBpdCBhbGwgdG8geW91ciBleGlzdGluZyBBUEkgb3ZlciBhIFJFU1RmdWwgSlNPTiBpbnRl
cmZhY2UuCisKKz4gX1tCYWNrYm9uZS5qcyAtIGJhY2tib25lanMub3JnXShodHRwOi8vYmFja2Jv
bmVqcy5vcmcpXworCisKKyMjIExlYXJuaW5nIEJhY2tib25lLmpzCisKK1RoZSBbQmFja2JvbmUu
anMgd2Vic2l0ZV0oaHR0cDovL2JhY2tib25lanMub3JnKSBpcyBhIGdyZWF0IHJlc291cmNlIGZv
ciBnZXR0aW5nIHN0YXJ0ZWQuCisKK0hlcmUgYXJlIHNvbWUgbGlua3MgeW91IG1heSBmaW5kIGhl
bHBmdWw6CisKKyogW0Fubm90YXRlZCBzb3VyY2UgY29kZV0oaHR0cDovL2JhY2tib25lanMub3Jn
L2RvY3MvYmFja2JvbmUuaHRtbCkKKyogW0FwcGxpY2F0aW9ucyBidWlsdCB3aXRoIEJhY2tib25l
LmpzXShodHRwOi8vYmFja2JvbmVqcy5vcmcvI2V4YW1wbGVzKQorKiBbRkFRXShodHRwOi8vYmFj
a2JvbmVqcy5vcmcvI2ZhcSkKKworQXJ0aWNsZXMgYW5kIGd1aWRlcyBmcm9tIHRoZSBjb21tdW5p
dHk6CisKKyogW0RldmVsb3BpbmcgQmFja2JvbmUuanMgQXBwbGljYXRpb25zXShodHRwOi8vYWRk
eW9zbWFuaS5naXRodWIuaW8vYmFja2JvbmUtZnVuZGFtZW50YWxzKQorKiBbQ29sbGVjdGlvbiBv
ZiB0dXRvcmlhbHMsIGJsb2cgcG9zdHMsIGFuZCBleGFtcGxlIHNpdGVzXShodHRwczovL2dpdGh1
Yi5jb20vZG9jdW1lbnRjbG91ZC9iYWNrYm9uZS93aWtpL1R1dG9yaWFscyUyQy1ibG9nLXBvc3Rz
LWFuZC1leGFtcGxlLXNpdGVzKQorCitHZXQgaGVscCBmcm9tIG90aGVyIEJhY2tib25lLmpzIHVz
ZXJzOgorCisqIFtCYWNrYm9uZS5qcyBvbiBTdGFja092ZXJmbG93XShodHRwOi8vc3RhY2tvdmVy
Zmxvdy5jb20vcXVlc3Rpb25zL3RhZ2dlZC9iYWNrYm9uZS5qcykKKyogW0dvb2dsZSBHcm91cHMg
bWFpbGluZyBsaXN0XShodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLyMhZm9ydW0vYmFj
a2JvbmVqcykKKyogW0JhY2tib25lLmpzIG9uIFR3aXR0ZXJdKGh0dHA6Ly90d2l0dGVyLmNvbS9k
b2N1bWVudGNsb3VkKQorCitfSWYgeW91IGhhdmUgb3RoZXIgaGVscGZ1bCBsaW5rcyB0byBzaGFy
ZSwgb3IgZmluZCBhbnkgb2YgdGhlIGxpbmtzIGFib3ZlIG5vIGxvbmdlciB3b3JrLCBwbGVhc2Ug
W2xldCB1cyBrbm93XShodHRwczovL2dpdGh1Yi5jb20vdGFzdGVqcy90b2RvbXZjL2lzc3Vlcyku
XwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlcl9jb21wb25lbnRz
L2JhY2tib25lLmxvY2FsU3RvcmFnZS9iYWNrYm9uZS5sb2NhbFN0b3JhZ2UuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlcl9jb21wb25lbnRzL2Jh
Y2tib25lLmxvY2FsU3RvcmFnZS9iYWNrYm9uZS5sb2NhbFN0b3JhZ2UuanMJKHJldmlzaW9uIDAp
CisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBvbmVudHMvYmFj
a2JvbmUubG9jYWxTdG9yYWdlL2JhY2tib25lLmxvY2FsU3RvcmFnZS5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE5MiBAQAorLyoqCisgKiBCYWNrYm9uZSBsb2NhbFN0b3JhZ2UgQWRhcHRl
cgorICogVmVyc2lvbiAxLjEuMAorICoKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXJvbWVnbi9C
YWNrYm9uZS5sb2NhbFN0b3JhZ2UKKyAqLworKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7Cisg
ICBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CisgICAg
ICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCisgICAgICBkZWZpbmUo
WyJ1bmRlcnNjb3JlIiwiYmFja2JvbmUiXSwgZnVuY3Rpb24oXywgQmFja2JvbmUpIHsKKyAgICAg
ICAgLy8gVXNlIGdsb2JhbCB2YXJpYWJsZXMgaWYgdGhlIGxvY2FscyBpcyB1bmRlZmluZWQuCisg
ICAgICAgIHJldHVybiBmYWN0b3J5KF8gfHwgcm9vdC5fLCBCYWNrYm9uZSB8fCByb290LkJhY2ti
b25lKTsKKyAgICAgIH0pOworICAgfSBlbHNlIHsKKyAgICAgIC8vIFJlcXVpcmVKUyBpc24ndCBi
ZWluZyB1c2VkLiBBc3N1bWUgdW5kZXJzY29yZSBhbmQgYmFja2JvbmUgaXMgbG9hZGVkIGluIDxz
Y3JpcHQ+IHRhZ3MKKyAgICAgIGZhY3RvcnkoXywgQmFja2JvbmUpOworICAgfQorfSh0aGlzLCBm
dW5jdGlvbihfLCBCYWNrYm9uZSkgeworLy8gQSBzaW1wbGUgbW9kdWxlIHRvIHJlcGxhY2UgYEJh
Y2tib25lLnN5bmNgIHdpdGggKmxvY2FsU3RvcmFnZSotYmFzZWQKKy8vIHBlcnNpc3RlbmNlLiBN
b2RlbHMgYXJlIGdpdmVuIEdVSURTLCBhbmQgc2F2ZWQgaW50byBhIEpTT04gb2JqZWN0LiBTaW1w
bGUKKy8vIGFzIHRoYXQuCisKKy8vIEhvbGQgcmVmZXJlbmNlIHRvIFVuZGVyc2NvcmUuanMgYW5k
IEJhY2tib25lLmpzIGluIHRoZSBjbG9zdXJlIGluIG9yZGVyCisvLyB0byBtYWtlIHRoaW5ncyB3
b3JrIGV2ZW4gaWYgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBnbG9iYWwgbmFtZXNwYWNlCisK
Ky8vIEdlbmVyYXRlIGZvdXIgcmFuZG9tIGhleCBkaWdpdHMuCitmdW5jdGlvbiBTNCgpIHsKKyAg
IHJldHVybiAoKCgxK01hdGgucmFuZG9tKCkpKjB4MTAwMDApfDApLnRvU3RyaW5nKDE2KS5zdWJz
dHJpbmcoMSk7Cit9OworCisvLyBHZW5lcmF0ZSBhIHBzZXVkby1HVUlEIGJ5IGNvbmNhdGVuYXRp
bmcgcmFuZG9tIGhleGFkZWNpbWFsLgorZnVuY3Rpb24gZ3VpZCgpIHsKKyAgIHJldHVybiAoUzQo
KStTNCgpKyItIitTNCgpKyItIitTNCgpKyItIitTNCgpKyItIitTNCgpK1M0KCkrUzQoKSk7Cit9
OworCisvLyBPdXIgU3RvcmUgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgSlMgb2JqZWN0IGlu
ICpsb2NhbFN0b3JhZ2UqLiBDcmVhdGUgaXQKKy8vIHdpdGggYSBtZWFuaW5nZnVsIG5hbWUsIGxp
a2UgdGhlIG5hbWUgeW91J2QgZ2l2ZSBhIHRhYmxlLgorLy8gd2luZG93LlN0b3JlIGlzIGRlcHJl
Y3RhdGVkLCB1c2UgQmFja2JvbmUuTG9jYWxTdG9yYWdlIGluc3RlYWQKK0JhY2tib25lLkxvY2Fs
U3RvcmFnZSA9IHdpbmRvdy5TdG9yZSA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgdGhpcy5uYW1lID0g
bmFtZTsKKyAgdmFyIHN0b3JlID0gdGhpcy5sb2NhbFN0b3JhZ2UoKS5nZXRJdGVtKHRoaXMubmFt
ZSk7CisgIHRoaXMucmVjb3JkcyA9IChzdG9yZSAmJiBzdG9yZS5zcGxpdCgiLCIpKSB8fCBbXTsK
K307CisKK18uZXh0ZW5kKEJhY2tib25lLkxvY2FsU3RvcmFnZS5wcm90b3R5cGUsIHsKKworICAv
LyBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSAqKlN0b3JlKiogdG8gKmxvY2FsU3RvcmFn
ZSouCisgIHNhdmU6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMubG9jYWxTdG9yYWdlKCkuc2V0SXRl
bSh0aGlzLm5hbWUsIHRoaXMucmVjb3Jkcy5qb2luKCIsIikpOworICB9LAorCisgIC8vIEFkZCBh
IG1vZGVsLCBnaXZpbmcgaXQgYSAoaG9wZWZ1bGx5KS11bmlxdWUgR1VJRCwgaWYgaXQgZG9lc24n
dCBhbHJlYWR5CisgIC8vIGhhdmUgYW4gaWQgb2YgaXQncyBvd24uCisgIGNyZWF0ZTogZnVuY3Rp
b24obW9kZWwpIHsKKyAgICBpZiAoIW1vZGVsLmlkKSB7CisgICAgICBtb2RlbC5pZCA9IGd1aWQo
KTsKKyAgICAgIG1vZGVsLnNldChtb2RlbC5pZEF0dHJpYnV0ZSwgbW9kZWwuaWQpOworICAgIH0K
KyAgICB0aGlzLmxvY2FsU3RvcmFnZSgpLnNldEl0ZW0odGhpcy5uYW1lKyItIittb2RlbC5pZCwg
SlNPTi5zdHJpbmdpZnkobW9kZWwpKTsKKyAgICB0aGlzLnJlY29yZHMucHVzaChtb2RlbC5pZC50
b1N0cmluZygpKTsKKyAgICB0aGlzLnNhdmUoKTsKKyAgICByZXR1cm4gdGhpcy5maW5kKG1vZGVs
KTsKKyAgfSwKKworICAvLyBVcGRhdGUgYSBtb2RlbCBieSByZXBsYWNpbmcgaXRzIGNvcHkgaW4g
YHRoaXMuZGF0YWAuCisgIHVwZGF0ZTogZnVuY3Rpb24obW9kZWwpIHsKKyAgICB0aGlzLmxvY2Fs
U3RvcmFnZSgpLnNldEl0ZW0odGhpcy5uYW1lKyItIittb2RlbC5pZCwgSlNPTi5zdHJpbmdpZnko
bW9kZWwpKTsKKyAgICBpZiAoIV8uaW5jbHVkZSh0aGlzLnJlY29yZHMsIG1vZGVsLmlkLnRvU3Ry
aW5nKCkpKQorICAgICAgdGhpcy5yZWNvcmRzLnB1c2gobW9kZWwuaWQudG9TdHJpbmcoKSk7IHRo
aXMuc2F2ZSgpOworICAgIHJldHVybiB0aGlzLmZpbmQobW9kZWwpOworICB9LAorCisgIC8vIFJl
dHJpZXZlIGEgbW9kZWwgZnJvbSBgdGhpcy5kYXRhYCBieSBpZC4KKyAgZmluZDogZnVuY3Rpb24o
bW9kZWwpIHsKKyAgICByZXR1cm4gdGhpcy5qc29uRGF0YSh0aGlzLmxvY2FsU3RvcmFnZSgpLmdl
dEl0ZW0odGhpcy5uYW1lKyItIittb2RlbC5pZCkpOworICB9LAorCisgIC8vIFJldHVybiB0aGUg
YXJyYXkgb2YgYWxsIG1vZGVscyBjdXJyZW50bHkgaW4gc3RvcmFnZS4KKyAgZmluZEFsbDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIF8odGhpcy5yZWNvcmRzKS5jaGFpbigpCisgICAgICAubWFw
KGZ1bmN0aW9uKGlkKXsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNvbkRhdGEodGhpcy5sb2NhbFN0
b3JhZ2UoKS5nZXRJdGVtKHRoaXMubmFtZSsiLSIraWQpKTsKKyAgICAgIH0sIHRoaXMpCisgICAg
ICAuY29tcGFjdCgpCisgICAgICAudmFsdWUoKTsKKyAgfSwKKworICAvLyBEZWxldGUgYSBtb2Rl
bCBmcm9tIGB0aGlzLmRhdGFgLCByZXR1cm5pbmcgaXQuCisgIGRlc3Ryb3k6IGZ1bmN0aW9uKG1v
ZGVsKSB7CisgICAgaWYgKG1vZGVsLmlzTmV3KCkpCisgICAgICByZXR1cm4gZmFsc2UKKyAgICB0
aGlzLmxvY2FsU3RvcmFnZSgpLnJlbW92ZUl0ZW0odGhpcy5uYW1lKyItIittb2RlbC5pZCk7Cisg
ICAgdGhpcy5yZWNvcmRzID0gXy5yZWplY3QodGhpcy5yZWNvcmRzLCBmdW5jdGlvbihpZCl7Cisg
ICAgICByZXR1cm4gaWQgPT09IG1vZGVsLmlkLnRvU3RyaW5nKCk7CisgICAgfSk7CisgICAgdGhp
cy5zYXZlKCk7CisgICAgcmV0dXJuIG1vZGVsOworICB9LAorCisgIGxvY2FsU3RvcmFnZTogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTsKKyAgfSwKKyAgCisgIC8vIGZpeCBm
b3IgImlsbGVnYWwgYWNjZXNzIiBlcnJvciBvbiBBbmRyb2lkIHdoZW4gSlNPTi5wYXJzZSBpcyBw
YXNzZWQgbnVsbAorICBqc29uRGF0YTogZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgIHJldHVybiBk
YXRhICYmIEpTT04ucGFyc2UoZGF0YSk7CisgIH0KKworfSk7CisKKy8vIGxvY2FsU3luYyBkZWxl
Z2F0ZSB0byB0aGUgbW9kZWwgb3IgY29sbGVjdGlvbidzCisvLyAqbG9jYWxTdG9yYWdlKiBwcm9w
ZXJ0eSwgd2hpY2ggc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIGBTdG9yZWAuCisvLyB3aW5kb3cu
U3RvcmUuc3luYyBhbmQgQmFja2JvbmUubG9jYWxTeW5jIGlzIGRlcHJlY3RhdGVkLCB1c2UgQmFj
a2JvbmUuTG9jYWxTdG9yYWdlLnN5bmMgaW5zdGVhZAorQmFja2JvbmUuTG9jYWxTdG9yYWdlLnN5
bmMgPSB3aW5kb3cuU3RvcmUuc3luYyA9IEJhY2tib25lLmxvY2FsU3luYyA9IGZ1bmN0aW9uKG1l
dGhvZCwgbW9kZWwsIG9wdGlvbnMpIHsKKyAgdmFyIHN0b3JlID0gbW9kZWwubG9jYWxTdG9yYWdl
IHx8IG1vZGVsLmNvbGxlY3Rpb24ubG9jYWxTdG9yYWdlOworCisgIHZhciByZXNwLCBlcnJvck1l
c3NhZ2UsIHN5bmNEZmQgPSAkLkRlZmVycmVkICYmICQuRGVmZXJyZWQoKTsgLy9JZiAkIGlzIGhh
dmluZyBEZWZlcnJlZCAtIHVzZSBpdC4gCisKKyAgdHJ5IHsKKworICAgIHN3aXRjaCAobWV0aG9k
KSB7CisgICAgICBjYXNlICJyZWFkIjoKKyAgICAgICAgcmVzcCA9IG1vZGVsLmlkICE9IHVuZGVm
aW5lZCA/IHN0b3JlLmZpbmQobW9kZWwpIDogc3RvcmUuZmluZEFsbCgpOworICAgICAgICBicmVh
azsKKyAgICAgIGNhc2UgImNyZWF0ZSI6CisgICAgICAgIHJlc3AgPSBzdG9yZS5jcmVhdGUobW9k
ZWwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgInVwZGF0ZSI6CisgICAgICAgIHJlc3Ag
PSBzdG9yZS51cGRhdGUobW9kZWwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImRlbGV0
ZSI6CisgICAgICAgIHJlc3AgPSBzdG9yZS5kZXN0cm95KG1vZGVsKTsKKyAgICAgICAgYnJlYWs7
CisgICAgfQorCisgIH0gY2F0Y2goZXJyb3IpIHsKKyAgICBpZiAoZXJyb3IuY29kZSA9PT0gRE9N
RXhjZXB0aW9uLlFVT1RBX0VYQ0VFREVEX0VSUiAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLmxlbmd0
aCA9PT0gMCkKKyAgICAgIGVycm9yTWVzc2FnZSA9ICJQcml2YXRlIGJyb3dzaW5nIGlzIHVuc3Vw
cG9ydGVkIjsKKyAgICBlbHNlCisgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlOwor
ICB9CisKKyAgaWYgKHJlc3ApIHsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnN1Y2Nlc3Mp
CisgICAgICBpZiAoQmFja2JvbmUuVkVSU0lPTiA9PT0gIjAuOS4xMCIpIHsKKyAgICAgICAgb3B0
aW9ucy5zdWNjZXNzKG1vZGVsLCByZXNwLCBvcHRpb25zKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIG9wdGlvbnMuc3VjY2VzcyhyZXNwKTsKKyAgICAgIH0KKyAgICBpZiAoc3luY0RmZCkKKyAg
ICAgIHN5bmNEZmQucmVzb2x2ZShyZXNwKTsKKworICB9IGVsc2UgeworICAgIGVycm9yTWVzc2Fn
ZSA9IGVycm9yTWVzc2FnZSA/IGVycm9yTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6ICJSZWNvcmQgTm90IEZvdW5kIjsKKyAgICAKKyAgICBpZiAob3B0aW9ucyAmJiBv
cHRpb25zLmVycm9yKQorICAgICAgaWYgKEJhY2tib25lLlZFUlNJT04gPT09ICIwLjkuMTAiKSB7
CisgICAgICAgIG9wdGlvbnMuZXJyb3IobW9kZWwsIGVycm9yTWVzc2FnZSwgb3B0aW9ucyk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBvcHRpb25zLmVycm9yKGVycm9yTWVzc2FnZSk7CisgICAg
ICB9CisgICAgICAKKyAgICBpZiAoc3luY0RmZCkKKyAgICAgIHN5bmNEZmQucmVqZWN0KGVycm9y
TWVzc2FnZSk7CisgIH0KKyAgCisgIC8vIGFkZCBjb21wYXRpYmlsaXR5IHdpdGggJC5hamF4Cisg
IC8vIGFsd2F5cyBleGVjdXRlIGNhbGxiYWNrIGZvciBzdWNjZXNzIGFuZCBlcnJvcgorICBpZiAo
b3B0aW9ucyAmJiBvcHRpb25zLmNvbXBsZXRlKSBvcHRpb25zLmNvbXBsZXRlKHJlc3ApOworCisg
IHJldHVybiBzeW5jRGZkICYmIHN5bmNEZmQucHJvbWlzZSgpOworfTsKKworQmFja2JvbmUuYWph
eFN5bmMgPSBCYWNrYm9uZS5zeW5jOworCitCYWNrYm9uZS5nZXRTeW5jTWV0aG9kID0gZnVuY3Rp
b24obW9kZWwpIHsKKyAgaWYobW9kZWwubG9jYWxTdG9yYWdlIHx8IChtb2RlbC5jb2xsZWN0aW9u
ICYmIG1vZGVsLmNvbGxlY3Rpb24ubG9jYWxTdG9yYWdlKSkgeworICAgIHJldHVybiBCYWNrYm9u
ZS5sb2NhbFN5bmM7CisgIH0KKworICByZXR1cm4gQmFja2JvbmUuYWpheFN5bmM7Cit9OworCisv
LyBPdmVycmlkZSAnQmFja2JvbmUuc3luYycgdG8gZGVmYXVsdCB0byBsb2NhbFN5bmMsCisvLyB0
aGUgb3JpZ2luYWwgJ0JhY2tib25lLnN5bmMnIGlzIHN0aWxsIGF2YWlsYWJsZSBpbiAnQmFja2Jv
bmUuYWpheFN5bmMnCitCYWNrYm9uZS5zeW5jID0gZnVuY3Rpb24obWV0aG9kLCBtb2RlbCwgb3B0
aW9ucykgeworICByZXR1cm4gQmFja2JvbmUuZ2V0U3luY01ldGhvZChtb2RlbCkuYXBwbHkodGhp
cywgW21ldGhvZCwgbW9kZWwsIG9wdGlvbnNdKTsKK307CisKK3JldHVybiBCYWNrYm9uZS5Mb2Nh
bFN0b3JhZ2U7Cit9KSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDogUGVyZm9y
bWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlcl9jb21wb25lbnRzL2JhY2tib25lL2JhY2ti
b25lLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVh
bGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93
ZXJfY29tcG9uZW50cy9iYWNrYm9uZS9iYWNrYm9uZS5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZv
cm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy9iYWNrYm9uZS9iYWNr
Ym9uZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NzEgQEAKKy8vICAgICBCYWNrYm9u
ZS5qcyAxLjAuMAorCisvLyAgICAgKGMpIDIwMTAtMjAxMyBKZXJlbXkgQXNoa2VuYXMsIERvY3Vt
ZW50Q2xvdWQgSW5jLgorLy8gICAgIEJhY2tib25lIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQg
dW5kZXIgdGhlIE1JVCBsaWNlbnNlLgorLy8gICAgIEZvciBhbGwgZGV0YWlscyBhbmQgZG9jdW1l
bnRhdGlvbjoKKy8vICAgICBodHRwOi8vYmFja2JvbmVqcy5vcmcKKworKGZ1bmN0aW9uKCl7CisK
KyAgLy8gSW5pdGlhbCBTZXR1cAorICAvLyAtLS0tLS0tLS0tLS0tCisKKyAgLy8gU2F2ZSBhIHJl
ZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIGBl
eHBvcnRzYAorICAvLyBvbiB0aGUgc2VydmVyKS4KKyAgdmFyIHJvb3QgPSB0aGlzOworCisgIC8v
IFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBgQmFja2JvbmVgIHZhcmlhYmxlLCBzbyB0
aGF0IGl0IGNhbiBiZQorICAvLyByZXN0b3JlZCBsYXRlciBvbiwgaWYgYG5vQ29uZmxpY3RgIGlz
IHVzZWQuCisgIHZhciBwcmV2aW91c0JhY2tib25lID0gcm9vdC5CYWNrYm9uZTsKKworICAvLyBD
cmVhdGUgbG9jYWwgcmVmZXJlbmNlcyB0byBhcnJheSBtZXRob2RzIHdlJ2xsIHdhbnQgdG8gdXNl
IGxhdGVyLgorICB2YXIgYXJyYXkgPSBbXTsKKyAgdmFyIHB1c2ggPSBhcnJheS5wdXNoOworICB2
YXIgc2xpY2UgPSBhcnJheS5zbGljZTsKKyAgdmFyIHNwbGljZSA9IGFycmF5LnNwbGljZTsKKwor
ICAvLyBUaGUgdG9wLWxldmVsIG5hbWVzcGFjZS4gQWxsIHB1YmxpYyBCYWNrYm9uZSBjbGFzc2Vz
IGFuZCBtb2R1bGVzIHdpbGwKKyAgLy8gYmUgYXR0YWNoZWQgdG8gdGhpcy4gRXhwb3J0ZWQgZm9y
IGJvdGggdGhlIGJyb3dzZXIgYW5kIHRoZSBzZXJ2ZXIuCisgIHZhciBCYWNrYm9uZTsKKyAgaWYg
KHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykgeworICAgIEJhY2tib25lID0gZXhwb3J0
czsKKyAgfSBlbHNlIHsKKyAgICBCYWNrYm9uZSA9IHJvb3QuQmFja2JvbmUgPSB7fTsKKyAgfQor
CisgIC8vIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gS2VlcCBpbiBzeW5jIHdpdGgg
YHBhY2thZ2UuanNvbmAuCisgIEJhY2tib25lLlZFUlNJT04gPSAnMS4wLjAnOworCisgIC8vIFJl
cXVpcmUgVW5kZXJzY29yZSwgaWYgd2UncmUgb24gdGhlIHNlcnZlciwgYW5kIGl0J3Mgbm90IGFs
cmVhZHkgcHJlc2VudC4KKyAgdmFyIF8gPSByb290Ll87CisgIGlmICghXyAmJiAodHlwZW9mIHJl
cXVpcmUgIT09ICd1bmRlZmluZWQnKSkgXyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUnKTsKKworICAv
LyBGb3IgQmFja2JvbmUncyBwdXJwb3NlcywgalF1ZXJ5LCBaZXB0bywgRW5kZXIsIG9yIE15IExp
YnJhcnkgKGtpZGRpbmcpIG93bnMKKyAgLy8gdGhlIGAkYCB2YXJpYWJsZS4KKyAgQmFja2JvbmUu
JCA9IHJvb3QualF1ZXJ5IHx8IHJvb3QuWmVwdG8gfHwgcm9vdC5lbmRlciB8fCByb290LiQ7CisK
KyAgLy8gUnVucyBCYWNrYm9uZS5qcyBpbiAqbm9Db25mbGljdCogbW9kZSwgcmV0dXJuaW5nIHRo
ZSBgQmFja2JvbmVgIHZhcmlhYmxlCisgIC8vIHRvIGl0cyBwcmV2aW91cyBvd25lci4gUmV0dXJu
cyBhIHJlZmVyZW5jZSB0byB0aGlzIEJhY2tib25lIG9iamVjdC4KKyAgQmFja2JvbmUubm9Db25m
bGljdCA9IGZ1bmN0aW9uKCkgeworICAgIHJvb3QuQmFja2JvbmUgPSBwcmV2aW91c0JhY2tib25l
OworICAgIHJldHVybiB0aGlzOworICB9OworCisgIC8vIFR1cm4gb24gYGVtdWxhdGVIVFRQYCB0
byBzdXBwb3J0IGxlZ2FjeSBIVFRQIHNlcnZlcnMuIFNldHRpbmcgdGhpcyBvcHRpb24KKyAgLy8g
d2lsbCBmYWtlIGAiUFVUImAgYW5kIGAiREVMRVRFImAgcmVxdWVzdHMgdmlhIHRoZSBgX21ldGhv
ZGAgcGFyYW1ldGVyIGFuZAorICAvLyBzZXQgYSBgWC1IdHRwLU1ldGhvZC1PdmVycmlkZWAgaGVh
ZGVyLgorICBCYWNrYm9uZS5lbXVsYXRlSFRUUCA9IGZhbHNlOworCisgIC8vIFR1cm4gb24gYGVt
dWxhdGVKU09OYCB0byBzdXBwb3J0IGxlZ2FjeSBzZXJ2ZXJzIHRoYXQgY2FuJ3QgZGVhbCB3aXRo
IGRpcmVjdAorICAvLyBgYXBwbGljYXRpb24vanNvbmAgcmVxdWVzdHMgLi4uIHdpbGwgZW5jb2Rl
IHRoZSBib2R5IGFzCisgIC8vIGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGlu
c3RlYWQgYW5kIHdpbGwgc2VuZCB0aGUgbW9kZWwgaW4gYQorICAvLyBmb3JtIHBhcmFtIG5hbWVk
IGBtb2RlbGAuCisgIEJhY2tib25lLmVtdWxhdGVKU09OID0gZmFsc2U7CisKKyAgLy8gQmFja2Jv
bmUuRXZlbnRzCisgIC8vIC0tLS0tLS0tLS0tLS0tLQorCisgIC8vIEEgbW9kdWxlIHRoYXQgY2Fu
IGJlIG1peGVkIGluIHRvICphbnkgb2JqZWN0KiBpbiBvcmRlciB0byBwcm92aWRlIGl0IHdpdGgK
KyAgLy8gY3VzdG9tIGV2ZW50cy4gWW91IG1heSBiaW5kIHdpdGggYG9uYCBvciByZW1vdmUgd2l0
aCBgb2ZmYCBjYWxsYmFjaworICAvLyBmdW5jdGlvbnMgdG8gYW4gZXZlbnQ7IGB0cmlnZ2VyYC1p
bmcgYW4gZXZlbnQgZmlyZXMgYWxsIGNhbGxiYWNrcyBpbgorICAvLyBzdWNjZXNzaW9uLgorICAv
LworICAvLyAgICAgdmFyIG9iamVjdCA9IHt9OworICAvLyAgICAgXy5leHRlbmQob2JqZWN0LCBC
YWNrYm9uZS5FdmVudHMpOworICAvLyAgICAgb2JqZWN0Lm9uKCdleHBhbmQnLCBmdW5jdGlvbigp
eyBhbGVydCgnZXhwYW5kZWQnKTsgfSk7CisgIC8vICAgICBvYmplY3QudHJpZ2dlcignZXhwYW5k
Jyk7CisgIC8vCisgIHZhciBFdmVudHMgPSBCYWNrYm9uZS5FdmVudHMgPSB7CisKKyAgICAvLyBC
aW5kIGFuIGV2ZW50IHRvIGEgYGNhbGxiYWNrYCBmdW5jdGlvbi4gUGFzc2luZyBgImFsbCJgIHdp
bGwgYmluZAorICAgIC8vIHRoZSBjYWxsYmFjayB0byBhbGwgZXZlbnRzIGZpcmVkLgorICAgIG9u
OiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgY29udGV4dCkgeworICAgICAgaWYgKCFldmVudHNB
cGkodGhpcywgJ29uJywgbmFtZSwgW2NhbGxiYWNrLCBjb250ZXh0XSkgfHwgIWNhbGxiYWNrKSBy
ZXR1cm4gdGhpczsKKyAgICAgIHRoaXMuX2V2ZW50cyB8fCAodGhpcy5fZXZlbnRzID0ge30pOwor
ICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tuYW1lXSB8fCAodGhpcy5fZXZlbnRzW25h
bWVdID0gW10pOworICAgICAgZXZlbnRzLnB1c2goe2NhbGxiYWNrOiBjYWxsYmFjaywgY29udGV4
dDogY29udGV4dCwgY3R4OiBjb250ZXh0IHx8IHRoaXN9KTsKKyAgICAgIHJldHVybiB0aGlzOwor
ICAgIH0sCisKKyAgICAvLyBCaW5kIGFuIGV2ZW50IHRvIG9ubHkgYmUgdHJpZ2dlcmVkIGEgc2lu
Z2xlIHRpbWUuIEFmdGVyIHRoZSBmaXJzdCB0aW1lCisgICAgLy8gdGhlIGNhbGxiYWNrIGlzIGlu
dm9rZWQsIGl0IHdpbGwgYmUgcmVtb3ZlZC4KKyAgICBvbmNlOiBmdW5jdGlvbihuYW1lLCBjYWxs
YmFjaywgY29udGV4dCkgeworICAgICAgaWYgKCFldmVudHNBcGkodGhpcywgJ29uY2UnLCBuYW1l
LCBbY2FsbGJhY2ssIGNvbnRleHRdKSB8fCAhY2FsbGJhY2spIHJldHVybiB0aGlzOworICAgICAg
dmFyIHNlbGYgPSB0aGlzOworICAgICAgdmFyIG9uY2UgPSBfLm9uY2UoZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHNlbGYub2ZmKG5hbWUsIG9uY2UpOworICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOworICAgICAgfSk7CisgICAgICBvbmNlLl9jYWxsYmFjayA9IGNhbGxiYWNr
OworICAgICAgcmV0dXJuIHRoaXMub24obmFtZSwgb25jZSwgY29udGV4dCk7CisgICAgfSwKKwor
ICAgIC8vIFJlbW92ZSBvbmUgb3IgbWFueSBjYWxsYmFja3MuIElmIGBjb250ZXh0YCBpcyBudWxs
LCByZW1vdmVzIGFsbAorICAgIC8vIGNhbGxiYWNrcyB3aXRoIHRoYXQgZnVuY3Rpb24uIElmIGBj
YWxsYmFja2AgaXMgbnVsbCwgcmVtb3ZlcyBhbGwKKyAgICAvLyBjYWxsYmFja3MgZm9yIHRoZSBl
dmVudC4gSWYgYG5hbWVgIGlzIG51bGwsIHJlbW92ZXMgYWxsIGJvdW5kCisgICAgLy8gY2FsbGJh
Y2tzIGZvciBhbGwgZXZlbnRzLgorICAgIG9mZjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIGNv
bnRleHQpIHsKKyAgICAgIHZhciByZXRhaW4sIGV2LCBldmVudHMsIG5hbWVzLCBpLCBsLCBqLCBr
OworICAgICAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIWV2ZW50c0FwaSh0aGlzLCAnb2ZmJywgbmFt
ZSwgW2NhbGxiYWNrLCBjb250ZXh0XSkpIHJldHVybiB0aGlzOworICAgICAgaWYgKCFuYW1lICYm
ICFjYWxsYmFjayAmJiAhY29udGV4dCkgeworICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTsKKyAg
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIG5hbWVzID0gbmFtZSA/IFtuYW1l
XSA6IF8ua2V5cyh0aGlzLl9ldmVudHMpOworICAgICAgZm9yIChpID0gMCwgbCA9IG5hbWVzLmxl
bmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBuYW1lID0gbmFtZXNbaV07CisgICAgICAgIGlm
IChldmVudHMgPSB0aGlzLl9ldmVudHNbbmFtZV0pIHsKKyAgICAgICAgICB0aGlzLl9ldmVudHNb
bmFtZV0gPSByZXRhaW4gPSBbXTsKKyAgICAgICAgICBpZiAoY2FsbGJhY2sgfHwgY29udGV4dCkg
eworICAgICAgICAgICAgZm9yIChqID0gMCwgayA9IGV2ZW50cy5sZW5ndGg7IGogPCBrOyBqKysp
IHsKKyAgICAgICAgICAgICAgZXYgPSBldmVudHNbal07CisgICAgICAgICAgICAgIGlmICgoY2Fs
bGJhY2sgJiYgY2FsbGJhY2sgIT09IGV2LmNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBldi5jYWxs
YmFjay5fY2FsbGJhY2spIHx8CisgICAgICAgICAgICAgICAgICAoY29udGV4dCAmJiBjb250ZXh0
ICE9PSBldi5jb250ZXh0KSkgeworICAgICAgICAgICAgICAgIHJldGFpbi5wdXNoKGV2KTsKKyAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAo
IXJldGFpbi5sZW5ndGgpIGRlbGV0ZSB0aGlzLl9ldmVudHNbbmFtZV07CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8vIFRyaWdnZXIgb25l
IG9yIG1hbnkgZXZlbnRzLCBmaXJpbmcgYWxsIGJvdW5kIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGFy
ZQorICAgIC8vIHBhc3NlZCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgYHRyaWdnZXJgIGlzLCBhcGFy
dCBmcm9tIHRoZSBldmVudCBuYW1lCisgICAgLy8gKHVubGVzcyB5b3UncmUgbGlzdGVuaW5nIG9u
IGAiYWxsImAsIHdoaWNoIHdpbGwgY2F1c2UgeW91ciBjYWxsYmFjayB0bworICAgIC8vIHJlY2Vp
dmUgdGhlIHRydWUgbmFtZSBvZiB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50KS4KKyAg
ICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICBpZiAoIXRoaXMuX2V2ZW50cykgcmV0
dXJuIHRoaXM7CisgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAg
ICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICd0cmlnZ2VyJywgbmFtZSwgYXJncykpIHJldHVybiB0
aGlzOworICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tuYW1lXTsKKyAgICAgIHZhciBh
bGxFdmVudHMgPSB0aGlzLl9ldmVudHMuYWxsOworICAgICAgaWYgKGV2ZW50cykgdHJpZ2dlckV2
ZW50cyhldmVudHMsIGFyZ3MpOworICAgICAgaWYgKGFsbEV2ZW50cykgdHJpZ2dlckV2ZW50cyhh
bGxFdmVudHMsIGFyZ3VtZW50cyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAg
Ly8gVGVsbCB0aGlzIG9iamVjdCB0byBzdG9wIGxpc3RlbmluZyB0byBlaXRoZXIgc3BlY2lmaWMg
ZXZlbnRzIC4uLiBvcgorICAgIC8vIHRvIGV2ZXJ5IG9iamVjdCBpdCdzIGN1cnJlbnRseSBsaXN0
ZW5pbmcgdG8uCisgICAgc3RvcExpc3RlbmluZzogZnVuY3Rpb24ob2JqLCBuYW1lLCBjYWxsYmFj
aykgeworICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyczsKKyAgICAgIGlmICgh
bGlzdGVuZXJzKSByZXR1cm4gdGhpczsKKyAgICAgIHZhciBkZWxldGVMaXN0ZW5lciA9ICFuYW1l
ICYmICFjYWxsYmFjazsKKyAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIGNhbGxi
YWNrID0gdGhpczsKKyAgICAgIGlmIChvYmopIChsaXN0ZW5lcnMgPSB7fSlbb2JqLl9saXN0ZW5l
cklkXSA9IG9iajsKKyAgICAgIGZvciAodmFyIGlkIGluIGxpc3RlbmVycykgeworICAgICAgICBs
aXN0ZW5lcnNbaWRdLm9mZihuYW1lLCBjYWxsYmFjaywgdGhpcyk7CisgICAgICAgIGlmIChkZWxl
dGVMaXN0ZW5lcikgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07CisgICAgICB9CisgICAgICBy
ZXR1cm4gdGhpczsKKyAgICB9CisKKyAgfTsKKworICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdXNl
ZCB0byBzcGxpdCBldmVudCBzdHJpbmdzLgorICB2YXIgZXZlbnRTcGxpdHRlciA9IC9ccysvOwor
CisgIC8vIEltcGxlbWVudCBmYW5jeSBmZWF0dXJlcyBvZiB0aGUgRXZlbnRzIEFQSSBzdWNoIGFz
IG11bHRpcGxlIGV2ZW50CisgIC8vIG5hbWVzIGAiY2hhbmdlIGJsdXIiYCBhbmQgalF1ZXJ5LXN0
eWxlIGV2ZW50IG1hcHMgYHtjaGFuZ2U6IGFjdGlvbn1gCisgIC8vIGluIHRlcm1zIG9mIHRoZSBl
eGlzdGluZyBBUEkuCisgIHZhciBldmVudHNBcGkgPSBmdW5jdGlvbihvYmosIGFjdGlvbiwgbmFt
ZSwgcmVzdCkgeworICAgIGlmICghbmFtZSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBIYW5kbGUg
ZXZlbnQgbWFwcy4KKyAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7CisgICAgICBm
b3IgKHZhciBrZXkgaW4gbmFtZSkgeworICAgICAgICBvYmpbYWN0aW9uXS5hcHBseShvYmosIFtr
ZXksIG5hbWVba2V5XV0uY29uY2F0KHJlc3QpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgc3BhY2Ugc2VwYXJhdGVkIGV2ZW50IG5hbWVzLgor
ICAgIGlmIChldmVudFNwbGl0dGVyLnRlc3QobmFtZSkpIHsKKyAgICAgIHZhciBuYW1lcyA9IG5h
bWUuc3BsaXQoZXZlbnRTcGxpdHRlcik7CisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5hbWVz
Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBvYmpbYWN0aW9uXS5hcHBseShvYmosIFtu
YW1lc1tpXV0uY29uY2F0KHJlc3QpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfTsKKworICAvLyBBIGRpZmZpY3VsdC10by1iZWxp
ZXZlLCBidXQgb3B0aW1pemVkIGludGVybmFsIGRpc3BhdGNoIGZ1bmN0aW9uIGZvcgorICAvLyB0
cmlnZ2VyaW5nIGV2ZW50cy4gVHJpZXMgdG8ga2VlcCB0aGUgdXN1YWwgY2FzZXMgc3BlZWR5ICht
b3N0IGludGVybmFsCisgIC8vIEJhY2tib25lIGV2ZW50cyBoYXZlIDMgYXJndW1lbnRzKS4KKyAg
dmFyIHRyaWdnZXJFdmVudHMgPSBmdW5jdGlvbihldmVudHMsIGFyZ3MpIHsKKyAgICB2YXIgZXYs
IGkgPSAtMSwgbCA9IGV2ZW50cy5sZW5ndGgsIGExID0gYXJnc1swXSwgYTIgPSBhcmdzWzFdLCBh
MyA9IGFyZ3NbMl07CisgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkgeworICAgICAgY2FzZSAwOiB3
aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCk7IHJl
dHVybjsKKyAgICAgIGNhc2UgMTogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2Fs
bGJhY2suY2FsbChldi5jdHgsIGExKTsgcmV0dXJuOworICAgICAgY2FzZSAyOiB3aGlsZSAoKytp
IDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCwgYTEsIGEyKTsgcmV0
dXJuOworICAgICAgY2FzZSAzOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxs
YmFjay5jYWxsKGV2LmN0eCwgYTEsIGEyLCBhMyk7IHJldHVybjsKKyAgICAgIGRlZmF1bHQ6IHdo
aWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmFwcGx5KGV2LmN0eCwgYXJn
cyk7CisgICAgfQorICB9OworCisgIHZhciBsaXN0ZW5NZXRob2RzID0ge2xpc3RlblRvOiAnb24n
LCBsaXN0ZW5Ub09uY2U6ICdvbmNlJ307CisKKyAgLy8gSW52ZXJzaW9uLW9mLWNvbnRyb2wgdmVy
c2lvbnMgb2YgYG9uYCBhbmQgYG9uY2VgLiBUZWxsICp0aGlzKiBvYmplY3QgdG8KKyAgLy8gbGlz
dGVuIHRvIGFuIGV2ZW50IGluIGFub3RoZXIgb2JqZWN0IC4uLiBrZWVwaW5nIHRyYWNrIG9mIHdo
YXQgaXQncworICAvLyBsaXN0ZW5pbmcgdG8uCisgIF8uZWFjaChsaXN0ZW5NZXRob2RzLCBmdW5j
dGlvbihpbXBsZW1lbnRhdGlvbiwgbWV0aG9kKSB7CisgICAgRXZlbnRzW21ldGhvZF0gPSBmdW5j
dGlvbihvYmosIG5hbWUsIGNhbGxiYWNrKSB7CisgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5f
bGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7CisgICAgICB2YXIgaWQgPSBvYmou
X2xpc3RlbmVySWQgfHwgKG9iai5fbGlzdGVuZXJJZCA9IF8udW5pcXVlSWQoJ2wnKSk7CisgICAg
ICBsaXN0ZW5lcnNbaWRdID0gb2JqOworICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0
JykgY2FsbGJhY2sgPSB0aGlzOworICAgICAgb2JqW2ltcGxlbWVudGF0aW9uXShuYW1lLCBjYWxs
YmFjaywgdGhpcyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9OworICB9KTsKKworICAvLyBB
bGlhc2VzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgRXZlbnRzLmJpbmQgICA9IEV2
ZW50cy5vbjsKKyAgRXZlbnRzLnVuYmluZCA9IEV2ZW50cy5vZmY7CisKKyAgLy8gQWxsb3cgdGhl
IGBCYWNrYm9uZWAgb2JqZWN0IHRvIHNlcnZlIGFzIGEgZ2xvYmFsIGV2ZW50IGJ1cywgZm9yIGZv
bGtzIHdobworICAvLyB3YW50IGdsb2JhbCAicHVic3ViIiBpbiBhIGNvbnZlbmllbnQgcGxhY2Uu
CisgIF8uZXh0ZW5kKEJhY2tib25lLCBFdmVudHMpOworCisgIC8vIEJhY2tib25lLk1vZGVsCisg
IC8vIC0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQmFja2JvbmUgKipNb2RlbHMqKiBhcmUgdGhlIGJh
c2ljIGRhdGEgb2JqZWN0IGluIHRoZSBmcmFtZXdvcmsgLS0KKyAgLy8gZnJlcXVlbnRseSByZXBy
ZXNlbnRpbmcgYSByb3cgaW4gYSB0YWJsZSBpbiBhIGRhdGFiYXNlIG9uIHlvdXIgc2VydmVyLgor
ICAvLyBBIGRpc2NyZXRlIGNodW5rIG9mIGRhdGEgYW5kIGEgYnVuY2ggb2YgdXNlZnVsLCByZWxh
dGVkIG1ldGhvZHMgZm9yCisgIC8vIHBlcmZvcm1pbmcgY29tcHV0YXRpb25zIGFuZCB0cmFuc2Zv
cm1hdGlvbnMgb24gdGhhdCBkYXRhLgorCisgIC8vIENyZWF0ZSBhIG5ldyBtb2RlbCB3aXRoIHRo
ZSBzcGVjaWZpZWQgYXR0cmlidXRlcy4gQSBjbGllbnQgaWQgKGBjaWRgKQorICAvLyBpcyBhdXRv
bWF0aWNhbGx5IGdlbmVyYXRlZCBhbmQgYXNzaWduZWQgZm9yIHlvdS4KKyAgdmFyIE1vZGVsID0g
QmFja2JvbmUuTW9kZWwgPSBmdW5jdGlvbihhdHRyaWJ1dGVzLCBvcHRpb25zKSB7CisgICAgdmFy
IGRlZmF1bHRzOworICAgIHZhciBhdHRycyA9IGF0dHJpYnV0ZXMgfHwge307CisgICAgb3B0aW9u
cyB8fCAob3B0aW9ucyA9IHt9KTsKKyAgICB0aGlzLmNpZCA9IF8udW5pcXVlSWQoJ2MnKTsKKyAg
ICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKKyAgICBfLmV4dGVuZCh0aGlzLCBfLnBpY2sob3B0aW9u
cywgbW9kZWxPcHRpb25zKSk7CisgICAgaWYgKG9wdGlvbnMucGFyc2UpIGF0dHJzID0gdGhpcy5w
YXJzZShhdHRycywgb3B0aW9ucykgfHwge307CisgICAgaWYgKGRlZmF1bHRzID0gXy5yZXN1bHQo
dGhpcywgJ2RlZmF1bHRzJykpIHsKKyAgICAgIGF0dHJzID0gXy5kZWZhdWx0cyh7fSwgYXR0cnMs
IGRlZmF1bHRzKTsKKyAgICB9CisgICAgdGhpcy5zZXQoYXR0cnMsIG9wdGlvbnMpOworICAgIHRo
aXMuY2hhbmdlZCA9IHt9OworICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVu
dHMpOworICB9OworCisgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRvIGJlIGF0dGFjaGVkIGRpcmVj
dGx5IHRvIHRoZSBtb2RlbCwgaWYgcHJvdmlkZWQuCisgIHZhciBtb2RlbE9wdGlvbnMgPSBbJ3Vy
bCcsICd1cmxSb290JywgJ2NvbGxlY3Rpb24nXTsKKworICAvLyBBdHRhY2ggYWxsIGluaGVyaXRh
YmxlIG1ldGhvZHMgdG8gdGhlIE1vZGVsIHByb3RvdHlwZS4KKyAgXy5leHRlbmQoTW9kZWwucHJv
dG90eXBlLCBFdmVudHMsIHsKKworICAgIC8vIEEgaGFzaCBvZiBhdHRyaWJ1dGVzIHdob3NlIGN1
cnJlbnQgYW5kIHByZXZpb3VzIHZhbHVlIGRpZmZlci4KKyAgICBjaGFuZ2VkOiBudWxsLAorCisg
ICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGR1cmluZyB0aGUgbGFzdCBmYWlsZWQgdmFsaWRhdGlv
bi4KKyAgICB2YWxpZGF0aW9uRXJyb3I6IG51bGwsCisKKyAgICAvLyBUaGUgZGVmYXVsdCBuYW1l
IGZvciB0aGUgSlNPTiBgaWRgIGF0dHJpYnV0ZSBpcyBgImlkImAuIE1vbmdvREIgYW5kCisgICAg
Ly8gQ291Y2hEQiB1c2VycyBtYXkgd2FudCB0byBzZXQgdGhpcyB0byBgIl9pZCJgLgorICAgIGlk
QXR0cmlidXRlOiAnaWQnLAorCisgICAgLy8gSW5pdGlhbGl6ZSBpcyBhbiBlbXB0eSBmdW5jdGlv
biBieSBkZWZhdWx0LiBPdmVycmlkZSBpdCB3aXRoIHlvdXIgb3duCisgICAgLy8gaW5pdGlhbGl6
YXRpb24gbG9naWMuCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LAorCisgICAgLy8gUmV0
dXJuIGEgY29weSBvZiB0aGUgbW9kZWwncyBgYXR0cmlidXRlc2Agb2JqZWN0LgorICAgIHRvSlNP
TjogZnVuY3Rpb24ob3B0aW9ucykgeworICAgICAgcmV0dXJuIF8uY2xvbmUodGhpcy5hdHRyaWJ1
dGVzKTsKKyAgICB9LAorCisgICAgLy8gUHJveHkgYEJhY2tib25lLnN5bmNgIGJ5IGRlZmF1bHQg
LS0gYnV0IG92ZXJyaWRlIHRoaXMgaWYgeW91IG5lZWQKKyAgICAvLyBjdXN0b20gc3luY2luZyBz
ZW1hbnRpY3MgZm9yICp0aGlzKiBwYXJ0aWN1bGFyIG1vZGVsLgorICAgIHN5bmM6IGZ1bmN0aW9u
KCkgeworICAgICAgcmV0dXJuIEJhY2tib25lLnN5bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK
KyAgICB9LAorCisgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuCisgICAgZ2V0
OiBmdW5jdGlvbihhdHRyKSB7CisgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdOwor
ICAgIH0sCisKKyAgICAvLyBHZXQgdGhlIEhUTUwtZXNjYXBlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1
dGUuCisgICAgZXNjYXBlOiBmdW5jdGlvbihhdHRyKSB7CisgICAgICByZXR1cm4gXy5lc2NhcGUo
dGhpcy5nZXQoYXR0cikpOworICAgIH0sCisKKyAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUg
YXR0cmlidXRlIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBub3QgbnVsbAorICAgIC8vIG9yIHVu
ZGVmaW5lZC4KKyAgICBoYXM6IGZ1bmN0aW9uKGF0dHIpIHsKKyAgICAgIHJldHVybiB0aGlzLmdl
dChhdHRyKSAhPSBudWxsOworICAgIH0sCisKKyAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0
dHJpYnV0ZXMgb24gdGhlIG9iamVjdCwgZmlyaW5nIGAiY2hhbmdlImAuIFRoaXMgaXMKKyAgICAv
LyB0aGUgY29yZSBwcmltaXRpdmUgb3BlcmF0aW9uIG9mIGEgbW9kZWwsIHVwZGF0aW5nIHRoZSBk
YXRhIGFuZCBub3RpZnlpbmcKKyAgICAvLyBhbnlvbmUgd2hvIG5lZWRzIHRvIGtub3cgYWJvdXQg
dGhlIGNoYW5nZSBpbiBzdGF0ZS4gVGhlIGhlYXJ0IG9mIHRoZSBiZWFzdC4KKyAgICBzZXQ6IGZ1
bmN0aW9uKGtleSwgdmFsLCBvcHRpb25zKSB7CisgICAgICB2YXIgYXR0ciwgYXR0cnMsIHVuc2V0
LCBjaGFuZ2VzLCBzaWxlbnQsIGNoYW5naW5nLCBwcmV2LCBjdXJyZW50OworICAgICAgaWYgKGtl
eSA9PSBudWxsKSByZXR1cm4gdGhpczsKKworICAgICAgLy8gSGFuZGxlIGJvdGggYCJrZXkiLCB2
YWx1ZWAgYW5kIGB7a2V5OiB2YWx1ZX1gIC1zdHlsZSBhcmd1bWVudHMuCisgICAgICBpZiAodHlw
ZW9mIGtleSA9PT0gJ29iamVjdCcpIHsKKyAgICAgICAgYXR0cnMgPSBrZXk7CisgICAgICAgIG9w
dGlvbnMgPSB2YWw7CisgICAgICB9IGVsc2UgeworICAgICAgICAoYXR0cnMgPSB7fSlba2V5XSA9
IHZhbDsKKyAgICAgIH0KKworICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTsKKworICAg
ICAgLy8gUnVuIHZhbGlkYXRpb24uCisgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlKGF0dHJzLCBv
cHRpb25zKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgYW5k
IG9wdGlvbnMuCisgICAgICB1bnNldCAgICAgICAgICAgPSBvcHRpb25zLnVuc2V0OworICAgICAg
c2lsZW50ICAgICAgICAgID0gb3B0aW9ucy5zaWxlbnQ7CisgICAgICBjaGFuZ2VzICAgICAgICAg
PSBbXTsKKyAgICAgIGNoYW5naW5nICAgICAgICA9IHRoaXMuX2NoYW5naW5nOworICAgICAgdGhp
cy5fY2hhbmdpbmcgID0gdHJ1ZTsKKworICAgICAgaWYgKCFjaGFuZ2luZykgeworICAgICAgICB0
aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMgPSBfLmNsb25lKHRoaXMuYXR0cmlidXRlcyk7CisgICAg
ICAgIHRoaXMuY2hhbmdlZCA9IHt9OworICAgICAgfQorICAgICAgY3VycmVudCA9IHRoaXMuYXR0
cmlidXRlcywgcHJldiA9IHRoaXMuX3ByZXZpb3VzQXR0cmlidXRlczsKKworICAgICAgLy8gQ2hl
Y2sgZm9yIGNoYW5nZXMgb2YgYGlkYC4KKyAgICAgIGlmICh0aGlzLmlkQXR0cmlidXRlIGluIGF0
dHJzKSB0aGlzLmlkID0gYXR0cnNbdGhpcy5pZEF0dHJpYnV0ZV07CisKKyAgICAgIC8vIEZvciBl
YWNoIGBzZXRgIGF0dHJpYnV0ZSwgdXBkYXRlIG9yIGRlbGV0ZSB0aGUgY3VycmVudCB2YWx1ZS4K
KyAgICAgIGZvciAoYXR0ciBpbiBhdHRycykgeworICAgICAgICB2YWwgPSBhdHRyc1thdHRyXTsK
KyAgICAgICAgaWYgKCFfLmlzRXF1YWwoY3VycmVudFthdHRyXSwgdmFsKSkgY2hhbmdlcy5wdXNo
KGF0dHIpOworICAgICAgICBpZiAoIV8uaXNFcXVhbChwcmV2W2F0dHJdLCB2YWwpKSB7CisgICAg
ICAgICAgdGhpcy5jaGFuZ2VkW2F0dHJdID0gdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgIGRlbGV0ZSB0aGlzLmNoYW5nZWRbYXR0cl07CisgICAgICAgIH0KKyAgICAgICAgdW5zZXQg
PyBkZWxldGUgY3VycmVudFthdHRyXSA6IGN1cnJlbnRbYXR0cl0gPSB2YWw7CisgICAgICB9CisK
KyAgICAgIC8vIFRyaWdnZXIgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZSBjaGFuZ2VzLgorICAgICAg
aWYgKCFzaWxlbnQpIHsKKyAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoKSB0aGlzLl9wZW5kaW5n
ID0gdHJ1ZTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGFuZ2VzLmxlbmd0aDsgaSA8
IGw7IGkrKykgeworICAgICAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlOicgKyBjaGFuZ2VzW2ld
LCB0aGlzLCBjdXJyZW50W2NoYW5nZXNbaV1dLCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAg
fQorCisgICAgICAvLyBZb3UgbWlnaHQgYmUgd29uZGVyaW5nIHdoeSB0aGVyZSdzIGEgYHdoaWxl
YCBsb29wIGhlcmUuIENoYW5nZXMgY2FuCisgICAgICAvLyBiZSByZWN1cnNpdmVseSBuZXN0ZWQg
d2l0aGluIGAiY2hhbmdlImAgZXZlbnRzLgorICAgICAgaWYgKGNoYW5naW5nKSByZXR1cm4gdGhp
czsKKyAgICAgIGlmICghc2lsZW50KSB7CisgICAgICAgIHdoaWxlICh0aGlzLl9wZW5kaW5nKSB7
CisgICAgICAgICAgdGhpcy5fcGVuZGluZyA9IGZhbHNlOworICAgICAgICAgIHRoaXMudHJpZ2dl
cignY2hhbmdlJywgdGhpcywgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRo
aXMuX3BlbmRpbmcgPSBmYWxzZTsKKyAgICAgIHRoaXMuX2NoYW5naW5nID0gZmFsc2U7CisgICAg
ICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9t
IHRoZSBtb2RlbCwgZmlyaW5nIGAiY2hhbmdlImAuIGB1bnNldGAgaXMgYSBub29wCisgICAgLy8g
aWYgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0LgorICAgIHVuc2V0OiBmdW5jdGlvbihhdHRy
LCBvcHRpb25zKSB7CisgICAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgdm9pZCAwLCBfLmV4dGVu
ZCh7fSwgb3B0aW9ucywge3Vuc2V0OiB0cnVlfSkpOworICAgIH0sCisKKyAgICAvLyBDbGVhciBh
bGwgYXR0cmlidXRlcyBvbiB0aGUgbW9kZWwsIGZpcmluZyBgImNoYW5nZSJgLgorICAgIGNsZWFy
OiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgICB2YXIgYXR0cnMgPSB7fTsKKyAgICAgIGZvciAo
dmFyIGtleSBpbiB0aGlzLmF0dHJpYnV0ZXMpIGF0dHJzW2tleV0gPSB2b2lkIDA7CisgICAgICBy
ZXR1cm4gdGhpcy5zZXQoYXR0cnMsIF8uZXh0ZW5kKHt9LCBvcHRpb25zLCB7dW5zZXQ6IHRydWV9
KSk7CisgICAgfSwKKworICAgIC8vIERldGVybWluZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQg
c2luY2UgdGhlIGxhc3QgYCJjaGFuZ2UiYCBldmVudC4KKyAgICAvLyBJZiB5b3Ugc3BlY2lmeSBh
biBhdHRyaWJ1dGUgbmFtZSwgZGV0ZXJtaW5lIGlmIHRoYXQgYXR0cmlidXRlIGhhcyBjaGFuZ2Vk
LgorICAgIGhhc0NoYW5nZWQ6IGZ1bmN0aW9uKGF0dHIpIHsKKyAgICAgIGlmIChhdHRyID09IG51
bGwpIHJldHVybiAhXy5pc0VtcHR5KHRoaXMuY2hhbmdlZCk7CisgICAgICByZXR1cm4gXy5oYXMo
dGhpcy5jaGFuZ2VkLCBhdHRyKTsKKyAgICB9LAorCisgICAgLy8gUmV0dXJuIGFuIG9iamVjdCBj
b250YWluaW5nIGFsbCB0aGUgYXR0cmlidXRlcyB0aGF0IGhhdmUgY2hhbmdlZCwgb3IKKyAgICAv
LyBmYWxzZSBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlZCBhdHRyaWJ1dGVzLiBVc2VmdWwgZm9yIGRl
dGVybWluaW5nIHdoYXQKKyAgICAvLyBwYXJ0cyBvZiBhIHZpZXcgbmVlZCB0byBiZSB1cGRhdGVk
IGFuZC9vciB3aGF0IGF0dHJpYnV0ZXMgbmVlZCB0byBiZQorICAgIC8vIHBlcnNpc3RlZCB0byB0
aGUgc2VydmVyLiBVbnNldCBhdHRyaWJ1dGVzIHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC4KKyAg
ICAvLyBZb3UgY2FuIGFsc28gcGFzcyBhbiBhdHRyaWJ1dGVzIG9iamVjdCB0byBkaWZmIGFnYWlu
c3QgdGhlIG1vZGVsLAorICAgIC8vIGRldGVybWluaW5nIGlmIHRoZXJlICp3b3VsZCBiZSogYSBj
aGFuZ2UuCisgICAgY2hhbmdlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGRpZmYpIHsKKyAgICAgIGlm
ICghZGlmZikgcmV0dXJuIHRoaXMuaGFzQ2hhbmdlZCgpID8gXy5jbG9uZSh0aGlzLmNoYW5nZWQp
IDogZmFsc2U7CisgICAgICB2YXIgdmFsLCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICB2YXIgb2xk
ID0gdGhpcy5fY2hhbmdpbmcgPyB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMgOiB0aGlzLmF0dHJp
YnV0ZXM7CisgICAgICBmb3IgKHZhciBhdHRyIGluIGRpZmYpIHsKKyAgICAgICAgaWYgKF8uaXNF
cXVhbChvbGRbYXR0cl0sICh2YWwgPSBkaWZmW2F0dHJdKSkpIGNvbnRpbnVlOworICAgICAgICAo
Y2hhbmdlZCB8fCAoY2hhbmdlZCA9IHt9KSlbYXR0cl0gPSB2YWw7CisgICAgICB9CisgICAgICBy
ZXR1cm4gY2hhbmdlZDsKKyAgICB9LAorCisgICAgLy8gR2V0IHRoZSBwcmV2aW91cyB2YWx1ZSBv
ZiBhbiBhdHRyaWJ1dGUsIHJlY29yZGVkIGF0IHRoZSB0aW1lIHRoZSBsYXN0CisgICAgLy8gYCJj
aGFuZ2UiYCBldmVudCB3YXMgZmlyZWQuCisgICAgcHJldmlvdXM6IGZ1bmN0aW9uKGF0dHIpIHsK
KyAgICAgIGlmIChhdHRyID09IG51bGwgfHwgIXRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcykgcmV0
dXJuIG51bGw7CisgICAgICByZXR1cm4gdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzW2F0dHJdOwor
ICAgIH0sCisKKyAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCBh
dCB0aGUgdGltZSBvZiB0aGUgcHJldmlvdXMKKyAgICAvLyBgImNoYW5nZSJgIGV2ZW50LgorICAg
IHByZXZpb3VzQXR0cmlidXRlczogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gXy5jbG9uZSh0
aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMpOworICAgIH0sCisKKyAgICAvLyBGZXRjaCB0aGUgbW9k
ZWwgZnJvbSB0aGUgc2VydmVyLiBJZiB0aGUgc2VydmVyJ3MgcmVwcmVzZW50YXRpb24gb2YgdGhl
CisgICAgLy8gbW9kZWwgZGlmZmVycyBmcm9tIGl0cyBjdXJyZW50IGF0dHJpYnV0ZXMsIHRoZXkg
d2lsbCBiZSBvdmVycmlkZGVuLAorICAgIC8vIHRyaWdnZXJpbmcgYSBgImNoYW5nZSJgIGV2ZW50
LgorICAgIGZldGNoOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgICBvcHRpb25zID0gb3B0aW9u
cyA/IF8uY2xvbmUob3B0aW9ucykgOiB7fTsKKyAgICAgIGlmIChvcHRpb25zLnBhcnNlID09PSB2
b2lkIDApIG9wdGlvbnMucGFyc2UgPSB0cnVlOworICAgICAgdmFyIG1vZGVsID0gdGhpczsKKyAg
ICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzOworICAgICAgb3B0aW9ucy5zdWNjZXNz
ID0gZnVuY3Rpb24ocmVzcCkgeworICAgICAgICBpZiAoIW1vZGVsLnNldChtb2RlbC5wYXJzZShy
ZXNwLCBvcHRpb25zKSwgb3B0aW9ucykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHN1Y2Nl
c3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpOworICAgICAgICBtb2RlbC50cmlnZ2Vy
KCdzeW5jJywgbW9kZWwsIHJlc3AsIG9wdGlvbnMpOworICAgICAgfTsKKyAgICAgIHdyYXBFcnJv
cih0aGlzLCBvcHRpb25zKTsKKyAgICAgIHJldHVybiB0aGlzLnN5bmMoJ3JlYWQnLCB0aGlzLCBv
cHRpb25zKTsKKyAgICB9LAorCisgICAgLy8gU2V0IGEgaGFzaCBvZiBtb2RlbCBhdHRyaWJ1dGVz
LCBhbmQgc3luYyB0aGUgbW9kZWwgdG8gdGhlIHNlcnZlci4KKyAgICAvLyBJZiB0aGUgc2VydmVy
IHJldHVybnMgYW4gYXR0cmlidXRlcyBoYXNoIHRoYXQgZGlmZmVycywgdGhlIG1vZGVsJ3MKKyAg
ICAvLyBzdGF0ZSB3aWxsIGJlIGBzZXRgIGFnYWluLgorICAgIHNhdmU6IGZ1bmN0aW9uKGtleSwg
dmFsLCBvcHRpb25zKSB7CisgICAgICB2YXIgYXR0cnMsIG1ldGhvZCwgeGhyLCBhdHRyaWJ1dGVz
ID0gdGhpcy5hdHRyaWJ1dGVzOworCisgICAgICAvLyBIYW5kbGUgYm90aCBgImtleSIsIHZhbHVl
YCBhbmQgYHtrZXk6IHZhbHVlfWAgLXN0eWxlIGFyZ3VtZW50cy4KKyAgICAgIGlmIChrZXkgPT0g
bnVsbCB8fCB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JykgeworICAgICAgICBhdHRycyA9IGtleTsK
KyAgICAgICAgb3B0aW9ucyA9IHZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIChhdHRycyA9
IHt9KVtrZXldID0gdmFsOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSdyZSBub3Qgd2FpdGlu
ZyBhbmQgYXR0cmlidXRlcyBleGlzdCwgc2F2ZSBhY3RzIGFzIGBzZXQoYXR0cikuc2F2ZShudWxs
LCBvcHRzKWAuCisgICAgICBpZiAoYXR0cnMgJiYgKCFvcHRpb25zIHx8ICFvcHRpb25zLndhaXQp
ICYmICF0aGlzLnNldChhdHRycywgb3B0aW9ucykpIHJldHVybiBmYWxzZTsKKworICAgICAgb3B0
aW9ucyA9IF8uZXh0ZW5kKHt2YWxpZGF0ZTogdHJ1ZX0sIG9wdGlvbnMpOworCisgICAgICAvLyBE
byBub3QgcGVyc2lzdCBpbnZhbGlkIG1vZGVscy4KKyAgICAgIGlmICghdGhpcy5fdmFsaWRhdGUo
YXR0cnMsIG9wdGlvbnMpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIFNldCB0ZW1wb3Jhcnkg
YXR0cmlidXRlcyBpZiBge3dhaXQ6IHRydWV9YC4KKyAgICAgIGlmIChhdHRycyAmJiBvcHRpb25z
LndhaXQpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gXy5leHRlbmQoe30sIGF0dHJpYnV0
ZXMsIGF0dHJzKTsKKyAgICAgIH0KKworICAgICAgLy8gQWZ0ZXIgYSBzdWNjZXNzZnVsIHNlcnZl
ci1zaWRlIHNhdmUsIHRoZSBjbGllbnQgaXMgKG9wdGlvbmFsbHkpCisgICAgICAvLyB1cGRhdGVk
IHdpdGggdGhlIHNlcnZlci1zaWRlIHN0YXRlLgorICAgICAgaWYgKG9wdGlvbnMucGFyc2UgPT09
IHZvaWQgMCkgb3B0aW9ucy5wYXJzZSA9IHRydWU7CisgICAgICB2YXIgbW9kZWwgPSB0aGlzOwor
ICAgICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7CisgICAgICBvcHRpb25zLnN1Y2Nl
c3MgPSBmdW5jdGlvbihyZXNwKSB7CisgICAgICAgIC8vIEVuc3VyZSBhdHRyaWJ1dGVzIGFyZSBy
ZXN0b3JlZCBkdXJpbmcgc3luY2hyb25vdXMgc2F2ZXMuCisgICAgICAgIG1vZGVsLmF0dHJpYnV0
ZXMgPSBhdHRyaWJ1dGVzOworICAgICAgICB2YXIgc2VydmVyQXR0cnMgPSBtb2RlbC5wYXJzZShy
ZXNwLCBvcHRpb25zKTsKKyAgICAgICAgaWYgKG9wdGlvbnMud2FpdCkgc2VydmVyQXR0cnMgPSBf
LmV4dGVuZChhdHRycyB8fCB7fSwgc2VydmVyQXR0cnMpOworICAgICAgICBpZiAoXy5pc09iamVj
dChzZXJ2ZXJBdHRycykgJiYgIW1vZGVsLnNldChzZXJ2ZXJBdHRycywgb3B0aW9ucykpIHsKKyAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHN1
Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpOworICAgICAgICBtb2RlbC50cmlnZ2VyKCdzeW5j
JywgbW9kZWwsIHJlc3AsIG9wdGlvbnMpOworICAgICAgfTsKKyAgICAgIHdyYXBFcnJvcih0aGlz
LCBvcHRpb25zKTsKKworICAgICAgbWV0aG9kID0gdGhpcy5pc05ldygpID8gJ2NyZWF0ZScgOiAo
b3B0aW9ucy5wYXRjaCA/ICdwYXRjaCcgOiAndXBkYXRlJyk7CisgICAgICBpZiAobWV0aG9kID09
PSAncGF0Y2gnKSBvcHRpb25zLmF0dHJzID0gYXR0cnM7CisgICAgICB4aHIgPSB0aGlzLnN5bmMo
bWV0aG9kLCB0aGlzLCBvcHRpb25zKTsKKworICAgICAgLy8gUmVzdG9yZSBhdHRyaWJ1dGVzLgor
ICAgICAgaWYgKGF0dHJzICYmIG9wdGlvbnMud2FpdCkgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmli
dXRlczsKKworICAgICAgcmV0dXJuIHhocjsKKyAgICB9LAorCisgICAgLy8gRGVzdHJveSB0aGlz
IG1vZGVsIG9uIHRoZSBzZXJ2ZXIgaWYgaXQgd2FzIGFscmVhZHkgcGVyc2lzdGVkLgorICAgIC8v
IE9wdGltaXN0aWNhbGx5IHJlbW92ZXMgdGhlIG1vZGVsIGZyb20gaXRzIGNvbGxlY3Rpb24sIGlm
IGl0IGhhcyBvbmUuCisgICAgLy8gSWYgYHdhaXQ6IHRydWVgIGlzIHBhc3NlZCwgd2FpdHMgZm9y
IHRoZSBzZXJ2ZXIgdG8gcmVzcG9uZCBiZWZvcmUgcmVtb3ZhbC4KKyAgICBkZXN0cm95OiBmdW5j
dGlvbihvcHRpb25zKSB7CisgICAgICBvcHRpb25zID0gb3B0aW9ucyA/IF8uY2xvbmUob3B0aW9u
cykgOiB7fTsKKyAgICAgIHZhciBtb2RlbCA9IHRoaXM7CisgICAgICB2YXIgc3VjY2VzcyA9IG9w
dGlvbnMuc3VjY2VzczsKKworICAgICAgdmFyIGRlc3Ryb3kgPSBmdW5jdGlvbigpIHsKKyAgICAg
ICAgbW9kZWwudHJpZ2dlcignZGVzdHJveScsIG1vZGVsLCBtb2RlbC5jb2xsZWN0aW9uLCBvcHRp
b25zKTsKKyAgICAgIH07CisKKyAgICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3Ap
IHsKKyAgICAgICAgaWYgKG9wdGlvbnMud2FpdCB8fCBtb2RlbC5pc05ldygpKSBkZXN0cm95KCk7
CisgICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKG1vZGVsLCByZXNwLCBvcHRpb25zKTsKKyAg
ICAgICAgaWYgKCFtb2RlbC5pc05ldygpKSBtb2RlbC50cmlnZ2VyKCdzeW5jJywgbW9kZWwsIHJl
c3AsIG9wdGlvbnMpOworICAgICAgfTsKKworICAgICAgaWYgKHRoaXMuaXNOZXcoKSkgeworICAg
ICAgICBvcHRpb25zLnN1Y2Nlc3MoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQor
ICAgICAgd3JhcEVycm9yKHRoaXMsIG9wdGlvbnMpOworCisgICAgICB2YXIgeGhyID0gdGhpcy5z
eW5jKCdkZWxldGUnLCB0aGlzLCBvcHRpb25zKTsKKyAgICAgIGlmICghb3B0aW9ucy53YWl0KSBk
ZXN0cm95KCk7CisgICAgICByZXR1cm4geGhyOworICAgIH0sCisKKyAgICAvLyBEZWZhdWx0IFVS
TCBmb3IgdGhlIG1vZGVsJ3MgcmVwcmVzZW50YXRpb24gb24gdGhlIHNlcnZlciAtLSBpZiB5b3Un
cmUKKyAgICAvLyB1c2luZyBCYWNrYm9uZSdzIHJlc3RmdWwgbWV0aG9kcywgb3ZlcnJpZGUgdGhp
cyB0byBjaGFuZ2UgdGhlIGVuZHBvaW50CisgICAgLy8gdGhhdCB3aWxsIGJlIGNhbGxlZC4KKyAg
ICB1cmw6IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJhc2UgPSBfLnJlc3VsdCh0aGlzLCAndXJs
Um9vdCcpIHx8IF8ucmVzdWx0KHRoaXMuY29sbGVjdGlvbiwgJ3VybCcpIHx8IHVybEVycm9yKCk7
CisgICAgICBpZiAodGhpcy5pc05ldygpKSByZXR1cm4gYmFzZTsKKyAgICAgIHJldHVybiBiYXNl
ICsgKGJhc2UuY2hhckF0KGJhc2UubGVuZ3RoIC0gMSkgPT09ICcvJyA/ICcnIDogJy8nKSArIGVu
Y29kZVVSSUNvbXBvbmVudCh0aGlzLmlkKTsKKyAgICB9LAorCisgICAgLy8gKipwYXJzZSoqIGNv
bnZlcnRzIGEgcmVzcG9uc2UgaW50byB0aGUgaGFzaCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGBzZXRg
IG9uCisgICAgLy8gdGhlIG1vZGVsLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0
IHRvIHBhc3MgdGhlIHJlc3BvbnNlIGFsb25nLgorICAgIHBhcnNlOiBmdW5jdGlvbihyZXNwLCBv
cHRpb25zKSB7CisgICAgICByZXR1cm4gcmVzcDsKKyAgICB9LAorCisgICAgLy8gQ3JlYXRlIGEg
bmV3IG1vZGVsIHdpdGggaWRlbnRpY2FsIGF0dHJpYnV0ZXMgdG8gdGhpcyBvbmUuCisgICAgY2xv
bmU6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMu
YXR0cmlidXRlcyk7CisgICAgfSwKKworICAgIC8vIEEgbW9kZWwgaXMgbmV3IGlmIGl0IGhhcyBu
ZXZlciBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCBsYWNrcyBhbiBpZC4KKyAgICBpc05l
dzogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5pZCA9PSBudWxsOworICAgIH0sCisK
KyAgICAvLyBDaGVjayBpZiB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGluIGEgdmFsaWQgc3RhdGUu
CisgICAgaXNWYWxpZDogZnVuY3Rpb24ob3B0aW9ucykgeworICAgICAgcmV0dXJuIHRoaXMuX3Zh
bGlkYXRlKHt9LCBfLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7IHZhbGlkYXRlOiB0cnVlIH0pKTsK
KyAgICB9LAorCisgICAgLy8gUnVuIHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbmV4dCBjb21wbGV0
ZSBzZXQgb2YgbW9kZWwgYXR0cmlidXRlcywKKyAgICAvLyByZXR1cm5pbmcgYHRydWVgIGlmIGFs
bCBpcyB3ZWxsLiBPdGhlcndpc2UsIGZpcmUgYW4gYCJpbnZhbGlkImAgZXZlbnQuCisgICAgX3Zh
bGlkYXRlOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykgeworICAgICAgaWYgKCFvcHRpb25zLnZh
bGlkYXRlIHx8ICF0aGlzLnZhbGlkYXRlKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGF0dHJzID0gXy5l
eHRlbmQoe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cnMpOworICAgICAgdmFyIGVycm9yID0gdGhp
cy52YWxpZGF0aW9uRXJyb3IgPSB0aGlzLnZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKSB8fCBudWxs
OworICAgICAgaWYgKCFlcnJvcikgcmV0dXJuIHRydWU7CisgICAgICB0aGlzLnRyaWdnZXIoJ2lu
dmFsaWQnLCB0aGlzLCBlcnJvciwgXy5leHRlbmQob3B0aW9ucyB8fCB7fSwge3ZhbGlkYXRpb25F
cnJvcjogZXJyb3J9KSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIH0pOworCisg
IC8vIFVuZGVyc2NvcmUgbWV0aG9kcyB0aGF0IHdlIHdhbnQgdG8gaW1wbGVtZW50IG9uIHRoZSBN
b2RlbC4KKyAgdmFyIG1vZGVsTWV0aG9kcyA9IFsna2V5cycsICd2YWx1ZXMnLCAncGFpcnMnLCAn
aW52ZXJ0JywgJ3BpY2snLCAnb21pdCddOworCisgIC8vIE1peCBpbiBlYWNoIFVuZGVyc2NvcmUg
bWV0aG9kIGFzIGEgcHJveHkgdG8gYE1vZGVsI2F0dHJpYnV0ZXNgLgorICBfLmVhY2gobW9kZWxN
ZXRob2RzLCBmdW5jdGlvbihtZXRob2QpIHsKKyAgICBNb2RlbC5wcm90b3R5cGVbbWV0aG9kXSA9
IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7Cisg
ICAgICBhcmdzLnVuc2hpZnQodGhpcy5hdHRyaWJ1dGVzKTsKKyAgICAgIHJldHVybiBfW21ldGhv
ZF0uYXBwbHkoXywgYXJncyk7CisgICAgfTsKKyAgfSk7CisKKyAgLy8gQmFja2JvbmUuQ29sbGVj
dGlvbgorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gSWYgbW9kZWxzIHRlbmQgdG8g
cmVwcmVzZW50IGEgc2luZ2xlIHJvdyBvZiBkYXRhLCBhIEJhY2tib25lIENvbGxlY3Rpb24gaXMK
KyAgLy8gbW9yZSBhbmFsYWdvdXMgdG8gYSB0YWJsZSBmdWxsIG9mIGRhdGEgLi4uIG9yIGEgc21h
bGwgc2xpY2Ugb3IgcGFnZSBvZiB0aGF0CisgIC8vIHRhYmxlLCBvciBhIGNvbGxlY3Rpb24gb2Yg
cm93cyB0aGF0IGJlbG9uZyB0b2dldGhlciBmb3IgYSBwYXJ0aWN1bGFyIHJlYXNvbgorICAvLyAt
LSBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoaXMgcGFydGljdWxhciBmb2xkZXIsIGFsbCBvZiB0
aGUgZG9jdW1lbnRzCisgIC8vIGJlbG9uZ2luZyB0byB0aGlzIHBhcnRpY3VsYXIgYXV0aG9yLCBh
bmQgc28gb24uIENvbGxlY3Rpb25zIG1haW50YWluCisgIC8vIGluZGV4ZXMgb2YgdGhlaXIgbW9k
ZWxzLCBib3RoIGluIG9yZGVyLCBhbmQgZm9yIGxvb2t1cCBieSBgaWRgLgorCisgIC8vIENyZWF0
ZSBhIG5ldyAqKkNvbGxlY3Rpb24qKiwgcGVyaGFwcyB0byBjb250YWluIGEgc3BlY2lmaWMgdHlw
ZSBvZiBgbW9kZWxgLgorICAvLyBJZiBhIGBjb21wYXJhdG9yYCBpcyBzcGVjaWZpZWQsIHRoZSBD
b2xsZWN0aW9uIHdpbGwgbWFpbnRhaW4KKyAgLy8gaXRzIG1vZGVscyBpbiBzb3J0IG9yZGVyLCBh
cyB0aGV5J3JlIGFkZGVkIGFuZCByZW1vdmVkLgorICB2YXIgQ29sbGVjdGlvbiA9IEJhY2tib25l
LkNvbGxlY3Rpb24gPSBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHsKKyAgICBvcHRpb25zIHx8
IChvcHRpb25zID0ge30pOworICAgIGlmIChvcHRpb25zLnVybCkgdGhpcy51cmwgPSBvcHRpb25z
LnVybDsKKyAgICBpZiAob3B0aW9ucy5tb2RlbCkgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7
CisgICAgaWYgKG9wdGlvbnMuY29tcGFyYXRvciAhPT0gdm9pZCAwKSB0aGlzLmNvbXBhcmF0b3Ig
PSBvcHRpb25zLmNvbXBhcmF0b3I7CisgICAgdGhpcy5fcmVzZXQoKTsKKyAgICB0aGlzLmluaXRp
YWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICBpZiAobW9kZWxzKSB0aGlzLnJlc2V0
KG1vZGVscywgXy5leHRlbmQoe3NpbGVudDogdHJ1ZX0sIG9wdGlvbnMpKTsKKyAgfTsKKworICAv
LyBEZWZhdWx0IG9wdGlvbnMgZm9yIGBDb2xsZWN0aW9uI3NldGAuCisgIHZhciBzZXRPcHRpb25z
ID0ge2FkZDogdHJ1ZSwgcmVtb3ZlOiB0cnVlLCBtZXJnZTogdHJ1ZX07CisgIHZhciBhZGRPcHRp
b25zID0ge2FkZDogdHJ1ZSwgbWVyZ2U6IGZhbHNlLCByZW1vdmU6IGZhbHNlfTsKKworICAvLyBE
ZWZpbmUgdGhlIENvbGxlY3Rpb24ncyBpbmhlcml0YWJsZSBtZXRob2RzLgorICBfLmV4dGVuZChD
b2xsZWN0aW9uLnByb3RvdHlwZSwgRXZlbnRzLCB7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBtb2Rl
bCBmb3IgYSBjb2xsZWN0aW9uIGlzIGp1c3QgYSAqKkJhY2tib25lLk1vZGVsKiouCisgICAgLy8g
VGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBtb3N0IGNhc2VzLgorICAgIG1vZGVsOiBNb2Rl
bCwKKworICAgIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdC4g
T3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93bgorICAgIC8vIGluaXRpYWxpemF0aW9uIGxvZ2ljLgor
ICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7fSwKKworICAgIC8vIFRoZSBKU09OIHJlcHJlc2Vu
dGF0aW9uIG9mIGEgQ29sbGVjdGlvbiBpcyBhbiBhcnJheSBvZiB0aGUKKyAgICAvLyBtb2RlbHMn
IGF0dHJpYnV0ZXMuCisgICAgdG9KU09OOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgICByZXR1
cm4gdGhpcy5tYXAoZnVuY3Rpb24obW9kZWwpeyByZXR1cm4gbW9kZWwudG9KU09OKG9wdGlvbnMp
OyB9KTsKKyAgICB9LAorCisgICAgLy8gUHJveHkgYEJhY2tib25lLnN5bmNgIGJ5IGRlZmF1bHQu
CisgICAgc3luYzogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gQmFja2JvbmUuc3luYy5hcHBs
eSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICAvLyBBZGQgYSBtb2RlbCwgb3IgbGlz
dCBvZiBtb2RlbHMgdG8gdGhlIHNldC4KKyAgICBhZGQ6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9u
cykgeworICAgICAgcmV0dXJuIHRoaXMuc2V0KG1vZGVscywgXy5kZWZhdWx0cyhvcHRpb25zIHx8
IHt9LCBhZGRPcHRpb25zKSk7CisgICAgfSwKKworICAgIC8vIFJlbW92ZSBhIG1vZGVsLCBvciBh
IGxpc3Qgb2YgbW9kZWxzIGZyb20gdGhlIHNldC4KKyAgICByZW1vdmU6IGZ1bmN0aW9uKG1vZGVs
cywgb3B0aW9ucykgeworICAgICAgbW9kZWxzID0gXy5pc0FycmF5KG1vZGVscykgPyBtb2RlbHMu
c2xpY2UoKSA6IFttb2RlbHNdOworICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTsKKyAg
ICAgIHZhciBpLCBsLCBpbmRleCwgbW9kZWw7CisgICAgICBmb3IgKGkgPSAwLCBsID0gbW9kZWxz
Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBtb2RlbCA9IHRoaXMuZ2V0KG1vZGVsc1tp
XSk7CisgICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlOworICAgICAgICBkZWxldGUgdGhpcy5f
YnlJZFttb2RlbC5pZF07CisgICAgICAgIGRlbGV0ZSB0aGlzLl9ieUlkW21vZGVsLmNpZF07Cisg
ICAgICAgIGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTsKKyAgICAgICAgdGhpcy5tb2RlbHMu
c3BsaWNlKGluZGV4LCAxKTsKKyAgICAgICAgdGhpcy5sZW5ndGgtLTsKKyAgICAgICAgaWYgKCFv
cHRpb25zLnNpbGVudCkgeworICAgICAgICAgIG9wdGlvbnMuaW5kZXggPSBpbmRleDsKKyAgICAg
ICAgICBtb2RlbC50cmlnZ2VyKCdyZW1vdmUnLCBtb2RlbCwgdGhpcywgb3B0aW9ucyk7CisgICAg
ICAgIH0KKyAgICAgICAgdGhpcy5fcmVtb3ZlUmVmZXJlbmNlKG1vZGVsKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBVcGRhdGUgYSBjb2xsZWN0aW9uIGJ5
IGBzZXRgLWluZyBhIG5ldyBsaXN0IG9mIG1vZGVscywgYWRkaW5nIG5ldyBvbmVzLAorICAgIC8v
IHJlbW92aW5nIG1vZGVscyB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudCwgYW5kIG1lcmdpbmcg
bW9kZWxzIHRoYXQKKyAgICAvLyBhbHJlYWR5IGV4aXN0IGluIHRoZSBjb2xsZWN0aW9uLCBhcyBu
ZWNlc3NhcnkuIFNpbWlsYXIgdG8gKipNb2RlbCNzZXQqKiwKKyAgICAvLyB0aGUgY29yZSBvcGVy
YXRpb24gZm9yIHVwZGF0aW5nIHRoZSBkYXRhIGNvbnRhaW5lZCBieSB0aGUgY29sbGVjdGlvbi4K
KyAgICBzZXQ6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykgeworICAgICAgb3B0aW9ucyA9IF8u
ZGVmYXVsdHMob3B0aW9ucyB8fCB7fSwgc2V0T3B0aW9ucyk7CisgICAgICBpZiAob3B0aW9ucy5w
YXJzZSkgbW9kZWxzID0gdGhpcy5wYXJzZShtb2RlbHMsIG9wdGlvbnMpOworICAgICAgaWYgKCFf
LmlzQXJyYXkobW9kZWxzKSkgbW9kZWxzID0gbW9kZWxzID8gW21vZGVsc10gOiBbXTsKKyAgICAg
IHZhciBpLCBsLCBtb2RlbCwgYXR0cnMsIGV4aXN0aW5nLCBzb3J0OworICAgICAgdmFyIGF0ID0g
b3B0aW9ucy5hdDsKKyAgICAgIHZhciBzb3J0YWJsZSA9IHRoaXMuY29tcGFyYXRvciAmJiAoYXQg
PT0gbnVsbCkgJiYgb3B0aW9ucy5zb3J0ICE9PSBmYWxzZTsKKyAgICAgIHZhciBzb3J0QXR0ciA9
IF8uaXNTdHJpbmcodGhpcy5jb21wYXJhdG9yKSA/IHRoaXMuY29tcGFyYXRvciA6IG51bGw7Cisg
ICAgICB2YXIgdG9BZGQgPSBbXSwgdG9SZW1vdmUgPSBbXSwgbW9kZWxNYXAgPSB7fTsKKworICAg
ICAgLy8gVHVybiBiYXJlIG9iamVjdHMgaW50byBtb2RlbCByZWZlcmVuY2VzLCBhbmQgcHJldmVu
dCBpbnZhbGlkIG1vZGVscworICAgICAgLy8gZnJvbSBiZWluZyBhZGRlZC4KKyAgICAgIGZvciAo
aSA9IDAsIGwgPSBtb2RlbHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIGlmICghKG1v
ZGVsID0gdGhpcy5fcHJlcGFyZU1vZGVsKG1vZGVsc1tpXSwgb3B0aW9ucykpKSBjb250aW51ZTsK
KworICAgICAgICAvLyBJZiBhIGR1cGxpY2F0ZSBpcyBmb3VuZCwgcHJldmVudCBpdCBmcm9tIGJl
aW5nIGFkZGVkIGFuZAorICAgICAgICAvLyBvcHRpb25hbGx5IG1lcmdlIGl0IGludG8gdGhlIGV4
aXN0aW5nIG1vZGVsLgorICAgICAgICBpZiAoZXhpc3RpbmcgPSB0aGlzLmdldChtb2RlbCkpIHsK
KyAgICAgICAgICBpZiAob3B0aW9ucy5yZW1vdmUpIG1vZGVsTWFwW2V4aXN0aW5nLmNpZF0gPSB0
cnVlOworICAgICAgICAgIGlmIChvcHRpb25zLm1lcmdlKSB7CisgICAgICAgICAgICBleGlzdGlu
Zy5zZXQobW9kZWwuYXR0cmlidXRlcywgb3B0aW9ucyk7CisgICAgICAgICAgICBpZiAoc29ydGFi
bGUgJiYgIXNvcnQgJiYgZXhpc3RpbmcuaGFzQ2hhbmdlZChzb3J0QXR0cikpIHNvcnQgPSB0cnVl
OworICAgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vZGVsLCBwdXNoIGl0
IHRvIHRoZSBgdG9BZGRgIGxpc3QuCisgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5hZGQpIHsK
KyAgICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTsKKworICAgICAgICAgIC8vIExpc3RlbiB0byBh
ZGRlZCBtb2RlbHMnIGV2ZW50cywgYW5kIGluZGV4IG1vZGVscyBmb3IgbG9va3VwIGJ5CisgICAg
ICAgICAgLy8gYGlkYCBhbmQgYnkgYGNpZGAuCisgICAgICAgICAgbW9kZWwub24oJ2FsbCcsIHRo
aXMuX29uTW9kZWxFdmVudCwgdGhpcyk7CisgICAgICAgICAgdGhpcy5fYnlJZFttb2RlbC5jaWRd
ID0gbW9kZWw7CisgICAgICAgICAgaWYgKG1vZGVsLmlkICE9IG51bGwpIHRoaXMuX2J5SWRbbW9k
ZWwuaWRdID0gbW9kZWw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gUmVtb3ZlIG5v
bmV4aXN0ZW50IG1vZGVscyBpZiBhcHByb3ByaWF0ZS4KKyAgICAgIGlmIChvcHRpb25zLnJlbW92
ZSkgeworICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyArK2kpIHsK
KyAgICAgICAgICBpZiAoIW1vZGVsTWFwWyhtb2RlbCA9IHRoaXMubW9kZWxzW2ldKS5jaWRdKSB0
b1JlbW92ZS5wdXNoKG1vZGVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9SZW1vdmUubGVu
Z3RoKSB0aGlzLnJlbW92ZSh0b1JlbW92ZSwgb3B0aW9ucyk7CisgICAgICB9CisKKyAgICAgIC8v
IFNlZSBpZiBzb3J0aW5nIGlzIG5lZWRlZCwgdXBkYXRlIGBsZW5ndGhgIGFuZCBzcGxpY2UgaW4g
bmV3IG1vZGVscy4KKyAgICAgIGlmICh0b0FkZC5sZW5ndGgpIHsKKyAgICAgICAgaWYgKHNvcnRh
YmxlKSBzb3J0ID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5sZW5ndGggKz0gdG9BZGQubGVuZ3RoOwor
ICAgICAgICBpZiAoYXQgIT0gbnVsbCkgeworICAgICAgICAgIHNwbGljZS5hcHBseSh0aGlzLm1v
ZGVscywgW2F0LCAwXS5jb25jYXQodG9BZGQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICBwdXNoLmFwcGx5KHRoaXMubW9kZWxzLCB0b0FkZCk7CisgICAgICAgIH0KKyAgICAgIH0KKwor
ICAgICAgLy8gU2lsZW50bHkgc29ydCB0aGUgY29sbGVjdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAg
ICAgIGlmIChzb3J0KSB0aGlzLnNvcnQoe3NpbGVudDogdHJ1ZX0pOworCisgICAgICBpZiAob3B0
aW9ucy5zaWxlbnQpIHJldHVybiB0aGlzOworCisgICAgICAvLyBUcmlnZ2VyIGBhZGRgIGV2ZW50
cy4KKyAgICAgIGZvciAoaSA9IDAsIGwgPSB0b0FkZC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAg
ICAgICAgKG1vZGVsID0gdG9BZGRbaV0pLnRyaWdnZXIoJ2FkZCcsIG1vZGVsLCB0aGlzLCBvcHRp
b25zKTsKKyAgICAgIH0KKworICAgICAgLy8gVHJpZ2dlciBgc29ydGAgaWYgdGhlIGNvbGxlY3Rp
b24gd2FzIHNvcnRlZC4KKyAgICAgIGlmIChzb3J0KSB0aGlzLnRyaWdnZXIoJ3NvcnQnLCB0aGlz
LCBvcHRpb25zKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBXaGVuIHlv
dSBoYXZlIG1vcmUgaXRlbXMgdGhhbiB5b3Ugd2FudCB0byBhZGQgb3IgcmVtb3ZlIGluZGl2aWR1
YWxseSwKKyAgICAvLyB5b3UgY2FuIHJlc2V0IHRoZSBlbnRpcmUgc2V0IHdpdGggYSBuZXcgbGlz
dCBvZiBtb2RlbHMsIHdpdGhvdXQgZmlyaW5nCisgICAgLy8gYW55IGdyYW51bGFyIGBhZGRgIG9y
IGByZW1vdmVgIGV2ZW50cy4gRmlyZXMgYHJlc2V0YCB3aGVuIGZpbmlzaGVkLgorICAgIC8vIFVz
ZWZ1bCBmb3IgYnVsayBvcGVyYXRpb25zIGFuZCBvcHRpbWl6YXRpb25zLgorICAgIHJlc2V0OiBm
dW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7
fSk7CisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubW9kZWxzLmxlbmd0aDsgaSA8IGw7
IGkrKykgeworICAgICAgICB0aGlzLl9yZW1vdmVSZWZlcmVuY2UodGhpcy5tb2RlbHNbaV0pOwor
ICAgICAgfQorICAgICAgb3B0aW9ucy5wcmV2aW91c01vZGVscyA9IHRoaXMubW9kZWxzOworICAg
ICAgdGhpcy5fcmVzZXQoKTsKKyAgICAgIHRoaXMuYWRkKG1vZGVscywgXy5leHRlbmQoe3NpbGVu
dDogdHJ1ZX0sIG9wdGlvbnMpKTsKKyAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHRoaXMudHJp
Z2dlcigncmVzZXQnLCB0aGlzLCBvcHRpb25zKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0s
CisKKyAgICAvLyBBZGQgYSBtb2RlbCB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLgorICAg
IHB1c2g6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7CisgICAgICBtb2RlbCA9IHRoaXMuX3By
ZXBhcmVNb2RlbChtb2RlbCwgb3B0aW9ucyk7CisgICAgICB0aGlzLmFkZChtb2RlbCwgXy5leHRl
bmQoe2F0OiB0aGlzLmxlbmd0aH0sIG9wdGlvbnMpKTsKKyAgICAgIHJldHVybiBtb2RlbDsKKyAg
ICB9LAorCisgICAgLy8gUmVtb3ZlIGEgbW9kZWwgZnJvbSB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0
aW9uLgorICAgIHBvcDogZnVuY3Rpb24ob3B0aW9ucykgeworICAgICAgdmFyIG1vZGVsID0gdGhp
cy5hdCh0aGlzLmxlbmd0aCAtIDEpOworICAgICAgdGhpcy5yZW1vdmUobW9kZWwsIG9wdGlvbnMp
OworICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0sCisKKyAgICAvLyBBZGQgYSBtb2RlbCB0byB0
aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgIHVuc2hpZnQ6IGZ1bmN0aW9uKG1v
ZGVsLCBvcHRpb25zKSB7CisgICAgICBtb2RlbCA9IHRoaXMuX3ByZXBhcmVNb2RlbChtb2RlbCwg
b3B0aW9ucyk7CisgICAgICB0aGlzLmFkZChtb2RlbCwgXy5leHRlbmQoe2F0OiAwfSwgb3B0aW9u
cykpOworICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0sCisKKyAgICAvLyBSZW1vdmUgYSBtb2Rl
bCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgc2hpZnQ6IGZ1bmN0
aW9uKG9wdGlvbnMpIHsKKyAgICAgIHZhciBtb2RlbCA9IHRoaXMuYXQoMCk7CisgICAgICB0aGlz
LnJlbW92ZShtb2RlbCwgb3B0aW9ucyk7CisgICAgICByZXR1cm4gbW9kZWw7CisgICAgfSwKKwor
ICAgIC8vIFNsaWNlIG91dCBhIHN1Yi1hcnJheSBvZiBtb2RlbHMgZnJvbSB0aGUgY29sbGVjdGlv
bi4KKyAgICBzbGljZTogZnVuY3Rpb24oYmVnaW4sIGVuZCkgeworICAgICAgcmV0dXJuIHRoaXMu
bW9kZWxzLnNsaWNlKGJlZ2luLCBlbmQpOworICAgIH0sCisKKyAgICAvLyBHZXQgYSBtb2RlbCBm
cm9tIHRoZSBzZXQgYnkgaWQuCisgICAgZ2V0OiBmdW5jdGlvbihvYmopIHsKKyAgICAgIGlmIChv
YmogPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDsKKyAgICAgIHJldHVybiB0aGlzLl9ieUlkW29iai5p
ZCAhPSBudWxsID8gb2JqLmlkIDogb2JqLmNpZCB8fCBvYmpdOworICAgIH0sCisKKyAgICAvLyBH
ZXQgdGhlIG1vZGVsIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICBhdDogZnVuY3Rpb24oaW5kZXgp
IHsKKyAgICAgIHJldHVybiB0aGlzLm1vZGVsc1tpbmRleF07CisgICAgfSwKKworICAgIC8vIFJl
dHVybiBtb2RlbHMgd2l0aCBtYXRjaGluZyBhdHRyaWJ1dGVzLiBVc2VmdWwgZm9yIHNpbXBsZSBj
YXNlcyBvZgorICAgIC8vIGBmaWx0ZXJgLgorICAgIHdoZXJlOiBmdW5jdGlvbihhdHRycywgZmly
c3QpIHsKKyAgICAgIGlmIChfLmlzRW1wdHkoYXR0cnMpKSByZXR1cm4gZmlyc3QgPyB2b2lkIDAg
OiBbXTsKKyAgICAgIHJldHVybiB0aGlzW2ZpcnN0ID8gJ2ZpbmQnIDogJ2ZpbHRlciddKGZ1bmN0
aW9uKG1vZGVsKSB7CisgICAgICAgIGZvciAodmFyIGtleSBpbiBhdHRycykgeworICAgICAgICAg
IGlmIChhdHRyc1trZXldICE9PSBtb2RlbC5nZXQoa2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8vIFJl
dHVybiB0aGUgZmlyc3QgbW9kZWwgd2l0aCBtYXRjaGluZyBhdHRyaWJ1dGVzLiBVc2VmdWwgZm9y
IHNpbXBsZSBjYXNlcworICAgIC8vIG9mIGBmaW5kYC4KKyAgICBmaW5kV2hlcmU6IGZ1bmN0aW9u
KGF0dHJzKSB7CisgICAgICByZXR1cm4gdGhpcy53aGVyZShhdHRycywgdHJ1ZSk7CisgICAgfSwK
KworICAgIC8vIEZvcmNlIHRoZSBjb2xsZWN0aW9uIHRvIHJlLXNvcnQgaXRzZWxmLiBZb3UgZG9u
J3QgbmVlZCB0byBjYWxsIHRoaXMgdW5kZXIKKyAgICAvLyBub3JtYWwgY2lyY3Vtc3RhbmNlcywg
YXMgdGhlIHNldCB3aWxsIG1haW50YWluIHNvcnQgb3JkZXIgYXMgZWFjaCBpdGVtCisgICAgLy8g
aXMgYWRkZWQuCisgICAgc29ydDogZnVuY3Rpb24ob3B0aW9ucykgeworICAgICAgaWYgKCF0aGlz
LmNvbXBhcmF0b3IpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNvcnQgYSBzZXQgd2l0aG91dCBh
IGNvbXBhcmF0b3InKTsKKyAgICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7CisKKyAgICAg
IC8vIFJ1biBzb3J0IGJhc2VkIG9uIHR5cGUgb2YgYGNvbXBhcmF0b3JgLgorICAgICAgaWYgKF8u
aXNTdHJpbmcodGhpcy5jb21wYXJhdG9yKSB8fCB0aGlzLmNvbXBhcmF0b3IubGVuZ3RoID09PSAx
KSB7CisgICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5zb3J0QnkodGhpcy5jb21wYXJhdG9yLCB0
aGlzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMubW9kZWxzLnNvcnQoXy5iaW5kKHRo
aXMuY29tcGFyYXRvciwgdGhpcykpOworICAgICAgfQorCisgICAgICBpZiAoIW9wdGlvbnMuc2ls
ZW50KSB0aGlzLnRyaWdnZXIoJ3NvcnQnLCB0aGlzLCBvcHRpb25zKTsKKyAgICAgIHJldHVybiB0
aGlzOworICAgIH0sCisKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSBzbWFsbGVzdCBpbmRleCBhdCB3
aGljaCBhIG1vZGVsIHNob3VsZCBiZSBpbnNlcnRlZCBzbyBhcworICAgIC8vIHRvIG1haW50YWlu
IG9yZGVyLgorICAgIHNvcnRlZEluZGV4OiBmdW5jdGlvbihtb2RlbCwgdmFsdWUsIGNvbnRleHQp
IHsKKyAgICAgIHZhbHVlIHx8ICh2YWx1ZSA9IHRoaXMuY29tcGFyYXRvcik7CisgICAgICB2YXIg
aXRlcmF0b3IgPSBfLmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUgOiBmdW5jdGlvbihtb2RlbCkg
eworICAgICAgICByZXR1cm4gbW9kZWwuZ2V0KHZhbHVlKTsKKyAgICAgIH07CisgICAgICByZXR1
cm4gXy5zb3J0ZWRJbmRleCh0aGlzLm1vZGVscywgbW9kZWwsIGl0ZXJhdG9yLCBjb250ZXh0KTsK
KyAgICB9LAorCisgICAgLy8gUGx1Y2sgYW4gYXR0cmlidXRlIGZyb20gZWFjaCBtb2RlbCBpbiB0
aGUgY29sbGVjdGlvbi4KKyAgICBwbHVjazogZnVuY3Rpb24oYXR0cikgeworICAgICAgcmV0dXJu
IF8uaW52b2tlKHRoaXMubW9kZWxzLCAnZ2V0JywgYXR0cik7CisgICAgfSwKKworICAgIC8vIEZl
dGNoIHRoZSBkZWZhdWx0IHNldCBvZiBtb2RlbHMgZm9yIHRoaXMgY29sbGVjdGlvbiwgcmVzZXR0
aW5nIHRoZQorICAgIC8vIGNvbGxlY3Rpb24gd2hlbiB0aGV5IGFycml2ZS4gSWYgYHJlc2V0OiB0
cnVlYCBpcyBwYXNzZWQsIHRoZSByZXNwb25zZQorICAgIC8vIGRhdGEgd2lsbCBiZSBwYXNzZWQg
dGhyb3VnaCB0aGUgYHJlc2V0YCBtZXRob2QgaW5zdGVhZCBvZiBgc2V0YC4KKyAgICBmZXRjaDog
ZnVuY3Rpb24ob3B0aW9ucykgeworICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9w
dGlvbnMpIDoge307CisgICAgICBpZiAob3B0aW9ucy5wYXJzZSA9PT0gdm9pZCAwKSBvcHRpb25z
LnBhcnNlID0gdHJ1ZTsKKyAgICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzOworICAg
ICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzOworICAgICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rp
b24ocmVzcCkgeworICAgICAgICB2YXIgbWV0aG9kID0gb3B0aW9ucy5yZXNldCA/ICdyZXNldCcg
OiAnc2V0JzsKKyAgICAgICAgY29sbGVjdGlvblttZXRob2RdKHJlc3AsIG9wdGlvbnMpOworICAg
ICAgICBpZiAoc3VjY2Vzcykgc3VjY2Vzcyhjb2xsZWN0aW9uLCByZXNwLCBvcHRpb25zKTsKKyAg
ICAgICAgY29sbGVjdGlvbi50cmlnZ2VyKCdzeW5jJywgY29sbGVjdGlvbiwgcmVzcCwgb3B0aW9u
cyk7CisgICAgICB9OworICAgICAgd3JhcEVycm9yKHRoaXMsIG9wdGlvbnMpOworICAgICAgcmV0
dXJuIHRoaXMuc3luYygncmVhZCcsIHRoaXMsIG9wdGlvbnMpOworICAgIH0sCisKKyAgICAvLyBD
cmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBtb2RlbCBpbiB0aGlzIGNvbGxlY3Rpb24uIEFkZCB0
aGUgbW9kZWwgdG8gdGhlCisgICAgLy8gY29sbGVjdGlvbiBpbW1lZGlhdGVseSwgdW5sZXNzIGB3
YWl0OiB0cnVlYCBpcyBwYXNzZWQsIGluIHdoaWNoIGNhc2Ugd2UKKyAgICAvLyB3YWl0IGZvciB0
aGUgc2VydmVyIHRvIGFncmVlLgorICAgIGNyZWF0ZTogZnVuY3Rpb24obW9kZWwsIG9wdGlvbnMp
IHsKKyAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gXy5jbG9uZShvcHRpb25zKSA6IHt9OworICAg
ICAgaWYgKCEobW9kZWwgPSB0aGlzLl9wcmVwYXJlTW9kZWwobW9kZWwsIG9wdGlvbnMpKSkgcmV0
dXJuIGZhbHNlOworICAgICAgaWYgKCFvcHRpb25zLndhaXQpIHRoaXMuYWRkKG1vZGVsLCBvcHRp
b25zKTsKKyAgICAgIHZhciBjb2xsZWN0aW9uID0gdGhpczsKKyAgICAgIHZhciBzdWNjZXNzID0g
b3B0aW9ucy5zdWNjZXNzOworICAgICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24ocmVzcCkg
eworICAgICAgICBpZiAob3B0aW9ucy53YWl0KSBjb2xsZWN0aW9uLmFkZChtb2RlbCwgb3B0aW9u
cyk7CisgICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKG1vZGVsLCByZXNwLCBvcHRpb25zKTsK
KyAgICAgIH07CisgICAgICBtb2RlbC5zYXZlKG51bGwsIG9wdGlvbnMpOworICAgICAgcmV0dXJu
IG1vZGVsOworICAgIH0sCisKKyAgICAvLyAqKnBhcnNlKiogY29udmVydHMgYSByZXNwb25zZSBp
bnRvIGEgbGlzdCBvZiBtb2RlbHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgLy8gY29sbGVjdGlv
bi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMganVzdCB0byBwYXNzIGl0IHRocm91Z2gu
CisgICAgcGFyc2U6IGZ1bmN0aW9uKHJlc3AsIG9wdGlvbnMpIHsKKyAgICAgIHJldHVybiByZXNw
OworICAgIH0sCisKKyAgICAvLyBDcmVhdGUgYSBuZXcgY29sbGVjdGlvbiB3aXRoIGFuIGlkZW50
aWNhbCBsaXN0IG9mIG1vZGVscyBhcyB0aGlzIG9uZS4KKyAgICBjbG9uZTogZnVuY3Rpb24oKSB7
CisgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tb2RlbHMpOworICAgIH0s
CisKKyAgICAvLyBQcml2YXRlIG1ldGhvZCB0byByZXNldCBhbGwgaW50ZXJuYWwgc3RhdGUuIENh
bGxlZCB3aGVuIHRoZSBjb2xsZWN0aW9uCisgICAgLy8gaXMgZmlyc3QgaW5pdGlhbGl6ZWQgb3Ig
cmVzZXQuCisgICAgX3Jlc2V0OiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMubGVuZ3RoID0gMDsK
KyAgICAgIHRoaXMubW9kZWxzID0gW107CisgICAgICB0aGlzLl9ieUlkICA9IHt9OworICAgIH0s
CisKKyAgICAvLyBQcmVwYXJlIGEgaGFzaCBvZiBhdHRyaWJ1dGVzIChvciBvdGhlciBtb2RlbCkg
dG8gYmUgYWRkZWQgdG8gdGhpcworICAgIC8vIGNvbGxlY3Rpb24uCisgICAgX3ByZXBhcmVNb2Rl
bDogZnVuY3Rpb24oYXR0cnMsIG9wdGlvbnMpIHsKKyAgICAgIGlmIChhdHRycyBpbnN0YW5jZW9m
IE1vZGVsKSB7CisgICAgICAgIGlmICghYXR0cnMuY29sbGVjdGlvbikgYXR0cnMuY29sbGVjdGlv
biA9IHRoaXM7CisgICAgICAgIHJldHVybiBhdHRyczsKKyAgICAgIH0KKyAgICAgIG9wdGlvbnMg
fHwgKG9wdGlvbnMgPSB7fSk7CisgICAgICBvcHRpb25zLmNvbGxlY3Rpb24gPSB0aGlzOworICAg
ICAgdmFyIG1vZGVsID0gbmV3IHRoaXMubW9kZWwoYXR0cnMsIG9wdGlvbnMpOworICAgICAgaWYg
KCFtb2RlbC5fdmFsaWRhdGUoYXR0cnMsIG9wdGlvbnMpKSB7CisgICAgICAgIHRoaXMudHJpZ2dl
cignaW52YWxpZCcsIHRoaXMsIGF0dHJzLCBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgfQorICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0sCisKKyAgICAvLyBJbnRlcm5h
bCBtZXRob2QgdG8gc2V2ZXIgYSBtb2RlbCdzIHRpZXMgdG8gYSBjb2xsZWN0aW9uLgorICAgIF9y
ZW1vdmVSZWZlcmVuY2U6IGZ1bmN0aW9uKG1vZGVsKSB7CisgICAgICBpZiAodGhpcyA9PT0gbW9k
ZWwuY29sbGVjdGlvbikgZGVsZXRlIG1vZGVsLmNvbGxlY3Rpb247CisgICAgICBtb2RlbC5vZmYo
J2FsbCcsIHRoaXMuX29uTW9kZWxFdmVudCwgdGhpcyk7CisgICAgfSwKKworICAgIC8vIEludGVy
bmFsIG1ldGhvZCBjYWxsZWQgZXZlcnkgdGltZSBhIG1vZGVsIGluIHRoZSBzZXQgZmlyZXMgYW4g
ZXZlbnQuCisgICAgLy8gU2V0cyBuZWVkIHRvIHVwZGF0ZSB0aGVpciBpbmRleGVzIHdoZW4gbW9k
ZWxzIGNoYW5nZSBpZHMuIEFsbCBvdGhlcgorICAgIC8vIGV2ZW50cyBzaW1wbHkgcHJveHkgdGhy
b3VnaC4gImFkZCIgYW5kICJyZW1vdmUiIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZQorICAgIC8vIGlu
IG90aGVyIGNvbGxlY3Rpb25zIGFyZSBpZ25vcmVkLgorICAgIF9vbk1vZGVsRXZlbnQ6IGZ1bmN0
aW9uKGV2ZW50LCBtb2RlbCwgY29sbGVjdGlvbiwgb3B0aW9ucykgeworICAgICAgaWYgKChldmVu
dCA9PT0gJ2FkZCcgfHwgZXZlbnQgPT09ICdyZW1vdmUnKSAmJiBjb2xsZWN0aW9uICE9PSB0aGlz
KSByZXR1cm47CisgICAgICBpZiAoZXZlbnQgPT09ICdkZXN0cm95JykgdGhpcy5yZW1vdmUobW9k
ZWwsIG9wdGlvbnMpOworICAgICAgaWYgKG1vZGVsICYmIGV2ZW50ID09PSAnY2hhbmdlOicgKyBt
b2RlbC5pZEF0dHJpYnV0ZSkgeworICAgICAgICBkZWxldGUgdGhpcy5fYnlJZFttb2RlbC5wcmV2
aW91cyhtb2RlbC5pZEF0dHJpYnV0ZSldOworICAgICAgICBpZiAobW9kZWwuaWQgIT0gbnVsbCkg
dGhpcy5fYnlJZFttb2RlbC5pZF0gPSBtb2RlbDsKKyAgICAgIH0KKyAgICAgIHRoaXMudHJpZ2dl
ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKworICB9KTsKKworICAvLyBVbmRlcnNj
b3JlIG1ldGhvZHMgdGhhdCB3ZSB3YW50IHRvIGltcGxlbWVudCBvbiB0aGUgQ29sbGVjdGlvbi4K
KyAgLy8gOTAlIG9mIHRoZSBjb3JlIHVzZWZ1bG5lc3Mgb2YgQmFja2JvbmUgQ29sbGVjdGlvbnMg
aXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQKKyAgLy8gcmlnaHQgaGVyZToKKyAgdmFyIG1ldGhvZHMg
PSBbJ2ZvckVhY2gnLCAnZWFjaCcsICdtYXAnLCAnY29sbGVjdCcsICdyZWR1Y2UnLCAnZm9sZGwn
LAorICAgICdpbmplY3QnLCAncmVkdWNlUmlnaHQnLCAnZm9sZHInLCAnZmluZCcsICdkZXRlY3Qn
LCAnZmlsdGVyJywgJ3NlbGVjdCcsCisgICAgJ3JlamVjdCcsICdldmVyeScsICdhbGwnLCAnc29t
ZScsICdhbnknLCAnaW5jbHVkZScsICdjb250YWlucycsICdpbnZva2UnLAorICAgICdtYXgnLCAn
bWluJywgJ3RvQXJyYXknLCAnc2l6ZScsICdmaXJzdCcsICdoZWFkJywgJ3Rha2UnLCAnaW5pdGlh
bCcsICdyZXN0JywKKyAgICAndGFpbCcsICdkcm9wJywgJ2xhc3QnLCAnd2l0aG91dCcsICdpbmRl
eE9mJywgJ3NodWZmbGUnLCAnbGFzdEluZGV4T2YnLAorICAgICdpc0VtcHR5JywgJ2NoYWluJ107
CisKKyAgLy8gTWl4IGluIGVhY2ggVW5kZXJzY29yZSBtZXRob2QgYXMgYSBwcm94eSB0byBgQ29s
bGVjdGlvbiNtb2RlbHNgLgorICBfLmVhY2gobWV0aG9kcywgZnVuY3Rpb24obWV0aG9kKSB7Cisg
ICAgQ29sbGVjdGlvbi5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFy
IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgICBhcmdzLnVuc2hpZnQodGhpcy5t
b2RlbHMpOworICAgICAgcmV0dXJuIF9bbWV0aG9kXS5hcHBseShfLCBhcmdzKTsKKyAgICB9Owor
ICB9KTsKKworICAvLyBVbmRlcnNjb3JlIG1ldGhvZHMgdGhhdCB0YWtlIGEgcHJvcGVydHkgbmFt
ZSBhcyBhbiBhcmd1bWVudC4KKyAgdmFyIGF0dHJpYnV0ZU1ldGhvZHMgPSBbJ2dyb3VwQnknLCAn
Y291bnRCeScsICdzb3J0QnknXTsKKworICAvLyBVc2UgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIHBy
b3BlcnRpZXMuCisgIF8uZWFjaChhdHRyaWJ1dGVNZXRob2RzLCBmdW5jdGlvbihtZXRob2QpIHsK
KyAgICBDb2xsZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odmFsdWUsIGNvbnRl
eHQpIHsKKyAgICAgIHZhciBpdGVyYXRvciA9IF8uaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSA6
IGZ1bmN0aW9uKG1vZGVsKSB7CisgICAgICAgIHJldHVybiBtb2RlbC5nZXQodmFsdWUpOworICAg
ICAgfTsKKyAgICAgIHJldHVybiBfW21ldGhvZF0odGhpcy5tb2RlbHMsIGl0ZXJhdG9yLCBjb250
ZXh0KTsKKyAgICB9OworICB9KTsKKworICAvLyBCYWNrYm9uZS5WaWV3CisgIC8vIC0tLS0tLS0t
LS0tLS0KKworICAvLyBCYWNrYm9uZSBWaWV3cyBhcmUgYWxtb3N0IG1vcmUgY29udmVudGlvbiB0
aGFuIHRoZXkgYXJlIGFjdHVhbCBjb2RlLiBBIFZpZXcKKyAgLy8gaXMgc2ltcGx5IGEgSmF2YVNj
cmlwdCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgbG9naWNhbCBjaHVuayBvZiBVSSBpbiB0aGUK
KyAgLy8gRE9NLiBUaGlzIG1pZ2h0IGJlIGEgc2luZ2xlIGl0ZW0sIGFuIGVudGlyZSBsaXN0LCBh
IHNpZGViYXIgb3IgcGFuZWwsIG9yCisgIC8vIGV2ZW4gdGhlIHN1cnJvdW5kaW5nIGZyYW1lIHdo
aWNoIHdyYXBzIHlvdXIgd2hvbGUgYXBwLiBEZWZpbmluZyBhIGNodW5rIG9mCisgIC8vIFVJIGFz
IGEgKipWaWV3KiogYWxsb3dzIHlvdSB0byBkZWZpbmUgeW91ciBET00gZXZlbnRzIGRlY2xhcmF0
aXZlbHksIHdpdGhvdXQKKyAgLy8gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHJlbmRlciBvcmRlciAu
Li4gYW5kIG1ha2VzIGl0IGVhc3kgZm9yIHRoZSB2aWV3IHRvCisgIC8vIHJlYWN0IHRvIHNwZWNp
ZmljIGNoYW5nZXMgaW4gdGhlIHN0YXRlIG9mIHlvdXIgbW9kZWxzLgorCisgIC8vIENyZWF0aW5n
IGEgQmFja2JvbmUuVmlldyBjcmVhdGVzIGl0cyBpbml0aWFsIGVsZW1lbnQgb3V0c2lkZSBvZiB0
aGUgRE9NLAorICAvLyBpZiBhbiBleGlzdGluZyBlbGVtZW50IGlzIG5vdCBwcm92aWRlZC4uLgor
ICB2YXIgVmlldyA9IEJhY2tib25lLlZpZXcgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgdGhp
cy5jaWQgPSBfLnVuaXF1ZUlkKCd2aWV3Jyk7CisgICAgdGhpcy5fY29uZmlndXJlKG9wdGlvbnMg
fHwge30pOworICAgIHRoaXMuX2Vuc3VyZUVsZW1lbnQoKTsKKyAgICB0aGlzLmluaXRpYWxpemUu
YXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB0aGlzLmRlbGVnYXRlRXZlbnRzKCk7CisgIH07
CisKKyAgLy8gQ2FjaGVkIHJlZ2V4IHRvIHNwbGl0IGtleXMgZm9yIGBkZWxlZ2F0ZWAuCisgIHZh
ciBkZWxlZ2F0ZUV2ZW50U3BsaXR0ZXIgPSAvXihcUyspXHMqKC4qKSQvOworCisgIC8vIExpc3Qg
b2YgdmlldyBvcHRpb25zIHRvIGJlIG1lcmdlZCBhcyBwcm9wZXJ0aWVzLgorICB2YXIgdmlld09w
dGlvbnMgPSBbJ21vZGVsJywgJ2NvbGxlY3Rpb24nLCAnZWwnLCAnaWQnLCAnYXR0cmlidXRlcycs
ICdjbGFzc05hbWUnLCAndGFnTmFtZScsICdldmVudHMnXTsKKworICAvLyBTZXQgdXAgYWxsIGlu
aGVyaXRhYmxlICoqQmFja2JvbmUuVmlldyoqIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuCisgIF8u
ZXh0ZW5kKFZpZXcucHJvdG90eXBlLCBFdmVudHMsIHsKKworICAgIC8vIFRoZSBkZWZhdWx0IGB0
YWdOYW1lYCBvZiBhIFZpZXcncyBlbGVtZW50IGlzIGAiZGl2ImAuCisgICAgdGFnTmFtZTogJ2Rp
dicsCisKKyAgICAvLyBqUXVlcnkgZGVsZWdhdGUgZm9yIGVsZW1lbnQgbG9va3VwLCBzY29wZWQg
dG8gRE9NIGVsZW1lbnRzIHdpdGhpbiB0aGUKKyAgICAvLyBjdXJyZW50IHZpZXcuIFRoaXMgc2hv
dWxkIGJlIHByZWZlcmVkIHRvIGdsb2JhbCBsb29rdXBzIHdoZXJlIHBvc3NpYmxlLgorICAgICQ6
IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CisgICAgICByZXR1cm4gdGhpcy4kZWwuZmluZChzZWxlY3Rv
cik7CisgICAgfSwKKworICAgIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkg
ZGVmYXVsdC4gT3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93bgorICAgIC8vIGluaXRpYWxpemF0aW9u
IGxvZ2ljLgorICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7fSwKKworICAgIC8vICoqcmVuZGVy
KiogaXMgdGhlIGNvcmUgZnVuY3Rpb24gdGhhdCB5b3VyIHZpZXcgc2hvdWxkIG92ZXJyaWRlLCBp
biBvcmRlcgorICAgIC8vIHRvIHBvcHVsYXRlIGl0cyBlbGVtZW50IChgdGhpcy5lbGApLCB3aXRo
IHRoZSBhcHByb3ByaWF0ZSBIVE1MLiBUaGUKKyAgICAvLyBjb252ZW50aW9uIGlzIGZvciAqKnJl
bmRlcioqIHRvIGFsd2F5cyByZXR1cm4gYHRoaXNgLgorICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7
CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gUmVtb3ZlIHRoaXMgdmlldyBi
eSB0YWtpbmcgdGhlIGVsZW1lbnQgb3V0IG9mIHRoZSBET00sIGFuZCByZW1vdmluZyBhbnkKKyAg
ICAvLyBhcHBsaWNhYmxlIEJhY2tib25lLkV2ZW50cyBsaXN0ZW5lcnMuCisgICAgcmVtb3ZlOiBm
dW5jdGlvbigpIHsKKyAgICAgIHRoaXMuJGVsLnJlbW92ZSgpOworICAgICAgdGhpcy5zdG9wTGlz
dGVuaW5nKCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gQ2hhbmdlIHRo
ZSB2aWV3J3MgZWxlbWVudCAoYHRoaXMuZWxgIHByb3BlcnR5KSwgaW5jbHVkaW5nIGV2ZW50Cisg
ICAgLy8gcmUtZGVsZWdhdGlvbi4KKyAgICBzZXRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50LCBk
ZWxlZ2F0ZSkgeworICAgICAgaWYgKHRoaXMuJGVsKSB0aGlzLnVuZGVsZWdhdGVFdmVudHMoKTsK
KyAgICAgIHRoaXMuJGVsID0gZWxlbWVudCBpbnN0YW5jZW9mIEJhY2tib25lLiQgPyBlbGVtZW50
IDogQmFja2JvbmUuJChlbGVtZW50KTsKKyAgICAgIHRoaXMuZWwgPSB0aGlzLiRlbFswXTsKKyAg
ICAgIGlmIChkZWxlZ2F0ZSAhPT0gZmFsc2UpIHRoaXMuZGVsZWdhdGVFdmVudHMoKTsKKyAgICAg
IHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBTZXQgY2FsbGJhY2tzLCB3aGVyZSBgdGhp
cy5ldmVudHNgIGlzIGEgaGFzaCBvZgorICAgIC8vCisgICAgLy8gKnsiZXZlbnQgc2VsZWN0b3Ii
OiAiY2FsbGJhY2sifSoKKyAgICAvLworICAgIC8vICAgICB7CisgICAgLy8gICAgICAgJ21vdXNl
ZG93biAudGl0bGUnOiAgJ2VkaXQnLAorICAgIC8vICAgICAgICdjbGljayAuYnV0dG9uJzogICAg
ICdzYXZlJworICAgIC8vICAgICAgICdjbGljayAub3Blbic6ICAgICAgIGZ1bmN0aW9uKGUpIHsg
Li4uIH0KKyAgICAvLyAgICAgfQorICAgIC8vCisgICAgLy8gcGFpcnMuIENhbGxiYWNrcyB3aWxs
IGJlIGJvdW5kIHRvIHRoZSB2aWV3LCB3aXRoIGB0aGlzYCBzZXQgcHJvcGVybHkuCisgICAgLy8g
VXNlcyBldmVudCBkZWxlZ2F0aW9uIGZvciBlZmZpY2llbmN5LgorICAgIC8vIE9taXR0aW5nIHRo
ZSBzZWxlY3RvciBiaW5kcyB0aGUgZXZlbnQgdG8gYHRoaXMuZWxgLgorICAgIC8vIFRoaXMgb25s
eSB3b3JrcyBmb3IgZGVsZWdhdGUtYWJsZSBldmVudHM6IG5vdCBgZm9jdXNgLCBgYmx1cmAsIGFu
ZAorICAgIC8vIG5vdCBgY2hhbmdlYCwgYHN1Ym1pdGAsIGFuZCBgcmVzZXRgIGluIEludGVybmV0
IEV4cGxvcmVyLgorICAgIGRlbGVnYXRlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKKyAgICAg
IGlmICghKGV2ZW50cyB8fCAoZXZlbnRzID0gXy5yZXN1bHQodGhpcywgJ2V2ZW50cycpKSkpIHJl
dHVybiB0aGlzOworICAgICAgdGhpcy51bmRlbGVnYXRlRXZlbnRzKCk7CisgICAgICBmb3IgKHZh
ciBrZXkgaW4gZXZlbnRzKSB7CisgICAgICAgIHZhciBtZXRob2QgPSBldmVudHNba2V5XTsKKyAg
ICAgICAgaWYgKCFfLmlzRnVuY3Rpb24obWV0aG9kKSkgbWV0aG9kID0gdGhpc1tldmVudHNba2V5
XV07CisgICAgICAgIGlmICghbWV0aG9kKSBjb250aW51ZTsKKworICAgICAgICB2YXIgbWF0Y2gg
PSBrZXkubWF0Y2goZGVsZWdhdGVFdmVudFNwbGl0dGVyKTsKKyAgICAgICAgdmFyIGV2ZW50TmFt
ZSA9IG1hdGNoWzFdLCBzZWxlY3RvciA9IG1hdGNoWzJdOworICAgICAgICBtZXRob2QgPSBfLmJp
bmQobWV0aG9kLCB0aGlzKTsKKyAgICAgICAgZXZlbnROYW1lICs9ICcuZGVsZWdhdGVFdmVudHMn
ICsgdGhpcy5jaWQ7CisgICAgICAgIGlmIChzZWxlY3RvciA9PT0gJycpIHsKKyAgICAgICAgICB0
aGlzLiRlbC5vbihldmVudE5hbWUsIG1ldGhvZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgdGhpcy4kZWwub24oZXZlbnROYW1lLCBzZWxlY3RvciwgbWV0aG9kKTsKKyAgICAgICAgfQor
ICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8vIENsZWFycyBhbGwg
Y2FsbGJhY2tzIHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIHZpZXcgd2l0aCBgZGVsZWdhdGVFdmVu
dHNgLgorICAgIC8vIFlvdSB1c3VhbGx5IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMsIGJ1dCBtYXkg
d2lzaCB0byBpZiB5b3UgaGF2ZSBtdWx0aXBsZQorICAgIC8vIEJhY2tib25lIHZpZXdzIGF0dGFj
aGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LgorICAgIHVuZGVsZWdhdGVFdmVudHM6IGZ1bmN0
aW9uKCkgeworICAgICAgdGhpcy4kZWwub2ZmKCcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQp
OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8vIFBlcmZvcm1zIHRoZSBpbml0
aWFsIGNvbmZpZ3VyYXRpb24gb2YgYSBWaWV3IHdpdGggYSBzZXQgb2Ygb3B0aW9ucy4KKyAgICAv
LyBLZXlzIHdpdGggc3BlY2lhbCBtZWFuaW5nICooZS5nLiBtb2RlbCwgY29sbGVjdGlvbiwgaWQs
IGNsYXNzTmFtZSkqIGFyZQorICAgIC8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSB2aWV3LiAg
U2VlIGB2aWV3T3B0aW9uc2AgZm9yIGFuIGV4aGF1c3RpdmUKKyAgICAvLyBsaXN0LgorICAgIF9j
b25maWd1cmU6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMpIG9w
dGlvbnMgPSBfLmV4dGVuZCh7fSwgXy5yZXN1bHQodGhpcywgJ29wdGlvbnMnKSwgb3B0aW9ucyk7
CisgICAgICBfLmV4dGVuZCh0aGlzLCBfLnBpY2sob3B0aW9ucywgdmlld09wdGlvbnMpKTsKKyAg
ICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfSwKKworICAgIC8vIEVuc3VyZSB0aGF0
IHRoZSBWaWV3IGhhcyBhIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLgorICAgIC8vIElmIGB0
aGlzLmVsYCBpcyBhIHN0cmluZywgcGFzcyBpdCB0aHJvdWdoIGAkKClgLCB0YWtlIHRoZSBmaXJz
dAorICAgIC8vIG1hdGNoaW5nIGVsZW1lbnQsIGFuZCByZS1hc3NpZ24gaXQgdG8gYGVsYC4gT3Ro
ZXJ3aXNlLCBjcmVhdGUKKyAgICAvLyBhbiBlbGVtZW50IGZyb20gdGhlIGBpZGAsIGBjbGFzc05h
bWVgIGFuZCBgdGFnTmFtZWAgcHJvcGVydGllcy4KKyAgICBfZW5zdXJlRWxlbWVudDogZnVuY3Rp
b24oKSB7CisgICAgICBpZiAoIXRoaXMuZWwpIHsKKyAgICAgICAgdmFyIGF0dHJzID0gXy5leHRl
bmQoe30sIF8ucmVzdWx0KHRoaXMsICdhdHRyaWJ1dGVzJykpOworICAgICAgICBpZiAodGhpcy5p
ZCkgYXR0cnMuaWQgPSBfLnJlc3VsdCh0aGlzLCAnaWQnKTsKKyAgICAgICAgaWYgKHRoaXMuY2xh
c3NOYW1lKSBhdHRyc1snY2xhc3MnXSA9IF8ucmVzdWx0KHRoaXMsICdjbGFzc05hbWUnKTsKKyAg
ICAgICAgdmFyICRlbCA9IEJhY2tib25lLiQoJzwnICsgXy5yZXN1bHQodGhpcywgJ3RhZ05hbWUn
KSArICc+JykuYXR0cihhdHRycyk7CisgICAgICAgIHRoaXMuc2V0RWxlbWVudCgkZWwsIGZhbHNl
KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2V0RWxlbWVudChfLnJlc3VsdCh0aGlz
LCAnZWwnKSwgZmFsc2UpOworICAgICAgfQorICAgIH0KKworICB9KTsKKworICAvLyBCYWNrYm9u
ZS5zeW5jCisgIC8vIC0tLS0tLS0tLS0tLS0KKworICAvLyBPdmVycmlkZSB0aGlzIGZ1bmN0aW9u
IHRvIGNoYW5nZSB0aGUgbWFubmVyIGluIHdoaWNoIEJhY2tib25lIHBlcnNpc3RzCisgIC8vIG1v
ZGVscyB0byB0aGUgc2VydmVyLiBZb3Ugd2lsbCBiZSBwYXNzZWQgdGhlIHR5cGUgb2YgcmVxdWVz
dCwgYW5kIHRoZQorICAvLyBtb2RlbCBpbiBxdWVzdGlvbi4gQnkgZGVmYXVsdCwgbWFrZXMgYSBS
RVNUZnVsIEFqYXggcmVxdWVzdAorICAvLyB0byB0aGUgbW9kZWwncyBgdXJsKClgLiBTb21lIHBv
c3NpYmxlIGN1c3RvbWl6YXRpb25zIGNvdWxkIGJlOgorICAvLworICAvLyAqIFVzZSBgc2V0VGlt
ZW91dGAgdG8gYmF0Y2ggcmFwaWQtZmlyZSB1cGRhdGVzIGludG8gYSBzaW5nbGUgcmVxdWVzdC4K
KyAgLy8gKiBTZW5kIHVwIHRoZSBtb2RlbHMgYXMgWE1MIGluc3RlYWQgb2YgSlNPTi4KKyAgLy8g
KiBQZXJzaXN0IG1vZGVscyB2aWEgV2ViU29ja2V0cyBpbnN0ZWFkIG9mIEFqYXguCisgIC8vCisg
IC8vIFR1cm4gb24gYEJhY2tib25lLmVtdWxhdGVIVFRQYCBpbiBvcmRlciB0byBzZW5kIGBQVVRg
IGFuZCBgREVMRVRFYCByZXF1ZXN0cworICAvLyBhcyBgUE9TVGAsIHdpdGggYSBgX21ldGhvZGAg
cGFyYW1ldGVyIGNvbnRhaW5pbmcgdGhlIHRydWUgSFRUUCBtZXRob2QsCisgIC8vIGFzIHdlbGwg
YXMgYWxsIHJlcXVlc3RzIHdpdGggdGhlIGJvZHkgYXMgYGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0t
dXJsZW5jb2RlZGAKKyAgLy8gaW5zdGVhZCBvZiBgYXBwbGljYXRpb24vanNvbmAgd2l0aCB0aGUg
bW9kZWwgaW4gYSBwYXJhbSBuYW1lZCBgbW9kZWxgLgorICAvLyBVc2VmdWwgd2hlbiBpbnRlcmZh
Y2luZyB3aXRoIHNlcnZlci1zaWRlIGxhbmd1YWdlcyBsaWtlICoqUEhQKiogdGhhdCBtYWtlCisg
IC8vIGl0IGRpZmZpY3VsdCB0byByZWFkIHRoZSBib2R5IG9mIGBQVVRgIHJlcXVlc3RzLgorICBC
YWNrYm9uZS5zeW5jID0gZnVuY3Rpb24obWV0aG9kLCBtb2RlbCwgb3B0aW9ucykgeworICAgIHZh
ciB0eXBlID0gbWV0aG9kTWFwW21ldGhvZF07CisKKyAgICAvLyBEZWZhdWx0IG9wdGlvbnMsIHVu
bGVzcyBzcGVjaWZpZWQuCisgICAgXy5kZWZhdWx0cyhvcHRpb25zIHx8IChvcHRpb25zID0ge30p
LCB7CisgICAgICBlbXVsYXRlSFRUUDogQmFja2JvbmUuZW11bGF0ZUhUVFAsCisgICAgICBlbXVs
YXRlSlNPTjogQmFja2JvbmUuZW11bGF0ZUpTT04KKyAgICB9KTsKKworICAgIC8vIERlZmF1bHQg
SlNPTi1yZXF1ZXN0IG9wdGlvbnMuCisgICAgdmFyIHBhcmFtcyA9IHt0eXBlOiB0eXBlLCBkYXRh
VHlwZTogJ2pzb24nfTsKKworICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBVUkwuCisgICAg
aWYgKCFvcHRpb25zLnVybCkgeworICAgICAgcGFyYW1zLnVybCA9IF8ucmVzdWx0KG1vZGVsLCAn
dXJsJykgfHwgdXJsRXJyb3IoKTsKKyAgICB9CisKKyAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZl
IHRoZSBhcHByb3ByaWF0ZSByZXF1ZXN0IGRhdGEuCisgICAgaWYgKG9wdGlvbnMuZGF0YSA9PSBu
dWxsICYmIG1vZGVsICYmIChtZXRob2QgPT09ICdjcmVhdGUnIHx8IG1ldGhvZCA9PT0gJ3VwZGF0
ZScgfHwgbWV0aG9kID09PSAncGF0Y2gnKSkgeworICAgICAgcGFyYW1zLmNvbnRlbnRUeXBlID0g
J2FwcGxpY2F0aW9uL2pzb24nOworICAgICAgcGFyYW1zLmRhdGEgPSBKU09OLnN0cmluZ2lmeShv
cHRpb25zLmF0dHJzIHx8IG1vZGVsLnRvSlNPTihvcHRpb25zKSk7CisgICAgfQorCisgICAgLy8g
Rm9yIG9sZGVyIHNlcnZlcnMsIGVtdWxhdGUgSlNPTiBieSBlbmNvZGluZyB0aGUgcmVxdWVzdCBp
bnRvIGFuIEhUTUwtZm9ybS4KKyAgICBpZiAob3B0aW9ucy5lbXVsYXRlSlNPTikgeworICAgICAg
cGFyYW1zLmNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7
CisgICAgICBwYXJhbXMuZGF0YSA9IHBhcmFtcy5kYXRhID8ge21vZGVsOiBwYXJhbXMuZGF0YX0g
OiB7fTsKKyAgICB9CisKKyAgICAvLyBGb3Igb2xkZXIgc2VydmVycywgZW11bGF0ZSBIVFRQIGJ5
IG1pbWlja2luZyB0aGUgSFRUUCBtZXRob2Qgd2l0aCBgX21ldGhvZGAKKyAgICAvLyBBbmQgYW4g
YFgtSFRUUC1NZXRob2QtT3ZlcnJpZGVgIGhlYWRlci4KKyAgICBpZiAob3B0aW9ucy5lbXVsYXRl
SFRUUCAmJiAodHlwZSA9PT0gJ1BVVCcgfHwgdHlwZSA9PT0gJ0RFTEVURScgfHwgdHlwZSA9PT0g
J1BBVENIJykpIHsKKyAgICAgIHBhcmFtcy50eXBlID0gJ1BPU1QnOworICAgICAgaWYgKG9wdGlv
bnMuZW11bGF0ZUpTT04pIHBhcmFtcy5kYXRhLl9tZXRob2QgPSB0eXBlOworICAgICAgdmFyIGJl
Zm9yZVNlbmQgPSBvcHRpb25zLmJlZm9yZVNlbmQ7CisgICAgICBvcHRpb25zLmJlZm9yZVNlbmQg
PSBmdW5jdGlvbih4aHIpIHsKKyAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtSFRUUC1N
ZXRob2QtT3ZlcnJpZGUnLCB0eXBlKTsKKyAgICAgICAgaWYgKGJlZm9yZVNlbmQpIHJldHVybiBi
ZWZvcmVTZW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9OworICAgIH0KKworICAg
IC8vIERvbid0IHByb2Nlc3MgZGF0YSBvbiBhIG5vbi1HRVQgcmVxdWVzdC4KKyAgICBpZiAocGFy
YW1zLnR5cGUgIT09ICdHRVQnICYmICFvcHRpb25zLmVtdWxhdGVKU09OKSB7CisgICAgICBwYXJh
bXMucHJvY2Vzc0RhdGEgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSdyZSBzZW5kaW5n
IGEgYFBBVENIYCByZXF1ZXN0LCBhbmQgd2UncmUgaW4gYW4gb2xkIEludGVybmV0IEV4cGxvcmVy
CisgICAgLy8gdGhhdCBzdGlsbCBoYXMgQWN0aXZlWCBlbmFibGVkIGJ5IGRlZmF1bHQsIG92ZXJy
aWRlIGpRdWVyeSB0byB1c2UgdGhhdAorICAgIC8vIGZvciBYSFIgaW5zdGVhZC4gUmVtb3ZlIHRo
aXMgbGluZSB3aGVuIGpRdWVyeSBzdXBwb3J0cyBgUEFUQ0hgIG9uIElFOC4KKyAgICBpZiAocGFy
YW1zLnR5cGUgPT09ICdQQVRDSCcgJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYKKyAgICAgICAg
ICAhKHdpbmRvdy5leHRlcm5hbCAmJiB3aW5kb3cuZXh0ZXJuYWwubXNBY3RpdmVYRmlsdGVyaW5n
RW5hYmxlZCkpIHsKKyAgICAgIHBhcmFtcy54aHIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0
dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOworICAgICAgfTsKKyAg
ICB9CisKKyAgICAvLyBNYWtlIHRoZSByZXF1ZXN0LCBhbGxvd2luZyB0aGUgdXNlciB0byBvdmVy
cmlkZSBhbnkgQWpheCBvcHRpb25zLgorICAgIHZhciB4aHIgPSBvcHRpb25zLnhociA9IEJhY2ti
b25lLmFqYXgoXy5leHRlbmQocGFyYW1zLCBvcHRpb25zKSk7CisgICAgbW9kZWwudHJpZ2dlcign
cmVxdWVzdCcsIG1vZGVsLCB4aHIsIG9wdGlvbnMpOworICAgIHJldHVybiB4aHI7CisgIH07CisK
KyAgLy8gTWFwIGZyb20gQ1JVRCB0byBIVFRQIGZvciBvdXIgZGVmYXVsdCBgQmFja2JvbmUuc3lu
Y2AgaW1wbGVtZW50YXRpb24uCisgIHZhciBtZXRob2RNYXAgPSB7CisgICAgJ2NyZWF0ZSc6ICdQ
T1NUJywKKyAgICAndXBkYXRlJzogJ1BVVCcsCisgICAgJ3BhdGNoJzogICdQQVRDSCcsCisgICAg
J2RlbGV0ZSc6ICdERUxFVEUnLAorICAgICdyZWFkJzogICAnR0VUJworICB9OworCisgIC8vIFNl
dCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgQmFja2JvbmUuYWpheGAgdG8gcHJveHkg
dGhyb3VnaCB0byBgJGAuCisgIC8vIE92ZXJyaWRlIHRoaXMgaWYgeW91J2QgbGlrZSB0byB1c2Ug
YSBkaWZmZXJlbnQgbGlicmFyeS4KKyAgQmFja2JvbmUuYWpheCA9IGZ1bmN0aW9uKCkgeworICAg
IHJldHVybiBCYWNrYm9uZS4kLmFqYXguYXBwbHkoQmFja2JvbmUuJCwgYXJndW1lbnRzKTsKKyAg
fTsKKworICAvLyBCYWNrYm9uZS5Sb3V0ZXIKKyAgLy8gLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8g
Um91dGVycyBtYXAgZmF1eC1VUkxzIHRvIGFjdGlvbnMsIGFuZCBmaXJlIGV2ZW50cyB3aGVuIHJv
dXRlcyBhcmUKKyAgLy8gbWF0Y2hlZC4gQ3JlYXRpbmcgYSBuZXcgb25lIHNldHMgaXRzIGByb3V0
ZXNgIGhhc2gsIGlmIG5vdCBzZXQgc3RhdGljYWxseS4KKyAgdmFyIFJvdXRlciA9IEJhY2tib25l
LlJvdXRlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICBvcHRpb25zIHx8IChvcHRpb25zID0g
e30pOworICAgIGlmIChvcHRpb25zLnJvdXRlcykgdGhpcy5yb3V0ZXMgPSBvcHRpb25zLnJvdXRl
czsKKyAgICB0aGlzLl9iaW5kUm91dGVzKCk7CisgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgIH07CisKKyAgLy8gQ2FjaGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMg
Zm9yIG1hdGNoaW5nIG5hbWVkIHBhcmFtIHBhcnRzIGFuZCBzcGxhdHRlZAorICAvLyBwYXJ0cyBv
ZiByb3V0ZSBzdHJpbmdzLgorICB2YXIgb3B0aW9uYWxQYXJhbSA9IC9cKCguKj8pXCkvZzsKKyAg
dmFyIG5hbWVkUGFyYW0gICAgPSAvKFwoXD8pPzpcdysvZzsKKyAgdmFyIHNwbGF0UGFyYW0gICAg
PSAvXCpcdysvZzsKKyAgdmFyIGVzY2FwZVJlZ0V4cCAgPSAvW1wte31cW1xdKz8uLFxcXF4kfCNc
c10vZzsKKworICAvLyBTZXQgdXAgYWxsIGluaGVyaXRhYmxlICoqQmFja2JvbmUuUm91dGVyKiog
cHJvcGVydGllcyBhbmQgbWV0aG9kcy4KKyAgXy5leHRlbmQoUm91dGVyLnByb3RvdHlwZSwgRXZl
bnRzLCB7CisKKyAgICAvLyBJbml0aWFsaXplIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGJ5IGRlZmF1
bHQuIE92ZXJyaWRlIGl0IHdpdGggeW91ciBvd24KKyAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dp
Yy4KKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbigpe30sCisKKyAgICAvLyBNYW51YWxseSBiaW5k
IGEgc2luZ2xlIG5hbWVkIHJvdXRlIHRvIGEgY2FsbGJhY2suIEZvciBleGFtcGxlOgorICAgIC8v
CisgICAgLy8gICAgIHRoaXMucm91dGUoJ3NlYXJjaC86cXVlcnkvcDpudW0nLCAnc2VhcmNoJywg
ZnVuY3Rpb24ocXVlcnksIG51bSkgeworICAgIC8vICAgICAgIC4uLgorICAgIC8vICAgICB9KTsK
KyAgICAvLworICAgIHJvdXRlOiBmdW5jdGlvbihyb3V0ZSwgbmFtZSwgY2FsbGJhY2spIHsKKyAg
ICAgIGlmICghXy5pc1JlZ0V4cChyb3V0ZSkpIHJvdXRlID0gdGhpcy5fcm91dGVUb1JlZ0V4cChy
b3V0ZSk7CisgICAgICBpZiAoXy5pc0Z1bmN0aW9uKG5hbWUpKSB7CisgICAgICAgIGNhbGxiYWNr
ID0gbmFtZTsKKyAgICAgICAgbmFtZSA9ICcnOworICAgICAgfQorICAgICAgaWYgKCFjYWxsYmFj
aykgY2FsbGJhY2sgPSB0aGlzW25hbWVdOworICAgICAgdmFyIHJvdXRlciA9IHRoaXM7CisgICAg
ICBCYWNrYm9uZS5oaXN0b3J5LnJvdXRlKHJvdXRlLCBmdW5jdGlvbihmcmFnbWVudCkgeworICAg
ICAgICB2YXIgYXJncyA9IHJvdXRlci5fZXh0cmFjdFBhcmFtZXRlcnMocm91dGUsIGZyYWdtZW50
KTsKKyAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2suYXBwbHkocm91dGVyLCBhcmdzKTsKKyAg
ICAgICAgcm91dGVyLnRyaWdnZXIuYXBwbHkocm91dGVyLCBbJ3JvdXRlOicgKyBuYW1lXS5jb25j
YXQoYXJncykpOworICAgICAgICByb3V0ZXIudHJpZ2dlcigncm91dGUnLCBuYW1lLCBhcmdzKTsK
KyAgICAgICAgQmFja2JvbmUuaGlzdG9yeS50cmlnZ2VyKCdyb3V0ZScsIHJvdXRlciwgbmFtZSwg
YXJncyk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBT
aW1wbGUgcHJveHkgdG8gYEJhY2tib25lLmhpc3RvcnlgIHRvIHNhdmUgYSBmcmFnbWVudCBpbnRv
IHRoZSBoaXN0b3J5LgorICAgIG5hdmlnYXRlOiBmdW5jdGlvbihmcmFnbWVudCwgb3B0aW9ucykg
eworICAgICAgQmFja2JvbmUuaGlzdG9yeS5uYXZpZ2F0ZShmcmFnbWVudCwgb3B0aW9ucyk7Cisg
ICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gQmluZCBhbGwgZGVmaW5lZCByb3V0
ZXMgdG8gYEJhY2tib25lLmhpc3RvcnlgLiBXZSBoYXZlIHRvIHJldmVyc2UgdGhlCisgICAgLy8g
b3JkZXIgb2YgdGhlIHJvdXRlcyBoZXJlIHRvIHN1cHBvcnQgYmVoYXZpb3Igd2hlcmUgdGhlIG1v
c3QgZ2VuZXJhbAorICAgIC8vIHJvdXRlcyBjYW4gYmUgZGVmaW5lZCBhdCB0aGUgYm90dG9tIG9m
IHRoZSByb3V0ZSBtYXAuCisgICAgX2JpbmRSb3V0ZXM6IGZ1bmN0aW9uKCkgeworICAgICAgaWYg
KCF0aGlzLnJvdXRlcykgcmV0dXJuOworICAgICAgdGhpcy5yb3V0ZXMgPSBfLnJlc3VsdCh0aGlz
LCAncm91dGVzJyk7CisgICAgICB2YXIgcm91dGUsIHJvdXRlcyA9IF8ua2V5cyh0aGlzLnJvdXRl
cyk7CisgICAgICB3aGlsZSAoKHJvdXRlID0gcm91dGVzLnBvcCgpKSAhPSBudWxsKSB7CisgICAg
ICAgIHRoaXMucm91dGUocm91dGUsIHRoaXMucm91dGVzW3JvdXRlXSk7CisgICAgICB9CisgICAg
fSwKKworICAgIC8vIENvbnZlcnQgYSByb3V0ZSBzdHJpbmcgaW50byBhIHJlZ3VsYXIgZXhwcmVz
c2lvbiwgc3VpdGFibGUgZm9yIG1hdGNoaW5nCisgICAgLy8gYWdhaW5zdCB0aGUgY3VycmVudCBs
b2NhdGlvbiBoYXNoLgorICAgIF9yb3V0ZVRvUmVnRXhwOiBmdW5jdGlvbihyb3V0ZSkgeworICAg
ICAgcm91dGUgPSByb3V0ZS5yZXBsYWNlKGVzY2FwZVJlZ0V4cCwgJ1xcJCYnKQorICAgICAgICAg
ICAgICAgICAgIC5yZXBsYWNlKG9wdGlvbmFsUGFyYW0sICcoPzokMSk/JykKKyAgICAgICAgICAg
ICAgICAgICAucmVwbGFjZShuYW1lZFBhcmFtLCBmdW5jdGlvbihtYXRjaCwgb3B0aW9uYWwpewor
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbmFsID8gbWF0Y2ggOiAnKFteXC9dKykn
OworICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgLnJlcGxhY2Uoc3Bs
YXRQYXJhbSwgJyguKj8pJyk7CisgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyByb3V0ZSAr
ICckJyk7CisgICAgfSwKKworICAgIC8vIEdpdmVuIGEgcm91dGUsIGFuZCBhIFVSTCBmcmFnbWVu
dCB0aGF0IGl0IG1hdGNoZXMsIHJldHVybiB0aGUgYXJyYXkgb2YKKyAgICAvLyBleHRyYWN0ZWQg
ZGVjb2RlZCBwYXJhbWV0ZXJzLiBFbXB0eSBvciB1bm1hdGNoZWQgcGFyYW1ldGVycyB3aWxsIGJl
CisgICAgLy8gdHJlYXRlZCBhcyBgbnVsbGAgdG8gbm9ybWFsaXplIGNyb3NzLWJyb3dzZXIgYmVo
YXZpb3IuCisgICAgX2V4dHJhY3RQYXJhbWV0ZXJzOiBmdW5jdGlvbihyb3V0ZSwgZnJhZ21lbnQp
IHsKKyAgICAgIHZhciBwYXJhbXMgPSByb3V0ZS5leGVjKGZyYWdtZW50KS5zbGljZSgxKTsKKyAg
ICAgIHJldHVybiBfLm1hcChwYXJhbXMsIGZ1bmN0aW9uKHBhcmFtKSB7CisgICAgICAgIHJldHVy
biBwYXJhbSA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJhbSkgOiBudWxsOworICAgICAgfSk7Cisg
ICAgfQorCisgIH0pOworCisgIC8vIEJhY2tib25lLkhpc3RvcnkKKyAgLy8gLS0tLS0tLS0tLS0t
LS0tLQorCisgIC8vIEhhbmRsZXMgY3Jvc3MtYnJvd3NlciBoaXN0b3J5IG1hbmFnZW1lbnQsIGJh
c2VkIG9uIGVpdGhlcgorICAvLyBbcHVzaFN0YXRlXShodHRwOi8vZGl2ZWludG9odG1sNS5pbmZv
L2hpc3RvcnkuaHRtbCkgYW5kIHJlYWwgVVJMcywgb3IKKyAgLy8gW29uaGFzaGNoYW5nZV0oaHR0
cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vd2luZG93Lm9uaGFzaGNo
YW5nZSkKKyAgLy8gYW5kIFVSTCBmcmFnbWVudHMuIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIG5l
aXRoZXIgKG9sZCBJRSwgbmF0Y2gpLAorICAvLyBmYWxscyBiYWNrIHRvIHBvbGxpbmcuCisgIHZh
ciBIaXN0b3J5ID0gQmFja2JvbmUuSGlzdG9yeSA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuaGFu
ZGxlcnMgPSBbXTsKKyAgICBfLmJpbmRBbGwodGhpcywgJ2NoZWNrVXJsJyk7CisKKyAgICAvLyBF
bnN1cmUgdGhhdCBgSGlzdG9yeWAgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgYnJvd3Nlci4K
KyAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIHRoaXMubG9j
YXRpb24gPSB3aW5kb3cubG9jYXRpb247CisgICAgICB0aGlzLmhpc3RvcnkgPSB3aW5kb3cuaGlz
dG9yeTsKKyAgICB9CisgIH07CisKKyAgLy8gQ2FjaGVkIHJlZ2V4IGZvciBzdHJpcHBpbmcgYSBs
ZWFkaW5nIGhhc2gvc2xhc2ggYW5kIHRyYWlsaW5nIHNwYWNlLgorICB2YXIgcm91dGVTdHJpcHBl
ciA9IC9eWyNcL118XHMrJC9nOworCisgIC8vIENhY2hlZCByZWdleCBmb3Igc3RyaXBwaW5nIGxl
YWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMuCisgIHZhciByb290U3RyaXBwZXIgPSAvXlwvK3xc
LyskL2c7CisKKyAgLy8gQ2FjaGVkIHJlZ2V4IGZvciBkZXRlY3RpbmcgTVNJRS4KKyAgdmFyIGlz
RXhwbG9yZXIgPSAvbXNpZSBbXHcuXSsvOworCisgIC8vIENhY2hlZCByZWdleCBmb3IgcmVtb3Zp
bmcgYSB0cmFpbGluZyBzbGFzaC4KKyAgdmFyIHRyYWlsaW5nU2xhc2ggPSAvXC8kLzsKKworICAv
LyBIYXMgdGhlIGhpc3RvcnkgaGFuZGxpbmcgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQ/CisgIEhpc3Rv
cnkuc3RhcnRlZCA9IGZhbHNlOworCisgIC8vIFNldCB1cCBhbGwgaW5oZXJpdGFibGUgKipCYWNr
Ym9uZS5IaXN0b3J5KiogcHJvcGVydGllcyBhbmQgbWV0aG9kcy4KKyAgXy5leHRlbmQoSGlzdG9y
eS5wcm90b3R5cGUsIEV2ZW50cywgeworCisgICAgLy8gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgdG8g
cG9sbCBmb3IgaGFzaCBjaGFuZ2VzLCBpZiBuZWNlc3NhcnksIGlzCisgICAgLy8gdHdlbnR5IHRp
bWVzIGEgc2Vjb25kLgorICAgIGludGVydmFsOiA1MCwKKworICAgIC8vIEdldHMgdGhlIHRydWUg
aGFzaCB2YWx1ZS4gQ2Fubm90IHVzZSBsb2NhdGlvbi5oYXNoIGRpcmVjdGx5IGR1ZSB0byBidWcK
KyAgICAvLyBpbiBGaXJlZm94IHdoZXJlIGxvY2F0aW9uLmhhc2ggd2lsbCBhbHdheXMgYmUgZGVj
b2RlZC4KKyAgICBnZXRIYXNoOiBmdW5jdGlvbih3aW5kb3cpIHsKKyAgICAgIHZhciBtYXRjaCA9
ICh3aW5kb3cgfHwgdGhpcykubG9jYXRpb24uaHJlZi5tYXRjaCgvIyguKikkLyk7CisgICAgICBy
ZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnOworICAgIH0sCisKKyAgICAvLyBHZXQgdGhlIGNy
b3NzLWJyb3dzZXIgbm9ybWFsaXplZCBVUkwgZnJhZ21lbnQsIGVpdGhlciBmcm9tIHRoZSBVUkws
CisgICAgLy8gdGhlIGhhc2gsIG9yIHRoZSBvdmVycmlkZS4KKyAgICBnZXRGcmFnbWVudDogZnVu
Y3Rpb24oZnJhZ21lbnQsIGZvcmNlUHVzaFN0YXRlKSB7CisgICAgICBpZiAoZnJhZ21lbnQgPT0g
bnVsbCkgeworICAgICAgICBpZiAodGhpcy5faGFzUHVzaFN0YXRlIHx8ICF0aGlzLl93YW50c0hh
c2hDaGFuZ2UgfHwgZm9yY2VQdXNoU3RhdGUpIHsKKyAgICAgICAgICBmcmFnbWVudCA9IHRoaXMu
bG9jYXRpb24ucGF0aG5hbWU7CisgICAgICAgICAgdmFyIHJvb3QgPSB0aGlzLnJvb3QucmVwbGFj
ZSh0cmFpbGluZ1NsYXNoLCAnJyk7CisgICAgICAgICAgaWYgKCFmcmFnbWVudC5pbmRleE9mKHJv
b3QpKSBmcmFnbWVudCA9IGZyYWdtZW50LnN1YnN0cihyb290Lmxlbmd0aCk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdldEhhc2goKTsKKyAgICAgICAgfQor
ICAgICAgfQorICAgICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2Uocm91dGVTdHJpcHBlciwgJycp
OworICAgIH0sCisKKyAgICAvLyBTdGFydCB0aGUgaGFzaCBjaGFuZ2UgaGFuZGxpbmcsIHJldHVy
bmluZyBgdHJ1ZWAgaWYgdGhlIGN1cnJlbnQgVVJMIG1hdGNoZXMKKyAgICAvLyBhbiBleGlzdGlu
ZyByb3V0ZSwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLgorICAgIHN0YXJ0OiBmdW5jdGlvbihvcHRp
b25zKSB7CisgICAgICBpZiAoSGlzdG9yeS5zdGFydGVkKSB0aHJvdyBuZXcgRXJyb3IoIkJhY2ti
b25lLmhpc3RvcnkgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIik7CisgICAgICBIaXN0b3J5LnN0
YXJ0ZWQgPSB0cnVlOworCisgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBpbml0aWFsIGNvbmZpZ3Vy
YXRpb24uIERvIHdlIG5lZWQgYW4gaWZyYW1lPworICAgICAgLy8gSXMgcHVzaFN0YXRlIGRlc2ly
ZWQgLi4uIGlzIGl0IGF2YWlsYWJsZT8KKyAgICAgIHRoaXMub3B0aW9ucyAgICAgICAgICA9IF8u
ZXh0ZW5kKHt9LCB7cm9vdDogJy8nfSwgdGhpcy5vcHRpb25zLCBvcHRpb25zKTsKKyAgICAgIHRo
aXMucm9vdCAgICAgICAgICAgICA9IHRoaXMub3B0aW9ucy5yb290OworICAgICAgdGhpcy5fd2Fu
dHNIYXNoQ2hhbmdlID0gdGhpcy5vcHRpb25zLmhhc2hDaGFuZ2UgIT09IGZhbHNlOworICAgICAg
dGhpcy5fd2FudHNQdXNoU3RhdGUgID0gISF0aGlzLm9wdGlvbnMucHVzaFN0YXRlOworICAgICAg
dGhpcy5faGFzUHVzaFN0YXRlICAgID0gISEodGhpcy5vcHRpb25zLnB1c2hTdGF0ZSAmJiB0aGlz
Lmhpc3RvcnkgJiYgdGhpcy5oaXN0b3J5LnB1c2hTdGF0ZSk7CisgICAgICB2YXIgZnJhZ21lbnQg
ICAgICAgICAgPSB0aGlzLmdldEZyYWdtZW50KCk7CisgICAgICB2YXIgZG9jTW9kZSAgICAgICAg
ICAgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7CisgICAgICB2YXIgb2xkSUUgICAgICAgICAgICAg
PSAoaXNFeHBsb3Jlci5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSkgJiYg
KCFkb2NNb2RlIHx8IGRvY01vZGUgPD0gNykpOworCisgICAgICAvLyBOb3JtYWxpemUgcm9vdCB0
byBhbHdheXMgaW5jbHVkZSBhIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoLgorICAgICAgdGhp
cy5yb290ID0gKCcvJyArIHRoaXMucm9vdCArICcvJykucmVwbGFjZShyb290U3RyaXBwZXIsICcv
Jyk7CisKKyAgICAgIGlmIChvbGRJRSAmJiB0aGlzLl93YW50c0hhc2hDaGFuZ2UpIHsKKyAgICAg
ICAgdGhpcy5pZnJhbWUgPSBCYWNrYm9uZS4kKCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDowIiB0
YWJpbmRleD0iLTEiIC8+JykuaGlkZSgpLmFwcGVuZFRvKCdib2R5JylbMF0uY29udGVudFdpbmRv
dzsKKyAgICAgICAgdGhpcy5uYXZpZ2F0ZShmcmFnbWVudCk7CisgICAgICB9CisKKyAgICAgIC8v
IERlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHVzaW5nIHB1c2hTdGF0ZSBvciBoYXNoZXMsIGFu
ZCB3aGV0aGVyCisgICAgICAvLyAnb25oYXNoY2hhbmdlJyBpcyBzdXBwb3J0ZWQsIGRldGVybWlu
ZSBob3cgd2UgY2hlY2sgdGhlIFVSTCBzdGF0ZS4KKyAgICAgIGlmICh0aGlzLl9oYXNQdXNoU3Rh
dGUpIHsKKyAgICAgICAgQmFja2JvbmUuJCh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRoaXMuY2hl
Y2tVcmwpOworICAgICAgfSBlbHNlIGlmICh0aGlzLl93YW50c0hhc2hDaGFuZ2UgJiYgKCdvbmhh
c2hjaGFuZ2UnIGluIHdpbmRvdykgJiYgIW9sZElFKSB7CisgICAgICAgIEJhY2tib25lLiQod2lu
ZG93KS5vbignaGFzaGNoYW5nZScsIHRoaXMuY2hlY2tVcmwpOworICAgICAgfSBlbHNlIGlmICh0
aGlzLl93YW50c0hhc2hDaGFuZ2UpIHsKKyAgICAgICAgdGhpcy5fY2hlY2tVcmxJbnRlcnZhbCA9
IHNldEludGVydmFsKHRoaXMuY2hlY2tVcmwsIHRoaXMuaW50ZXJ2YWwpOworICAgICAgfQorCisg
ICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGJhc2UgdXJsLCBmb3Ig
YSBwdXNoU3RhdGUgbGluaworICAgICAgLy8gb3BlbmVkIGJ5IGEgbm9uLXB1c2hTdGF0ZSBicm93
c2VyLgorICAgICAgdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgdmFyIGxvYyA9IHRo
aXMubG9jYXRpb247CisgICAgICB2YXIgYXRSb290ID0gbG9jLnBhdGhuYW1lLnJlcGxhY2UoL1te
XC9dJC8sICckJi8nKSA9PT0gdGhpcy5yb290OworCisgICAgICAvLyBJZiB3ZSd2ZSBzdGFydGVk
IG9mZiB3aXRoIGEgcm91dGUgZnJvbSBhIGBwdXNoU3RhdGVgLWVuYWJsZWQgYnJvd3NlciwKKyAg
ICAgIC8vIGJ1dCB3ZSdyZSBjdXJyZW50bHkgaW4gYSBicm93c2VyIHRoYXQgZG9lc24ndCBzdXBw
b3J0IGl0Li4uCisgICAgICBpZiAodGhpcy5fd2FudHNIYXNoQ2hhbmdlICYmIHRoaXMuX3dhbnRz
UHVzaFN0YXRlICYmICF0aGlzLl9oYXNQdXNoU3RhdGUgJiYgIWF0Um9vdCkgeworICAgICAgICB0
aGlzLmZyYWdtZW50ID0gdGhpcy5nZXRGcmFnbWVudChudWxsLCB0cnVlKTsKKyAgICAgICAgdGhp
cy5sb2NhdGlvbi5yZXBsYWNlKHRoaXMucm9vdCArIHRoaXMubG9jYXRpb24uc2VhcmNoICsgJyMn
ICsgdGhpcy5mcmFnbWVudCk7CisgICAgICAgIC8vIFJldHVybiBpbW1lZGlhdGVseSBhcyBicm93
c2VyIHdpbGwgZG8gcmVkaXJlY3QgdG8gbmV3IHVybAorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgICAgLy8gT3IgaWYgd2UndmUgc3RhcnRlZCBvdXQgd2l0aCBhIGhhc2gtYmFzZWQgcm91dGUs
IGJ1dCB3ZSdyZSBjdXJyZW50bHkKKyAgICAgIC8vIGluIGEgYnJvd3NlciB3aGVyZSBpdCBjb3Vs
ZCBiZSBgcHVzaFN0YXRlYC1iYXNlZCBpbnN0ZWFkLi4uCisgICAgICB9IGVsc2UgaWYgKHRoaXMu
X3dhbnRzUHVzaFN0YXRlICYmIHRoaXMuX2hhc1B1c2hTdGF0ZSAmJiBhdFJvb3QgJiYgbG9jLmhh
c2gpIHsKKyAgICAgICAgdGhpcy5mcmFnbWVudCA9IHRoaXMuZ2V0SGFzaCgpLnJlcGxhY2Uocm91
dGVTdHJpcHBlciwgJycpOworICAgICAgICB0aGlzLmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBk
b2N1bWVudC50aXRsZSwgdGhpcy5yb290ICsgdGhpcy5mcmFnbWVudCArIGxvYy5zZWFyY2gpOwor
ICAgICAgfQorCisgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaWxlbnQpIHJldHVybiB0aGlzLmxv
YWRVcmwoKTsKKyAgICB9LAorCisgICAgLy8gRGlzYWJsZSBCYWNrYm9uZS5oaXN0b3J5LCBwZXJo
YXBzIHRlbXBvcmFyaWx5LiBOb3QgdXNlZnVsIGluIGEgcmVhbCBhcHAsCisgICAgLy8gYnV0IHBv
c3NpYmx5IHVzZWZ1bCBmb3IgdW5pdCB0ZXN0aW5nIFJvdXRlcnMuCisgICAgc3RvcDogZnVuY3Rp
b24oKSB7CisgICAgICBCYWNrYm9uZS4kKHdpbmRvdykub2ZmKCdwb3BzdGF0ZScsIHRoaXMuY2hl
Y2tVcmwpLm9mZignaGFzaGNoYW5nZScsIHRoaXMuY2hlY2tVcmwpOworICAgICAgY2xlYXJJbnRl
cnZhbCh0aGlzLl9jaGVja1VybEludGVydmFsKTsKKyAgICAgIEhpc3Rvcnkuc3RhcnRlZCA9IGZh
bHNlOworICAgIH0sCisKKyAgICAvLyBBZGQgYSByb3V0ZSB0byBiZSB0ZXN0ZWQgd2hlbiB0aGUg
ZnJhZ21lbnQgY2hhbmdlcy4gUm91dGVzIGFkZGVkIGxhdGVyCisgICAgLy8gbWF5IG92ZXJyaWRl
IHByZXZpb3VzIHJvdXRlcy4KKyAgICByb3V0ZTogZnVuY3Rpb24ocm91dGUsIGNhbGxiYWNrKSB7
CisgICAgICB0aGlzLmhhbmRsZXJzLnVuc2hpZnQoe3JvdXRlOiByb3V0ZSwgY2FsbGJhY2s6IGNh
bGxiYWNrfSk7CisgICAgfSwKKworICAgIC8vIENoZWNrcyB0aGUgY3VycmVudCBVUkwgdG8gc2Vl
IGlmIGl0IGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQgaGFzLAorICAgIC8vIGNhbGxzIGBsb2FkVXJs
YCwgbm9ybWFsaXppbmcgYWNyb3NzIHRoZSBoaWRkZW4gaWZyYW1lLgorICAgIGNoZWNrVXJsOiBm
dW5jdGlvbihlKSB7CisgICAgICB2YXIgY3VycmVudCA9IHRoaXMuZ2V0RnJhZ21lbnQoKTsKKyAg
ICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmZyYWdtZW50ICYmIHRoaXMuaWZyYW1lKSB7CisgICAg
ICAgIGN1cnJlbnQgPSB0aGlzLmdldEZyYWdtZW50KHRoaXMuZ2V0SGFzaCh0aGlzLmlmcmFtZSkp
OworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMuZnJhZ21lbnQpIHJldHVybiBm
YWxzZTsKKyAgICAgIGlmICh0aGlzLmlmcmFtZSkgdGhpcy5uYXZpZ2F0ZShjdXJyZW50KTsKKyAg
ICAgIHRoaXMubG9hZFVybCgpIHx8IHRoaXMubG9hZFVybCh0aGlzLmdldEhhc2goKSk7CisgICAg
fSwKKworICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgY3VycmVudCBVUkwgZnJhZ21lbnQuIElm
IGEgcm91dGUgc3VjY2VlZHMgd2l0aCBhCisgICAgLy8gbWF0Y2gsIHJldHVybnMgYHRydWVgLiBJ
ZiBubyBkZWZpbmVkIHJvdXRlcyBtYXRjaGVzIHRoZSBmcmFnbWVudCwKKyAgICAvLyByZXR1cm5z
IGBmYWxzZWAuCisgICAgbG9hZFVybDogZnVuY3Rpb24oZnJhZ21lbnRPdmVycmlkZSkgeworICAg
ICAgdmFyIGZyYWdtZW50ID0gdGhpcy5mcmFnbWVudCA9IHRoaXMuZ2V0RnJhZ21lbnQoZnJhZ21l
bnRPdmVycmlkZSk7CisgICAgICB2YXIgbWF0Y2hlZCA9IF8uYW55KHRoaXMuaGFuZGxlcnMsIGZ1
bmN0aW9uKGhhbmRsZXIpIHsKKyAgICAgICAgaWYgKGhhbmRsZXIucm91dGUudGVzdChmcmFnbWVu
dCkpIHsKKyAgICAgICAgICBoYW5kbGVyLmNhbGxiYWNrKGZyYWdtZW50KTsKKyAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gbWF0Y2hlZDsK
KyAgICB9LAorCisgICAgLy8gU2F2ZSBhIGZyYWdtZW50IGludG8gdGhlIGhhc2ggaGlzdG9yeSwg
b3IgcmVwbGFjZSB0aGUgVVJMIHN0YXRlIGlmIHRoZQorICAgIC8vICdyZXBsYWNlJyBvcHRpb24g
aXMgcGFzc2VkLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBwcm9wZXJseSBVUkwtZW5jb2RpbmcK
KyAgICAvLyB0aGUgZnJhZ21lbnQgaW4gYWR2YW5jZS4KKyAgICAvLworICAgIC8vIFRoZSBvcHRp
b25zIG9iamVjdCBjYW4gY29udGFpbiBgdHJpZ2dlcjogdHJ1ZWAgaWYgeW91IHdpc2ggdG8gaGF2
ZSB0aGUKKyAgICAvLyByb3V0ZSBjYWxsYmFjayBiZSBmaXJlZCAobm90IHVzdWFsbHkgZGVzaXJh
YmxlKSwgb3IgYHJlcGxhY2U6IHRydWVgLCBpZgorICAgIC8vIHlvdSB3aXNoIHRvIG1vZGlmeSB0
aGUgY3VycmVudCBVUkwgd2l0aG91dCBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIGhpc3RvcnkuCisg
ICAgbmF2aWdhdGU6IGZ1bmN0aW9uKGZyYWdtZW50LCBvcHRpb25zKSB7CisgICAgICBpZiAoIUhp
c3Rvcnkuc3RhcnRlZCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlv
bnMgPT09IHRydWUpIG9wdGlvbnMgPSB7dHJpZ2dlcjogb3B0aW9uc307CisgICAgICBmcmFnbWVu
dCA9IHRoaXMuZ2V0RnJhZ21lbnQoZnJhZ21lbnQgfHwgJycpOworICAgICAgaWYgKHRoaXMuZnJh
Z21lbnQgPT09IGZyYWdtZW50KSByZXR1cm47CisgICAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21l
bnQ7CisgICAgICB2YXIgdXJsID0gdGhpcy5yb290ICsgZnJhZ21lbnQ7CisKKyAgICAgIC8vIElm
IHB1c2hTdGF0ZSBpcyBhdmFpbGFibGUsIHdlIHVzZSBpdCB0byBzZXQgdGhlIGZyYWdtZW50IGFz
IGEgcmVhbCBVUkwuCisgICAgICBpZiAodGhpcy5faGFzUHVzaFN0YXRlKSB7CisgICAgICAgIHRo
aXMuaGlzdG9yeVtvcHRpb25zLnJlcGxhY2UgPyAncmVwbGFjZVN0YXRlJyA6ICdwdXNoU3RhdGUn
XSh7fSwgZG9jdW1lbnQudGl0bGUsIHVybCk7CisKKyAgICAgIC8vIElmIGhhc2ggY2hhbmdlcyBo
YXZlbid0IGJlZW4gZXhwbGljaXRseSBkaXNhYmxlZCwgdXBkYXRlIHRoZSBoYXNoCisgICAgICAv
LyBmcmFnbWVudCB0byBzdG9yZSBoaXN0b3J5LgorICAgICAgfSBlbHNlIGlmICh0aGlzLl93YW50
c0hhc2hDaGFuZ2UpIHsKKyAgICAgICAgdGhpcy5fdXBkYXRlSGFzaCh0aGlzLmxvY2F0aW9uLCBm
cmFnbWVudCwgb3B0aW9ucy5yZXBsYWNlKTsKKyAgICAgICAgaWYgKHRoaXMuaWZyYW1lICYmIChm
cmFnbWVudCAhPT0gdGhpcy5nZXRGcmFnbWVudCh0aGlzLmdldEhhc2godGhpcy5pZnJhbWUpKSkp
IHsKKyAgICAgICAgICAvLyBPcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBpZnJhbWUgdHJpY2tzIElF
NyBhbmQgZWFybGllciB0byBwdXNoIGEKKyAgICAgICAgICAvLyBoaXN0b3J5IGVudHJ5IG9uIGhh
c2gtdGFnIGNoYW5nZS4gIFdoZW4gcmVwbGFjZSBpcyB0cnVlLCB3ZSBkb24ndAorICAgICAgICAg
IC8vIHdhbnQgdGhpcy4KKyAgICAgICAgICBpZighb3B0aW9ucy5yZXBsYWNlKSB0aGlzLmlmcmFt
ZS5kb2N1bWVudC5vcGVuKCkuY2xvc2UoKTsKKyAgICAgICAgICB0aGlzLl91cGRhdGVIYXNoKHRo
aXMuaWZyYW1lLmxvY2F0aW9uLCBmcmFnbWVudCwgb3B0aW9ucy5yZXBsYWNlKTsKKyAgICAgICAg
fQorCisgICAgICAvLyBJZiB5b3UndmUgdG9sZCB1cyB0aGF0IHlvdSBleHBsaWNpdGx5IGRvbid0
IHdhbnQgZmFsbGJhY2sgaGFzaGNoYW5nZS0KKyAgICAgIC8vIGJhc2VkIGhpc3RvcnksIHRoZW4g
YG5hdmlnYXRlYCBiZWNvbWVzIGEgcGFnZSByZWZyZXNoLgorICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMubG9jYXRpb24uYXNzaWduKHVybCk7CisgICAgICB9CisgICAgICBpZiAo
b3B0aW9ucy50cmlnZ2VyKSB0aGlzLmxvYWRVcmwoZnJhZ21lbnQpOworICAgIH0sCisKKyAgICAv
LyBVcGRhdGUgdGhlIGhhc2ggbG9jYXRpb24sIGVpdGhlciByZXBsYWNpbmcgdGhlIGN1cnJlbnQg
ZW50cnksIG9yIGFkZGluZworICAgIC8vIGEgbmV3IG9uZSB0byB0aGUgYnJvd3NlciBoaXN0b3J5
LgorICAgIF91cGRhdGVIYXNoOiBmdW5jdGlvbihsb2NhdGlvbiwgZnJhZ21lbnQsIHJlcGxhY2Up
IHsKKyAgICAgIGlmIChyZXBsYWNlKSB7CisgICAgICAgIHZhciBocmVmID0gbG9jYXRpb24uaHJl
Zi5yZXBsYWNlKC8oamF2YXNjcmlwdDp8IykuKiQvLCAnJyk7CisgICAgICAgIGxvY2F0aW9uLnJl
cGxhY2UoaHJlZiArICcjJyArIGZyYWdtZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8v
IFNvbWUgYnJvd3NlcnMgcmVxdWlyZSB0aGF0IGBoYXNoYCBjb250YWlucyBhIGxlYWRpbmcgIy4K
KyAgICAgICAgbG9jYXRpb24uaGFzaCA9ICcjJyArIGZyYWdtZW50OworICAgICAgfQorICAgIH0K
KworICB9KTsKKworICAvLyBDcmVhdGUgdGhlIGRlZmF1bHQgQmFja2JvbmUuaGlzdG9yeS4KKyAg
QmFja2JvbmUuaGlzdG9yeSA9IG5ldyBIaXN0b3J5OworCisgIC8vIEhlbHBlcnMKKyAgLy8gLS0t
LS0tLQorCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb3JyZWN0bHkgc2V0IHVwIHRoZSBwcm90
b3R5cGUgY2hhaW4sIGZvciBzdWJjbGFzc2VzLgorICAvLyBTaW1pbGFyIHRvIGBnb29nLmluaGVy
aXRzYCwgYnV0IHVzZXMgYSBoYXNoIG9mIHByb3RvdHlwZSBwcm9wZXJ0aWVzIGFuZAorICAvLyBj
bGFzcyBwcm9wZXJ0aWVzIHRvIGJlIGV4dGVuZGVkLgorICB2YXIgZXh0ZW5kID0gZnVuY3Rpb24o
cHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKKyAgICB2YXIgcGFyZW50ID0gdGhpczsKKyAgICB2
YXIgY2hpbGQ7CisKKyAgICAvLyBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSBuZXcg
c3ViY2xhc3MgaXMgZWl0aGVyIGRlZmluZWQgYnkgeW91CisgICAgLy8gKHRoZSAiY29uc3RydWN0
b3IiIHByb3BlcnR5IGluIHlvdXIgYGV4dGVuZGAgZGVmaW5pdGlvbiksIG9yIGRlZmF1bHRlZAor
ICAgIC8vIGJ5IHVzIHRvIHNpbXBseSBjYWxsIHRoZSBwYXJlbnQncyBjb25zdHJ1Y3Rvci4KKyAg
ICBpZiAocHJvdG9Qcm9wcyAmJiBfLmhhcyhwcm90b1Byb3BzLCAnY29uc3RydWN0b3InKSkgewor
ICAgICAgY2hpbGQgPSBwcm90b1Byb3BzLmNvbnN0cnVjdG9yOworICAgIH0gZWxzZSB7CisgICAg
ICBjaGlsZCA9IGZ1bmN0aW9uKCl7IHJldHVybiBwYXJlbnQuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsgfTsKKyAgICB9CisKKyAgICAvLyBBZGQgc3RhdGljIHByb3BlcnRpZXMgdG8gdGhlIGNvbnN0
cnVjdG9yIGZ1bmN0aW9uLCBpZiBzdXBwbGllZC4KKyAgICBfLmV4dGVuZChjaGlsZCwgcGFyZW50
LCBzdGF0aWNQcm9wcyk7CisKKyAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBpbmhl
cml0IGZyb20gYHBhcmVudGAsIHdpdGhvdXQgY2FsbGluZworICAgIC8vIGBwYXJlbnRgJ3MgY29u
c3RydWN0b3IgZnVuY3Rpb24uCisgICAgdmFyIFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uKCl7IHRoaXMu
Y29uc3RydWN0b3IgPSBjaGlsZDsgfTsKKyAgICBTdXJyb2dhdGUucHJvdG90eXBlID0gcGFyZW50
LnByb3RvdHlwZTsKKyAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgU3Vycm9nYXRlOworCisgICAg
Ly8gQWRkIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChpbnN0YW5jZSBwcm9wZXJ0aWVzKSB0byB0aGUg
c3ViY2xhc3MsCisgICAgLy8gaWYgc3VwcGxpZWQuCisgICAgaWYgKHByb3RvUHJvcHMpIF8uZXh0
ZW5kKGNoaWxkLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CisKKyAgICAvLyBTZXQgYSBjb252ZW5p
ZW5jZSBwcm9wZXJ0eSBpbiBjYXNlIHRoZSBwYXJlbnQncyBwcm90b3R5cGUgaXMgbmVlZGVkCisg
ICAgLy8gbGF0ZXIuCisgICAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsKKwor
ICAgIHJldHVybiBjaGlsZDsKKyAgfTsKKworICAvLyBTZXQgdXAgaW5oZXJpdGFuY2UgZm9yIHRo
ZSBtb2RlbCwgY29sbGVjdGlvbiwgcm91dGVyLCB2aWV3IGFuZCBoaXN0b3J5LgorICBNb2RlbC5l
eHRlbmQgPSBDb2xsZWN0aW9uLmV4dGVuZCA9IFJvdXRlci5leHRlbmQgPSBWaWV3LmV4dGVuZCA9
IEhpc3RvcnkuZXh0ZW5kID0gZXh0ZW5kOworCisgIC8vIFRocm93IGFuIGVycm9yIHdoZW4gYSBV
UkwgaXMgbmVlZGVkLCBhbmQgbm9uZSBpcyBzdXBwbGllZC4KKyAgdmFyIHVybEVycm9yID0gZnVu
Y3Rpb24oKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCdBICJ1cmwiIHByb3BlcnR5IG9yIGZ1bmN0
aW9uIG11c3QgYmUgc3BlY2lmaWVkJyk7CisgIH07CisKKyAgLy8gV3JhcCBhbiBvcHRpb25hbCBl
cnJvciBjYWxsYmFjayB3aXRoIGEgZmFsbGJhY2sgZXJyb3IgZXZlbnQuCisgIHZhciB3cmFwRXJy
b3IgPSBmdW5jdGlvbiAobW9kZWwsIG9wdGlvbnMpIHsKKyAgICB2YXIgZXJyb3IgPSBvcHRpb25z
LmVycm9yOworICAgIG9wdGlvbnMuZXJyb3IgPSBmdW5jdGlvbihyZXNwKSB7CisgICAgICBpZiAo
ZXJyb3IpIGVycm9yKG1vZGVsLCByZXNwLCBvcHRpb25zKTsKKyAgICAgIG1vZGVsLnRyaWdnZXIo
J2Vycm9yJywgbW9kZWwsIHJlc3AsIG9wdGlvbnMpOworICAgIH07CisgIH07CisKK30pLmNhbGwo
dGhpcyk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RP
TUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBv
bmVudHMvanF1ZXJ5L2pxdWVyeS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2JhY2tib25lL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVyeS5qcwkocmV2aXNpb24g
MCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy9q
cXVlcnkvanF1ZXJ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTU5NyBAQAorLyohCisg
KiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjkuMQorICogaHR0cDovL2pxdWVyeS5jb20v
CisgKgorICogSW5jbHVkZXMgU2l6emxlLmpzCisgKiBodHRwOi8vc2l6emxlanMuY29tLworICoK
KyAqIENvcHlyaWdodCAyMDA1LCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhl
ciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICogaHR0
cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIwMTMtMi00CisgKi8KKyhmdW5j
dGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CisKKy8vIENhbid0IGRvIHRoaXMgYmVjYXVzZSBz
ZXZlcmFsIGFwcHMgaW5jbHVkaW5nIEFTUC5ORVQgdHJhY2UKKy8vIHRoZSBzdGFjayB2aWEgYXJn
dW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVmb3ggZGllcyBpZgorLy8geW91IHRyeSB0byB0
cmFjZSB0aHJvdWdoICJ1c2Ugc3RyaWN0IiBjYWxsIGNoYWlucy4gKCMxMzMzNSkKKy8vIFN1cHBv
cnQ6IEZpcmVmb3ggMTgrCisvLyJ1c2Ugc3RyaWN0IjsKK3ZhcgorICAgIC8vIFRoZSBkZWZlcnJl
ZCB1c2VkIG9uIERPTSByZWFkeQorICAgIHJlYWR5TGlzdCwKKworICAgIC8vIEEgY2VudHJhbCBy
ZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQorICAgIHJvb3RqUXVlcnksCisK
KyAgICAvLyBTdXBwb3J0OiBJRTw5CisgICAgLy8gRm9yIGB0eXBlb2Ygbm9kZS5tZXRob2RgIGlu
c3RlYWQgb2YgYG5vZGUubWV0aG9kICE9PSB1bmRlZmluZWRgCisgICAgY29yZV9zdHJ1bmRlZmlu
ZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAorCisgICAgLy8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50
IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KQorICAgIGRvY3VtZW50
ID0gd2luZG93LmRvY3VtZW50LAorICAgIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLAorCisg
ICAgLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisgICAgX2pRdWVyeSA9
IHdpbmRvdy5qUXVlcnksCisKKyAgICAvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3
cml0ZQorICAgIF8kID0gd2luZG93LiQsCisKKyAgICAvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWly
cworICAgIGNsYXNzMnR5cGUgPSB7fSwKKworICAgIC8vIExpc3Qgb2YgZGVsZXRlZCBkYXRhIGNh
Y2hlIGlkcywgc28gd2UgY2FuIHJldXNlIHRoZW0KKyAgICBjb3JlX2RlbGV0ZWRJZHMgPSBbXSwK
KworICAgIGNvcmVfdmVyc2lvbiA9ICIxLjkuMSIsCisKKyAgICAvLyBTYXZlIGEgcmVmZXJlbmNl
IHRvIHNvbWUgY29yZSBtZXRob2RzCisgICAgY29yZV9jb25jYXQgPSBjb3JlX2RlbGV0ZWRJZHMu
Y29uY2F0LAorICAgIGNvcmVfcHVzaCA9IGNvcmVfZGVsZXRlZElkcy5wdXNoLAorICAgIGNvcmVf
c2xpY2UgPSBjb3JlX2RlbGV0ZWRJZHMuc2xpY2UsCisgICAgY29yZV9pbmRleE9mID0gY29yZV9k
ZWxldGVkSWRzLmluZGV4T2YsCisgICAgY29yZV90b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJp
bmcsCisgICAgY29yZV9oYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5LAorICAgIGNv
cmVfdHJpbSA9IGNvcmVfdmVyc2lvbi50cmltLAorCisgICAgLy8gRGVmaW5lIGEgbG9jYWwgY29w
eSBvZiBqUXVlcnkKKyAgICBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7
CisgICAgLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25z
dHJ1Y3RvciAnZW5oYW5jZWQnCisgICAgcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0
b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKKyAgICB9LAorCisgICAgLy8gVXNlZCBmb3IgbWF0
Y2hpbmcgbnVtYmVycworICAgIGNvcmVfcG51bSA9IC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVd
WystXT9cZCt8KS8uc291cmNlLAorCisgICAgLy8gVXNlZCBmb3Igc3BsaXR0aW5nIG9uIHdoaXRl
c3BhY2UKKyAgICBjb3JlX3Jub3R3aGl0ZSA9IC9cUysvZywKKworICAgIC8vIE1ha2Ugc3VyZSB3
ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQgeW91LCBTYWZhcmkgNS4wIGFu
ZCBJRSkKKyAgICBydHJpbSA9IC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywK
KworICAgIC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCisgICAgLy8g
UHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2gg
KCM5NTIxKQorICAgIC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3Rh
cnQgd2l0aCA8KQorICAgIHJxdWlja0V4cHIgPSAvXig/Oig8W1x3XFddKz4pW14+XSp8IyhbXHct
XSopKSQvLAorCisgICAgLy8gTWF0Y2ggYSBzdGFuZGFsb25lIHRhZworICAgIHJzaW5nbGVUYWcg
PSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLAorCisgICAgLy8gSlNPTiBSZWdFeHAKKyAg
ICBydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKKyAgICBydmFsaWRicmFjZXMgPSAvKD86
Xnw6fCwpKD86XHMqXFspKy9nLAorICAgIHJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0
XXx1W1xkYS1mQS1GXXs0fSkvZywKKyAgICBydmFsaWR0b2tlbnMgPSAvIlteIlxcXHJcbl0qInx0
cnVlfGZhbHNlfG51bGx8LT8oPzpcZCtcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvZywKKworICAg
IC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZworICAgIHJtc1ByZWZpeCA9
IC9eLW1zLS8sCisgICAgcmRhc2hBbHBoYSA9IC8tKFtcZGEtel0pL2dpLAorCisgICAgLy8gVXNl
ZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKQorICAgIGZjYW1l
bENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7CisgICAgcmV0dXJuIGxldHRlci50b1Vw
cGVyQ2FzZSgpOworICAgIH0sCisKKyAgICAvLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlcgorICAg
IGNvbXBsZXRlZCA9IGZ1bmN0aW9uKCBldmVudCApIHsKKworICAgIC8vIHJlYWR5U3RhdGUgPT09
ICJjb21wbGV0ZSIgaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvIGNhbGwgdGhlIGRvbSByZWFkeSBp
biBvbGRJRQorICAgIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciB8fCBldmVudC50eXBl
ID09PSAibG9hZCIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKKyAg
ICBkZXRhY2goKTsKKyAgICBqUXVlcnkucmVhZHkoKTsKKyAgICB9CisgICAgfSwKKyAgICAvLyBD
bGVhbi11cCBtZXRob2QgZm9yIGRvbSByZWFkeSBldmVudHMKKyAgICBkZXRhY2ggPSBmdW5jdGlv
bigpIHsKKyAgICBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisgICAgZG9jdW1l
bnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBjb21wbGV0ZWQsIGZh
bHNlICk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJsb2FkIiwgY29tcGxldGVk
LCBmYWxzZSApOworCisgICAgfSBlbHNlIHsKKyAgICBkb2N1bWVudC5kZXRhY2hFdmVudCggIm9u
cmVhZHlzdGF0ZWNoYW5nZSIsIGNvbXBsZXRlZCApOworICAgIHdpbmRvdy5kZXRhY2hFdmVudCgg
Im9ubG9hZCIsIGNvbXBsZXRlZCApOworICAgIH0KKyAgICB9OworCitqUXVlcnkuZm4gPSBqUXVl
cnkucHJvdG90eXBlID0geworICAgIC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJl
aW5nIHVzZWQKKyAgICBqcXVlcnk6IGNvcmVfdmVyc2lvbiwKKworICAgIGNvbnN0cnVjdG9yOiBq
UXVlcnksCisgICAgaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5
ICkgeworICAgIHZhciBtYXRjaCwgZWxlbTsKKworICAgIC8vIEhBTkRMRTogJCgiIiksICQobnVs
bCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKKyAgICBpZiAoICFzZWxlY3RvciApIHsKKyAgICBy
ZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisgICAgaWYg
KCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAgIGlmICggc2VsZWN0b3IuY2hh
ckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkg
PT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKKyAgICAvLyBBc3N1bWUgdGhhdCBz
dHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSBy
ZWdleCBjaGVjaworICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdOworCisgICAg
fSBlbHNlIHsKKyAgICBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKKyAgICB9
CisKKyAgICAvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmll
ZCBmb3IgI2lkCisgICAgaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgewor
CisgICAgLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisgICAgaWYgKCBtYXRjaFsxXSAp
IHsKKyAgICBjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0g
OiBjb250ZXh0OworCisgICAgLy8gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdAorICAg
IGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTCgKKyAgICBtYXRjaFsxXSwKKyAg
ICBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwg
Y29udGV4dCA6IGRvY3VtZW50LAorICAgIHRydWUKKyAgICApICk7CisKKyAgICAvLyBIQU5ETEU6
ICQoaHRtbCwgcHJvcHMpCisgICAgaWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWzFdICkgJiYg
alF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHsKKyAgICBmb3IgKCBtYXRjaCBpbiBj
b250ZXh0ICkgeworICAgIC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1l
dGhvZHMgaWYgcG9zc2libGUKKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRj
aCBdICkgKSB7CisgICAgdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOworCisgICAg
Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlcworICAgIH0gZWxzZSB7CisgICAg
dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOworICAgIH0KKyAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIHRoaXM7CisKKyAgICAvLyBIQU5ETEU6ICQoI2lkKQorICAgIH0gZWxz
ZSB7CisgICAgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApOworCisg
ICAgLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVy
bnMKKyAgICAvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYz
CisgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICAvLyBIYW5kbGUgdGhl
IGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcworICAgIC8vIGJ5IG5hbWUgaW5z
dGVhZCBvZiBJRAorICAgIGlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CisgICAgcmV0dXJu
IHJvb3RqUXVlcnkuZmluZCggc2VsZWN0b3IgKTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2Us
IHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0Cisg
ICAgdGhpcy5sZW5ndGggPSAxOworICAgIHRoaXNbMF0gPSBlbGVtOworICAgIH0KKworICAgIHRo
aXMuY29udGV4dCA9IGRvY3VtZW50OworICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAg
ICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQor
ICAgIH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgeworICAgIHJldHVy
biAoIGNvbnRleHQgfHwgcm9vdGpRdWVyeSApLmZpbmQoIHNlbGVjdG9yICk7CisKKyAgICAvLyBI
QU5ETEU6ICQoZXhwciwgY29udGV4dCkKKyAgICAvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50
IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKKyAgICB9IGVsc2UgeworICAgIHJldHVybiB0aGlz
LmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKyAgICB9CisKKyAgICAv
LyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKKyAgICB9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlw
ZSApIHsKKyAgICB0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7CisgICAgdGhpcy5s
ZW5ndGggPSAxOworICAgIHJldHVybiB0aGlzOworCisgICAgLy8gSEFORExFOiAkKGZ1bmN0aW9u
KQorICAgIC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorICAgIH0gZWxzZSBpZiAoIGpR
dWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgeworICAgIHJldHVybiByb290alF1ZXJ5LnJl
YWR5KCBzZWxlY3RvciApOworICAgIH0KKworICAgIGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09
IHVuZGVmaW5lZCApIHsKKyAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7Cisg
ICAgdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKyAgICB9CisKKyAgICByZXR1cm4g
alF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKyAgICB9LAorCisgICAgLy8gU3Rh
cnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorICAgIHNlbGVjdG9yOiAiIiwKKworICAgIC8vIFRo
ZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAorICAgIGxlbmd0aDogMCwK
KworICAgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVk
IGVsZW1lbnQgc2V0CisgICAgc2l6ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubGVu
Z3RoOworICAgIH0sCisKKyAgICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gY29y
ZV9zbGljZS5jYWxsKCB0aGlzICk7CisgICAgfSwKKworICAgIC8vIEdldCB0aGUgTnRoIGVsZW1l
bnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKyAgICAvLyBHZXQgdGhlIHdob2xlIG1h
dGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorICAgIGdldDogZnVuY3Rpb24oIG51
bSApIHsKKyAgICByZXR1cm4gbnVtID09IG51bGwgPworCisgICAgLy8gUmV0dXJuIGEgJ2NsZWFu
JyBhcnJheQorICAgIHRoaXMudG9BcnJheSgpIDoKKworICAgIC8vIFJldHVybiBqdXN0IHRoZSBv
YmplY3QKKyAgICAoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sg
bnVtIF0gKTsKKyAgICB9LAorCisgICAgLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQg
cHVzaCBpdCBvbnRvIHRoZSBzdGFjaworICAgIC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVk
IGVsZW1lbnQgc2V0KQorICAgIHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgeworCisgICAg
Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXQKKyAgICB2YXIgcmV0ID0g
alF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7CisKKyAgICAvLyBBZGQg
dGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQorICAgIHJldC5w
cmV2T2JqZWN0ID0gdGhpczsKKyAgICByZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKKworICAg
IC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CisgICAgcmV0dXJuIHJldDsK
KyAgICB9LAorCisgICAgLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGlu
IHRoZSBtYXRjaGVkIHNldC4KKyAgICAvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0
aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcworICAgIC8vIG9ubHkgdXNlZCBpbnRlcm5h
bGx5LikKKyAgICBlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CisgICAgcmV0dXJu
IGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworICAgIH0sCisKKyAgICByZWFk
eTogZnVuY3Rpb24oIGZuICkgeworICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sKKyAgICBqUXVlcnku
cmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAor
CisgICAgc2xpY2U6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggY29y
ZV9zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTsKKyAgICB9LAorCisgICAgZmlyc3Q6
IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVxKCAwICk7CisgICAgfSwKKworICAgIGxh
c3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVxKCAtMSApOworICAgIH0sCisKKyAg
ICBlcTogZnVuY3Rpb24oIGkgKSB7CisgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLAorICAgIGog
PSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBq
ID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKKyAgICB9LAorCisgICAgbWFw
OiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVl
cnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworICAgIHJldHVybiBjYWxsYmFjay5j
YWxsKCBlbGVtLCBpLCBlbGVtICk7CisgICAgfSkpOworICAgIH0sCisKKyAgICBlbmQ6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3Rvcihu
dWxsKTsKKyAgICB9LAorCisgICAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgIC8vIEJl
aGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgor
ICAgIHB1c2g6IGNvcmVfcHVzaCwKKyAgICBzb3J0OiBbXS5zb3J0LAorICAgIHNwbGljZTogW10u
c3BsaWNlCit9OworCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90
eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBq
UXVlcnkuZm47CisKK2pRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24o
KSB7CisgICAgdmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5hbWUsIG9wdGlvbnMsIGNsb25l
LAorICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwKKyAgICBpID0gMSwKKyAgICBsZW5n
dGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgIGRlZXAgPSBmYWxzZTsKKworICAgIC8vIEhhbmRs
ZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKyAgICBpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29s
ZWFuIiApIHsKKyAgICBkZWVwID0gdGFyZ2V0OworICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXSB8
fCB7fTsKKyAgICAvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CisgICAgaSA9IDI7
CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Ig
c29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisgICAgaWYgKCB0eXBlb2YgdGFyZ2V0
ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApIHsKKyAgICB0YXJn
ZXQgPSB7fTsKKyAgICB9CisKKyAgICAvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9u
ZSBhcmd1bWVudCBpcyBwYXNzZWQKKyAgICBpZiAoIGxlbmd0aCA9PT0gaSApIHsKKyAgICB0YXJn
ZXQgPSB0aGlzOworICAgIC0taTsKKyAgICB9CisKKyAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkr
KyApIHsKKyAgICAvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCisg
ICAgaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgeworICAgIC8vIEV4
dGVuZCB0aGUgYmFzZSBvYmplY3QKKyAgICBmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CisgICAg
c3JjID0gdGFyZ2V0WyBuYW1lIF07CisgICAgY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKKworICAg
IC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKyAgICBpZiAoIHRhcmdldCA9PT0gY29weSAp
IHsKKyAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdp
bmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKKyAgICBpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpR
dWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5
KGNvcHkpKSApICkgeworICAgIGlmICggY29weUlzQXJyYXkgKSB7CisgICAgY29weUlzQXJyYXkg
PSBmYWxzZTsKKyAgICBjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheShzcmMpID8gc3JjIDog
W107CisKKyAgICB9IGVsc2UgeworICAgIGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2Jq
ZWN0KHNyYykgPyBzcmMgOiB7fTsKKyAgICB9CisKKyAgICAvLyBOZXZlciBtb3ZlIG9yaWdpbmFs
IG9iamVjdHMsIGNsb25lIHRoZW0KKyAgICB0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQo
IGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKyAgICAvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQg
dmFsdWVzCisgICAgfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgeworICAgIHRhcmdl
dFsgbmFtZSBdID0gY29weTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBS
ZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAorICAgIHJldHVybiB0YXJnZXQ7Cit9OworCitqUXVl
cnkuZXh0ZW5kKHsKKyAgICBub0NvbmZsaWN0OiBmdW5jdGlvbiggZGVlcCApIHsKKyAgICBpZiAo
IHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisgICAgd2luZG93LiQgPSBfJDsKKyAgICB9CisKKyAg
ICBpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkgeworICAgIHdpbmRvdy5q
UXVlcnkgPSBfalF1ZXJ5OworICAgIH0KKworICAgIHJldHVybiBqUXVlcnk7CisgICAgfSwKKwor
ICAgIC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBv
Y2N1cnMuCisgICAgaXNSZWFkeTogZmFsc2UsCisKKyAgICAvLyBBIGNvdW50ZXIgdG8gdHJhY2sg
aG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCisgICAgLy8gdGhlIHJlYWR5IGV2ZW50
IGZpcmVzLiBTZWUgIzY3ODEKKyAgICByZWFkeVdhaXQ6IDEsCisKKyAgICAvLyBIb2xkIChvciBy
ZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKKyAgICBob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkg
eworICAgIGlmICggaG9sZCApIHsKKyAgICBqUXVlcnkucmVhZHlXYWl0Kys7CisgICAgfSBlbHNl
IHsKKyAgICBqUXVlcnkucmVhZHkoIHRydWUgKTsKKyAgICB9CisgICAgfSwKKworICAgIC8vIEhh
bmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKyAgICByZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7
CisKKyAgICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJl
YWR5IHJlYWR5CisgICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDog
alF1ZXJ5LmlzUmVhZHkgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE1ha2Ugc3Vy
ZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0cyBhIGxpdHRsZSBvdmVyemVh
bG91cyAodGlja2V0ICM1NDQzKS4KKyAgICBpZiAoICFkb2N1bWVudC5ib2R5ICkgeworICAgIHJl
dHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTsKKyAgICB9CisKKyAgICAvLyBSZW1lbWJl
ciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKyAgICBqUXVlcnkuaXNSZWFkeSA9IHRydWU7CisKKyAg
ICAvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdh
aXQgaWYgbmVlZCBiZQorICAgIGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdh
aXQgPiAwICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgZnVu
Y3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisgICAgcmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1
bWVudCwgWyBqUXVlcnkgXSApOworCisgICAgLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZl
bnRzCisgICAgaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKKyAgICBqUXVlcnkoIGRvY3VtZW50
ICkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iik7CisgICAgfQorICAgIH0sCisKKyAgICAv
LyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9u
LgorICAgIC8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxp
a2UgYWxlcnQKKyAgICAvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJ
RSAoIzI5NjgpLgorICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgcmV0dXJu
IGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7CisgICAgfSwKKworICAgIGlzQXJyYXk6
IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKKyAgICByZXR1cm4galF1ZXJ5LnR5
cGUob2JqKSA9PT0gImFycmF5IjsKKyAgICB9LAorCisgICAgaXNXaW5kb3c6IGZ1bmN0aW9uKCBv
YmogKSB7CisgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PSBvYmoud2luZG93OworICAg
IH0sCisKKyAgICBpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgcmV0dXJuICFpc05h
TiggcGFyc2VGbG9hdChvYmopICkgJiYgaXNGaW5pdGUoIG9iaiApOworICAgIH0sCisKKyAgICB0
eXBlOiBmdW5jdGlvbiggb2JqICkgeworICAgIGlmICggb2JqID09IG51bGwgKSB7CisgICAgcmV0
dXJuIFN0cmluZyggb2JqICk7CisgICAgfQorICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAib2Jq
ZWN0IiB8fCB0eXBlb2Ygb2JqID09PSAiZnVuY3Rpb24iID8KKyAgICBjbGFzczJ0eXBlWyBjb3Jl
X3RvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiIDoKKyAgICB0eXBlb2Ygb2JqOworICAg
IH0sCisKKyAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgeworICAgIC8vIE11c3Qg
YmUgYW4gT2JqZWN0LgorICAgIC8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVj
ayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgorICAgIC8vIE1ha2Ug
c3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdo
LCBhcyB3ZWxsCisgICAgaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBlKG9iaikgIT09ICJvYmplY3Qi
IHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgeworICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICB0cnkgeworICAgIC8vIE5vdCBvd24gY29uc3RydWN0b3Ig
cHJvcGVydHkgbXVzdCBiZSBPYmplY3QKKyAgICBpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgorICAg
ICFjb3JlX2hhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIikgJiYKKyAgICAhY29yZV9oYXNP
d24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAiaXNQcm90b3R5cGVPZiIpICkgewor
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgLy8gSUU4
LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3Cisg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVt
ZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAorICAgIC8vIGlmIGxhc3Qgb25lIGlzIG93
biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgorCisgICAgdmFyIGtleTsKKyAgICBmb3Ig
KCBrZXkgaW4gb2JqICkge30KKworICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBjb3Jl
X2hhc093bi5jYWxsKCBvYmosIGtleSApOworICAgIH0sCisKKyAgICBpc0VtcHR5T2JqZWN0OiBm
dW5jdGlvbiggb2JqICkgeworICAgIHZhciBuYW1lOworICAgIGZvciAoIG5hbWUgaW4gb2JqICkg
eworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKwor
ICAgIGVycm9yOiBmdW5jdGlvbiggbXNnICkgeworICAgIHRocm93IG5ldyBFcnJvciggbXNnICk7
CisgICAgfSwKKworICAgIC8vIGRhdGE6IHN0cmluZyBvZiBodG1sCisgICAgLy8gY29udGV4dCAo
b3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4g
dGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAorICAgIC8vIGtlZXBTY3JpcHRzIChv
cHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRt
bCBzdHJpbmcKKyAgICBwYXJzZUhUTUw6IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2Ny
aXB0cyApIHsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsK
KyAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJv
b2xlYW4iICkgeworICAgIGtlZXBTY3JpcHRzID0gY29udGV4dDsKKyAgICBjb250ZXh0ID0gZmFs
c2U7CisgICAgfQorICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCisgICAgdmFy
IHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAorICAgIHNjcmlwdHMgPSAha2VlcFNj
cmlwdHMgJiYgW107CisKKyAgICAvLyBTaW5nbGUgdGFnCisgICAgaWYgKCBwYXJzZWQgKSB7Cisg
ICAgcmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbMV0gKSBdOworICAgIH0K
KworICAgIHBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwg
c2NyaXB0cyApOworICAgIGlmICggc2NyaXB0cyApIHsKKyAgICBqUXVlcnkoIHNjcmlwdHMgKS5y
ZW1vdmUoKTsKKyAgICB9CisgICAgcmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGls
ZE5vZGVzICk7CisgICAgfSwKKworICAgIHBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7Cisg
ICAgLy8gQXR0ZW1wdCB0byBwYXJzZSB1c2luZyB0aGUgbmF0aXZlIEpTT04gcGFyc2VyIGZpcnN0
CisgICAgaWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5wYXJzZSApIHsKKyAgICByZXR1
cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsKKyAgICB9CisKKyAgICBpZiAoIGRhdGEgPT09
IG51bGwgKSB7CisgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgaWYgKCB0eXBlb2YgZGF0
YSA9PT0gInN0cmluZyIgKSB7CisKKyAgICAvLyBNYWtlIHN1cmUgbGVhZGluZy90cmFpbGluZyB3
aGl0ZXNwYWNlIGlzIHJlbW92ZWQgKElFIGNhbid0IGhhbmRsZSBpdCkKKyAgICBkYXRhID0galF1
ZXJ5LnRyaW0oIGRhdGEgKTsKKworICAgIGlmICggZGF0YSApIHsKKyAgICAvLyBNYWtlIHN1cmUg
dGhlIGluY29taW5nIGRhdGEgaXMgYWN0dWFsIEpTT04KKyAgICAvLyBMb2dpYyBib3Jyb3dlZCBm
cm9tIGh0dHA6Ly9qc29uLm9yZy9qc29uMi5qcworICAgIGlmICggcnZhbGlkY2hhcnMudGVzdCgg
ZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsICJAIiApCisgICAgLnJlcGxhY2UoIHJ2YWxpZHRv
a2VucywgIl0iICkKKyAgICAucmVwbGFjZSggcnZhbGlkYnJhY2VzLCAiIikpICkgeworCisgICAg
cmV0dXJuICggbmV3IEZ1bmN0aW9uKCAicmV0dXJuICIgKyBkYXRhICkgKSgpOworICAgIH0KKyAg
ICB9CisgICAgfQorCisgICAgalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBKU09OOiAiICsgZGF0YSAp
OworICAgIH0sCisKKyAgICAvLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCisgICAgcGFyc2VY
TUw6IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIHZhciB4bWwsIHRtcDsKKyAgICBpZiAoICFkYXRh
IHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgICB9
CisgICAgdHJ5IHsKKyAgICBpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCisg
ICAgdG1wID0gbmV3IERPTVBhcnNlcigpOworICAgIHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmco
IGRhdGEgLCAidGV4dC94bWwiICk7CisgICAgfSBlbHNlIHsgLy8gSUUKKyAgICB4bWwgPSBuZXcg
QWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxET00iICk7CisgICAgeG1sLmFzeW5jID0gImZh
bHNlIjsKKyAgICB4bWwubG9hZFhNTCggZGF0YSApOworICAgIH0KKyAgICB9IGNhdGNoKCBlICkg
eworICAgIHhtbCA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgaWYgKCAheG1sIHx8ICF4bWwuZG9j
dW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiAp
Lmxlbmd0aCApIHsKKyAgICBqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsK
KyAgICB9CisgICAgcmV0dXJuIHhtbDsKKyAgICB9LAorCisgICAgbm9vcDogZnVuY3Rpb24oKSB7
fSwKKworICAgIC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CisgICAg
Ly8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkgSmltIERyaXNjb2xsCisgICAgLy8g
aHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9hcmNoaXZlLzIwMDkvMDkvMDgv
ZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0CisgICAgZ2xvYmFsRXZhbDogZnVuY3Rpb24o
IGRhdGEgKSB7CisgICAgaWYgKCBkYXRhICYmIGpRdWVyeS50cmltKCBkYXRhICkgKSB7CisgICAg
Ly8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIKKyAgICAvLyBXZSB1c2Ug
YW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBpcyB3aW5kb3cKKyAgICAvLyBy
YXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAorICAgICggd2luZG93LmV4ZWNTY3JpcHQgfHwg
ZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRh
dGEgKTsKKyAgICB9ICkoIGRhdGEgKTsKKyAgICB9CisgICAgfSwKKworICAgIC8vIENvbnZlcnQg
ZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKKyAg
ICAvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIp
CisgICAgY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgeworICAgIHJldHVybiBzdHJpbmcu
cmVwbGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENh
c2UgKTsKKyAgICB9LAorCisgICAgbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewor
ICAgIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9
PT0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0sCisKKyAgICAvLyBhcmdzIGlzIGZvciBpbnRl
cm5hbCB1c2FnZSBvbmx5CisgICAgZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3Mg
KSB7CisgICAgdmFyIHZhbHVlLAorICAgIGkgPSAwLAorICAgIGxlbmd0aCA9IG9iai5sZW5ndGgs
CisgICAgaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTsKKworICAgIGlmICggYXJncyApIHsK
KyAgICBpZiAoIGlzQXJyYXkgKSB7CisgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Cisg
ICAgdmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTsKKworICAgIGlmICgg
dmFsdWUgPT09IGZhbHNlICkgeworICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgfSBlbHNl
IHsKKyAgICBmb3IgKCBpIGluIG9iaiApIHsKKyAgICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBv
YmpbIGkgXSwgYXJncyApOworCisgICAgaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisgICAgYnJl
YWs7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2Ug
Zm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAorICAgIH0gZWxzZSB7CisgICAgaWYgKCBp
c0FycmF5ICkgeworICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAgIHZhbHVlID0g
Y2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7CisKKyAgICBpZiAoIHZhbHVl
ID09PSBmYWxzZSApIHsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgZm9yICggaSBpbiBvYmogKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkg
XSwgaSwgb2JqWyBpIF0gKTsKKworICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworICAgIGJy
ZWFrOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBvYmo7CisgICAg
fSwKKworICAgIC8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9z
c2libGUKKyAgICB0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKCJcdUZFRkZceEEw
IikgPworICAgIGZ1bmN0aW9uKCB0ZXh0ICkgeworICAgIHJldHVybiB0ZXh0ID09IG51bGwgPwor
ICAgICIiIDoKKyAgICBjb3JlX3RyaW0uY2FsbCggdGV4dCApOworICAgIH0gOgorCisgICAgLy8g
T3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHkKKyAgICBmdW5jdGlv
biggdGV4dCApIHsKKyAgICByZXR1cm4gdGV4dCA9PSBudWxsID8KKyAgICAiIiA6CisgICAgKCB0
ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKKyAgICB9LAorCisgICAgLy8gcmVzdWx0
cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorICAgIG1ha2VBcnJheTogZnVuY3Rpb24oIGFy
ciwgcmVzdWx0cyApIHsKKyAgICB2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKKworICAgIGlmICgg
YXJyICE9IG51bGwgKSB7CisgICAgaWYgKCBpc0FycmF5bGlrZSggT2JqZWN0KGFycikgKSApIHsK
KyAgICBqUXVlcnkubWVyZ2UoIHJldCwKKyAgICB0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/Cisg
ICAgWyBhcnIgXSA6IGFycgorICAgICk7CisgICAgfSBlbHNlIHsKKyAgICBjb3JlX3B1c2guY2Fs
bCggcmV0LCBhcnIgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgICB9LAor
CisgICAgaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKKyAgICB2YXIgbGVuOwor
CisgICAgaWYgKCBhcnIgKSB7CisgICAgaWYgKCBjb3JlX2luZGV4T2YgKSB7CisgICAgcmV0dXJu
IGNvcmVfaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTsKKyAgICB9CisKKyAgICBsZW4gPSBh
cnIubGVuZ3RoOworICAgIGkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDog
aSA6IDA7CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAvLyBTa2lwIGFjY2Vz
c2luZyBpbiBzcGFyc2UgYXJyYXlzCisgICAgaWYgKCBpIGluIGFyciAmJiBhcnJbIGkgXSA9PT0g
ZWxlbSApIHsKKyAgICByZXR1cm4gaTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVy
biAtMTsKKyAgICB9LAorCisgICAgbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewor
ICAgIHZhciBsID0gc2Vjb25kLmxlbmd0aCwKKyAgICBpID0gZmlyc3QubGVuZ3RoLAorICAgIGog
PSAwOworCisgICAgaWYgKCB0eXBlb2YgbCA9PT0gIm51bWJlciIgKSB7CisgICAgZm9yICggOyBq
IDwgbDsgaisrICkgeworICAgIGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdOworICAgIH0KKyAg
ICB9IGVsc2UgeworICAgIHdoaWxlICggc2Vjb25kW2pdICE9PSB1bmRlZmluZWQgKSB7CisgICAg
Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKKyAgICB9CisgICAgfQorCisgICAgZmlyc3Qu
bGVuZ3RoID0gaTsKKworICAgIHJldHVybiBmaXJzdDsKKyAgICB9LAorCisgICAgZ3JlcDogZnVu
Y3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworICAgIHZhciByZXRWYWwsCisgICAgcmV0
ID0gW10sCisgICAgaSA9IDAsCisgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOworICAgIGludiA9
ICEhaW52OworCisgICAgLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBp
dGVtcworICAgIC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisgICAgZm9yICgg
OyBpIDwgbGVuZ3RoOyBpKysgKSB7CisgICAgcmV0VmFsID0gISFjYWxsYmFjayggZWxlbXNbIGkg
XSwgaSApOworICAgIGlmICggaW52ICE9PSByZXRWYWwgKSB7CisgICAgcmV0LnB1c2goIGVsZW1z
WyBpIF0gKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAg
Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAgbWFwOiBmdW5jdGlvbiggZWxl
bXMsIGNhbGxiYWNrLCBhcmcgKSB7CisgICAgdmFyIHZhbHVlLAorICAgIGkgPSAwLAorICAgIGxl
bmd0aCA9IGVsZW1zLmxlbmd0aCwKKyAgICBpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICks
CisgICAgcmV0ID0gW107CisKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRp
bmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKyAgICBpZiAoIGlzQXJyYXkgKSB7CisgICAg
Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNb
IGkgXSwgaSwgYXJnICk7CisKKyAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7CisgICAgcmV0WyBy
ZXQubGVuZ3RoIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgfQorCisgICAgLy8gR28gdGhyb3VnaCBl
dmVyeSBrZXkgb24gdGhlIG9iamVjdCwKKyAgICB9IGVsc2UgeworICAgIGZvciAoIGkgaW4gZWxl
bXMgKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKyAg
ICBpZiAoIHZhbHVlICE9IG51bGwgKSB7CisgICAgcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsK
KyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMK
KyAgICByZXR1cm4gY29yZV9jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKyAgICB9LAorCisgICAg
Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCisgICAgZ3VpZDogMSwKKworICAg
IC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFw
cGx5aW5nIGFueQorICAgIC8vIGFyZ3VtZW50cy4KKyAgICBwcm94eTogZnVuY3Rpb24oIGZuLCBj
b250ZXh0ICkgeworICAgIHZhciBhcmdzLCBwcm94eSwgdG1wOworCisgICAgaWYgKCB0eXBlb2Yg
Y29udGV4dCA9PT0gInN0cmluZyIgKSB7CisgICAgdG1wID0gZm5bIGNvbnRleHQgXTsKKyAgICBj
b250ZXh0ID0gZm47CisgICAgZm4gPSB0bXA7CisgICAgfQorCisgICAgLy8gUXVpY2sgY2hlY2sg
dG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKKyAgICAvLyB0
aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVk
LgorICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkgeworICAgIHJldHVybiB1bmRl
ZmluZWQ7CisgICAgfQorCisgICAgLy8gU2ltdWxhdGVkIGJpbmQKKyAgICBhcmdzID0gY29yZV9z
bGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKKyAgICBwcm94eSA9IGZ1bmN0aW9uKCkgeworICAg
IHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggY29yZV9zbGlj
ZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CisgICAgfTsKKworICAgIC8vIFNldCB0aGUgZ3VpZCBv
ZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBj
YW4gYmUgcmVtb3ZlZAorICAgIHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVl
cnkuZ3VpZCsrOworCisgICAgcmV0dXJuIHByb3h5OworICAgIH0sCisKKyAgICAvLyBNdWx0aWZ1
bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb24KKyAg
ICAvLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVu
Y3Rpb24KKyAgICBhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWlu
YWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgbGVuZ3RoID0gZWxl
bXMubGVuZ3RoLAorICAgIGJ1bGsgPSBrZXkgPT0gbnVsbDsKKworICAgIC8vIFNldHMgbWFueSB2
YWx1ZXMKKyAgICBpZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0gIm9iamVjdCIgKSB7CisgICAg
Y2hhaW5hYmxlID0gdHJ1ZTsKKyAgICBmb3IgKCBpIGluIGtleSApIHsKKyAgICBqUXVlcnkuYWNj
ZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApOworICAgIH0K
KworICAgIC8vIFNldHMgb25lIHZhbHVlCisgICAgfSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVm
aW5lZCApIHsKKyAgICBjaGFpbmFibGUgPSB0cnVlOworCisgICAgaWYgKCAhalF1ZXJ5LmlzRnVu
Y3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmF3ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIGJ1
bGsgKSB7CisgICAgLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0
CisgICAgaWYgKCByYXcgKSB7CisgICAgZm4uY2FsbCggZWxlbXMsIHZhbHVlICk7CisgICAgZm4g
PSBudWxsOworCisgICAgLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVl
cworICAgIH0gZWxzZSB7CisgICAgYnVsayA9IGZuOworICAgIGZuID0gZnVuY3Rpb24oIGVsZW0s
IGtleSwgdmFsdWUgKSB7CisgICAgcmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZh
bHVlICk7CisgICAgfTsKKyAgICB9CisgICAgfQorCisgICAgaWYgKCBmbiApIHsKKyAgICBmb3Ig
KCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICBmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFs
dWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7Cisg
ICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2hhaW5hYmxlID8KKyAgICBlbGVtcyA6
CisKKyAgICAvLyBHZXRzCisgICAgYnVsayA/CisgICAgZm4uY2FsbCggZWxlbXMgKSA6CisgICAg
bGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0OworICAgIH0sCisKKyAgICBu
b3c6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCk7Cisg
ICAgfQorfSk7CisKK2pRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKKyAg
ICBpZiAoICFyZWFkeUxpc3QgKSB7CisKKyAgICByZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQo
KTsKKworICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2Fs
bGVkIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLgorICAgIC8v
IHdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVyYWN0aXZlIiBoZXJlLCBidXQg
aXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmUKKyAgICAvLyBkaXNjb3ZlcmVkIGJ5IENocmlz
UyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1Cisg
ICAgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworICAgIC8vIEhh
bmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0
byBkZWxheSByZWFkeQorICAgIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOworCisgICAgLy8g
U3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29udGVudExvYWRlZAorICAgIH0g
ZWxzZSBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisgICAgLy8gVXNlIHRoZSBo
YW5keSBldmVudCBjYWxsYmFjaworICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01D
b250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOworCisgICAgLy8gQSBmYWxsYmFjayB0
byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKyAgICB3aW5kb3cuYWRkRXZl
bnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7CisKKyAgICAvLyBJZiBJRSBl
dmVudCBtb2RlbCBpcyB1c2VkCisgICAgfSBlbHNlIHsKKyAgICAvLyBFbnN1cmUgZmlyaW5nIGJl
Zm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcworICAgIGRv
Y3VtZW50LmF0dGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgY29tcGxldGVkICk7CisK
KyAgICAvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29y
aworICAgIHdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRlZCApOworCisgICAg
Ly8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCisgICAgLy8gY29udGludWFsbHkgY2hlY2sgdG8gc2Vl
IGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeQorICAgIHZhciB0b3AgPSBmYWxzZTsKKworICAgIHRy
eSB7CisgICAgdG9wID0gd2luZG93LmZyYW1lRWxlbWVudCA9PSBudWxsICYmIGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudDsKKyAgICB9IGNhdGNoKGUpIHt9CisKKyAgICBpZiAoIHRvcCAmJiB0b3Au
ZG9TY3JvbGwgKSB7CisgICAgKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hlY2soKSB7CisgICAgaWYgKCAh
alF1ZXJ5LmlzUmVhZHkgKSB7CisKKyAgICB0cnkgeworICAgIC8vIFVzZSB0aGUgdHJpY2sgYnkg
RGllZ28gUGVyaW5pCisgICAgLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVu
dExvYWRlZC8KKyAgICB0b3AuZG9TY3JvbGwoImxlZnQiKTsKKyAgICB9IGNhdGNoKGUpIHsKKyAg
ICByZXR1cm4gc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgNTAgKTsKKyAgICB9CisKKyAgICAv
LyBkZXRhY2ggYWxsIGRvbSByZWFkeSBldmVudHMKKyAgICBkZXRhY2goKTsKKworICAgIC8vIGFu
ZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucworICAgIGpRdWVyeS5yZWFkeSgpOworICAg
IH0KKyAgICB9KSgpOworICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkeUxpc3Qu
cHJvbWlzZSggb2JqICk7Cit9OworCisvLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXAKK2pR
dWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdF
eHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CisgICAgY2xh
c3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsK
K30pOworCitmdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkgeworICAgIHZhciBsZW5ndGggPSBv
YmoubGVuZ3RoLAorICAgIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CisKKyAgICBpZiAoIGpR
dWVyeS5pc1dpbmRvdyggb2JqICkgKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IGlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHsKKyAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICByZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCB0eXBlICE9PSAiZnVuY3Rp
b24iICYmCisgICAgKCBsZW5ndGggPT09IDAgfHwKKyAgICB0eXBlb2YgbGVuZ3RoID09PSAibnVt
YmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iaiApOworfQorCisvLyBB
bGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKK3Jvb3RqUXVlcnkg
PSBqUXVlcnkoZG9jdW1lbnQpOworLy8gU3RyaW5nIHRvIE9iamVjdCBvcHRpb25zIGZvcm1hdCBj
YWNoZQordmFyIG9wdGlvbnNDYWNoZSA9IHt9OworCisvLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0
ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lcyBhbmQgc3RvcmUgaW4gY2FjaGUK
K2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7CisgICAgdmFyIG9iamVjdCA9IG9w
dGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307CisgICAgalF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0
Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkgeworICAgIG9i
amVjdFsgZmxhZyBdID0gdHJ1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4gb2JqZWN0OworfQorCisv
KgorICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRl
cnM6CisgKgorICogICAgb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0
ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdworICogICAgICAgICAgICB0aGUgY2FsbGJh
Y2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0CisgKgor
ICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxs
YmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCisgKgorICog
UG9zc2libGUgb3B0aW9uczoKKyAqCisgKiAgICBvbmNlOiAgICAgICAgICAgIHdpbGwgZW5zdXJl
IHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJl
ZCkKKyAqCisgKiAgICBtZW1vcnk6ICAgICAgICAgICAgd2lsbCBrZWVwIHRyYWNrIG9mIHByZXZp
b3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZAorICogICAgICAgICAg
ICAgICAgICAgIGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0
aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCisgKiAgICAgICAgICAgICAgICAgICAgdmFsdWVzIChsaWtl
IGEgRGVmZXJyZWQpCisgKgorICogICAgdW5pcXVlOiAgICAgICAgICAgIHdpbGwgZW5zdXJlIGEg
Y2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0
KQorICoKKyAqICAgIHN0b3BPbkZhbHNlOiAgICBpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNh
bGxiYWNrIHJldHVybnMgZmFsc2UKKyAqCisgKi8KK2pRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlv
biggb3B0aW9ucyApIHsKKworICAgIC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3Jt
YXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKKyAgICAvLyAod2UgY2hlY2sgaW4g
Y2FjaGUgZmlyc3QpCisgICAgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiA/
CisgICAgKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25z
ICkgKSA6CisgICAgalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKKworICAgIHZhciAvLyBG
bGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCisgICAgZmlyaW5nLAorICAg
IC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cykKKyAgICBtZW1v
cnksCisgICAgLy8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWQKKyAgICBm
aXJlZCwKKyAgICAvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKKyAgICBmaXJpbmdMZW5n
dGgsCisgICAgLy8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQg
YnkgcmVtb3ZlIGlmIG5lZWRlZCkKKyAgICBmaXJpbmdJbmRleCwKKyAgICAvLyBGaXJzdCBjYWxs
YmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aCkKKyAgICBm
aXJpbmdTdGFydCwKKyAgICAvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdAorICAgIGxpc3QgPSBbXSwK
KyAgICAvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzCisgICAgc3Rh
Y2sgPSAhb3B0aW9ucy5vbmNlICYmIFtdLAorICAgIC8vIEZpcmUgY2FsbGJhY2tzCisgICAgZmly
ZSA9IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIG1lbW9yeSA9IG9wdGlvbnMubWVtb3J5ICYmIGRh
dGE7CisgICAgZmlyZWQgPSB0cnVlOworICAgIGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwg
MDsKKyAgICBmaXJpbmdTdGFydCA9IDA7CisgICAgZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7
CisgICAgZmlyaW5nID0gdHJ1ZTsKKyAgICBmb3IgKCA7IGxpc3QgJiYgZmlyaW5nSW5kZXggPCBm
aXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7CisgICAgaWYgKCBsaXN0WyBmaXJpbmdJbmRl
eCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0
b3BPbkZhbHNlICkgeworICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIg
Y2FsbHMgdXNpbmcgYWRkCisgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBmaXJpbmcgPSBm
YWxzZTsKKyAgICBpZiAoIGxpc3QgKSB7CisgICAgaWYgKCBzdGFjayApIHsKKyAgICBpZiAoIHN0
YWNrLmxlbmd0aCApIHsKKyAgICBmaXJlKCBzdGFjay5zaGlmdCgpICk7CisgICAgfQorICAgIH0g
ZWxzZSBpZiAoIG1lbW9yeSApIHsKKyAgICBsaXN0ID0gW107CisgICAgfSBlbHNlIHsKKyAgICBz
ZWxmLmRpc2FibGUoKTsKKyAgICB9CisgICAgfQorICAgIH0sCisgICAgLy8gQWN0dWFsIENhbGxi
YWNrcyBvYmplY3QKKyAgICBzZWxmID0geworICAgIC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29s
bGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKKyAgICBhZGQ6IGZ1bmN0aW9uKCkgewor
ICAgIGlmICggbGlzdCApIHsKKyAgICAvLyBGaXJzdCwgd2Ugc2F2ZSB0aGUgY3VycmVudCBsZW5n
dGgKKyAgICB2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsKKyAgICAoZnVuY3Rpb24gYWRkKCBhcmdz
ICkgeworICAgIGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgeworICAgIHZh
ciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOworICAgIGlmICggdHlwZSA9PT0gImZ1bmN0aW9u
IiApIHsKKyAgICBpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkgewor
ICAgIGxpc3QucHVzaCggYXJnICk7CisgICAgfQorICAgIH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcu
bGVuZ3RoICYmIHR5cGUgIT09ICJzdHJpbmciICkgeworICAgIC8vIEluc3BlY3QgcmVjdXJzaXZl
bHkKKyAgICBhZGQoIGFyZyApOworICAgIH0KKyAgICB9KTsKKyAgICB9KSggYXJndW1lbnRzICk7
CisgICAgLy8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGUKKyAgICAvLyBj
dXJyZW50IGZpcmluZyBiYXRjaD8KKyAgICBpZiAoIGZpcmluZyApIHsKKyAgICBmaXJpbmdMZW5n
dGggPSBsaXN0Lmxlbmd0aDsKKyAgICAvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmlu
ZyB0aGVuCisgICAgLy8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheQorICAgIH0gZWxzZSBpZiAo
IG1lbW9yeSApIHsKKyAgICBmaXJpbmdTdGFydCA9IHN0YXJ0OworICAgIGZpcmUoIG1lbW9yeSAp
OworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKyAgICAvLyBSZW1vdmUg
YSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0CisgICAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKKyAgICBp
ZiAoIGxpc3QgKSB7CisgICAgalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFy
ZyApIHsKKyAgICB2YXIgaW5kZXg7CisgICAgd2hpbGUoICggaW5kZXggPSBqUXVlcnkuaW5BcnJh
eSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHsKKyAgICBsaXN0LnNwbGljZSggaW5kZXgs
IDEgKTsKKyAgICAvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXMKKyAgICBpZiAoIGZpcmluZyApIHsK
KyAgICBpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKKyAgICBmaXJpbmdMZW5ndGgtLTsK
KyAgICB9CisgICAgaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsKKyAgICBmaXJpbmdJbmRl
eC0tOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0pOworICAgIH0KKyAgICByZXR1cm4gdGhp
czsKKyAgICB9LAorICAgIC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxp
c3QuCisgICAgLy8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5v
dCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuCisgICAgaGFzOiBmdW5jdGlvbiggZm4gKSB7
CisgICAgcmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBs
aXN0ICYmIGxpc3QubGVuZ3RoICk7CisgICAgfSwKKyAgICAvLyBSZW1vdmUgYWxsIGNhbGxiYWNr
cyBmcm9tIHRoZSBsaXN0CisgICAgZW1wdHk6IGZ1bmN0aW9uKCkgeworICAgIGxpc3QgPSBbXTsK
KyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAgIC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGlu
ZyBhbnltb3JlCisgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7CisgICAgbGlzdCA9IHN0YWNrID0g
bWVtb3J5ID0gdW5kZWZpbmVkOworICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgLy8gSXMg
aXQgZGlzYWJsZWQ/CisgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAhbGlz
dDsKKyAgICB9LAorICAgIC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGUKKyAg
ICBsb2NrOiBmdW5jdGlvbigpIHsKKyAgICBzdGFjayA9IHVuZGVmaW5lZDsKKyAgICBpZiAoICFt
ZW1vcnkgKSB7CisgICAgc2VsZi5kaXNhYmxlKCk7CisgICAgfQorICAgIHJldHVybiB0aGlzOwor
ICAgIH0sCisgICAgLy8gSXMgaXQgbG9ja2VkPworICAgIGxvY2tlZDogZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuICFzdGFjazsKKyAgICB9LAorICAgIC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRo
IHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHMKKyAgICBmaXJlV2l0aDogZnVuY3Rpb24o
IGNvbnRleHQsIGFyZ3MgKSB7CisgICAgYXJncyA9IGFyZ3MgfHwgW107CisgICAgYXJncyA9IFsg
Y29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTsKKyAgICBpZiAoIGxp
c3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKKyAgICBpZiAoIGZpcmluZyApIHsKKyAgICBz
dGFjay5wdXNoKCBhcmdzICk7CisgICAgfSBlbHNlIHsKKyAgICBmaXJlKCBhcmdzICk7CisgICAg
fQorICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAgIC8vIENhbGwgYWxsIHRoZSBj
YWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCisgICAgZmlyZTogZnVuY3Rpb24oKSB7
CisgICAgc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CisgICAgcmV0dXJuIHRoaXM7
CisgICAgfSwKKyAgICAvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJl
ZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKKyAgICBmaXJlZDogZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuICEhZmlyZWQ7CisgICAgfQorICAgIH07CisKKyAgICByZXR1cm4gc2VsZjsKK307CitqUXVl
cnkuZXh0ZW5kKHsKKworICAgIERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKKyAgICB2YXIg
dHVwbGVzID0gWworICAgIC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBm
aW5hbCBzdGF0ZQorICAgIFsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoIm9u
Y2UgbWVtb3J5IiksICJyZXNvbHZlZCIgXSwKKyAgICBbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVy
eS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIgXSwKKyAgICBbICJub3RpZnki
LCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnkiKSBdCisgICAgXSwKKyAgICBz
dGF0ZSA9ICJwZW5kaW5nIiwKKyAgICBwcm9taXNlID0geworICAgIHN0YXRlOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gc3RhdGU7CisgICAgfSwKKyAgICBhbHdheXM6IGZ1bmN0aW9uKCkgewor
ICAgIGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOworICAgIHJl
dHVybiB0aGlzOworICAgIH0sCisgICAgdGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWls
LCBmblByb2dyZXNzICovICkgeworICAgIHZhciBmbnMgPSBhcmd1bWVudHM7CisgICAgcmV0dXJu
IGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CisgICAgalF1ZXJ5LmVhY2go
IHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgeworICAgIHZhciBhY3Rpb24gPSB0dXBsZVsg
MCBdLAorICAgIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07
CisgICAgLy8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGlu
ZyBhY3Rpb25zIHRvIG5ld0RlZmVyCisgICAgZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24o
KSB7CisgICAgdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyAp
OworICAgIGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21p
c2UgKSApIHsKKyAgICByZXR1cm5lZC5wcm9taXNlKCkKKyAgICAuZG9uZSggbmV3RGVmZXIucmVz
b2x2ZSApCisgICAgLmZhaWwoIG5ld0RlZmVyLnJlamVjdCApCisgICAgLnByb2dyZXNzKCBuZXdE
ZWZlci5ub3RpZnkgKTsKKyAgICB9IGVsc2UgeworICAgIG5ld0RlZmVyWyBhY3Rpb24gKyAiV2l0
aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21pc2UoKSA6IHRoaXMsIGZuID8g
WyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7CisgICAgfQorICAgIH0pOworICAgIH0pOworICAg
IGZucyA9IG51bGw7CisgICAgfSkucHJvbWlzZSgpOworICAgIH0sCisgICAgLy8gR2V0IGEgcHJv
bWlzZSBmb3IgdGhpcyBkZWZlcnJlZAorICAgIC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHBy
b21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKKyAgICBwcm9taXNlOiBmdW5jdGlv
biggb2JqICkgeworICAgIHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwg
cHJvbWlzZSApIDogcHJvbWlzZTsKKyAgICB9CisgICAgfSwKKyAgICBkZWZlcnJlZCA9IHt9Owor
CisgICAgLy8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdAorICAgIHByb21pc2UucGlwZSA9IHBy
b21pc2UudGhlbjsKKworICAgIC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHMKKyAgICBqUXVl
cnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CisgICAgdmFyIGxpc3QgPSB0
dXBsZVsgMiBdLAorICAgIHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTsKKworICAgIC8vIHByb21p
c2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkCisgICAgcHJvbWlzZVsgdHVw
bGVbMV0gXSA9IGxpc3QuYWRkOworCisgICAgLy8gSGFuZGxlIHN0YXRlCisgICAgaWYgKCBzdGF0
ZVN0cmluZyApIHsKKyAgICBsaXN0LmFkZChmdW5jdGlvbigpIHsKKyAgICAvLyBzdGF0ZSA9IFsg
cmVzb2x2ZWQgfCByZWplY3RlZCBdCisgICAgc3RhdGUgPSBzdGF0ZVN0cmluZzsKKworICAgIC8v
IFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0Lmxv
Y2sKKyAgICB9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBd
LmxvY2sgKTsKKyAgICB9CisKKyAgICAvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5v
dGlmeSBdCisgICAgZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHsKKyAgICBkZWZl
cnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDog
dGhpcywgYXJndW1lbnRzICk7CisgICAgcmV0dXJuIHRoaXM7CisgICAgfTsKKyAgICBkZWZlcnJl
ZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CisgICAgfSk7CisKKyAgICAv
LyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKKyAgICBwcm9taXNlLnByb21pc2UoIGRlZmVy
cmVkICk7CisKKyAgICAvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55CisgICAgaWYgKCBmdW5jICkg
eworICAgIGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CisgICAgfQorCisgICAgLy8g
QWxsIGRvbmUhCisgICAgcmV0dXJuIGRlZmVycmVkOworICAgIH0sCisKKyAgICAvLyBEZWZlcnJl
ZCBoZWxwZXIKKyAgICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9y
ZGluYXRlTiAqLyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgcmVzb2x2ZVZhbHVlcyA9IGNvcmVf
c2xpY2UuY2FsbCggYXJndW1lbnRzICksCisgICAgbGVuZ3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5n
dGgsCisKKyAgICAvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCisgICAg
cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVu
Y3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKKworICAgIC8vIHRo
ZSBtYXN0ZXIgRGVmZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2lu
Z2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgorICAgIGRlZmVycmVkID0gcmVtYWluaW5nID09
PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKKworICAgIC8vIFVwZGF0ZSBm
dW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXMKKyAgICB1cGRhdGVG
dW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7CisgICAgcmV0dXJuIGZ1bmN0
aW9uKCB2YWx1ZSApIHsKKyAgICBjb250ZXh0c1sgaSBdID0gdGhpczsKKyAgICB2YWx1ZXNbIGkg
XSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6
IHZhbHVlOworICAgIGlmKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkgeworICAgIGRlZmVy
cmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKKyAgICB9IGVsc2UgaWYgKCAhKCAt
LXJlbWFpbmluZyApICkgeworICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFs
dWVzICk7CisgICAgfQorICAgIH07CisgICAgfSwKKworICAgIHByb2dyZXNzVmFsdWVzLCBwcm9n
cmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7CisKKyAgICAvLyBhZGQgbGlzdGVuZXJzIHRv
IERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkCisgICAgaWYg
KCBsZW5ndGggPiAxICkgeworICAgIHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGgg
KTsKKyAgICBwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKKyAgICByZXNv
bHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOworICAgIGZvciAoIDsgaSA8IGxlbmd0
aDsgaSsrICkgeworICAgIGlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0
aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkgeworICAgIHJlc29sdmVWYWx1ZXNb
IGkgXS5wcm9taXNlKCkKKyAgICAuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRz
LCByZXNvbHZlVmFsdWVzICkgKQorICAgIC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKQorICAgIC5w
cm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMg
KSApOworICAgIH0gZWxzZSB7CisgICAgLS1yZW1haW5pbmc7CisgICAgfQorICAgIH0KKyAgICB9
CisKKyAgICAvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUg
bWFzdGVyCisgICAgaWYgKCAhcmVtYWluaW5nICkgeworICAgIGRlZmVycmVkLnJlc29sdmVXaXRo
KCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKKyAgICB9CisKKyAgICByZXR1cm4g
ZGVmZXJyZWQucHJvbWlzZSgpOworICAgIH0KK30pOworalF1ZXJ5LnN1cHBvcnQgPSAoZnVuY3Rp
b24oKSB7CisKKyAgICB2YXIgc3VwcG9ydCwgYWxsLCBhLAorICAgIGlucHV0LCBzZWxlY3QsIGZy
YWdtZW50LAorICAgIG9wdCwgZXZlbnROYW1lLCBpc1N1cHBvcnRlZCwgaSwKKyAgICBkaXYgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgIC8vIFNldHVwCisgICAgZGl2LnNl
dEF0dHJpYnV0ZSggImNsYXNzTmFtZSIsICJ0IiApOworICAgIGRpdi5pbm5lckhUTUwgPSAiICA8
bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNr
Ym94Jy8+IjsKKworICAgIC8vIFN1cHBvcnQgdGVzdHMgd29uJ3QgcnVuIGluIHNvbWUgbGltaXRl
ZCBvciBub24tYnJvd3NlciBlbnZpcm9ubWVudHMKKyAgICBhbGwgPSBkaXYuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoIioiKTsKKyAgICBhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbIDAg
XTsKKyAgICBpZiAoICFhbGwgfHwgIWEgfHwgIWFsbC5sZW5ndGggKSB7CisgICAgcmV0dXJuIHt9
OworICAgIH0KKworICAgIC8vIEZpcnN0IGJhdGNoIG9mIHRlc3RzCisgICAgc2VsZWN0ID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CisgICAgb3B0ID0gc2VsZWN0LmFwcGVuZENo
aWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSApOworICAgIGlucHV0ID0gZGl2
LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWyAwIF07CisKKyAgICBhLnN0eWxlLmNzc1Rl
eHQgPSAidG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiOworICAgIHN1cHBvcnQgPSB7Cisg
ICAgLy8gVGVzdCBzZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNsYXNzLiBJZiBpdCB3b3Jrcywg
d2UgbmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0cmlidXRlIChpZTYvNykKKyAg
ICBnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09ICJ0IiwKKworICAgIC8vIElFIHN0
cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKyAgICBsZWFk
aW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMsCisKKyAgICAvLyBN
YWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRl
ZAorICAgIC8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKKyAgICB0Ym9k
eTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsCisKKyAgICAvLyBN
YWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBp
bm5lckhUTUwKKyAgICAvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCisg
ICAgaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5n
dGgsCisKKyAgICAvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRl
CisgICAgLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKKyAgICBzdHlsZTogL3RvcC8udGVz
dCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IFVS
THMgYXJlbid0IG1hbmlwdWxhdGVkCisgICAgLy8gKElFIG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVs
dCkKKyAgICBocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwK
KworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKKyAgICAvLyAo
SUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKKyAgICAvLyBVc2UgYSByZWdleCB0byB3b3JrIGFyb3Vu
ZCBhIFdlYktpdCBpc3N1ZS4gU2VlICM1MTQ1CisgICAgb3BhY2l0eTogL14wLjUvLnRlc3QoIGEu
c3R5bGUub3BhY2l0eSApLAorCisgICAgLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQor
ICAgIC8vIChJRSB1c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKKyAgICBjc3NG
bG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisgICAgLy8gQ2hlY2sgdGhlIGRlZmF1bHQgY2hl
Y2tib3gvcmFkaW8gdmFsdWUgKCIiIG9uIFdlYktpdDsgIm9uIiBlbHNld2hlcmUpCisgICAgY2hl
Y2tPbjogISFpbnB1dC52YWx1ZSwKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0ZWQt
YnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3RlZCBwcm9wZXJ0eS4KKyAgICAv
LyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBp
dCdzIGluIGFuIG9wdGdyb3VwKQorICAgIG9wdFNlbGVjdGVkOiBvcHQuc2VsZWN0ZWQsCisKKyAg
ICAvLyBUZXN0cyBmb3IgZW5jdHlwZSBzdXBwb3J0IG9uIGEgZm9ybSAoIzY3NDMpCisgICAgZW5j
dHlwZTogISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSwKKworICAgIC8v
IE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2Js
ZW1zCisgICAgLy8gV2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5lZCwgdGhpcyBzdGlsbCB3b3Jr
cworICAgIGh0bWw1Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9k
ZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4iLAorCisgICAgLy8galF1ZXJ5
LnN1cHBvcnQuYm94TW9kZWwgREVQUkVDQVRFRCBpbiAxLjggc2luY2Ugd2UgZG9uJ3Qgc3VwcG9y
dCBRdWlya3MgTW9kZQorICAgIGJveE1vZGVsOiBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NT
MUNvbXBhdCIsCisKKyAgICAvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKKyAgICBkZWxldGVFeHBh
bmRvOiB0cnVlLAorICAgIG5vQ2xvbmVFdmVudDogdHJ1ZSwKKyAgICBpbmxpbmVCbG9ja05lZWRz
TGF5b3V0OiBmYWxzZSwKKyAgICBzaHJpbmtXcmFwQmxvY2tzOiBmYWxzZSwKKyAgICByZWxpYWJs
ZU1hcmdpblJpZ2h0OiB0cnVlLAorICAgIGJveFNpemluZ1JlbGlhYmxlOiB0cnVlLAorICAgIHBp
eGVsUG9zaXRpb246IGZhbHNlCisgICAgfTsKKworICAgIC8vIE1ha2Ugc3VyZSBjaGVja2VkIHN0
YXR1cyBpcyBwcm9wZXJseSBjbG9uZWQKKyAgICBpbnB1dC5jaGVja2VkID0gdHJ1ZTsKKyAgICBz
dXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDsK
KworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxl
Y3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKKyAgICAvLyAoV2ViS2l0IG1hcmtzIHRoZW0g
YXMgZGlzYWJsZWQpCisgICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKKyAgICBzdXBwb3J0Lm9w
dERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworICAgIC8vIFN1cHBvcnQ6IElFPDkKKyAgICB0
cnkgeworICAgIGRlbGV0ZSBkaXYudGVzdDsKKyAgICB9IGNhdGNoKCBlICkgeworICAgIHN1cHBv
cnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHdlIGNh
biB0cnVzdCBnZXRBdHRyaWJ1dGUoInZhbHVlIikKKyAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoImlucHV0Iik7CisgICAgaW5wdXQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiAp
OworICAgIHN1cHBvcnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0g
IiI7CisKKyAgICAvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFpbnMgaXRzIHZhbHVlIGFmdGVy
IGJlY29taW5nIGEgcmFkaW8KKyAgICBpbnB1dC52YWx1ZSA9ICJ0IjsKKyAgICBpbnB1dC5zZXRB
dHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOworICAgIHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlu
cHV0LnZhbHVlID09PSAidCI7CisKKyAgICAvLyAjMTEyMTcgLSBXZWJLaXQgbG9zZXMgY2hlY2sg
d2hlbiB0aGUgbmFtZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUKKyAgICBpbnB1dC5z
ZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInQiICk7CisgICAgaW5wdXQuc2V0QXR0cmlidXRlKCAi
bmFtZSIsICJ0IiApOworCisgICAgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZy
YWdtZW50KCk7CisgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CisKKyAgICAvLyBD
aGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAor
ICAgIC8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCisg
ICAgc3VwcG9ydC5hcHBlbmRDaGVja2VkID0gaW5wdXQuY2hlY2tlZDsKKworICAgIC8vIFdlYktp
dCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cworICAg
IHN1cHBvcnQuY2hlY2tDbG9uZSA9IGZyYWdtZW50LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9k
ZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOworCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAg
IC8vIE9wZXJhIGRvZXMgbm90IGNsb25lIGV2ZW50cyAoYW5kIHR5cGVvZiBkaXYuYXR0YWNoRXZl
bnQgPT09IHVuZGVmaW5lZCkuCisgICAgLy8gSUU5LTEwIGNsb25lcyBldmVudHMgYm91bmQgdmlh
IGF0dGFjaEV2ZW50LCBidXQgdGhleSBkb24ndCB0cmlnZ2VyIHdpdGggLmNsaWNrKCkKKyAgICBp
ZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKKyAgICBkaXYuYXR0YWNoRXZlbnQoICJvbmNsaWNrIiwg
ZnVuY3Rpb24oKSB7CisgICAgc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKKyAgICB9KTsK
KworICAgIGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbGljaygpOworICAgIH0KKworICAgIC8vIFN1
cHBvcnQ6IElFPDkgKGxhY2sgc3VibWl0L2NoYW5nZSBidWJibGUpLCBGaXJlZm94IDE3KyAobGFj
ayBmb2N1c2luIGV2ZW50KQorICAgIC8vIEJld2FyZSBvZiBDU1AgcmVzdHJpY3Rpb25zIChodHRw
czovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1ApLCB0ZXN0L2NzcC5waHAK
KyAgICBmb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6IHRydWUsIGZvY3VzaW46IHRy
dWUgfSkgeworICAgIGRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSA9ICJvbiIgKyBpLCAidCIg
KTsKKworICAgIHN1cHBvcnRbIGkgKyAiQnViYmxlcyIgXSA9IGV2ZW50TmFtZSBpbiB3aW5kb3cg
fHwgZGl2LmF0dHJpYnV0ZXNbIGV2ZW50TmFtZSBdLmV4cGFuZG8gPT09IGZhbHNlOworICAgIH0K
KworICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CisgICAgZGl2
LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gIiI7CisgICAgc3VwcG9y
dC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250ZW50
LWJveCI7CisKKyAgICAvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkK
KyAgICBqUXVlcnkoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRhaW5lciwgbWFyZ2luRGl2LCB0
ZHMsCisgICAgZGl2UmVzZXQgPSAicGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6
YmxvY2s7Ym94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7
LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OyIsCisgICAgYm9keSA9IGRvY3VtZW50Lmdl
dEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CisKKyAgICBpZiAoICFib2R5ICkgeworICAg
IC8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5CisgICAg
cmV0dXJuOworICAgIH0KKworICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ImRpdiIpOworICAgIGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gImJvcmRlcjowO3dpZHRoOjA7
aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6
MXB4IjsKKworICAgIGJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBk
aXYgKTsKKworICAgIC8vIFN1cHBvcnQ6IElFOAorICAgIC8vIENoZWNrIGlmIHRhYmxlIGNlbGxz
IHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0CisgICAgLy8g
dG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBj
ZWxscyBpbiBhCisgICAgLy8gdGFibGUgcm93OyBpZiBzbywgb2Zmc2V0V2lkdGgvSGVpZ2h0IGFy
ZSBub3QgcmVsaWFibGUgZm9yIHVzZSB3aGVuCisgICAgLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxl
bWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKKyAgICAvLyBkaXNwbGF5Om5vbmUg
KGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpcwor
ICAgIC8vIGhpZGRlbjsgZG9uIHNhZmV0eSBnb2dnbGVzIGFuZCBzZWUgYnVnICM0NTEyIGZvciBt
b3JlIGluZm9ybWF0aW9uKS4KKyAgICBkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkPjwv
dGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iOworICAgIHRkcyA9IGRpdi5nZXRFbGVtZW50c0J5
VGFnTmFtZSgidGQiKTsKKyAgICB0ZHNbIDAgXS5zdHlsZS5jc3NUZXh0ID0gInBhZGRpbmc6MDtt
YXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiOworICAgIGlzU3VwcG9ydGVkID0gKCB0ZHNb
IDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKKworICAgIHRkc1sgMCBdLnN0eWxlLmRpc3BsYXkg
PSAiIjsKKyAgICB0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCisgICAgLy8gU3Vw
cG9ydDogSUU4CisgICAgLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBv
ZmZzZXRXaWR0aC9IZWlnaHQKKyAgICBzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyA9IGlz
U3VwcG9ydGVkICYmICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7CisKKyAgICAvLyBD
aGVjayBib3gtc2l6aW5nIGFuZCBtYXJnaW4gYmVoYXZpb3IKKyAgICBkaXYuaW5uZXJIVE1MID0g
IiI7CisgICAgZGl2LnN0eWxlLmNzc1RleHQgPSAiYm94LXNpemluZzpib3JkZXItYm94Oy1tb3ot
Ym94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRp
bmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtw
b3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7IjsKKyAgICBzdXBwb3J0LmJveFNpemluZyA9ICggZGl2
Lm9mZnNldFdpZHRoID09PSA0ICk7CisgICAgc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbklu
Qm9keU9mZnNldCA9ICggYm9keS5vZmZzZXRUb3AgIT09IDEgKTsKKworICAgIC8vIFVzZSB3aW5k
b3cuZ2V0Q29tcHV0ZWRTdHlsZSBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3
aXRob3V0IGl0LgorICAgIGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7CisgICAgc3Vw
cG9ydC5waXhlbFBvc2l0aW9uID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxs
ICkgfHwge30gKS50b3AgIT09ICIxJSI7CisgICAgc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSA9
ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHsgd2lkdGg6ICI0cHgi
IH0gKS53aWR0aCA9PT0gIjRweCI7CisKKyAgICAvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNp
dCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5CisgICAgLy8gZ2V0cyBjb21w
dXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpCisg
ICAgLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKKyAgICAvLyBX
ZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZv
ciBtYXJnaW4tcmlnaHQKKyAgICBtYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7CisgICAgbWFyZ2luRGl2LnN0eWxlLmNzc1RleHQgPSBk
aXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0OworICAgIG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5S
aWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKKyAgICBkaXYuc3R5bGUud2lkdGgg
PSAiMXB4IjsKKworICAgIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CisgICAgIXBhcnNl
RmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHt9
ICkubWFyZ2luUmlnaHQgKTsKKyAgICB9CisKKyAgICBpZiAoIHR5cGVvZiBkaXYuc3R5bGUuem9v
bSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7CisgICAgLy8gU3VwcG9ydDogSUU8OAorICAgIC8v
IENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBsaWtlIGlubGluZS1i
bG9jaworICAgIC8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVpciBkaXNwbGF5IHRvICdpbmxp
bmUnIGFuZCBnaXZpbmcKKyAgICAvLyB0aGVtIGxheW91dAorICAgIGRpdi5pbm5lckhUTUwgPSAi
IjsKKyAgICBkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsgIndpZHRoOjFweDtwYWRkaW5n
OjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiOworICAgIHN1cHBvcnQuaW5saW5lQmxvY2tOZWVk
c0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7CisKKyAgICAvLyBTdXBwb3J0OiBJ
RTYKKyAgICAvLyBDaGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91dCBzaHJpbmstd3JhcCB0aGVp
ciBjaGlsZHJlbgorICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKyAgICBkaXYuaW5u
ZXJIVE1MID0gIjxkaXY+PC9kaXY+IjsKKyAgICBkaXYuZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9
ICI1cHgiOworICAgIHN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRo
ICE9PSAzICk7CisKKyAgICBpZiAoIHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCApIHsK
KyAgICAvLyBQcmV2ZW50IElFIDYgZnJvbSBhZmZlY3RpbmcgbGF5b3V0IGZvciBwb3NpdGlvbmVk
IGVsZW1lbnRzICMxMTA0OAorICAgIC8vIFByZXZlbnQgSUUgZnJvbSBzaHJpbmtpbmcgdGhlIGJv
ZHkgaW4gSUUgNyBtb2RlICMxMjg2OQorICAgIC8vIFN1cHBvcnQ6IElFPDgKKyAgICBib2R5LnN0
eWxlLnpvb20gPSAxOworICAgIH0KKyAgICB9CisKKyAgICBib2R5LnJlbW92ZUNoaWxkKCBjb250
YWluZXIgKTsKKworICAgIC8vIE51bGwgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKKyAg
ICBjb250YWluZXIgPSBkaXYgPSB0ZHMgPSBtYXJnaW5EaXYgPSBudWxsOworICAgIH0pOworCisg
ICAgLy8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRQorICAgIGFsbCA9IHNlbGVj
dCA9IGZyYWdtZW50ID0gb3B0ID0gYSA9IGlucHV0ID0gbnVsbDsKKworICAgIHJldHVybiBzdXBw
b3J0OworfSkoKTsKKwordmFyIHJicmFjZSA9IC8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkk
LywKKyAgICBybXVsdGlEYXNoID0gLyhbQS1aXSkvZzsKKworZnVuY3Rpb24gaW50ZXJuYWxEYXRh
KCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKXsKKyAgICBp
ZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworICAgIHJldHVybjsKKyAgICB9CisK
KyAgICB2YXIgdGhpc0NhY2hlLCByZXQsCisgICAgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5k
bywKKyAgICBnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIsCisKKyAgICAvLyBX
ZSBoYXZlIHRvIGhhbmRsZSBET00gbm9kZXMgYW5kIEpTIG9iamVjdHMgZGlmZmVyZW50bHkgYmVj
YXVzZSBJRTYtNworICAgIC8vIGNhbid0IEdDIG9iamVjdCByZWZlcmVuY2VzIHByb3Blcmx5IGFj
cm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5CisgICAgaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKKwor
ICAgIC8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9i
amVjdCBkYXRhIGlzCisgICAgLy8gYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIG9iamVjdCBzbyBH
QyBjYW4gb2NjdXIgYXV0b21hdGljYWxseQorICAgIGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNh
Y2hlIDogZWxlbSwKKworICAgIC8vIE9ubHkgZGVmaW5pbmcgYW4gSUQgZm9yIEpTIG9iamVjdHMg
aWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93cworICAgIC8vIHRoZSBjb2RlIHRvIHNo
b3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCisgICAg
aWQgPSBpc05vZGUgPyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxlbVsgaW50ZXJuYWxLZXkgXSAm
JiBpbnRlcm5hbEtleTsKKworICAgIC8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3
ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCisgICAgLy8gb2JqZWN0IHRo
YXQgaGFzIG5vIGRhdGEgYXQgYWxsCisgICAgaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFw
dnQgJiYgIWNhY2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYmIGRhdGEgPT09IHVuZGVmaW5l
ZCApIHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCAhaWQgKSB7CisgICAgLy8gT25s
eSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0
aGVpciBkYXRhCisgICAgLy8gZW5kcyB1cCBpbiB0aGUgZ2xvYmFsIGNhY2hlCisgICAgaWYgKCBp
c05vZGUgKSB7CisgICAgZWxlbVsgaW50ZXJuYWxLZXkgXSA9IGlkID0gY29yZV9kZWxldGVkSWRz
LnBvcCgpIHx8IGpRdWVyeS5ndWlkKys7CisgICAgfSBlbHNlIHsKKyAgICBpZCA9IGludGVybmFs
S2V5OworICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFjYWNoZVsgaWQgXSApIHsKKyAgICBjYWNo
ZVsgaWQgXSA9IHt9OworCisgICAgLy8gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeSBtZXRhZGF0YSBv
biBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdAorICAgIC8vIGlzIHNlcmlhbGl6ZWQg
dXNpbmcgSlNPTi5zdHJpbmdpZnkKKyAgICBpZiAoICFpc05vZGUgKSB7CisgICAgY2FjaGVbIGlk
IF0udG9KU09OID0galF1ZXJ5Lm5vb3A7CisgICAgfQorICAgIH0KKworICAgIC8vIEFuIG9iamVj
dCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFp
cjsgdGhpcyBnZXRzCisgICAgLy8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGlu
ZyBjYWNoZQorICAgIGlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBuYW1l
ID09PSAiZnVuY3Rpb24iICkgeworICAgIGlmICggcHZ0ICkgeworICAgIGNhY2hlWyBpZCBdID0g
alF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKKyAgICB9IGVsc2UgeworICAgIGNh
Y2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7
CisgICAgfQorICAgIH0KKworICAgIHRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdOworCisgICAgLy8g
alF1ZXJ5IGRhdGEoKSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBvYmplY3QgaW5zaWRlIHRoZSBv
YmplY3QncyBpbnRlcm5hbCBkYXRhCisgICAgLy8gY2FjaGUgaW4gb3JkZXIgdG8gYXZvaWQga2V5
IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1c2VyLWRlZmluZWQKKyAgICAv
LyBkYXRhLgorICAgIGlmICggIXB2dCApIHsKKyAgICBpZiAoICF0aGlzQ2FjaGUuZGF0YSApIHsK
KyAgICB0aGlzQ2FjaGUuZGF0YSA9IHt9OworICAgIH0KKworICAgIHRoaXNDYWNoZSA9IHRoaXND
YWNoZS5kYXRhOworICAgIH0KKworICAgIGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgeworICAg
IHRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0gPSBkYXRhOworICAgIH0KKwor
ICAgIC8vIENoZWNrIGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1lbCBhbmQgbm9uLWNvbnZlcnRl
ZCBkYXRhIHByb3BlcnR5IG5hbWVzCisgICAgLy8gSWYgYSBkYXRhIHByb3BlcnR5IHdhcyBzcGVj
aWZpZWQKKyAgICBpZiAoIGdldEJ5TmFtZSApIHsKKworICAgIC8vIEZpcnN0IFRyeSB0byBmaW5k
IGFzLWlzIHByb3BlcnR5IGRhdGEKKyAgICByZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTsKKworICAg
IC8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGEKKyAgICBpZiAoIHJldCA9
PSBudWxsICkgeworCisgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHkK
KyAgICByZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOworICAgIH0K
KyAgICB9IGVsc2UgeworICAgIHJldCA9IHRoaXNDYWNoZTsKKyAgICB9CisKKyAgICByZXR1cm4g
cmV0OworfQorCitmdW5jdGlvbiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHB2dCAp
IHsKKyAgICBpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworICAgIHJldHVybjsK
KyAgICB9CisKKyAgICB2YXIgaSwgbCwgdGhpc0NhY2hlLAorICAgIGlzTm9kZSA9IGVsZW0ubm9k
ZVR5cGUsCisKKyAgICAvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAg
ICBjYWNoZSA9IGlzTm9kZSA/IGpRdWVyeS5jYWNoZSA6IGVsZW0sCisgICAgaWQgPSBpc05vZGUg
PyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFuZG87CisKKyAgICAvLyBJZiB0
aGVyZSBpcyBhbHJlYWR5IG5vIGNhY2hlIGVudHJ5IGZvciB0aGlzIG9iamVjdCwgdGhlcmUgaXMg
bm8KKyAgICAvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmcKKyAgICBpZiAoICFjYWNoZVsgaWQgXSAp
IHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBuYW1lICkgeworCisgICAgdGhpc0Nh
Y2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhOworCisgICAgaWYgKCB0
aGlzQ2FjaGUgKSB7CisKKyAgICAvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBz
dHJpbmcgbmFtZXMgZm9yIGRhdGEga2V5cworICAgIGlmICggIWpRdWVyeS5pc0FycmF5KCBuYW1l
ICkgKSB7CisKKyAgICAvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlw
dWxhdGlvbgorICAgIGlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7CisgICAgbmFtZSA9IFsgbmFt
ZSBdOworICAgIH0gZWxzZSB7CisKKyAgICAvLyBzcGxpdCB0aGUgY2FtZWwgY2FzZWQgdmVyc2lv
biBieSBzcGFjZXMgdW5sZXNzIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMKKyAgICBuYW1l
ID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOworICAgIGlmICggbmFtZSBpbiB0aGlzQ2FjaGUg
KSB7CisgICAgbmFtZSA9IFsgbmFtZSBdOworICAgIH0gZWxzZSB7CisgICAgbmFtZSA9IG5hbWUu
c3BsaXQoIiAiKTsKKyAgICB9CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgLy8gSWYgIm5hbWUi
IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KKyAgICAvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNy
ZWF0ZWQsIHZpYSAoImtleSIsICJ2YWwiKSBzaWduYXR1cmUsCisgICAgLy8ga2V5cyB3aWxsIGJl
IGNvbnZlcnRlZCB0byBjYW1lbENhc2UuCisgICAgLy8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRv
IHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKKyAgICAvLyBib3RoIHBsYWluIGtl
eSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2CisgICAgLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxp
emUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguCisgICAgbmFtZSA9IG5hbWUuY29uY2F0KCBqUXVl
cnkubWFwKCBuYW1lLCBqUXVlcnkuY2FtZWxDYXNlICkgKTsKKyAgICB9CisKKyAgICBmb3IgKCBp
ID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworICAgIGRlbGV0ZSB0aGlzQ2Fj
aGVbIG5hbWVbaV0gXTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQg
aW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlCisgICAgLy8gYW5kIGxldCB0aGUgY2Fj
aGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCisgICAgaWYgKCAhKCBwdnQgPyBpc0VtcHR5
RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkgeworICAg
IHJldHVybjsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIFNlZSBqUXVlcnkuZGF0YSBm
b3IgbW9yZSBpbmZvcm1hdGlvbgorICAgIGlmICggIXB2dCApIHsKKyAgICBkZWxldGUgY2FjaGVb
IGlkIF0uZGF0YTsKKworICAgIC8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxl
c3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CisgICAgLy8gaGFkIGJlZW4gdGhlIG9ubHkgdGhp
bmcgbGVmdCBpbiBpdAorICAgIGlmICggIWlzRW1wdHlEYXRhT2JqZWN0KCBjYWNoZVsgaWQgXSAp
ICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQorCisgICAgLy8gRGVzdHJveSB0aGUgY2Fj
aGUKKyAgICBpZiAoIGlzTm9kZSApIHsKKyAgICBqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSwg
dHJ1ZSApOworCisgICAgLy8gVXNlIGRlbGV0ZSB3aGVuIHN1cHBvcnRlZCBmb3IgZXhwYW5kb3Mg
b3IgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgcGVyIGlzV2luZG93ICgjMTAwODApCisgICAgfSBl
bHNlIGlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBjYWNoZSAhPSBjYWNoZS53
aW5kb3cgKSB7CisgICAgZGVsZXRlIGNhY2hlWyBpZCBdOworCisgICAgLy8gV2hlbiBhbGwgZWxz
ZSBmYWlscywgbnVsbAorICAgIH0gZWxzZSB7CisgICAgY2FjaGVbIGlkIF0gPSBudWxsOworICAg
IH0KK30KKworalF1ZXJ5LmV4dGVuZCh7CisgICAgY2FjaGU6IHt9LAorCisgICAgLy8gVW5pcXVl
IGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCisgICAgLy8gTm9uLWRpZ2l0cyBy
ZW1vdmVkIHRvIG1hdGNoIHJpbmxpbmVqUXVlcnkKKyAgICBleHBhbmRvOiAialF1ZXJ5IiArICgg
Y29yZV92ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAorCisg
ICAgLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25z
IGlmIHlvdQorICAgIC8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8gcHJvcGVydGllcyB0byB0aGVt
LgorICAgIG5vRGF0YTogeworICAgICJlbWJlZCI6IHRydWUsCisgICAgLy8gQmFuIGFsbCBvYmpl
Y3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKKyAgICAib2JqZWN0
IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCisgICAgImFw
cGxldCI6IHRydWUKKyAgICB9LAorCisgICAgaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFu
ZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOworICAgIHJldHVybiAhIWVsZW0gJiYgIWlz
RW1wdHlEYXRhT2JqZWN0KCBlbGVtICk7CisgICAgfSwKKworICAgIGRhdGE6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lLCBkYXRhICkgeworICAgIHJldHVybiBpbnRlcm5hbERhdGEoIGVsZW0sIG5hbWUs
IGRhdGEgKTsKKyAgICB9LAorCisgICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUg
KSB7CisgICAgcmV0dXJuIGludGVybmFsUmVtb3ZlRGF0YSggZWxlbSwgbmFtZSApOworICAgIH0s
CisKKyAgICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgICAgX2RhdGE6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lLCBkYXRhICkgeworICAgIHJldHVybiBpbnRlcm5hbERhdGEoIGVsZW0sIG5hbWUs
IGRhdGEsIHRydWUgKTsKKyAgICB9LAorCisgICAgX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVt
LCBuYW1lICkgeworICAgIHJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHRy
dWUgKTsKKyAgICB9LAorCisgICAgLy8gQSBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGEgRE9N
IG5vZGUgY2FuIGhhbmRsZSB0aGUgZGF0YSBleHBhbmRvCisgICAgYWNjZXB0RGF0YTogZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgLy8gRG8gbm90IHNldCBkYXRhIG9uIG5vbi1lbGVtZW50IGJlY2F1
c2UgaXQgd2lsbCBub3QgYmUgY2xlYXJlZCAoIzgzMzUpLgorICAgIGlmICggZWxlbS5ub2RlVHlw
ZSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CisgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciBub0RhdGEgPSBlbGVtLm5vZGVOYW1lICYm
IGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOworCisgICAgLy8g
bm9kZXMgYWNjZXB0IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQ7IHJlamVjdGlvbiBj
YW4gYmUgY29uZGl0aW9uYWwKKyAgICByZXR1cm4gIW5vRGF0YSB8fCBub0RhdGEgIT09IHRydWUg
JiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSA9PT0gbm9EYXRhOworICAgIH0KK30pOwor
CitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsK
KyAgICB2YXIgYXR0cnMsIG5hbWUsCisgICAgZWxlbSA9IHRoaXNbMF0sCisgICAgaSA9IDAsCisg
ICAgZGF0YSA9IG51bGw7CisKKyAgICAvLyBHZXRzIGFsbCB2YWx1ZXMKKyAgICBpZiAoIGtleSA9
PT0gdW5kZWZpbmVkICkgeworICAgIGlmICggdGhpcy5sZW5ndGggKSB7CisgICAgZGF0YSA9IGpR
dWVyeS5kYXRhKCBlbGVtICk7CisKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWpR
dWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiApICkgeworICAgIGF0dHJzID0gZWxlbS5h
dHRyaWJ1dGVzOworICAgIGZvciAoIDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkgeworICAgIG5h
bWUgPSBhdHRyc1tpXS5uYW1lOworCisgICAgaWYgKCAhbmFtZS5pbmRleE9mKCAiZGF0YS0iICkg
KSB7CisgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTsKKworICAg
IGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKKyAgICB9CisgICAgfQorICAg
IGpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiwgdHJ1ZSApOworICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvLyBTZXRzIG11bHRpcGxlIHZhbHVl
cworICAgIGlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CisgICAgcmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpIHsKKyAgICBqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7CisgICAgfSk7
CisgICAgfQorCisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1
ZSApIHsKKworICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKyAgICAvLyBUcnkgdG8g
ZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKKyAgICByZXR1cm4gZWxlbSA/
IGRhdGFBdHRyKCBlbGVtLCBrZXksIGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKSApIDogbnVsbDsK
KyAgICB9CisKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmRhdGEoIHRo
aXMsIGtleSwgdmFsdWUgKTsKKyAgICB9KTsKKyAgICB9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRz
Lmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTsKKyAgICB9LAorCisgICAgcmVtb3ZlRGF0YTogZnVu
Y3Rpb24oIGtleSApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworICAgIGpR
dWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKKyAgICB9KTsKKyAgICB9Cit9KTsKKworZnVu
Y3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKyAgICAvLyBJZiBub3RoaW5nIHdh
cyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55CisgICAgLy8gZGF0YSBmcm9tIHRo
ZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCisgICAgaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYg
ZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKworICAgIHZhciBuYW1lID0gImRhdGEtIiArIGtleS5y
ZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CisKKyAgICBkYXRhID0g
ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKworICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJz
dHJpbmciICkgeworICAgIHRyeSB7CisgICAgZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUg
OgorICAgIGRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CisgICAgZGF0YSA9PT0gIm51bGwiID8g
bnVsbCA6CisgICAgLy8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hh
bmdlIHRoZSBzdHJpbmcKKyAgICArZGF0YSArICIiID09PSBkYXRhID8gK2RhdGEgOgorICAgIHJi
cmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOgorICAgIGRhdGE7
CisgICAgfSBjYXRjaCggZSApIHt9CisKKyAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRh
IHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKKyAgICBqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBk
YXRhICk7CisKKyAgICB9IGVsc2UgeworICAgIGRhdGEgPSB1bmRlZmluZWQ7CisgICAgfQorICAg
IH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvLyBjaGVja3MgYSBjYWNoZSBvYmplY3QgZm9y
IGVtcHRpbmVzcworZnVuY3Rpb24gaXNFbXB0eURhdGFPYmplY3QoIG9iaiApIHsKKyAgICB2YXIg
bmFtZTsKKyAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKKworICAgIC8vIGlmIHRoZSBwdWJsaWMg
ZGF0YSBvYmplY3QgaXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0aWxsIGVtcHR5CisgICAgaWYg
KCBuYW1lID09PSAiZGF0YSIgJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9ialtuYW1lXSApICkg
eworICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIG5hbWUgIT09ICJ0b0pTT04iICkgewor
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9Citq
UXVlcnkuZXh0ZW5kKHsKKyAgICBxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7
CisgICAgdmFyIHF1ZXVlOworCisgICAgaWYgKCBlbGVtICkgeworICAgIHR5cGUgPSAoIHR5cGUg
fHwgImZ4IiApICsgInF1ZXVlIjsKKyAgICBxdWV1ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlw
ZSApOworCisgICAgLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlm
IHRoaXMgaXMganVzdCBhIGxvb2t1cAorICAgIGlmICggZGF0YSApIHsKKyAgICBpZiAoICFxdWV1
ZSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKKyAgICBxdWV1ZSA9IGpRdWVyeS5fZGF0YSgg
ZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOworICAgIH0gZWxzZSB7CisgICAg
cXVldWUucHVzaCggZGF0YSApOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHF1ZXVlIHx8IFtd
OworICAgIH0KKyAgICB9LAorCisgICAgZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7
CisgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworICAgIHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1
ZSggZWxlbSwgdHlwZSApLAorICAgIHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAorICAgIGZu
ID0gcXVldWUuc2hpZnQoKSwKKyAgICBob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwg
dHlwZSApLAorICAgIG5leHQgPSBmdW5jdGlvbigpIHsKKyAgICBqUXVlcnkuZGVxdWV1ZSggZWxl
bSwgdHlwZSApOworICAgIH07CisKKyAgICAvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQs
IGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCisgICAgaWYgKCBmbiA9PT0gImlu
cHJvZ3Jlc3MiICkgeworICAgIGZuID0gcXVldWUuc2hpZnQoKTsKKyAgICBzdGFydExlbmd0aC0t
OworICAgIH0KKworICAgIGhvb2tzLmN1ciA9IGZuOworICAgIGlmICggZm4gKSB7CisKKyAgICAv
LyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJl
aW5nCisgICAgLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAorICAgIGlmICggdHlwZSA9PT0gImZ4
IiApIHsKKyAgICBxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKKyAgICB9CisKKyAgICAv
LyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uCisgICAgZGVsZXRlIGhvb2tz
LnN0b3A7CisgICAgZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKKyAgICB9CisKKyAgICBp
ZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKKyAgICBob29rcy5lbXB0eS5maXJlKCk7Cisg
ICAgfQorICAgIH0sCisKKyAgICAvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlv
biAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRoZSBjdXJyZW50
IG9uZQorICAgIF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKyAgICB2YXIg
a2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKKyAgICByZXR1cm4galF1ZXJ5Ll9kYXRhKCBlbGVt
LCBrZXkgKSB8fCBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSwgeworICAgIGVtcHR5OiBqUXVlcnku
Q2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKKyAgICBqUXVlcnkuX3Jl
bW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiICk7CisgICAgalF1ZXJ5Ll9yZW1vdmVEYXRh
KCBlbGVtLCBrZXkgKTsKKyAgICB9KQorICAgIH0pOworICAgIH0KK30pOworCitqUXVlcnkuZm4u
ZXh0ZW5kKHsKKyAgICBxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CisgICAgdmFyIHNl
dHRlciA9IDI7CisKKyAgICBpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKKyAgICBk
YXRhID0gdHlwZTsKKyAgICB0eXBlID0gImZ4IjsKKyAgICBzZXR0ZXItLTsKKyAgICB9CisKKyAg
ICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5x
dWV1ZSggdGhpc1swXSwgdHlwZSApOworICAgIH0KKworICAgIHJldHVybiBkYXRhID09PSB1bmRl
ZmluZWQgPworICAgIHRoaXMgOgorICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICB2YXIg
cXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKKworICAgIC8vIGVuc3Vy
ZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCisgICAgalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0
eXBlICk7CisKKyAgICBpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dy
ZXNzIiApIHsKKyAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworICAgIH0KKyAgICB9
KTsKKyAgICB9LAorICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworICAgIHJldHVybiB0
aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsK
KyAgICB9KTsKKyAgICB9LAorICAgIC8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50
IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4KKyAgICAvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNv
bS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCisgICAgZGVsYXk6IGZ1bmN0aW9uKCB0
aW1lLCB0eXBlICkgeworICAgIHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0
aW1lIF0gfHwgdGltZSA6IHRpbWU7CisgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworICAgIHJl
dHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7CisgICAgdmFy
IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CisgICAgaG9va3Muc3RvcCA9IGZ1
bmN0aW9uKCkgeworICAgIGNsZWFyVGltZW91dCggdGltZW91dCApOworICAgIH07CisgICAgfSk7
CisgICAgfSwKKyAgICBjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHsKKyAgICByZXR1cm4g
dGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworICAgIH0sCisgICAgLy8gR2V0IGEgcHJv
bWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQorICAgIC8vIGFyZSBl
bXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQorICAgIHByb21pc2U6IGZ1bmN0aW9u
KCB0eXBlLCBvYmogKSB7CisgICAgdmFyIHRtcCwKKyAgICBjb3VudCA9IDEsCisgICAgZGVmZXIg
PSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICBlbGVtZW50cyA9IHRoaXMsCisgICAgaSA9IHRoaXMu
bGVuZ3RoLAorICAgIHJlc29sdmUgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoICEoIC0tY291bnQg
KSApIHsKKyAgICBkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwor
ICAgIH0KKyAgICB9OworCisgICAgaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7Cisg
ICAgb2JqID0gdHlwZTsKKyAgICB0eXBlID0gdW5kZWZpbmVkOworICAgIH0KKyAgICB0eXBlID0g
dHlwZSB8fCAiZngiOworCisgICAgd2hpbGUoIGktLSApIHsKKyAgICB0bXAgPSBqUXVlcnkuX2Rh
dGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIgKTsKKyAgICBpZiAoIHRtcCAm
JiB0bXAuZW1wdHkgKSB7CisgICAgY291bnQrKzsKKyAgICB0bXAuZW1wdHkuYWRkKCByZXNvbHZl
ICk7CisgICAgfQorICAgIH0KKyAgICByZXNvbHZlKCk7CisgICAgcmV0dXJuIGRlZmVyLnByb21p
c2UoIG9iaiApOworICAgIH0KK30pOwordmFyIG5vZGVIb29rLCBib29sSG9vaywKKyAgICByY2xh
c3MgPSAvW1x0XHJcbl0vZywKKyAgICBycmV0dXJuID0gL1xyL2csCisgICAgcmZvY3VzYWJsZSA9
IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLAorICAgIHJjbGlj
a2FibGUgPSAvXig/OmF8YXJlYSkkL2ksCisgICAgcmJvb2xlYW4gPSAvXig/OmNoZWNrZWR8c2Vs
ZWN0ZWR8YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhp
ZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkKSQvaSwKKyAg
ICBydXNlRGVmYXVsdCA9IC9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2ksCisgICAgZ2V0U2V0QXR0
cmlidXRlID0galF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLAorICAgIGdldFNldElucHV0
ID0galF1ZXJ5LnN1cHBvcnQuaW5wdXQ7CisKK2pRdWVyeS5mbi5leHRlbmQoeworICAgIGF0dHI6
IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhp
cywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworICAg
IH0sCisKKyAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICByZXR1cm4gdGhp
cy5lYWNoKGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7
CisgICAgfSk7CisgICAgfSwKKworICAgIHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsK
KyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVl
LCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworICAgIH0sCisKKyAgICByZW1vdmVQcm9wOiBmdW5j
dGlvbiggbmFtZSApIHsKKyAgICBuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1l
OworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgLy8gdHJ5L2NhdGNoIGhh
bmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBv
biB3aW5kb3cpCisgICAgdHJ5IHsKKyAgICB0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7CisgICAg
ZGVsZXRlIHRoaXNbIG5hbWUgXTsKKyAgICB9IGNhdGNoKCBlICkge30KKyAgICB9KTsKKyAgICB9
LAorCisgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICB2YXIgY2xhc3Nlcywg
ZWxlbSwgY3VyLCBjbGF6eiwgaiwKKyAgICBpID0gMCwKKyAgICBsZW4gPSB0aGlzLmxlbmd0aCwK
KyAgICBwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZTsKKworICAg
IGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmV0dXJuIHRoaXMuZWFj
aChmdW5jdGlvbiggaiApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2Fs
bCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApOworICAgIH0pOworICAgIH0KKworICAgIGlm
ICggcHJvY2VlZCApIHsKKyAgICAvLyBUaGUgZGlzanVuY3Rpb24gaGVyZSBpcyBmb3IgYmV0dGVy
IGNvbXByZXNzaWJpbGl0eSAoc2VlIHJlbW92ZUNsYXNzKQorICAgIGNsYXNzZXMgPSAoIHZhbHVl
IHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKyAgICBmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKKyAgICBlbGVtID0gdGhpc1sgaSBdOworICAgIGN1ciA9IGVsZW0ubm9k
ZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/CisgICAgKCAiICIgKyBlbGVtLmNsYXNz
TmFtZSArICIgIiApLnJlcGxhY2UoIHJjbGFzcywgIiAiICkgOgorICAgICIgIgorICAgICk7CisK
KyAgICBpZiAoIGN1ciApIHsKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoIChjbGF6eiA9IGNsYXNz
ZXNbaisrXSkgKSB7CisgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA8
IDAgKSB7CisgICAgY3VyICs9IGNsYXp6ICsgIiAiOworICAgIH0KKyAgICB9CisgICAgZWxlbS5j
bGFzc05hbWUgPSBqUXVlcnkudHJpbSggY3VyICk7CisKKyAgICB9CisgICAgfQorICAgIH0KKwor
ICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICByZW1vdmVDbGFzczogZnVuY3Rpb24oIHZh
bHVlICkgeworICAgIHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLAorICAgIGkgPSAw
LAorICAgIGxlbiA9IHRoaXMubGVuZ3RoLAorICAgIHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3Ro
ID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFsdWU7CisKKyAgICBpZiAo
IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVu
Y3Rpb24oIGogKSB7CisgICAgalF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwo
IHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKKyAgICB9KTsKKyAgICB9CisgICAgaWYgKCBw
cm9jZWVkICkgeworICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIGNvcmVfcm5v
dHdoaXRlICkgfHwgW107CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBlbGVt
ID0gdGhpc1sgaSBdOworICAgIC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIg
Y29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCisgICAgY3VyID0gZWxlbS5ub2RlVHlwZSA9
PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID8KKyAgICAoICIgIiArIGVsZW0uY2xhc3NOYW1lICsg
IiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CisgICAgIiIKKyAgICApOworCisgICAgaWYg
KCBjdXIgKSB7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10p
ICkgeworICAgIC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKKyAgICB3aGlsZSAoIGN1ci5pbmRl
eE9mKCAiICIgKyBjbGF6eiArICIgIiApID49IDAgKSB7CisgICAgY3VyID0gY3VyLnJlcGxhY2Uo
ICIgIiArIGNsYXp6ICsgIiAiLCAiICIgKTsKKyAgICB9CisgICAgfQorICAgIGVsZW0uY2xhc3NO
YW1lID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiAiIjsKKyAgICB9CisgICAgfQorICAg
IH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICB0b2dnbGVDbGFzczogZnVuY3Rp
b24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwKKyAg
ICBpc0Jvb2wgPSB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIjsKKworICAgIGlmICggalF1
ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv
biggaSApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlz
LCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOworICAgIH0pOworICAg
IH0KKworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgaWYgKCB0eXBlID09
PSAic3RyaW5nIiApIHsKKyAgICAvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcworICAg
IHZhciBjbGFzc05hbWUsCisgICAgaSA9IDAsCisgICAgc2VsZiA9IGpRdWVyeSggdGhpcyApLAor
ICAgIHN0YXRlID0gc3RhdGVWYWwsCisgICAgY2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBjb3Jl
X3Jub3R3aGl0ZSApIHx8IFtdOworCisgICAgd2hpbGUgKCAoY2xhc3NOYW1lID0gY2xhc3NOYW1l
c1sgaSsrIF0pICkgeworICAgIC8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBz
ZXBhcmF0ZWQgbGlzdAorICAgIHN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFz
cyggY2xhc3NOYW1lICk7CisgICAgc2VsZlsgc3RhdGUgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNs
YXNzIiBdKCBjbGFzc05hbWUgKTsKKyAgICB9CisKKyAgICAvLyBUb2dnbGUgd2hvbGUgY2xhc3Mg
bmFtZQorICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09IGNvcmVfc3RydW5kZWZpbmVkIHx8IHR5cGUg
PT09ICJib29sZWFuIiApIHsKKyAgICBpZiAoIHRoaXMuY2xhc3NOYW1lICkgeworICAgIC8vIHN0
b3JlIGNsYXNzTmFtZSBpZiBzZXQKKyAgICBqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFt
ZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgZWxlbWVudCBo
YXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCAiZmFsc2UiLAorICAgIC8vIHRoZW4g
cmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBz
YXZlZCBpdCkuCisgICAgLy8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZp
b3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSwKKyAgICAvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVt
cHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuCisgICAgdGhpcy5jbGFzc05hbWUgPSB0
aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhp
cywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAg
ICBoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgIHZhciBjbGFzc05hbWUgPSAi
ICIgKyBzZWxlY3RvciArICIgIiwKKyAgICBpID0gMCwKKyAgICBsID0gdGhpcy5sZW5ndGg7Cisg
ICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIGlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0g
MSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIp
LmluZGV4T2YoIGNsYXNzTmFtZSApID49IDAgKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgdmFsOiBmdW5jdGlvbigg
dmFsdWUgKSB7CisgICAgdmFyIHJldCwgaG9va3MsIGlzRnVuY3Rpb24sCisgICAgZWxlbSA9IHRo
aXNbMF07CisKKyAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgeworICAgIGlmICggZWxlbSAp
IHsKKyAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZh
bEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKKworICAgIGlmICggaG9va3Mg
JiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgInZhbHVlIiApKSAh
PT0gdW5kZWZpbmVkICkgeworICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gZWxl
bS52YWx1ZTsKKworICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/CisgICAgLy8g
aGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcworICAgIHJldC5yZXBsYWNlKHJyZXR1cm4s
ICIiKSA6CisgICAgLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3Ig
bnVtYmVyCisgICAgcmV0ID09IG51bGwgPyAiIiA6IHJldDsKKyAgICB9CisKKyAgICByZXR1cm47
CisgICAgfQorCisgICAgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwor
CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAgICB2YXIgdmFsLAorICAg
IHNlbGYgPSBqUXVlcnkodGhpcyk7CisKKyAgICBpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7
CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggaXNGdW5jdGlvbiApIHsKKyAgICB2YWwg
PSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBzZWxmLnZhbCgpICk7CisgICAgfSBlbHNlIHsKKyAgICB2
YWwgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyAiIjsg
Y29udmVydCBudW1iZXJzIHRvIHN0cmluZworICAgIGlmICggdmFsID09IG51bGwgKSB7CisgICAg
dmFsID0gIiI7CisgICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7Cisg
ICAgdmFsICs9ICIiOworICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsK
KyAgICB2YWwgPSBqUXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKCB2YWx1ZSApIHsKKyAgICByZXR1
cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKKyAgICB9KTsKKyAgICB9CisKKyAg
ICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tz
WyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKKworICAgIC8vIElmIHNldCByZXR1cm5z
IHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nCisgICAgaWYgKCAhaG9va3Mg
fHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9
PT0gdW5kZWZpbmVkICkgeworICAgIHRoaXMudmFsdWUgPSB2YWw7CisgICAgfQorICAgIH0pOwor
ICAgIH0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICB2YWxIb29rczogeworICAgIG9wdGlv
bjogeworICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gYXR0cmlidXRlcy52YWx1
ZSBpcyB1bmRlZmluZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0CisgICAgLy8gdXNlcyAudmFsdWUu
IFNlZSAjNjkzMgorICAgIHZhciB2YWwgPSBlbGVtLmF0dHJpYnV0ZXMudmFsdWU7CisgICAgcmV0
dXJuICF2YWwgfHwgdmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CisgICAg
fQorICAgIH0sCisgICAgc2VsZWN0OiB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICB2YXIgdmFsdWUsIG9wdGlvbiwKKyAgICBvcHRpb25zID0gZWxlbS5vcHRpb25zLAorICAgIGlu
ZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorICAgIG9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVj
dC1vbmUiIHx8IGluZGV4IDwgMCwKKyAgICB2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sCisgICAg
bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgsCisgICAgaSA9IGluZGV4IDwg
MCA/CisgICAgbWF4IDoKKyAgICBvbmUgPyBpbmRleCA6IDA7CisKKyAgICAvLyBMb29wIHRocm91
Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCisgICAgZm9yICggOyBpIDwgbWF4OyBpKysgKSB7
CisgICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisgICAgLy8gb2xkSUUgZG9lc24ndCB1cGRh
dGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCisgICAgaWYgKCAoIG9wdGlvbi5z
ZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCisgICAgLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMg
dGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAorICAgICggalF1ZXJ5
LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJp
YnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCApICYmCisgICAgKCAhb3B0aW9uLnBhcmVudE5vZGUu
ZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91
cCIgKSApICkgeworCisgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlv
bgorICAgIHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTsKKworICAgIC8vIFdlIGRvbid0
IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisgICAgaWYgKCBvbmUgKSB7CisgICAgcmV0
dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5
CisgICAgdmFsdWVzLnB1c2goIHZhbHVlICk7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB2
YWx1ZXM7CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAg
IHZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOworCisgICAgalF1ZXJ5KGVs
ZW0pLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgdGhpcy5zZWxlY3RlZCA9
IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkodGhpcykudmFsKCksIHZhbHVlcyApID49IDA7CisgICAg
fSk7CisKKyAgICBpZiAoICF2YWx1ZXMubGVuZ3RoICkgeworICAgIGVsZW0uc2VsZWN0ZWRJbmRl
eCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKyAgICB9CisgICAgfSwK
KworICAgIGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKyAgICB2YXIgaG9v
a3MsIG5vdHhtbCwgcmV0LAorICAgIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAgIC8vIGRv
bid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9k
ZXMKKyAgICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBl
ID09PSAyICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGYWxsYmFjayB0byBwcm9w
IHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAorICAgIGlmICggdHlwZW9mIGVsZW0u
Z2V0QXR0cmlidXRlID09PSBjb3JlX3N0cnVuZGVmaW5lZCApIHsKKyAgICByZXR1cm4galF1ZXJ5
LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CisgICAgfQorCisgICAgbm90eG1sID0gblR5cGUg
IT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOworCisgICAgLy8gQWxsIGF0dHJpYnV0
ZXMgYXJlIGxvd2VyY2FzZQorICAgIC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRl
ZmluZWQKKyAgICBpZiAoIG5vdHhtbCApIHsKKyAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgp
OworICAgIGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8ICggcmJvb2xlYW4udGVz
dCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOworICAgIH0KKworICAgIGlmICggdmFs
dWUgIT09IHVuZGVmaW5lZCApIHsKKworICAgIGlmICggdmFsdWUgPT09IG51bGwgKSB7CisgICAg
alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKKworICAgIH0gZWxzZSBpZiAoIGhvb2tz
ICYmIG5vdHhtbCAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2
YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgeworICAgIHJldHVybiByZXQ7CisKKyAgICB9
IGVsc2UgeworICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArICIiICk7CisgICAg
cmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIH0gZWxzZSBpZiAoIGhvb2tzICYmIG5vdHhtbCAm
JiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBu
dWxsICkgeworICAgIHJldHVybiByZXQ7CisKKyAgICB9IGVsc2UgeworCisgICAgLy8gSW4gSUU5
KywgRmxhc2ggb2JqZWN0cyBkb24ndCBoYXZlIC5nZXRBdHRyaWJ1dGUgKCMxMjk0NSkKKyAgICAv
LyBTdXBwb3J0OiBJRTkrCisgICAgaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IGNv
cmVfc3RydW5kZWZpbmVkICkgeworICAgIHJldCA9ICBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSAp
OworICAgIH0KKworICAgIC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3
ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisgICAgcmV0dXJuIHJldCA9PSBudWxsID8KKyAgICB1
bmRlZmluZWQgOgorICAgIHJldDsKKyAgICB9CisgICAgfSwKKworICAgIHJlbW92ZUF0dHI6IGZ1
bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICB2YXIgbmFtZSwgcHJvcE5hbWUsCisgICAgaSA9
IDAsCisgICAgYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIGNvcmVfcm5vdHdoaXRl
ICk7CisKKyAgICBpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAg
IHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7CisgICAgcHJvcE5hbWUgPSBqUXVl
cnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKyAgICAvLyBCb29sZWFuIGF0dHJpYnV0ZXMg
Z2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisgICAgaWYgKCByYm9vbGVhbi50ZXN0KCBu
YW1lICkgKSB7CisgICAgLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9y
IGJvb2xlYW4gYXR0cmlidXRlcworICAgIC8vIEFsc28gY2xlYXIgZGVmYXVsdENoZWNrZWQvZGVm
YXVsdFNlbGVjdGVkIChpZiBhcHByb3ByaWF0ZSkgZm9yIElFPDgKKyAgICBpZiAoICFnZXRTZXRB
dHRyaWJ1dGUgJiYgcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgeworICAgIGVsZW1bIGpRdWVy
eS5jYW1lbENhc2UoICJkZWZhdWx0LSIgKyBuYW1lICkgXSA9CisgICAgZWxlbVsgcHJvcE5hbWUg
XSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwor
ICAgIH0KKworICAgIC8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2Fj
aCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKQorICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5
LmF0dHIoIGVsZW0sIG5hbWUsICIiICk7CisgICAgfQorCisgICAgZWxlbS5yZW1vdmVBdHRyaWJ1
dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApOworICAgIH0KKyAgICB9Cisg
ICAgfSwKKworICAgIGF0dHJIb29rczogeworICAgIHR5cGU6IHsKKyAgICBzZXQ6IGZ1bmN0aW9u
KCBlbGVtLCB2YWx1ZSApIHsKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5yYWRpb1ZhbHVlICYm
IHZhbHVlID09PSAicmFkaW8iICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAiaW5wdXQiKSApIHsK
KyAgICAvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0dG9uIGFmdGVyIHRoZSB2YWx1
ZSByZXNldHMgdGhlIHZhbHVlIGluIElFNi05CisgICAgLy8gUmVzZXQgdmFsdWUgdG8gZGVmYXVs
dCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVhdGlvbgorICAgIHZh
ciB2YWwgPSBlbGVtLnZhbHVlOworICAgIGVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVl
ICk7CisgICAgaWYgKCB2YWwgKSB7CisgICAgZWxlbS52YWx1ZSA9IHZhbDsKKyAgICB9CisgICAg
cmV0dXJuIHZhbHVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0sCisKKyAgICBwcm9wRml4
OiB7CisgICAgdGFiaW5kZXg6ICJ0YWJJbmRleCIsCisgICAgcmVhZG9ubHk6ICJyZWFkT25seSIs
CisgICAgImZvciI6ICJodG1sRm9yIiwKKyAgICAiY2xhc3MiOiAiY2xhc3NOYW1lIiwKKyAgICBt
YXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorICAgIGNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAor
ICAgIGNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAorICAgIHJvd3NwYW46ICJyb3dTcGFuIiwK
KyAgICBjb2xzcGFuOiAiY29sU3BhbiIsCisgICAgdXNlbWFwOiAidXNlTWFwIiwKKyAgICBmcmFt
ZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKKyAgICBjb250ZW50ZWRpdGFibGU6ICJjb250ZW50RWRp
dGFibGUiCisgICAgfSwKKworICAgIHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSAp
IHsKKyAgICB2YXIgcmV0LCBob29rcywgbm90eG1sLAorICAgIG5UeXBlID0gZWxlbS5ub2RlVHlw
ZTsKKworICAgIC8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFu
ZCBhdHRyaWJ1dGUgbm9kZXMKKyAgICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBl
ID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub3R4
bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CisKKyAgICBpZiAo
IG5vdHhtbCApIHsKKyAgICAvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzCisgICAgbmFtZSA9
IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKyAgICBob29rcyA9IGpRdWVyeS5wcm9w
SG9va3NbIG5hbWUgXTsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7
CisgICAgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBl
bGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgeworICAgIHJldHVybiByZXQ7CisK
KyAgICB9IGVsc2UgeworICAgIHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CisgICAg
fQorCisgICAgfSBlbHNlIHsKKyAgICBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChy
ZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CisgICAgcmV0dXJuIHJl
dDsKKworICAgIH0gZWxzZSB7CisgICAgcmV0dXJuIGVsZW1bIG5hbWUgXTsKKyAgICB9CisgICAg
fQorICAgIH0sCisKKyAgICBwcm9wSG9va3M6IHsKKyAgICB0YWJJbmRleDogeworICAgIGdldDog
ZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyBy
ZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNl
dAorICAgIC8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5n
LXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCisg
ICAgdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7
CisKKyAgICByZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZCA/
CisgICAgcGFyc2VJbnQoIGF0dHJpYnV0ZU5vZGUudmFsdWUsIDEwICkgOgorICAgIHJmb2N1c2Fi
bGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFt
ZSApICYmIGVsZW0uaHJlZiA/CisgICAgMCA6CisgICAgdW5kZWZpbmVkOworICAgIH0KKyAgICB9
CisgICAgfQorfSk7CisKKy8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcworYm9vbEhvb2sg
PSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIKKyAgICAvLyBV
c2UgLnByb3AgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgYXR0cmlidXRlIGlzIHVuZGVyc3Rvb2QgYXMg
Ym9vbGVhbgorICAgIHByb3AgPSBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSApLAorCisgICAgLy8g
RmV0Y2ggaXQgYWNjb3JkaW5nbHkKKyAgICBhdHRyID0gdHlwZW9mIHByb3AgPT09ICJib29sZWFu
IiAmJiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorICAgIGRldGFpbCA9IHR5cGVvZiBwcm9w
ID09PSAiYm9vbGVhbiIgPworCisgICAgZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRlID8K
KyAgICBhdHRyICE9IG51bGwgOgorICAgIC8vIG9sZElFIGZhYnJpY2F0ZXMgYW4gZW1wdHkgc3Ry
aW5nIGZvciBtaXNzaW5nIGJvb2xlYW4gYXR0cmlidXRlcworICAgIC8vIGFuZCBjb25mbGF0ZXMg
Y2hlY2tlZC9zZWxlY3RlZCBpbnRvIGF0dHJvcGVydGllcworICAgIHJ1c2VEZWZhdWx0LnRlc3Qo
IG5hbWUgKSA/CisgICAgZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSggImRlZmF1bHQtIiArIG5hbWUg
KSBdIDoKKyAgICAhIWF0dHIgOgorCisgICAgLy8gZmV0Y2ggYW4gYXR0cmlidXRlIG5vZGUgZm9y
IHByb3BlcnRpZXMgbm90IHJlY29nbml6ZWQgYXMgYm9vbGVhbgorICAgIGVsZW0uZ2V0QXR0cmli
dXRlTm9kZSggbmFtZSApOworCisgICAgcmV0dXJuIGRldGFpbCAmJiBkZXRhaWwudmFsdWUgIT09
IGZhbHNlID8KKyAgICBuYW1lLnRvTG93ZXJDYXNlKCkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9
LAorICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgeworICAgIGlmICggdmFs
dWUgPT09IGZhbHNlICkgeworICAgIC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBz
ZXQgdG8gZmFsc2UKKyAgICBqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOworICAgIH0g
ZWxzZSBpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQu
dGVzdCggbmFtZSApICkgeworICAgIC8vIElFPDggbmVlZHMgdGhlICpwcm9wZXJ0eSogbmFtZQor
ICAgIGVsZW0uc2V0QXR0cmlidXRlKCAhZ2V0U2V0QXR0cmlidXRlICYmIGpRdWVyeS5wcm9wRml4
WyBuYW1lIF0gfHwgbmFtZSwgbmFtZSApOworCisgICAgLy8gVXNlIGRlZmF1bHRDaGVja2VkIGFu
ZCBkZWZhdWx0U2VsZWN0ZWQgZm9yIG9sZElFCisgICAgfSBlbHNlIHsKKyAgICBlbGVtWyBqUXVl
cnkuY2FtZWxDYXNlKCAiZGVmYXVsdC0iICsgbmFtZSApIF0gPSBlbGVtWyBuYW1lIF0gPSB0cnVl
OworICAgIH0KKworICAgIHJldHVybiBuYW1lOworICAgIH0KK307CisKKy8vIGZpeCBvbGRJRSB2
YWx1ZSBhdHRyb3BlcnR5CitpZiAoICFnZXRTZXRJbnB1dCB8fCAhZ2V0U2V0QXR0cmlidXRlICkg
eworICAgIGpRdWVyeS5hdHRySG9va3MudmFsdWUgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxl
bSwgbmFtZSApIHsKKyAgICB2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7
CisgICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8KKworICAgIC8v
IElnbm9yZSB0aGUgdmFsdWUgKnByb3BlcnR5KiBieSB1c2luZyBkZWZhdWx0VmFsdWUKKyAgICBl
bGVtLmRlZmF1bHRWYWx1ZSA6CisKKyAgICByZXQgJiYgcmV0LnNwZWNpZmllZCA/IHJldC52YWx1
ZSA6IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBu
YW1lICkgeworICAgIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgKSB7Cisg
ICAgLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAor
ICAgIGVsZW0uZGVmYXVsdFZhbHVlID0gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAvLyBVc2Ug
bm9kZUhvb2sgaWYgZGVmaW5lZCAoIzE5NTQpOyBvdGhlcndpc2Ugc2V0QXR0cmlidXRlIGlzIGZp
bmUKKyAgICByZXR1cm4gbm9kZUhvb2sgJiYgbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFt
ZSApOworICAgIH0KKyAgICB9CisgICAgfTsKK30KKworLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQg
Z2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKK2lm
ICggIWdldFNldEF0dHJpYnV0ZSApIHsKKworICAgIC8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmli
dXRlIGluIElFNi83CisgICAgLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUK
KyAgICBub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7CisgICAgZ2V0OiBmdW5j
dGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2Rl
KCBuYW1lICk7CisgICAgcmV0dXJuIHJldCAmJiAoIG5hbWUgPT09ICJpZCIgfHwgbmFtZSA9PT0g
Im5hbWUiIHx8IG5hbWUgPT09ICJjb29yZHMiID8gcmV0LnZhbHVlICE9PSAiIiA6IHJldC5zcGVj
aWZpZWQgKSA/CisgICAgcmV0LnZhbHVlIDoKKyAgICB1bmRlZmluZWQ7CisgICAgfSwKKyAgICBz
ZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKKyAgICAvLyBTZXQgdGhlIGV4aXN0
aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQorICAgIHZhciByZXQgPSBlbGVtLmdl
dEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKKyAgICBpZiAoICFyZXQgKSB7CisgICAgZWxlbS5zZXRB
dHRyaWJ1dGVOb2RlKAorICAgIChyZXQgPSBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmli
dXRlKCBuYW1lICkpCisgICAgKTsKKyAgICB9CisKKyAgICByZXQudmFsdWUgPSB2YWx1ZSArPSAi
IjsKKworICAgIC8vIEJyZWFrIGFzc29jaWF0aW9uIHdpdGggY2xvbmVkIGVsZW1lbnRzIGJ5IGFs
c28gdXNpbmcgc2V0QXR0cmlidXRlICgjOTY0NikKKyAgICByZXR1cm4gbmFtZSA9PT0gInZhbHVl
IiB8fCB2YWx1ZSA9PT0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA/CisgICAgdmFsdWUgOgor
ICAgIHVuZGVmaW5lZDsKKyAgICB9CisgICAgfTsKKworICAgIC8vIFNldCBjb250ZW50ZWRpdGFi
bGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQorICAgIC8vIFNldHRpbmcgdG8gZW1wdHkg
c3RyaW5nIHRocm93cyBhbiBlcnJvciBhcyBhbiBpbnZhbGlkIHZhbHVlCisgICAgalF1ZXJ5LmF0
dHJIb29rcy5jb250ZW50ZWRpdGFibGUgPSB7CisgICAgZ2V0OiBub2RlSG9vay5nZXQsCisgICAg
c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CisgICAgbm9kZUhvb2suc2V0KCBl
bGVtLCB2YWx1ZSA9PT0gIiIgPyBmYWxzZSA6IHZhbHVlLCBuYW1lICk7CisgICAgfQorICAgIH07
CisKKyAgICAvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBl
bXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCisgICAgLy8gVGhpcyBpcyBmb3IgcmVtb3ZhbHMKKyAg
ICBqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkg
eworICAgIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5h
dHRySG9va3NbIG5hbWUgXSwgeworICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewor
ICAgIGlmICggdmFsdWUgPT09ICIiICkgeworICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAi
YXV0byIgKTsKKyAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAgICB9
KTsKK30KKworCisvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJ
RQorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4
VlMuODUlMjkuYXNweAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgKSB7Cisg
ICAgalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5j
dGlvbiggaSwgbmFtZSApIHsKKyAgICBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnku
ZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKKyAgICBnZXQ6IGZ1bmN0aW9uKCBl
bGVtICkgeworICAgIHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOworICAg
IHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKKyAgICB9CisgICAgfSk7Cisg
ICAgfSk7CisKKyAgICAvLyBocmVmL3NyYyBwcm9wZXJ0eSBzaG91bGQgZ2V0IHRoZSBmdWxsIG5v
cm1hbGl6ZWQgVVJMICgjMTAyOTkvIzEyOTE1KQorICAgIGpRdWVyeS5lYWNoKFsgImhyZWYiLCAi
c3JjIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICBqUXVlcnkucHJvcEhvb2tzWyBuYW1l
IF0gPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbS5nZXRB
dHRyaWJ1dGUoIG5hbWUsIDQgKTsKKyAgICB9CisgICAgfTsKKyAgICB9KTsKK30KKworaWYgKCAh
alF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7CisgICAgalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsK
KyAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIC8vIFJldHVybiB1bmRlZmluZWQgaW4g
dGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nCisgICAgLy8gTm90ZTogSUUgdXBwZXJjYXNlcyBjc3Mg
cHJvcGVydHkgbmFtZXMsIGJ1dCBpZiB3ZSB3ZXJlIHRvIC50b0xvd2VyQ2FzZSgpCisgICAgLy8g
LmNzc1RleHQsIHRoYXQgd291bGQgZGVzdHJveSBjYXNlIHNlbnN0aXRpdml0eSBpbiBVUkwncywg
bGlrZSBpbiAiYmFja2dyb3VuZCIKKyAgICByZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0IHx8IHVu
ZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAg
IHJldHVybiAoIGVsZW0uc3R5bGUuY3NzVGV4dCA9IHZhbHVlICsgIiIgKTsKKyAgICB9CisgICAg
fTsKK30KKworLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3Bl
cnR5IG9mIGFuIG9wdGlvbgorLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4
IHByb3BlcnR5IGZpeGVzIGl0CitpZiAoICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsK
KyAgICBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0galF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnBy
b3BIb29rcy5zZWxlY3RlZCwgeworICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFy
IHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKworICAgIGlmICggcGFyZW50ICkgeworICAgIHBh
cmVudC5zZWxlY3RlZEluZGV4OworCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3Jr
cyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCisgICAgaWYgKCBwYXJlbnQucGFyZW50Tm9kZSAp
IHsKKyAgICBwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIH0pOworfQorCisvLyBJRTYvNyBjYWxsIGVuY3R5
cGUgZW5jb2RpbmcKK2lmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5cGUgKSB7CisgICAgalF1ZXJ5
LnByb3BGaXguZW5jdHlwZSA9ICJlbmNvZGluZyI7Cit9CisKKy8vIFJhZGlvcyBhbmQgY2hlY2ti
b3hlcyBnZXR0ZXIvc2V0dGVyCitpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkgeworICAg
IGpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKKyAgICBq
UXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKKyAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewor
ICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5z
dGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkCisgICAgcmV0dXJuIGVsZW0u
Z2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CisgICAg
fQorICAgIH07CisgICAgfSk7Cit9CitqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIg
XSwgZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0
ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgeworICAgIHNldDogZnVuY3Rpb24oIGVsZW0s
IHZhbHVlICkgeworICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CisgICAgcmV0
dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52YWwoKSwg
dmFsdWUgKSA+PSAwICk7CisgICAgfQorICAgIH0KKyAgICB9KTsKK30pOwordmFyIHJmb3JtRWxl
bXMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCisgICAgcmtleUV2ZW50ID0gL15r
ZXkvLAorICAgIHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLAor
ICAgIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAorICAg
IHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkkLzsKKworZnVuY3Rpb24gcmV0
dXJuVHJ1ZSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZnVuY3Rpb24gcmV0dXJuRmFsc2Uo
KSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyBmb3Ig
bWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgorICog
UHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBp
ZGVhcy4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisgICAgZ2xvYmFsOiB7fSwKKworICAgIGFk
ZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHsKKyAg
ICB2YXIgdG1wLCBldmVudHMsIHQsIGhhbmRsZU9iakluLAorICAgIHNwZWNpYWwsIGV2ZW50SGFu
ZGxlLCBoYW5kbGVPYmosCisgICAgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBl
LAorICAgIGVsZW1EYXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICk7CisKKyAgICAvLyBEb24ndCBh
dHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBw
bGFpbiBvYmplY3RzKQorICAgIGlmICggIWVsZW1EYXRhICkgeworICAgIHJldHVybjsKKyAgICB9
CisKKyAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGlu
IGxpZXUgb2YgdGhlIGhhbmRsZXIKKyAgICBpZiAoIGhhbmRsZXIuaGFuZGxlciApIHsKKyAgICBo
YW5kbGVPYmpJbiA9IGhhbmRsZXI7CisgICAgaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7
CisgICAgc2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsKKyAgICB9CisKKyAgICAvLyBN
YWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9y
ZW1vdmUgaXQgbGF0ZXIKKyAgICBpZiAoICFoYW5kbGVyLmd1aWQgKSB7CisgICAgaGFuZGxlci5n
dWlkID0galF1ZXJ5Lmd1aWQrKzsKKyAgICB9CisKKyAgICAvLyBJbml0IHRoZSBlbGVtZW50J3Mg
ZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0Cisg
ICAgaWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7CisgICAgZXZlbnRzID0gZWxl
bURhdGEuZXZlbnRzID0ge307CisgICAgfQorICAgIGlmICggIShldmVudEhhbmRsZSA9IGVsZW1E
YXRhLmhhbmRsZSkgKSB7CisgICAgZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5j
dGlvbiggZSApIHsKKyAgICAvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnku
ZXZlbnQudHJpZ2dlcigpIGFuZAorICAgIC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVy
IGEgcGFnZSBoYXMgdW5sb2FkZWQKKyAgICByZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gY29yZV9z
dHJ1bmRlZmluZWQgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkg
PworICAgIGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZXZlbnRIYW5kbGUuZWxlbSwgYXJn
dW1lbnRzICkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9OworICAgIC8vIEFkZCBlbGVtIGFzIGEg
cHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJ
RSBub24tbmF0aXZlIGV2ZW50cworICAgIGV2ZW50SGFuZGxlLmVsZW0gPSBlbGVtOworICAgIH0K
KworICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKKyAg
ICAvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CisgICAgdHlw
ZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgWyIiXTsKKyAg
ICB0ID0gdHlwZXMubGVuZ3RoOworICAgIHdoaWxlICggdC0tICkgeworICAgIHRtcCA9IHJ0eXBl
bmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CisgICAgdHlwZSA9IG9yaWdUeXBlID0g
dG1wWzFdOworICAgIG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5z
b3J0KCk7CisKKyAgICAvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNp
YWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUKKyAgICBzcGVjaWFsID0galF1
ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAgIC8vIElmIHNlbGVjdG9yIGRl
ZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4g
dHlwZQorICAgIHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVj
aWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKworICAgIC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9u
IG5ld2x5IHJlc2V0IHR5cGUKKyAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5
cGUgXSB8fCB7fTsKKworICAgIC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhh
bmRsZXJzCisgICAgaGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7CisgICAgdHlwZTogdHlwZSwK
KyAgICBvcmlnVHlwZTogb3JpZ1R5cGUsCisgICAgZGF0YTogZGF0YSwKKyAgICBoYW5kbGVyOiBo
YW5kbGVyLAorICAgIGd1aWQ6IGhhbmRsZXIuZ3VpZCwKKyAgICBzZWxlY3Rvcjogc2VsZWN0b3Is
CisgICAgbmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0Nv
bnRleHQudGVzdCggc2VsZWN0b3IgKSwKKyAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigi
LiIpCisgICAgfSwgaGFuZGxlT2JqSW4gKTsKKworICAgIC8vIEluaXQgdGhlIGV2ZW50IGhhbmRs
ZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0CisgICAgaWYgKCAhKGhhbmRsZXJzID0gZXZlbnRz
WyB0eXBlIF0pICkgeworICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKKyAgICBo
YW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsKKworICAgIC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlz
dGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBm
YWxzZQorICAgIGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVt
LCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKKyAgICAvLyBC
aW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAorICAgIGlmICggZWxl
bS5hZGRFdmVudExpc3RlbmVyICkgeworICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwg
ZXZlbnRIYW5kbGUsIGZhbHNlICk7CisKKyAgICB9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50
ICkgeworICAgIGVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOwor
ICAgIH0KKyAgICB9CisgICAgfQorCisgICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKKyAgICBzcGVj
aWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKKworICAgIGlmICggIWhhbmRsZU9iai5o
YW5kbGVyLmd1aWQgKSB7CisgICAgaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3Vp
ZDsKKyAgICB9CisgICAgfQorCisgICAgLy8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBs
aXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnQKKyAgICBpZiAoIHNlbGVjdG9yICkgeworICAgIGhhbmRs
ZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTsKKyAg
ICB9IGVsc2UgeworICAgIGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOworICAgIH0KKworICAg
IC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBl
dmVudCBvcHRpbWl6YXRpb24KKyAgICBqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVl
OworICAgIH0KKworICAgIC8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBp
biBJRQorICAgIGVsZW0gPSBudWxsOworICAgIH0sCisKKyAgICAvLyBEZXRhY2ggYW4gZXZlbnQg
b3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKKyAgICByZW1vdmU6IGZ1bmN0aW9uKCBl
bGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkgeworICAgIHZhciBq
LCBoYW5kbGVPYmosIHRtcCwKKyAgICBvcmlnQ291bnQsIHQsIGV2ZW50cywKKyAgICBzcGVjaWFs
LCBoYW5kbGVycywgdHlwZSwKKyAgICBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKKyAgICBlbGVtRGF0
YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICk7CisKKyAg
ICBpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7CisgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4g
dHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWQKKyAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5t
YXRjaCggY29yZV9ybm90d2hpdGUgKSB8fCBbIiJdOworICAgIHQgPSB0eXBlcy5sZW5ndGg7Cisg
ICAgd2hpbGUgKCB0LS0gKSB7CisgICAgdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNb
dF0gKSB8fCBbXTsKKyAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07CisgICAgbmFtZXNwYWNl
cyA9ICggdG1wWzJdIHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQoKTsKKworICAgIC8vIFVuYmlu
ZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxl
bWVudAorICAgIGlmICggIXR5cGUgKSB7CisgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7Cisg
ICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIs
IHNlbGVjdG9yLCB0cnVlICk7CisgICAgfQorICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHNw
ZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworICAgIHR5cGUgPSAo
IHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwg
dHlwZTsKKyAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOworICAgIHRtcCA9IHRt
cFsyXSAmJiBuZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4q
XFwufCkiKSArICIoXFwufCQpIiApOworCisgICAgLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwor
ICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7CisgICAgd2hpbGUgKCBqLS0gKSB7
CisgICAgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKKworICAgIGlmICggKCBtYXBwZWRUeXBl
cyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiYKKyAgICAoICFoYW5kbGVy
IHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgorICAgICggIXRtcCB8fCB0
bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiYKKyAgICAoICFzZWxlY3RvciB8fCBz
ZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAiKioiICYmIGhh
bmRsZU9iai5zZWxlY3RvciApICkgeworICAgIGhhbmRsZXJzLnNwbGljZSggaiwgMSApOworCisg
ICAgaWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7CisgICAgaGFuZGxlcnMuZGVsZWdhdGVDb3Vu
dC0tOworICAgIH0KKyAgICBpZiAoIHNwZWNpYWwucmVtb3ZlICkgeworICAgIHNwZWNpYWwucmVt
b3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAg
Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBh
bmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAorICAgIC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBl
bmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJz
KQorICAgIGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7CisgICAgaWYgKCAh
c3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFj
ZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKKyAgICBqUXVlcnkucmVtb3ZlRXZl
bnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApOworICAgIH0KKworICAgIGRlbGV0ZSBl
dmVudHNbIHR5cGUgXTsKKyAgICB9CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRv
IGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKKyAgICBpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBl
dmVudHMgKSApIHsKKyAgICBkZWxldGUgZWxlbURhdGEuaGFuZGxlOworCisgICAgLy8gcmVtb3Zl
RGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYg
ZW1wdHkKKyAgICAvLyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxldGUKKyAgICBqUXVlcnkuX3Jl
bW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CisgICAgfQorICAgIH0sCisKKyAgICB0cmlnZ2Vy
OiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHsKKyAgICB2YXIg
aGFuZGxlLCBvbnR5cGUsIGN1ciwKKyAgICBidWJibGVUeXBlLCBzcGVjaWFsLCB0bXAsIGksCisg
ICAgZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCisgICAgdHlwZSA9IGNvcmVfaGFz
T3duLmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCwKKyAgICBuYW1l
c3BhY2VzID0gY29yZV9oYXNPd24uY2FsbCggZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5u
YW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOworCisgICAgY3VyID0gdG1wID0gZWxlbSA9IGVsZW0g
fHwgZG9jdW1lbnQ7CisKKyAgICAvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVu
dCBub2RlcworICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09
PSA4ICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBmb2N1cy9ibHVyIG1vcnBocyB0
byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKKyAg
ICBpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkg
KSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggdHlwZS5pbmRleE9mKCIuIikgPj0g
MCApIHsKKyAgICAvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRj
aCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisgICAgbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4i
KTsKKyAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworICAgIG5hbWVzcGFjZXMuc29ydCgp
OworICAgIH0KKyAgICBvbnR5cGUgPSB0eXBlLmluZGV4T2YoIjoiKSA8IDAgJiYgIm9uIiArIHR5
cGU7CisKKyAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBP
YmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKKyAgICBldmVudCA9IGV2ZW50WyBq
UXVlcnkuZXhwYW5kbyBdID8KKyAgICBldmVudCA6CisgICAgbmV3IGpRdWVyeS5FdmVudCggdHlw
ZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOworCisgICAgZXZlbnQuaXNU
cmlnZ2VyID0gdHJ1ZTsKKyAgICBldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIi4i
KTsKKyAgICBldmVudC5uYW1lc3BhY2VfcmUgPSBldmVudC5uYW1lc3BhY2UgPworICAgIG5ldyBS
ZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihc
XC58JCkiICkgOgorICAgIG51bGw7CisKKyAgICAvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2Fz
ZSBpdCBpcyBiZWluZyByZXVzZWQKKyAgICBldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CisgICAg
aWYgKCAhZXZlbnQudGFyZ2V0ICkgeworICAgIGV2ZW50LnRhcmdldCA9IGVsZW07CisgICAgfQor
CisgICAgLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBj
cmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAorICAgIGRhdGEgPSBkYXRhID09IG51bGwgPwor
ICAgIFsgZXZlbnQgXSA6CisgICAgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7
CisKKyAgICAvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVz
CisgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisgICAg
aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIu
YXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBX
M0MgZXZlbnRzIHNwZWMgKCM5OTUxKQorICAgIC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhl
biB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQp
CisgICAgaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnku
aXNXaW5kb3coIGVsZW0gKSApIHsKKworICAgIGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRl
VHlwZSB8fCB0eXBlOworICAgIGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0
eXBlICkgKSB7CisgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7CisgICAgfQorICAgIGZvciAoIDsg
Y3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKKyAgICBldmVudFBhdGgucHVzaCggY3VyICk7
CisgICAgdG1wID0gY3VyOworICAgIH0KKworICAgIC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBn
b3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKQorICAg
IGlmICggdG1wID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHsKKyAgICBl
dmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2lu
ZG93ICk7CisgICAgfQorICAgIH0KKworICAgIC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50
IHBhdGgKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYg
IWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisKKyAgICBldmVudC50eXBlID0gaSA+
IDEgPworICAgIGJ1YmJsZVR5cGUgOgorICAgIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKKwor
ICAgIC8vIGpRdWVyeSBoYW5kbGVyCisgICAgaGFuZGxlID0gKCBqUXVlcnkuX2RhdGEoIGN1ciwg
ImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsICJo
YW5kbGUiICk7CisgICAgaWYgKCBoYW5kbGUgKSB7CisgICAgaGFuZGxlLmFwcGx5KCBjdXIsIGRh
dGEgKTsKKyAgICB9CisKKyAgICAvLyBOYXRpdmUgaGFuZGxlcgorICAgIGhhbmRsZSA9IG9udHlw
ZSAmJiBjdXJbIG9udHlwZSBdOworICAgIGlmICggaGFuZGxlICYmIGpRdWVyeS5hY2NlcHREYXRh
KCBjdXIgKSAmJiBoYW5kbGUuYXBwbHkgJiYgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKSA9PT0g
ZmFsc2UgKSB7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICB9CisgICAgfQorICAg
IGV2ZW50LnR5cGUgPSB0eXBlOworCisgICAgLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVm
YXVsdCBhY3Rpb24sIGRvIGl0IG5vdworICAgIGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQu
aXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisKKyAgICBpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8
fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBlbGVtLm93bmVyRG9jdW1lbnQsIGRhdGEgKSA9PT0g
ZmFsc2UpICYmCisgICAgISh0eXBlID09PSAiY2xpY2siICYmIGpRdWVyeS5ub2RlTmFtZSggZWxl
bSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CisKKyAgICAvLyBDYWxs
IGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFt
ZSBhcyB0aGUgZXZlbnQuCisgICAgLy8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKCkgY2hlY2sg
aGVyZSBiZWNhdXNlIElFNi83IGZhaWxzIHRoYXQgdGVzdC4KKyAgICAvLyBEb24ndCBkbyBkZWZh
dWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAo
IzYxNzApCisgICAgaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICFqUXVlcnkuaXNXaW5k
b3coIGVsZW0gKSApIHsKKworICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQg
d2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKKyAgICB0bXAgPSBlbGVtWyBvbnR5cGUgXTsK
KworICAgIGlmICggdG1wICkgeworICAgIGVsZW1bIG9udHlwZSBdID0gbnVsbDsKKyAgICB9CisK
KyAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdl
IGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQorICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0
eXBlOworICAgIHRyeSB7CisgICAgZWxlbVsgdHlwZSBdKCk7CisgICAgfSBjYXRjaCAoIGUgKSB7
CisgICAgLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2
LCMxMjUxOCkKKyAgICAvLyBvbmx5IHJlcHJvZHVjaWJsZSBvbiB3aW5YUCBJRTggbmF0aXZlLCBu
b3QgSUU5IGluIElFOCBtb2RlCisgICAgfQorICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1
bmRlZmluZWQ7CisKKyAgICBpZiAoIHRtcCApIHsKKyAgICBlbGVtWyBvbnR5cGUgXSA9IHRtcDsK
KyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXZlbnQucmVzdWx0Owor
ICAgIH0sCisKKyAgICBkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgeworCisgICAgLy8gTWFr
ZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0Cisg
ICAgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApOworCisgICAgdmFyIGksIHJldCwg
aGFuZGxlT2JqLCBtYXRjaGVkLCBqLAorICAgIGhhbmRsZXJRdWV1ZSA9IFtdLAorICAgIGFyZ3Mg
PSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorICAgIGhhbmRsZXJzID0gKCBqUXVlcnku
X2RhdGEoIHRoaXMsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLAorICAg
IHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9OworCisg
ICAgLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1v
bmx5KSBuYXRpdmUgZXZlbnQKKyAgICBhcmdzWzBdID0gZXZlbnQ7CisgICAgZXZlbnQuZGVsZWdh
dGVUYXJnZXQgPSB0aGlzOworCisgICAgLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3Ig
dGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAorICAgIGlmICggc3Bl
Y2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50
ICkgPT09IGZhbHNlICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUg
aGFuZGxlcnMKKyAgICBoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCgg
dGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CisKKyAgICAvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0
aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1cworICAgIGkgPSAwOwor
ICAgIHdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQ
cm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKyAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hl
ZC5lbGVtOworCisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5o
YW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgp
ICkgeworCisgICAgLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFt
ZXNwYWNlLCBvcgorICAgIC8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFs
IHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2Up
LgorICAgIGlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVz
dCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgeworCisgICAgZXZlbnQuaGFuZGxlT2JqID0gaGFu
ZGxlT2JqOworICAgIGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKKworICAgIHJldCA9ICgg
KGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxl
IHx8IGhhbmRsZU9iai5oYW5kbGVyICkKKyAgICAuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyAp
OworCisgICAgaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKKyAgICBpZiAoIChldmVudC5yZXN1
bHQgPSByZXQpID09PSBmYWxzZSApIHsKKyAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAg
IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAg
ICB9CisKKyAgICAvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0
eXBlCisgICAgaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsKKyAgICBzcGVjaWFsLnBvc3RE
aXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApOworICAgIH0KKworICAgIHJldHVybiBldmVudC5y
ZXN1bHQ7CisgICAgfSwKKworICAgIGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJz
ICkgeworICAgIHZhciBzZWwsIGhhbmRsZU9iaiwgbWF0Y2hlcywgaSwKKyAgICBoYW5kbGVyUXVl
dWUgPSBbXSwKKyAgICBkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKKyAg
ICBjdXIgPSBldmVudC50YXJnZXQ7CisKKyAgICAvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzCisg
ICAgLy8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKCMxMzE4MCkKKyAgICAv
LyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgjMzg2MSkKKyAgICBp
ZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmICghZXZlbnQuYnV0dG9uIHx8IGV2
ZW50LnR5cGUgIT09ICJjbGljayIpICkgeworCisgICAgZm9yICggOyBjdXIgIT0gdGhpczsgY3Vy
ID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKKworICAgIC8vIERvbid0IGNoZWNrIG5vbi1l
bGVtZW50cyAoIzEzMjA4KQorICAgIC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVk
IGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQorICAgIGlmICggY3VyLm5v
ZGVUeXBlID09PSAxICYmIChjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0g
ImNsaWNrIikgKSB7CisgICAgbWF0Y2hlcyA9IFtdOworICAgIGZvciAoIGkgPSAwOyBpIDwgZGVs
ZWdhdGVDb3VudDsgaSsrICkgeworICAgIGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CisKKyAg
ICAvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEz
MjAzKQorICAgIHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArICIgIjsKKworICAgIGlmICggbWF0
Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHsKKyAgICBtYXRjaGVzWyBzZWwgXSA9IGhhbmRs
ZU9iai5uZWVkc0NvbnRleHQgPworICAgIGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciAp
ID49IDAgOgorICAgIGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5n
dGg7CisgICAgfQorICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gKSB7CisgICAgbWF0Y2hlcy5wdXNo
KCBoYW5kbGVPYmogKTsKKyAgICB9CisgICAgfQorICAgIGlmICggbWF0Y2hlcy5sZW5ndGggKSB7
CisgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0p
OworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEFkZCB0aGUgcmVtYWluaW5n
IChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKKyAgICBpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5k
bGVycy5sZW5ndGggKSB7CisgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5k
bGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gaGFuZGxlclF1ZXVlOworICAgIH0sCisKKyAgICBmaXg6IGZ1bmN0aW9uKCBldmVudCAp
IHsKKyAgICBpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgeworICAgIHJldHVybiBldmVu
dDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBv
YmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKKyAgICB2YXIgaSwgcHJvcCwgY29w
eSwKKyAgICB0eXBlID0gZXZlbnQudHlwZSwKKyAgICBvcmlnaW5hbEV2ZW50ID0gZXZlbnQsCisg
ICAgZml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTsKKworICAgIGlmICggIWZpeEhvb2sg
KSB7CisgICAgdGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9CisgICAgcm1vdXNlRXZl
bnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDoKKyAgICBya2V5RXZlbnQudGVzdCgg
dHlwZSApID8gdGhpcy5rZXlIb29rcyA6CisgICAge307CisgICAgfQorICAgIGNvcHkgPSBmaXhI
b29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJv
cHM7CisKKyAgICBldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKKwor
ICAgIGkgPSBjb3B5Lmxlbmd0aDsKKyAgICB3aGlsZSAoIGktLSApIHsKKyAgICBwcm9wID0gY29w
eVsgaSBdOworICAgIGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07CisgICAg
fQorCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8vIEZpeCB0YXJnZXQgcHJvcGVydHkgKCMx
OTI1KQorICAgIGlmICggIWV2ZW50LnRhcmdldCApIHsKKyAgICBldmVudC50YXJnZXQgPSBvcmln
aW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CisgICAgfQorCisgICAgLy8gU3VwcG9y
dDogQ2hyb21lIDIzKywgU2FmYXJpPworICAgIC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4
dCBub2RlICgjNTA0LCAjMTMxNDMpCisgICAgaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09
IDMgKSB7CisgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CisgICAg
fQorCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8vIEZvciBtb3VzZS9rZXkgZXZlbnRzLCBt
ZXRhS2V5PT1mYWxzZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgsICMxMTMyOCkKKyAgICBldmVu
dC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5OworCisgICAgcmV0dXJuIGZpeEhvb2suZmlsdGVy
ID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKKyAgICB9
LAorCisgICAgLy8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQg
YW5kIE1vdXNlRXZlbnQKKyAgICBwcm9wczogImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3Ry
bEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0
S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSwKKworICAgIGZpeEhv
b2tzOiB7fSwKKworICAgIGtleUhvb2tzOiB7CisgICAgcHJvcHM6ICJjaGFyIGNoYXJDb2RlIGtl
eSBrZXlDb2RlIi5zcGxpdCgiICIpLAorICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmln
aW5hbCApIHsKKworICAgIC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50cworICAgIGlmICggZXZl
bnQud2hpY2ggPT0gbnVsbCApIHsKKyAgICBldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2Rl
ICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7CisgICAgfQor
CisgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKyAgICB9LAorCisgICAgbW91c2VIb29rczogewor
ICAgIHByb3BzOiAiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9m
ZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxp
dCgiICIpLAorICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKKyAgICB2
YXIgYm9keSwgZXZlbnREb2MsIGRvYywKKyAgICBidXR0b24gPSBvcmlnaW5hbC5idXR0b24sCisg
ICAgZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDsKKworICAgIC8vIENhbGN1bGF0
ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKKyAgICBpZiAoIGV2
ZW50LnBhZ2VYID09IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkgeworICAgIGV2
ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CisgICAgZG9j
ID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OworICAgIGJvZHkgPSBldmVudERvYy5ib2R5Owor
CisgICAgZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9s
bExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNs
aWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApOworICAgIGV2ZW50LnBh
Z2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkg
JiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJv
ZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTsKKyAgICB9CisKKyAgICAvLyBBZGQgcmVsYXRl
ZFRhcmdldCwgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBm
cm9tRWxlbWVudCApIHsKKyAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbUVsZW1lbnQgPT09
IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZyb21FbGVtZW50OworICAgIH0K
KworICAgIC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsg
MyA9PT0gcmlnaHQKKyAgICAvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRv
bid0IHVzZSBpdAorICAgIGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVk
ICkgeworICAgIGV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0dG9uICYgMiA/
IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXZl
bnQ7CisgICAgfQorICAgIH0sCisKKyAgICBzcGVjaWFsOiB7CisgICAgbG9hZDogeworICAgIC8v
IFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2lu
ZG93LmxvYWQKKyAgICBub0J1YmJsZTogdHJ1ZQorICAgIH0sCisgICAgY2xpY2s6IHsKKyAgICAv
LyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBi
ZSByaWdodAorICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgeworICAgIGlmICggalF1ZXJ5Lm5vZGVO
YW1lKCB0aGlzLCAiaW5wdXQiICkgJiYgdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMu
Y2xpY2sgKSB7CisgICAgdGhpcy5jbGljaygpOworICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg
ICAgfQorICAgIH0sCisgICAgZm9jdXM6IHsKKyAgICAvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBw
b3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKKyAgICB0cmlnZ2VyOiBm
dW5jdGlvbigpIHsKKyAgICBpZiAoIHRoaXMgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYg
dGhpcy5mb2N1cyApIHsKKyAgICB0cnkgeworICAgIHRoaXMuZm9jdXMoKTsKKyAgICByZXR1cm4g
ZmFsc2U7CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8v
IElmIHdlIGVycm9yIG9uIGZvY3VzIHRvIGhpZGRlbiBlbGVtZW50ICgjMTQ4NiwgIzEyNTE4KSwK
KyAgICAvLyBsZXQgLnRyaWdnZXIoKSBydW4gdGhlIGhhbmRsZXJzCisgICAgfQorICAgIH0KKyAg
ICB9LAorICAgIGRlbGVnYXRlVHlwZTogImZvY3VzaW4iCisgICAgfSwKKyAgICBibHVyOiB7Cisg
ICAgdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisgICAgaWYgKCB0aGlzID09PSBkb2N1bWVudC5hY3Rp
dmVFbGVtZW50ICYmIHRoaXMuYmx1ciApIHsKKyAgICB0aGlzLmJsdXIoKTsKKyAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorICAgIH0sCisgICAgZGVsZWdhdGVUeXBlOiAiZm9jdXNvdXQiCisgICAg
fSwKKworICAgIGJlZm9yZXVubG9hZDogeworICAgIHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2
ZW50ICkgeworCisgICAgLy8gRXZlbiB3aGVuIHJldHVyblZhbHVlIGVxdWFscyB0byB1bmRlZmlu
ZWQgRmlyZWZveCB3aWxsIHN0aWxsIHNob3cgYWxlcnQKKyAgICBpZiAoIGV2ZW50LnJlc3VsdCAh
PT0gdW5kZWZpbmVkICkgeworICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBl
dmVudC5yZXN1bHQ7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfSwKKworICAgIHNpbXVsYXRl
OiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHsKKyAgICAvLyBQaWdneWJh
Y2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCisgICAgLy8g
RmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQg
aWYgdGhlCisgICAgLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBk
byB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuCisgICAgdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAorICAg
IG5ldyBqUXVlcnkuRXZlbnQoKSwKKyAgICBldmVudCwKKyAgICB7IHR5cGU6IHR5cGUsCisgICAg
aXNTaW11bGF0ZWQ6IHRydWUsCisgICAgb3JpZ2luYWxFdmVudDoge30KKyAgICB9CisgICAgKTsK
KyAgICBpZiAoIGJ1YmJsZSApIHsKKyAgICBqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwg
ZWxlbSApOworICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVs
ZW0sIGUgKTsKKyAgICB9CisgICAgaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgeworICAg
IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgfQorICAgIH0KK307CisKK2pRdWVyeS5yZW1v
dmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPworICAgIGZ1bmN0aW9uKCBl
bGVtLCB0eXBlLCBoYW5kbGUgKSB7CisgICAgaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIg
KSB7CisgICAgZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7
CisgICAgfQorICAgIH0gOgorICAgIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7Cisg
ICAgdmFyIG5hbWUgPSAib24iICsgdHlwZTsKKworICAgIGlmICggZWxlbS5kZXRhY2hFdmVudCAp
IHsKKworICAgIC8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1vcnkgbGVha3MgZm9yIGN1
c3RvbSBldmVudHMgaW4gSUU2LTgKKyAgICAvLyBkZXRhY2hFdmVudCBuZWVkZWQgcHJvcGVydHkg
b24gZWxlbWVudCwgYnkgbmFtZSBvZiB0aGF0IGV2ZW50LCB0byBwcm9wZXJseSBleHBvc2UgaXQg
dG8gR0MKKyAgICBpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09IGNvcmVfc3RydW5kZWZpbmVk
ICkgeworICAgIGVsZW1bIG5hbWUgXSA9IG51bGw7CisgICAgfQorCisgICAgZWxlbS5kZXRhY2hF
dmVudCggbmFtZSwgaGFuZGxlICk7CisgICAgfQorICAgIH07CisKK2pRdWVyeS5FdmVudCA9IGZ1
bmN0aW9uKCBzcmMsIHByb3BzICkgeworICAgIC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91
dCB0aGUgJ25ldycga2V5d29yZAorICAgIGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2
ZW50KSApIHsKKyAgICByZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOworICAg
IH0KKworICAgIC8vIEV2ZW50IG9iamVjdAorICAgIGlmICggc3JjICYmIHNyYy50eXBlICkgewor
ICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKyAgICB0aGlzLnR5cGUgPSBzcmMudHlwZTsK
KworICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBt
YXJrZWQgYXMgcHJldmVudGVkCisgICAgLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRy
ZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50
ZWQgPSAoIHNyYy5kZWZhdWx0UHJldmVudGVkIHx8IHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2Ug
fHwKKyAgICBzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkg
KSA/IHJldHVyblRydWUgOiByZXR1cm5GYWxzZTsKKworICAgIC8vIEV2ZW50IHR5cGUKKyAgICB9
IGVsc2UgeworICAgIHRoaXMudHlwZSA9IHNyYzsKKyAgICB9CisKKyAgICAvLyBQdXQgZXhwbGlj
aXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdAorICAgIGlmICgg
cHJvcHMgKSB7CisgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKKyAgICB9CisKKyAg
ICAvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9u
ZQorICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5v
dygpOworCisgICAgLy8gTWFyayBpdCBhcyBmaXhlZAorICAgIHRoaXNbIGpRdWVyeS5leHBhbmRv
IF0gPSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRz
IGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisvLyBodHRw
Oi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21h
LXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CisgICAgaXNE
ZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKyAgICBpc1Byb3BhZ2F0aW9uU3RvcHBlZDog
cmV0dXJuRmFsc2UsCisgICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZh
bHNlLAorCisgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBlID0gdGhp
cy5vcmlnaW5hbEV2ZW50OworCisgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5U
cnVlOworICAgIGlmICggIWUgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHBy
ZXZlbnREZWZhdWx0IGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAorICAgIGlm
ICggZS5wcmV2ZW50RGVmYXVsdCApIHsKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisKKyAgICAv
LyBTdXBwb3J0OiBJRQorICAgIC8vIE90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3Bl
cnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZQorICAgIH0gZWxzZSB7CisgICAgZS5y
ZXR1cm5WYWx1ZSA9IGZhbHNlOworICAgIH0KKyAgICB9LAorICAgIHN0b3BQcm9wYWdhdGlvbjog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CisKKyAgICB0aGlz
LmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKyAgICBpZiAoICFlICkgeworICAg
IHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cywgcnVuIGl0
IG9uIHRoZSBvcmlnaW5hbCBldmVudAorICAgIGlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7Cisg
ICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0OiBJRQorICAg
IC8vIFNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0
byB0cnVlCisgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlOworICAgIH0sCisgICAgc3RvcEltbWVk
aWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFn
YXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKyAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwor
ICAgIH0KK307CisKKy8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3Vz
ZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcworalF1ZXJ5LmVhY2goeworICAgIG1vdXNl
ZW50ZXI6ICJtb3VzZW92ZXIiLAorICAgIG1vdXNlbGVhdmU6ICJtb3VzZW91dCIKK30sIGZ1bmN0
aW9uKCBvcmlnLCBmaXggKSB7CisgICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsK
KyAgICBkZWxlZ2F0ZVR5cGU6IGZpeCwKKyAgICBiaW5kVHlwZTogZml4LAorCisgICAgaGFuZGxl
OiBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgdmFyIHJldCwKKyAgICB0YXJnZXQgPSB0aGlzLAor
ICAgIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAorICAgIGhhbmRsZU9iaiA9IGV2ZW50
LmhhbmRsZU9iajsKKworICAgIC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxl
ciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KKyAgICAvLyBOQjogTm8gcmVsYXRl
ZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdworICAg
IGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5z
KCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7CisgICAgZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmln
VHlwZTsKKyAgICByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRz
ICk7CisgICAgZXZlbnQudHlwZSA9IGZpeDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgICB9
CisgICAgfTsKK30pOworCisvLyBJRSBzdWJtaXQgZGVsZWdhdGlvbgoraWYgKCAhalF1ZXJ5LnN1
cHBvcnQuc3VibWl0QnViYmxlcyApIHsKKworICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1p
dCA9IHsKKyAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgLy8gT25seSBuZWVkIHRoaXMgZm9y
IGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKKyAgICBpZiAoIGpRdWVyeS5ub2RlTmFtZSgg
dGhpcywgImZvcm0iICkgKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIExh
enktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRhbnQgZm9ybSBtYXkgcG90ZW50
aWFsbHkgYmUgc3VibWl0dGVkCisgICAgalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImNsaWNrLl9z
dWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBlICkgeworICAgIC8vIE5vZGUgbmFt
ZSBjaGVjayBhdm9pZHMgYSBWTUwtcmVsYXRlZCBjcmFzaCBpbiBJRSAoIzk4MDcpCisgICAgdmFy
IGVsZW0gPSBlLnRhcmdldCwKKyAgICBmb3JtID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5w
dXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApID8gZWxlbS5mb3JtIDog
dW5kZWZpbmVkOworICAgIGlmICggZm9ybSAmJiAhalF1ZXJ5Ll9kYXRhKCBmb3JtLCAic3VibWl0
QnViYmxlcyIgKSApIHsKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCAic3VibWl0Ll9zdWJt
aXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVl
OworICAgIH0pOworICAgIGpRdWVyeS5fZGF0YSggZm9ybSwgInN1Ym1pdEJ1YmJsZXMiLCB0cnVl
ICk7CisgICAgfQorICAgIH0pOworICAgIC8vIHJldHVybiB1bmRlZmluZWQgc2luY2Ugd2UgZG9u
J3QgbmVlZCBhbiBldmVudCBsaXN0ZW5lcgorICAgIH0sCisKKyAgICBwb3N0RGlzcGF0Y2g6IGZ1
bmN0aW9uKCBldmVudCApIHsKKyAgICAvLyBJZiBmb3JtIHdhcyBzdWJtaXR0ZWQgYnkgdGhlIHVz
ZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWUKKyAgICBpZiAoIGV2ZW50Ll9zdWJtaXRf
YnViYmxlICkgeworICAgIGRlbGV0ZSBldmVudC5fc3VibWl0X2J1YmJsZTsKKyAgICBpZiAoIHRo
aXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgeworICAgIGpRdWVyeS5ldmVudC5z
aW11bGF0ZSggInN1Ym1pdCIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQsIHRydWUgKTsKKyAgICB9
CisgICAgfQorICAgIH0sCisKKyAgICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7CisgICAgLy8gT25s
eSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKKyAgICBpZiAoIGpR
dWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIC8vIFJlbW92ZSBkZWxlZ2F0ZWQgaGFuZGxlcnM7IGNsZWFuRGF0YSBldmVudHVh
bGx5IHJlYXBzIHN1Ym1pdCBoYW5kbGVycyBhdHRhY2hlZCBhYm92ZQorICAgIGpRdWVyeS5ldmVu
dC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKKyAgICB9CisgICAgfTsKK30KKworLy8gSUUg
Y2hhbmdlIGRlbGVnYXRpb24gYW5kIGNoZWNrYm94L3JhZGlvIGZpeAoraWYgKCAhalF1ZXJ5LnN1
cHBvcnQuY2hhbmdlQnViYmxlcyApIHsKKworICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsLmNoYW5n
ZSA9IHsKKworICAgIHNldHVwOiBmdW5jdGlvbigpIHsKKworICAgIGlmICggcmZvcm1FbGVtcy50
ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7CisgICAgLy8gSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBv
biBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQgb24gY2xpY2sKKyAgICAvLyBh
ZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hhbmdlIGluIHNwZWNpYWwuY2hh
bmdlLmhhbmRsZS4KKyAgICAvLyBUaGlzIHN0aWxsIGZpcmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRp
bWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuCisgICAgaWYgKCB0aGlzLnR5cGUgPT09ICJj
aGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgeworICAgIGpRdWVyeS5ldmVudC5h
ZGQoIHRoaXMsICJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGV2ZW50ICkgewor
ICAgIGlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUgPT09ICJjaGVja2VkIiAp
IHsKKyAgICB0aGlzLl9qdXN0X2NoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICB9KTsKKyAgICBq
UXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCAp
IHsKKyAgICBpZiAoIHRoaXMuX2p1c3RfY2hhbmdlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewor
ICAgIHRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOworICAgIH0KKyAgICAvLyBBbGxvdyB0cmln
Z2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDApCisgICAgalF1ZXJ5LmV2ZW50
LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUgKTsKKyAgICB9KTsKKyAgICB9
CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBEZWxlZ2F0ZWQgZXZlbnQ7IGxhenkt
YWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBpbnB1dHMKKyAgICBqUXVlcnkuZXZl
bnQuYWRkKCB0aGlzLCAiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsIGZ1bmN0aW9uKCBlICkgewor
ICAgIHZhciBlbGVtID0gZS50YXJnZXQ7CisKKyAgICBpZiAoIHJmb3JtRWxlbXMudGVzdCggZWxl
bS5ub2RlTmFtZSApICYmICFqUXVlcnkuX2RhdGEoIGVsZW0sICJjaGFuZ2VCdWJibGVzIiApICkg
eworICAgIGpRdWVyeS5ldmVudC5hZGQoIGVsZW0sICJjaGFuZ2UuX2NoYW5nZSIsIGZ1bmN0aW9u
KCBldmVudCApIHsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNTaW11bGF0
ZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKKyAgICBqUXVlcnkuZXZlbnQuc2ltdWxhdGUoICJj
aGFuZ2UiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7CisgICAgfQorICAgIH0pOwor
ICAgIGpRdWVyeS5fZGF0YSggZWxlbSwgImNoYW5nZUJ1YmJsZXMiLCB0cnVlICk7CisgICAgfQor
ICAgIH0pOworICAgIH0sCisKKyAgICBoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICB2
YXIgZWxlbSA9IGV2ZW50LnRhcmdldDsKKworICAgIC8vIFN3YWxsb3cgbmF0aXZlIGNoYW5nZSBl
dmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0cmlnZ2VyZWQgdGhlbSBhYm92
ZQorICAgIGlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1NpbXVsYXRlZCB8fCBldmVudC5p
c1RyaWdnZXIgfHwgKGVsZW0udHlwZSAhPT0gInJhZGlvIiAmJiBlbGVtLnR5cGUgIT09ICJjaGVj
a2JveCIpICkgeworICAgIHJldHVybiBldmVudC5oYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhp
cywgYXJndW1lbnRzICk7CisgICAgfQorICAgIH0sCisKKyAgICB0ZWFyZG93bjogZnVuY3Rpb24o
KSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5fY2hhbmdlIiApOworCisgICAg
cmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKKyAgICB9CisgICAgfTsK
K30KKworLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzCitpZiAoICFq
UXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKKyAgICBqUXVlcnkuZWFjaCh7IGZvY3Vz
OiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsK
KworICAgIC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciB3aGlsZSBzb21lb25l
IHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQKKyAgICB2YXIgYXR0YWNoZXMgPSAwLAorICAgIGhhbmRs
ZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgs
IGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwgdHJ1ZSApOworICAgIH07
CisKKyAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CisgICAgc2V0dXA6IGZ1bmN0
aW9uKCkgeworICAgIGlmICggYXR0YWNoZXMrKyA9PT0gMCApIHsKKyAgICBkb2N1bWVudC5hZGRF
dmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7CisgICAgfQorICAgIH0sCisgICAg
dGVhcmRvd246IGZ1bmN0aW9uKCkgeworICAgIGlmICggLS1hdHRhY2hlcyA9PT0gMCApIHsKKyAg
ICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7Cisg
ICAgfQorICAgIH0KKyAgICB9OworICAgIH0pOworfQorCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwor
ICAgIG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCov
IG9uZSApIHsKKyAgICB2YXIgdHlwZSwgb3JpZ0ZuOworCisgICAgLy8gVHlwZXMgY2FuIGJlIGEg
bWFwIG9mIHR5cGVzL2hhbmRsZXJzCisgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3Qi
ICkgeworICAgIC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCisgICAgaWYgKCB0
eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworICAgIC8vICggdHlwZXMtT2JqZWN0LCBk
YXRhICkKKyAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKKyAgICBzZWxlY3RvciA9IHVuZGVm
aW5lZDsKKyAgICB9CisgICAgZm9yICggdHlwZSBpbiB0eXBlcyApIHsKKyAgICB0aGlzLm9uKCB0
eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CisgICAgfQorICAgIHJl
dHVybiB0aGlzOworICAgIH0KKworICAgIGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwg
KSB7CisgICAgLy8gKCB0eXBlcywgZm4gKQorICAgIGZuID0gc2VsZWN0b3I7CisgICAgZGF0YSA9
IHNlbGVjdG9yID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7Cisg
ICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAgIC8vICggdHlwZXMs
IHNlbGVjdG9yLCBmbiApCisgICAgZm4gPSBkYXRhOworICAgIGRhdGEgPSB1bmRlZmluZWQ7Cisg
ICAgfSBlbHNlIHsKKyAgICAvLyAoIHR5cGVzLCBkYXRhLCBmbiApCisgICAgZm4gPSBkYXRhOwor
ICAgIGRhdGEgPSBzZWxlY3RvcjsKKyAgICBzZWxlY3RvciA9IHVuZGVmaW5lZDsKKyAgICB9Cisg
ICAgfQorICAgIGlmICggZm4gPT09IGZhbHNlICkgeworICAgIGZuID0gcmV0dXJuRmFsc2U7Cisg
ICAgfSBlbHNlIGlmICggIWZuICkgeworICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlm
ICggb25lID09PSAxICkgeworICAgIG9yaWdGbiA9IGZuOworICAgIGZuID0gZnVuY3Rpb24oIGV2
ZW50ICkgeworICAgIC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlu
cyB0aGUgaW5mbworICAgIGpRdWVyeSgpLm9mZiggZXZlbnQgKTsKKyAgICByZXR1cm4gb3JpZ0Zu
LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKyAgICB9OworICAgIC8vIFVzZSBzYW1lIGd1aWQg
c28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisgICAgZm4uZ3VpZCA9IG9yaWdGbi5n
dWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7CisgICAgfQorICAgIHJldHVy
biB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5
cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKKyAgICB9KTsKKyAgICB9LAorICAgIG9uZTogZnVu
Y3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CisgICAgcmV0dXJuIHRoaXMub24o
IHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsKKyAgICB9LAorICAgIG9mZjogZnVuY3Rp
b24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7CisgICAgdmFyIGhhbmRsZU9iaiwgdHlwZTsKKyAg
ICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiAp
IHsKKyAgICAvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50CisgICAgaGFuZGxl
T2JqID0gdHlwZXMuaGFuZGxlT2JqOworICAgIGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQg
KS5vZmYoCisgICAgaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArICIu
IiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3JpZ1R5cGUsCisgICAgaGFuZGxl
T2JqLnNlbGVjdG9yLAorICAgIGhhbmRsZU9iai5oYW5kbGVyCisgICAgKTsKKyAgICByZXR1cm4g
dGhpczsKKyAgICB9CisgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgeworICAg
IC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCisgICAgZm9yICggdHlwZSBpbiB0eXBl
cyApIHsKKyAgICB0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTsKKyAg
ICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmICggc2VsZWN0b3IgPT09IGZhbHNl
IHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsKKyAgICAvLyAoIHR5cGVzIFss
IGZuXSApCisgICAgZm4gPSBzZWxlY3RvcjsKKyAgICBzZWxlY3RvciA9IHVuZGVmaW5lZDsKKyAg
ICB9CisgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgZm4gPSByZXR1cm5GYWxzZTsKKyAg
ICB9CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICBqUXVlcnkuZXZlbnQu
cmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7CisgICAgfSk7CisgICAgfSwKKwor
ICAgIGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7CisgICAgcmV0dXJuIHRoaXMu
b24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgdW5iaW5kOiBmdW5jdGlv
biggdHlwZXMsIGZuICkgeworICAgIHJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7
CisgICAgfSwKKworICAgIGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRh
LCBmbiApIHsKKyAgICByZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiAp
OworICAgIH0sCisgICAgdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4g
KSB7CisgICAgLy8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQor
ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNlbGVjdG9yLCAi
KioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIsIGZuICk7CisgICAgfSwK
KworICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworICAgIHJldHVybiB0aGlz
LmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEs
IHRoaXMgKTsKKyAgICB9KTsKKyAgICB9LAorICAgIHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbigg
dHlwZSwgZGF0YSApIHsKKyAgICB2YXIgZWxlbSA9IHRoaXNbMF07CisgICAgaWYgKCBlbGVtICkg
eworICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1
ZSApOworICAgIH0KKyAgICB9Cit9KTsKKy8qIQorICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdp
bmUKKyAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmli
dXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICogaHR0cDovL3Npenps
ZWpzLmNvbS8KKyAqLworKGZ1bmN0aW9uKCB3aW5kb3csIHVuZGVmaW5lZCApIHsKKwordmFyIGks
CisgICAgY2FjaGVkcnVucywKKyAgICBFeHByLAorICAgIGdldFRleHQsCisgICAgaXNYTUwsCisg
ICAgY29tcGlsZSwKKyAgICBoYXNEdXBsaWNhdGUsCisgICAgb3V0ZXJtb3N0Q29udGV4dCwKKwor
ICAgIC8vIExvY2FsIGRvY3VtZW50IHZhcnMKKyAgICBzZXREb2N1bWVudCwKKyAgICBkb2N1bWVu
dCwKKyAgICBkb2NFbGVtLAorICAgIGRvY3VtZW50SXNYTUwsCisgICAgcmJ1Z2d5UVNBLAorICAg
IHJidWdneU1hdGNoZXMsCisgICAgbWF0Y2hlcywKKyAgICBjb250YWlucywKKyAgICBzb3J0T3Jk
ZXIsCisKKyAgICAvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCisgICAgZXhwYW5kbyA9ICJzaXp6
bGUiICsgLShuZXcgRGF0ZSgpKSwKKyAgICBwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQs
CisgICAgc3VwcG9ydCA9IHt9LAorICAgIGRpcnJ1bnMgPSAwLAorICAgIGRvbmUgPSAwLAorICAg
IGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNo
ZSgpLAorICAgIGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorCisgICAgLy8gR2VuZXJh
bC1wdXJwb3NlIGNvbnN0YW50cworICAgIHN0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQs
CisgICAgTUFYX05FR0FUSVZFID0gMSA8PCAzMSwKKworICAgIC8vIEFycmF5IG1ldGhvZHMKKyAg
ICBhcnIgPSBbXSwKKyAgICBwb3AgPSBhcnIucG9wLAorICAgIHB1c2ggPSBhcnIucHVzaCwKKyAg
ICBzbGljZSA9IGFyci5zbGljZSwKKyAgICAvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2Yg
aWYgd2UgY2FuJ3QgdXNlIGEgbmF0aXZlIG9uZQorICAgIGluZGV4T2YgPSBhcnIuaW5kZXhPZiB8
fCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgbGVuID0gdGhpcy5sZW5n
dGg7CisgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgaWYgKCB0aGlzW2ldID09PSBl
bGVtICkgeworICAgIHJldHVybiBpOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworICAg
IH0sCisKKworICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMKKworICAgIC8vIFdoaXRlc3BhY2Ug
Y2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFj
ZQorICAgIHdoaXRlc3BhY2UgPSAiW1xceDIwXFx0XFxyXFxuXFxmXSIsCisgICAgLy8gaHR0cDov
L3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2NoYXJhY3RlcnMKKyAgICBjaGFyYWN0ZXJFbmNv
ZGluZyA9ICIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsCisKKyAgICAvLyBMb29z
ZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVycworICAgIC8vIEFuIHVucXVv
dGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlmaWVyIGh0dHA6Ly93d3cudzMub3JnL1RS
L2NzczMtc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisgICAgLy8gUHJvcGVyIHN5bnRh
eDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVu
dGlmaWVyCisgICAgaWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoICJ3Iiwg
IncjIiApLAorCisgICAgLy8gQWNjZXB0YWJsZSBvcGVyYXRvcnMgaHR0cDovL3d3dy53My5vcmcv
VFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisgICAgb3BlcmF0b3JzID0gIihbKl4k
fCF+XT89KSIsCisgICAgYXR0cmlidXRlcyA9ICJcXFsiICsgd2hpdGVzcGFjZSArICIqKCIgKyBj
aGFyYWN0ZXJFbmNvZGluZyArICIpIiArIHdoaXRlc3BhY2UgKworICAgICIqKD86IiArIG9wZXJh
dG9ycyArIHdoaXRlc3BhY2UgKyAiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8
KCIgKyBpZGVudGlmaWVyICsgIil8KXwpIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsCisKKyAgICAv
LyBQcmVmZXIgYXJndW1lbnRzIHF1b3RlZCwKKyAgICAvLyAgIHRoZW4gbm90IGNvbnRhaW5pbmcg
cHNldWRvcy9icmFja2V0cywKKyAgICAvLyAgIHRoZW4gYXR0cmlidXRlIHNlbGVjdG9ycy9ub24t
cGFyZW50aGV0aWNhbCBleHByZXNzaW9ucywKKyAgICAvLyAgIHRoZW4gYW55dGhpbmcgZWxzZQor
ICAgIC8vIFRoZXNlIHByZWZlcmVuY2VzIGFyZSBoZXJlIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9m
IHNlbGVjdG9ycworICAgIC8vICAgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgUFNFVURPIHByZUZp
bHRlcgorICAgIHBzZXVkb3MgPSAiOigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSg/OlxcKCgo
WydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIg
KyBhdHRyaWJ1dGVzLnJlcGxhY2UoIDMsIDggKSArICIpKil8LiopXFwpfCkiLAorCisgICAgLy8g
TGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNv
bWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgorICAgIHJ0
cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86
XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAorCisgICAgcmNvbW1hID0gbmV3
IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqLCIgKyB3aGl0ZXNwYWNlICsgIioiICksCisg
ICAgcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFtcXHgy
MFxcdFxcclxcblxcZj4rfl0pIiArIHdoaXRlc3BhY2UgKyAiKiIgKSwKKyAgICBycHNldWRvID0g
bmV3IFJlZ0V4cCggcHNldWRvcyApLAorICAgIHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggIl4i
ICsgaWRlbnRpZmllciArICIkIiApLAorCisgICAgbWF0Y2hFeHByID0geworICAgICJJRCI6IG5l
dyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKKyAgICAiQ0xBU1Mi
OiBuZXcgUmVnRXhwKCAiXlxcLigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKKyAgICAi
TkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wiXT8oIiArIGNoYXJhY3RlckVuY29kaW5n
ICsgIilbJ1wiXT9cXF0iICksCisgICAgIlRBRyI6IG5ldyBSZWdFeHAoICJeKCIgKyBjaGFyYWN0
ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3KiIgKSArICIpIiApLAorICAgICJBVFRSIjogbmV3
IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAorICAgICJQU0VVRE8iOiBuZXcgUmVnRXhwKCAi
XiIgKyBwc2V1ZG9zICksCisgICAgIkNISUxEIjogbmV3IFJlZ0V4cCggIl46KG9ubHl8Zmlyc3R8
bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIgKyB3aGl0ZXNwYWNlICsK
KyAgICAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzoo
WystXXwpIiArIHdoaXRlc3BhY2UgKworICAgICIqKFxcZCspfCkpIiArIHdoaXRlc3BhY2UgKyAi
KlxcKXwpIiwgImkiICksCisgICAgLy8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5n
IC5pcygpCisgICAgLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YAor
ICAgICJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIipbPit+
XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIgKworICAgIHdoaXRl
c3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18
JCkiLCAiaSIgKQorICAgIH0sCisKKyAgICByc2libGluZyA9IC9bXHgyMFx0XHJcblxmXSpbK35d
LywKKworICAgIHJuYXRpdmUgPSAvXltee10rXHtccypcW25hdGl2ZSBjb2RlLywKKworICAgIC8v
IEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9y
cworICAgIHJxdWlja0V4cHIgPSAvXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLAor
CisgICAgcmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksCisg
ICAgcmhlYWRlciA9IC9eaFxkJC9pLAorCisgICAgcmVzY2FwZSA9IC8nfFxcL2csCisgICAgcmF0
dHJpYnV0ZVF1b3RlcyA9IC9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJcblxm
XSpcXS9nLAorCisgICAgLy8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEv
c3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVycworICAgIHJ1bmVzY2FwZSA9IC9cXChbXGRh
LWZBLUZdezEsNn1bXHgyMFx0XHJcblxmXT98LikvZywKKyAgICBmdW5lc2NhcGUgPSBmdW5jdGlv
biggXywgZXNjYXBlZCApIHsKKyAgICB2YXIgaGlnaCA9ICIweCIgKyBlc2NhcGVkIC0gMHgxMDAw
MDsKKyAgICAvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAorICAgIHJldHVybiBoaWdoICE9PSBo
aWdoID8KKyAgICBlc2NhcGVkIDoKKyAgICAvLyBCTVAgY29kZXBvaW50CisgICAgaGlnaCA8IDAg
PworICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOgorICAgIC8vIFN1
cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQorICAgIFN0cmluZy5m
cm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCAp
OworICAgIH07CisKKy8vIFVzZSBhIHN0cmlwcGVkLWRvd24gc2xpY2UgaWYgd2UgY2FuJ3QgdXNl
IGEgbmF0aXZlIG9uZQordHJ5IHsKKyAgICBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuZG9jdW1l
bnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKK30gY2F0Y2ggKCBlICkgewor
ICAgIHNsaWNlID0gZnVuY3Rpb24oIGkgKSB7CisgICAgdmFyIGVsZW0sCisgICAgcmVzdWx0cyA9
IFtdOworICAgIHdoaWxlICggKGVsZW0gPSB0aGlzW2krK10pICkgeworICAgIHJlc3VsdHMucHVz
aCggZWxlbSApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9OworfQorCisvKioK
KyAqIEZvciBmZWF0dXJlIGRldGVjdGlvbgorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1
bmN0aW9uIHRvIHRlc3QgZm9yIG5hdGl2ZSBzdXBwb3J0CisgKi8KK2Z1bmN0aW9uIGlzTmF0aXZl
KCBmbiApIHsKKyAgICByZXR1cm4gcm5hdGl2ZS50ZXN0KCBmbiArICIiICk7Cit9CisKKy8qKgor
ICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCisgKiBAcmV0dXJucyB7
RnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBz
dG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoCisgKiAgICBwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Ut
c3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNh
Y2hlTGVuZ3RoKQorICogICAgZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQorICovCitmdW5jdGlv
biBjcmVhdGVDYWNoZSgpIHsKKyAgICB2YXIgY2FjaGUsCisgICAga2V5cyA9IFtdOworCisgICAg
cmV0dXJuIChjYWNoZSA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworICAgIC8vIFVzZSAoa2V5
ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRp
ZXMgKHNlZSBJc3N1ZSAjMTU3KQorICAgIGlmICgga2V5cy5wdXNoKCBrZXkgKz0gIiAiICkgPiBF
eHByLmNhY2hlTGVuZ3RoICkgeworICAgIC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50
cmllcworICAgIGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07CisgICAgfQorICAgIHJldHVy
biAoY2FjaGVbIGtleSBdID0gdmFsdWUpOworICAgIH0pOworfQorCisvKioKKyAqIE1hcmsgYSBm
dW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBm
biBUaGUgZnVuY3Rpb24gdG8gbWFyaworICovCitmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkg
eworICAgIGZuWyBleHBhbmRvIF0gPSB0cnVlOworICAgIHJldHVybiBmbjsKK30KKworLyoqCisg
KiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAorICogQHBhcmFtIHtGdW5jdGlvbn0g
Zm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJvb2xlYW4gcmVzdWx0Cisg
Ki8KK2Z1bmN0aW9uIGFzc2VydCggZm4gKSB7CisgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoImRpdiIpOworCisgICAgdHJ5IHsKKyAgICByZXR1cm4gZm4oIGRpdiApOworICAg
IH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfSBmaW5hbGx5IHsKKyAgICAv
LyByZWxlYXNlIG1lbW9yeSBpbiBJRQorICAgIGRpdiA9IG51bGw7CisgICAgfQorfQorCitmdW5j
dGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgeworICAgIHZh
ciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsCisgICAgLy8gUVNBIHZhcnMKKyAgICBpLCBncm91
cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsKKworICAgIGlmICggKCBjb250
ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAh
PT0gZG9jdW1lbnQgKSB7CisgICAgc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKKyAgICB9CisKKyAg
ICBjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKyAgICByZXN1bHRzID0gcmVzdWx0cyB8
fCBbXTsKKworICAgIGlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmlu
ZyIgKSB7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgaWYgKCAobm9kZVR5cGUg
PSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHsKKyAgICByZXR1
cm4gW107CisgICAgfQorCisgICAgaWYgKCAhZG9jdW1lbnRJc1hNTCAmJiAhc2VlZCApIHsKKwor
ICAgIC8vIFNob3J0Y3V0cworICAgIGlmICggKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxl
Y3RvciApKSApIHsKKyAgICAvLyBTcGVlZC11cDogU2l6emxlKCIjSUQiKQorICAgIGlmICggKG0g
PSBtYXRjaFsxXSkgKSB7CisgICAgaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKKyAgICBlbGVtID0g
Y29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApOworICAgIC8vIENoZWNrIHBhcmVudE5vZGUgdG8g
Y2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAgLy8gbm9kZXMgdGhhdCBhcmUg
bm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgIGlmICggZWxlbSAmJiBlbGVtLnBh
cmVudE5vZGUgKSB7CisgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5k
IFdlYmtpdCByZXR1cm4gaXRlbXMKKyAgICAvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKKyAgICBp
ZiAoIGVsZW0uaWQgPT09IG0gKSB7CisgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7CisgICAgcmV0
dXJuIHJlc3VsdHM7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdHM7Cisg
ICAgfQorICAgIH0gZWxzZSB7CisgICAgLy8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudAorICAg
IGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCisgICAgY29udGFpbnMoIGNvbnRleHQsIGVsZW0g
KSAmJiBlbGVtLmlkID09PSBtICkgeworICAgIHJlc3VsdHMucHVzaCggZWxlbSApOworICAgIHJl
dHVybiByZXN1bHRzOworICAgIH0KKyAgICB9CisKKyAgICAvLyBTcGVlZC11cDogU2l6emxlKCJU
QUciKQorICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgeworICAgIHB1c2guYXBwbHkoIHJlc3Vs
dHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSwg
MCkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKworICAgIC8vIFNwZWVkLXVwOiBTaXp6bGUoIi5D
TEFTUyIpCisgICAgfSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRCeUNs
YXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CisgICAgcHVzaC5h
cHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUo
IG0gKSwgMCkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisgICAgfQorCisgICAgLy8g
UVNBIHBhdGgKKyAgICBpZiAoIHN1cHBvcnQucXNhICYmICFyYnVnZ3lRU0EudGVzdChzZWxlY3Rv
cikgKSB7CisgICAgb2xkID0gdHJ1ZTsKKyAgICBuaWQgPSBleHBhbmRvOworICAgIG5ld0NvbnRl
eHQgPSBjb250ZXh0OworICAgIG5ld1NlbGVjdG9yID0gbm9kZVR5cGUgPT09IDkgJiYgc2VsZWN0
b3I7CisKKyAgICAvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJp
ZXMKKyAgICAvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJh
IElEIG9uIHRoZSByb290CisgICAgLy8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtz
IHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCisgICAgLy8gSUUgOCBkb2Vzbid0
IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCisgICAgaWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250
ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3QiICkgeworICAgIGdyb3VwcyA9
IHRva2VuaXplKCBzZWxlY3RvciApOworCisgICAgaWYgKCAob2xkID0gY29udGV4dC5nZXRBdHRy
aWJ1dGUoImlkIikpICkgeworICAgIG5pZCA9IG9sZC5yZXBsYWNlKCByZXNjYXBlLCAiXFwkJiIg
KTsKKyAgICB9IGVsc2UgeworICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsK
KyAgICB9CisgICAgbmlkID0gIltpZD0nIiArIG5pZCArICInXSAiOworCisgICAgaSA9IGdyb3Vw
cy5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgZ3JvdXBzW2ldID0gbmlkICsgdG9T
ZWxlY3RvciggZ3JvdXBzW2ldICk7CisgICAgfQorICAgIG5ld0NvbnRleHQgPSByc2libGluZy50
ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0OworICAgIG5l
d1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIiwiKTsKKyAgICB9CisKKyAgICBpZiAoIG5ld1NlbGVj
dG9yICkgeworICAgIHRyeSB7CisgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbCgg
bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKAorICAgIG5ld1NlbGVjdG9yCisgICAgKSwgMCAp
ICk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSBjYXRjaChxc2FFcnJvcikgeworICAgIH0g
ZmluYWxseSB7CisgICAgaWYgKCAhb2xkICkgeworICAgIGNvbnRleHQucmVtb3ZlQXR0cmlidXRl
KCJpZCIpOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGwg
b3RoZXJzCisgICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIg
KSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOworfQorCisvKioKKyAqIERldGVjdCB4bWwKKyAq
IEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50Cisg
Ki8KK2lzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gZG9j
dW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBl
eGlzdAorICAgIC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKQorICAg
IHZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxl
bSkuZG9jdW1lbnRFbGVtZW50OworICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVu
dEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiA6IGZhbHNlOworfTsKKworLyoqCisgKiBTZXRz
IGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9j
dW1lbnQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9j
dW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CisgKiBAcmV0dXJucyB7T2Jq
ZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50CisgKi8KK3NldERvY3VtZW50ID0gU2l6
emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7CisgICAgdmFyIGRvYyA9IG5vZGUg
PyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKKworICAgIC8vIElm
IG5vIGRvY3VtZW50IGFuZCBkb2N1bWVudEVsZW1lbnQgaXMgYXZhaWxhYmxlLCByZXR1cm4KKyAg
ICBpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9j
dW1lbnRFbGVtZW50ICkgeworICAgIHJldHVybiBkb2N1bWVudDsKKyAgICB9CisKKyAgICAvLyBT
ZXQgb3VyIGRvY3VtZW50CisgICAgZG9jdW1lbnQgPSBkb2M7CisgICAgZG9jRWxlbSA9IGRvYy5k
b2N1bWVudEVsZW1lbnQ7CisKKyAgICAvLyBTdXBwb3J0IHRlc3RzCisgICAgZG9jdW1lbnRJc1hN
TCA9IGlzWE1MKCBkb2MgKTsKKworICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1l
KCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzCisgICAgc3VwcG9ydC50YWdOYW1lTm9Db21tZW50
cyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworICAgIGRpdi5hcHBlbmRDaGlsZCggZG9jLmNy
ZWF0ZUNvbW1lbnQoIiIpICk7CisgICAgcmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUo
IioiKS5sZW5ndGg7CisgICAgfSk7CisKKyAgICAvLyBDaGVjayBpZiBhdHRyaWJ1dGVzIHNob3Vs
ZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzCisgICAgc3VwcG9ydC5hdHRyaWJ1dGVz
ID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisgICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0
Pjwvc2VsZWN0PiI7CisgICAgdmFyIHR5cGUgPSB0eXBlb2YgZGl2Lmxhc3RDaGlsZC5nZXRBdHRy
aWJ1dGUoIm11bHRpcGxlIik7CisgICAgLy8gSUU4IHJldHVybnMgYSBzdHJpbmcgZm9yIHNvbWUg
YXR0cmlidXRlcyBldmVuIHdoZW4gbm90IHByZXNlbnQKKyAgICByZXR1cm4gdHlwZSAhPT0gImJv
b2xlYW4iICYmIHR5cGUgIT09ICJzdHJpbmciOworICAgIH0pOworCisgICAgLy8gQ2hlY2sgaWYg
Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSBjYW4gYmUgdHJ1c3RlZAorICAgIHN1cHBvcnQuZ2V0QnlD
bGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBPcGVyYSBjYW4ndCBm
aW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQorICAgIGRpdi5pbm5lckhUTUwgPSAiPGRp
diBjbGFzcz0naGlkZGVuIGUnPjwvZGl2PjxkaXYgY2xhc3M9J2hpZGRlbic+PC9kaXY+IjsKKyAg
ICBpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCAhZGl2LmdldEVsZW1lbnRzQnlD
bGFzc05hbWUoImUiKS5sZW5ndGggKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IC8vIFNhZmFyaSAzLjIgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMgYW5kIGRvZXNuJ3QgY2F0Y2gg
Y2hhbmdlcworICAgIGRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOworICAgIHJldHVybiBk
aXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMjsKKyAgICB9KTsKKwor
ICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZQor
ICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZpbGVnZXMgZm9ybSBjb250cm9s
cyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElECisgICAgc3VwcG9ydC5nZXRCeU5hbWUgPSBhc3Nl
cnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBJbmplY3QgY29udGVudAorICAgIGRpdi5pZCA9
IGV4cGFuZG8gKyAwOworICAgIGRpdi5pbm5lckhUTUwgPSAiPGEgbmFtZT0nIiArIGV4cGFuZG8g
KyAiJz48L2E+PGRpdiBuYW1lPSciICsgZXhwYW5kbyArICInPjwvZGl2PiI7CisgICAgZG9jRWxl
bS5pbnNlcnRCZWZvcmUoIGRpdiwgZG9jRWxlbS5maXJzdENoaWxkICk7CisKKyAgICAvLyBUZXN0
CisgICAgdmFyIHBhc3MgPSBkb2MuZ2V0RWxlbWVudHNCeU5hbWUgJiYKKyAgICAvLyBidWdneSBi
cm93c2VycyB3aWxsIHJldHVybiBmZXdlciB0aGFuIHRoZSBjb3JyZWN0IDIKKyAgICBkb2MuZ2V0
RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGggPT09IDIgKworICAgIC8vIGJ1Z2d5IGJy
b3dzZXJzIHdpbGwgcmV0dXJuIG1vcmUgdGhhbiB0aGUgY29ycmVjdCAwCisgICAgZG9jLmdldEVs
ZW1lbnRzQnlOYW1lKCBleHBhbmRvICsgMCApLmxlbmd0aDsKKyAgICBzdXBwb3J0LmdldElkTm90
TmFtZSA9ICFkb2MuZ2V0RWxlbWVudEJ5SWQoIGV4cGFuZG8gKTsKKworICAgIC8vIENsZWFudXAK
KyAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBkaXYgKTsKKworICAgIHJldHVybiBwYXNzOworICAg
IH0pOworCisgICAgLy8gSUU2LzcgcmV0dXJuIG1vZGlmaWVkIGF0dHJpYnV0ZXMKKyAgICBFeHBy
LmF0dHJIYW5kbGUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICBkaXYuaW5uZXJIVE1M
ID0gIjxhIGhyZWY9JyMnPjwvYT4iOworICAgIHJldHVybiBkaXYuZmlyc3RDaGlsZCAmJiB0eXBl
b2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYKKyAgICBk
aXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIiMiOworICAgIH0pID8KKyAg
ICB7fSA6CisgICAgeworICAgICJocmVmIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJu
IGVsZW0uZ2V0QXR0cmlidXRlKCAiaHJlZiIsIDIgKTsKKyAgICB9LAorICAgICJ0eXBlIjogZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7Cisg
ICAgfQorICAgIH07CisKKyAgICAvLyBJRCBmaW5kIGFuZCBmaWx0ZXIKKyAgICBpZiAoIHN1cHBv
cnQuZ2V0SWROb3ROYW1lICkgeworICAgIEV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwg
Y29udGV4dCApIHsKKyAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBz
dHJ1bmRlZmluZWQgJiYgIWRvY3VtZW50SXNYTUwgKSB7CisgICAgdmFyIG0gPSBjb250ZXh0Lmdl
dEVsZW1lbnRCeUlkKCBpZCApOworICAgIC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hl
biBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAgLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2Vy
IGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgIHJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFtt
XSA6IFtdOworICAgIH0KKyAgICB9OworICAgIEV4cHIuZmlsdGVyWyJJRCJdID0gZnVuY3Rpb24o
IGlkICkgeworICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2Fw
ZSApOworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbS5nZXRB
dHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKKyAgICB9OworICAgIH07CisgICAgfSBlbHNlIHsK
KyAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7CisgICAgaWYg
KCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmICFkb2N1
bWVudElzWE1MICkgeworICAgIHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsK
KworICAgIHJldHVybiBtID8KKyAgICBtLmlkID09PSBpZCB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1
dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLnZhbHVl
ID09PSBpZCA/CisgICAgW21dIDoKKyAgICB1bmRlZmluZWQgOgorICAgIFtdOworICAgIH0KKyAg
ICB9OworICAgIEV4cHIuZmlsdGVyWyJJRCJdID0gIGZ1bmN0aW9uKCBpZCApIHsKKyAgICB2YXIg
YXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKKyAgICByZXR1cm4g
ZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1
dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwor
ICAgIHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDsKKyAgICB9OworICAgIH07
CisgICAgfQorCisgICAgLy8gVGFnCisgICAgRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQudGFn
TmFtZU5vQ29tbWVudHMgPworICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CisgICAgaWYg
KCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkg
eworICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKKyAgICB9
CisgICAgfSA6CisgICAgZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKKyAgICB2YXIgZWxlbSwK
KyAgICB0bXAgPSBbXSwKKyAgICBpID0gMCwKKyAgICByZXN1bHRzID0gY29udGV4dC5nZXRFbGVt
ZW50c0J5VGFnTmFtZSggdGFnICk7CisKKyAgICAvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1l
bnRzCisgICAgaWYgKCB0YWcgPT09ICIqIiApIHsKKyAgICB3aGlsZSAoIChlbGVtID0gcmVzdWx0
c1tpKytdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisgICAgdG1wLnB1
c2goIGVsZW0gKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgfTsKKworICAgIC8vIE5hbWUKKyAgICBFeHByLmZpbmRbIk5B
TUUiXSA9IHN1cHBvcnQuZ2V0QnlOYW1lICYmIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7Cisg
ICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gc3RydW5kZWZpbmVk
ICkgeworICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBuYW1lICk7CisgICAg
fQorICAgIH07CisKKyAgICAvLyBDbGFzcworICAgIEV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBv
cnQuZ2V0QnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHsKKyAg
ICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IHN0cnVuZGVm
aW5lZCAmJiAhZG9jdW1lbnRJc1hNTCApIHsKKyAgICByZXR1cm4gY29udGV4dC5nZXRFbGVtZW50
c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsKKyAgICB9CisgICAgfTsKKworICAgIC8vIFFTQSBh
bmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKKworICAgIC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0
aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpCisgICAgcmJ1Z2d5
TWF0Y2hlcyA9IFtdOworCisgICAgLy8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRy
dWUgKENocm9tZSAyMSksCisgICAgLy8gbm8gbmVlZCB0byBhbHNvIGFkZCB0byBidWdneU1hdGNo
ZXMgc2luY2UgbWF0Y2hlcyBjaGVja3MgYnVnZ3lRU0EKKyAgICAvLyBBIHN1cHBvcnQgdGVzdCB3
b3VsZCByZXF1aXJlIHRvbyBtdWNoIGNvZGUgKHdvdWxkIGluY2x1ZGUgZG9jdW1lbnQgcmVhZHkp
CisgICAgcmJ1Z2d5UVNBID0gWyAiOmZvY3VzIiBdOworCisgICAgaWYgKCAoc3VwcG9ydC5xc2Eg
PSBpc05hdGl2ZShkb2MucXVlcnlTZWxlY3RvckFsbCkpICkgeworICAgIC8vIEJ1aWxkIFFTQSBy
ZWdleAorICAgIC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmkKKyAg
ICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5
IHN0cmluZyBvbiBwdXJwb3NlCisgICAgLy8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50
IG9mIG5vdCBleHBsaWN0bHkKKyAgICAvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJp
YnV0ZSwKKyAgICAvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaAorICAgIC8v
IGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5CisgICAgZGl2LmlubmVySFRNTCA9
ICI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKKworICAg
IC8vIElFOCAtIFNvbWUgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0
bHkKKyAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCAp
IHsKKyAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzpjaGVja2Vk
fGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIgKTsKKyAg
ICB9CisKKyAgICAvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVj
dGVkIG9wdGlvbiBlbGVtZW50cworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVD
LWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCisgICAgLy8gSUU4IHRocm93cyBlcnJv
ciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKKyAgICBpZiAoICFkaXYucXVlcnlT
ZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CisgICAgcmJ1Z2d5UVNBLnB1c2goIjpj
aGVja2VkIik7CisgICAgfQorICAgIH0pOworCisgICAgYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7
CisKKyAgICAvLyBPcGVyYSAxMC0xMi9JRTggLSBePSAkPSAqPSBhbmQgZW1wdHkgdmFsdWVzCisg
ICAgLy8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmcKKyAgICBkaXYuaW5uZXJIVE1MID0gIjxp
bnB1dCB0eXBlPSdoaWRkZW4nIGk9JycvPiI7CisgICAgaWYgKCBkaXYucXVlcnlTZWxlY3RvckFs
bCgiW2lePScnXSIpLmxlbmd0aCApIHsKKyAgICByYnVnZ3lRU0EucHVzaCggIlsqXiRdPSIgKyB3
aGl0ZXNwYWNlICsgIiooPzpcIlwifCcnKSIgKTsKKyAgICB9CisKKyAgICAvLyBGRiAzLjUgLSA6
ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFy
ZSBzdGlsbCBlbmFibGVkKQorICAgIC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBu
b3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFi
bGVkIikubGVuZ3RoICkgeworICAgIHJidWdneVFTQS5wdXNoKCAiOmVuYWJsZWQiLCAiOmRpc2Fi
bGVkIiApOworICAgIH0KKworICAgIC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBv
c3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCisgICAgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngi
KTsKKyAgICByYnVnZ3lRU0EucHVzaCgiLC4qOiIpOworICAgIH0pOworICAgIH0KKworICAgIGlm
ICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gaXNOYXRpdmUoIChtYXRjaGVzID0gZG9jRWxl
bS5tYXRjaGVzU2VsZWN0b3IgfHwKKyAgICBkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fAor
ICAgIGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8CisgICAgZG9jRWxlbS5vTWF0Y2hl
c1NlbGVjdG9yIHx8CisgICAgZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CisKKyAg
ICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBw
b3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3IKKyAgICAvLyBvbiBhIGRpc2Nvbm5lY3RlZCBu
b2RlIChJRSA5KQorICAgIHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwo
IGRpdiwgImRpdiIgKTsKKworICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRp
b24KKyAgICAvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkCisg
ICAgbWF0Y2hlcy5jYWxsKCBkaXYsICJbcyE9JyddOngiICk7CisgICAgcmJ1Z2d5TWF0Y2hlcy5w
dXNoKCAiIT0iLCBwc2V1ZG9zICk7CisgICAgfSk7CisgICAgfQorCisgICAgcmJ1Z2d5UVNBID0g
bmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oInwiKSApOworICAgIHJidWdneU1hdGNoZXMgPSBu
ZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOworCisgICAgLy8gRWxlbWVudCBj
b250YWlucyBhbm90aGVyCisgICAgLy8gUHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxlbWVudCBp
bmNsdXNpdmUgZGVzY2VuZGVudAorICAgIC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNv
bnRhaW4gaXRzZWxmCisgICAgY29udGFpbnMgPSBpc05hdGl2ZShkb2NFbGVtLmNvbnRhaW5zKSB8
fCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8KKyAgICBmdW5jdGlvbiggYSwgYiAp
IHsKKyAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQg
OiBhLAorICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOworICAgIHJldHVybiBhID09PSBidXAg
fHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKAorICAgIGFkb3duLmNvbnRhaW5z
ID8KKyAgICBhZG93bi5jb250YWlucyggYnVwICkgOgorICAgIGEuY29tcGFyZURvY3VtZW50UG9z
aXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgorICAgICkpOwor
ICAgIH0gOgorICAgIGZ1bmN0aW9uKCBhLCBiICkgeworICAgIGlmICggYiApIHsKKyAgICB3aGls
ZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKKyAgICBpZiAoIGIgPT09IGEgKSB7CisgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICAgIH07
CisKKyAgICAvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisgICAgc29ydE9yZGVyID0gZG9jRWxl
bS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/CisgICAgZnVuY3Rpb24oIGEsIGIgKSB7CisgICAg
dmFyIGNvbXBhcmU7CisKKyAgICBpZiAoIGEgPT09IGIgKSB7CisgICAgaGFzRHVwbGljYXRlID0g
dHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIChjb21wYXJlID0gYi5jb21w
YXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29t
cGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSkgKSB7CisgICAgaWYgKCBjb21wYXJlICYgMSB8fCBh
LnBhcmVudE5vZGUgJiYgYS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMSApIHsKKyAgICBpZiAo
IGEgPT09IGRvYyB8fCBjb250YWlucyggcHJlZmVycmVkRG9jLCBhICkgKSB7CisgICAgcmV0dXJu
IC0xOworICAgIH0KKyAgICBpZiAoIGIgPT09IGRvYyB8fCBjb250YWlucyggcHJlZmVycmVkRG9j
LCBiICkgKSB7CisgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworICAgIH0KKyAg
ICByZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7CisgICAgfQorCisgICAgcmV0dXJuIGEuY29t
cGFyZURvY3VtZW50UG9zaXRpb24gPyAtMSA6IDE7CisgICAgfSA6CisgICAgZnVuY3Rpb24oIGEs
IGIgKSB7CisgICAgdmFyIGN1ciwKKyAgICBpID0gMCwKKyAgICBhdXAgPSBhLnBhcmVudE5vZGUs
CisgICAgYnVwID0gYi5wYXJlbnROb2RlLAorICAgIGFwID0gWyBhIF0sCisgICAgYnAgPSBbIGIg
XTsKKworICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWwKKyAgICBp
ZiAoIGEgPT09IGIgKSB7CisgICAgaGFzRHVwbGljYXRlID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsK
KworICAgIC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29u
bmVjdGVkCisgICAgfSBlbHNlIGlmICggIWF1cCB8fCAhYnVwICkgeworICAgIHJldHVybiBhID09
PSBkb2MgPyAtMSA6CisgICAgYiA9PT0gZG9jID8gMSA6CisgICAgYXVwID8gLTEgOgorICAgIGJ1
cCA/IDEgOgorICAgIDA7CisKKyAgICAvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBj
YW4gZG8gYSBxdWljayBjaGVjaworICAgIH0gZWxzZSBpZiAoIGF1cCA9PT0gYnVwICkgeworICAg
IHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2Ug
d2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvbgorICAg
IGN1ciA9IGE7CisgICAgd2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkgeworICAgIGFw
LnVuc2hpZnQoIGN1ciApOworICAgIH0KKyAgICBjdXIgPSBiOworICAgIHdoaWxlICggKGN1ciA9
IGN1ci5wYXJlbnROb2RlKSApIHsKKyAgICBicC51bnNoaWZ0KCBjdXIgKTsKKyAgICB9CisKKyAg
ICAvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQorICAgIHdo
aWxlICggYXBbaV0gPT09IGJwW2ldICkgeworICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4g
aSA/CisgICAgLy8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9u
IGFuY2VzdG9yCisgICAgc2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKSA6CisKKyAgICAvLyBP
dGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3QKKyAgICBhcFtpXSA9PT0g
cHJlZmVycmVkRG9jID8gLTEgOgorICAgIGJwW2ldID09PSBwcmVmZXJyZWREb2MgPyAxIDoKKyAg
ICAwOworICAgIH07CisKKyAgICAvLyBBbHdheXMgYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBkdXBs
aWNhdGVzIGlmIHNvcnQgZG9lc24ndAorICAgIC8vIHBhc3MgdGhlbSB0byBvdXIgY29tcGFyaXNv
biBmdW5jdGlvbiAoYXMgaW4gR29vZ2xlIENocm9tZSkuCisgICAgaGFzRHVwbGljYXRlID0gZmFs
c2U7CisgICAgWzAsIDBdLnNvcnQoIHNvcnRPcmRlciApOworICAgIHN1cHBvcnQuZGV0ZWN0RHVw
bGljYXRlcyA9IGhhc0R1cGxpY2F0ZTsKKworICAgIHJldHVybiBkb2N1bWVudDsKK307CisKK1Np
enpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgeworICAgIHJldHVybiBT
aXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7Cit9OworCitTaXp6bGUubWF0Y2hl
c1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7CisgICAgLy8gU2V0IGRvY3VtZW50
IHZhcnMgaWYgbmVlZGVkCisgICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkg
IT09IGRvY3VtZW50ICkgeworICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQorCisgICAg
Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisgICAgZXhw
ciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsKKworICAgIC8v
IHJidWdneVFTQSBhbHdheXMgY29udGFpbnMgOmZvY3VzLCBzbyBubyBuZWVkIGZvciBhbiBleGlz
dGVuY2UgY2hlY2sKKyAgICBpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmICFkb2N1bWVu
dElzWE1MICYmICghcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KGV4cHIpKSAm
JiAhcmJ1Z2d5UVNBLnRlc3QoZXhwcikgKSB7CisgICAgdHJ5IHsKKyAgICB2YXIgcmV0ID0gbWF0
Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7CisKKyAgICAvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9y
IHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzCisgICAgaWYgKCByZXQgfHwgc3Vw
cG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fAorICAgIC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBu
b2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50CisgICAgLy8gZnJhZ21lbnQgaW4gSUUg
OQorICAgIGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7
CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgfSBjYXRjaChlKSB7fQorICAgIH0KKworICAg
IHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbZWxlbV0gKS5sZW5ndGggPiAw
OworfTsKKworU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7Cisg
ICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisgICAgaWYgKCAoIGNvbnRleHQub3du
ZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgeworICAgIHNldERvY3VtZW50
KCBjb250ZXh0ICk7CisgICAgfQorICAgIHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSAp
OworfTsKKworU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIg
dmFsOworCisgICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisgICAgaWYgKCAoIGVs
ZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgeworICAgIHNldERvY3Vt
ZW50KCBlbGVtICk7CisgICAgfQorCisgICAgaWYgKCAhZG9jdW1lbnRJc1hNTCApIHsKKyAgICBu
YW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0KKyAgICBpZiAoICh2YWwgPSBFeHByLmF0
dHJIYW5kbGVbIG5hbWUgXSkgKSB7CisgICAgcmV0dXJuIHZhbCggZWxlbSApOworICAgIH0KKyAg
ICBpZiAoIGRvY3VtZW50SXNYTUwgfHwgc3VwcG9ydC5hdHRyaWJ1dGVzICkgeworICAgIHJldHVy
biBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOworICAgIH0KKyAgICByZXR1cm4gKCAodmFsID0g
ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1l
ICkgKSAmJiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPworICAgIG5hbWUgOgorICAgIHZhbCAmJiB2
YWwuc3BlY2lmaWVkID8gdmFsLnZhbHVlIDogbnVsbDsKK307CisKK1NpenpsZS5lcnJvciA9IGZ1
bmN0aW9uKCBtc2cgKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJl
Y29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyApOworfTsKKworLy8gRG9jdW1lbnQgc29ydGlu
ZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlcworU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbigg
cmVzdWx0cyApIHsKKyAgICB2YXIgZWxlbSwKKyAgICBkdXBsaWNhdGVzID0gW10sCisgICAgaSA9
IDEsCisgICAgaiA9IDA7CisKKyAgICAvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3Qg
ZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlCisgICAgaGFzRHVwbGljYXRlID0gIXN1
cHBvcnQuZGV0ZWN0RHVwbGljYXRlczsKKyAgICByZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApOwor
CisgICAgaWYgKCBoYXNEdXBsaWNhdGUgKSB7CisgICAgZm9yICggOyAoZWxlbSA9IHJlc3VsdHNb
aV0pOyBpKysgKSB7CisgICAgaWYgKCBlbGVtID09PSByZXN1bHRzWyBpIC0gMSBdICkgeworICAg
IGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTsKKyAgICB9CisgICAgfQorICAgIHdoaWxlICggai0t
ICkgeworICAgIHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTsKKyAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIHJlc3VsdHM7Cit9OworCitmdW5jdGlvbiBzaWJsaW5nQ2hlY2so
IGEsIGIgKSB7CisgICAgdmFyIGN1ciA9IGIgJiYgYSwKKyAgICBkaWZmID0gY3VyICYmICggfmIu
c291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLSAoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9O
RUdBVElWRSApOworCisgICAgLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBi
b3RoIG5vZGVzCisgICAgaWYgKCBkaWZmICkgeworICAgIHJldHVybiBkaWZmOworICAgIH0KKwor
ICAgIC8vIENoZWNrIGlmIGIgZm9sbG93cyBhCisgICAgaWYgKCBjdXIgKSB7CisgICAgd2hpbGUg
KCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHsKKyAgICBpZiAoIGN1ciA9PT0gYiApIHsKKyAg
ICByZXR1cm4gLTE7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYSA/IDEgOiAt
MTsKK30KKworLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1
dCB0eXBlcworZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CisgICAgcmV0dXJu
IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpOworICAgIHJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gdHlw
ZTsKKyAgICB9OworfQorCisvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3Mg
Zm9yIGJ1dHRvbnMKK2Z1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsKKyAgICBy
ZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRv
TG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJi
dXR0b24iKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisgICAgfTsKK30KKworLy8gUmV0dXJucyBh
IGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFscworZnVuY3Rpb24gY3Jl
YXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7CisgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5j
dGlvbiggYXJndW1lbnQgKSB7CisgICAgYXJndW1lbnQgPSArYXJndW1lbnQ7CisgICAgcmV0dXJu
IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKKyAgICB2YXIgaiwKKyAg
ICBtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAorICAgIGkg
PSBtYXRjaEluZGV4ZXMubGVuZ3RoOworCisgICAgLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQg
dGhlIHNwZWNpZmllZCBpbmRleGVzCisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCBzZWVk
WyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKKyAgICBzZWVkW2pdID0gIShtYXRjaGVzW2pd
ID0gc2VlZFtqXSk7CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAgICB9KTsKK30KKworLyoqCisg
KiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFy
cmF5IG9mIERPTSBub2RlcworICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCisgKi8KK2dl
dFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBub2Rl
LAorICAgIHJldCA9ICIiLAorICAgIGkgPSAwLAorICAgIG5vZGVUeXBlID0gZWxlbS5ub2RlVHlw
ZTsKKworICAgIGlmICggIW5vZGVUeXBlICkgeworICAgIC8vIElmIG5vIG5vZGVUeXBlLCB0aGlz
IGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5CisgICAgZm9yICggOyAobm9kZSA9IGVsZW1baV0p
OyBpKysgKSB7CisgICAgLy8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXMKKyAgICByZXQg
Kz0gZ2V0VGV4dCggbm9kZSApOworICAgIH0KKyAgICB9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0g
MSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7CisgICAgLy8gVXNlIHRl
eHRDb250ZW50IGZvciBlbGVtZW50cworICAgIC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZv
ciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKHNlZSAjMTExNTMpCisgICAgaWYgKCB0eXBlb2Yg
ZWxlbS50ZXh0Q29udGVudCA9PT0gInN0cmluZyIgKSB7CisgICAgcmV0dXJuIGVsZW0udGV4dENv
bnRlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW4KKyAgICBm
b3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGlu
ZyApIHsKKyAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSApOworICAgIH0KKyAgICB9CisgICAgfSBl
bHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7CisgICAgcmV0dXJu
IGVsZW0ubm9kZVZhbHVlOworICAgIH0KKyAgICAvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9y
IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXMKKworICAgIHJldHVybiByZXQ7Cit9OworCitF
eHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKworICAgIC8vIENhbiBiZSBhZGp1c3RlZCBieSB0
aGUgdXNlcgorICAgIGNhY2hlTGVuZ3RoOiA1MCwKKworICAgIGNyZWF0ZVBzZXVkbzogbWFya0Z1
bmN0aW9uLAorCisgICAgbWF0Y2g6IG1hdGNoRXhwciwKKworICAgIGZpbmQ6IHt9LAorCisgICAg
cmVsYXRpdmU6IHsKKyAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9kZSIsIGZpcnN0OiB0cnVlIH0s
CisgICAgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sCisgICAgIisiOiB7IGRpcjogInByZXZp
b3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCisgICAgIn4iOiB7IGRpcjogInByZXZpb3VzU2li
bGluZyIgfQorICAgIH0sCisKKyAgICBwcmVGaWx0ZXI6IHsKKyAgICAiQVRUUiI6IGZ1bmN0aW9u
KCBtYXRjaCApIHsKKyAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwg
ZnVuZXNjYXBlICk7CisKKyAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3
aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAorICAgIG1hdGNoWzNdID0gKCBtYXRjaFs0XSB8fCBt
YXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisKKyAgICBp
ZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworICAgIG1hdGNoWzNdID0gIiAiICsgbWF0Y2hbM10g
KyAiICI7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CisgICAgfSwK
KworICAgICJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKyAgICAvKiBtYXRjaGVzIGZyb20g
bWF0Y2hFeHByWyJDSElMRCJdCisgICAgMSB0eXBlIChvbmx5fG50aHwuLi4pCisgICAgMiB3aGF0
IChjaGlsZHxvZi10eXBlKQorICAgIDMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1c
ZCspP3wuLi4pCisgICAgNCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpu
fCkKKyAgICA1IHNpZ24gb2YgeG4tY29tcG9uZW50CisgICAgNiB4IG9mIHhuLWNvbXBvbmVudAor
ICAgIDcgc2lnbiBvZiB5LWNvbXBvbmVudAorICAgIDggeSBvZiB5LWNvbXBvbmVudAorICAgICov
CisgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOworCisgICAgaWYgKCBtYXRj
aFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKKyAgICAvLyBudGgtKiByZXF1aXJlcyBh
cmd1bWVudAorICAgIGlmICggIW1hdGNoWzNdICkgeworICAgIFNpenpsZS5lcnJvciggbWF0Y2hb
MF0gKTsKKyAgICB9CisKKyAgICAvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhw
ci5maWx0ZXIuQ0hJTEQKKyAgICAvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNw
ZWN0aXZlbHkgdG8gMC8xCisgICAgbWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsg
KG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09ICJldmVuIiB8fCBtYXRjaFszXSA9
PT0gIm9kZCIgKSApOworICAgIG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkg
fHwgbWF0Y2hbM10gPT09ICJvZGQiICk7CisKKyAgICAvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBh
cmd1bWVudHMKKyAgICB9IGVsc2UgaWYgKCBtYXRjaFszXSApIHsKKyAgICBTaXp6bGUuZXJyb3Io
IG1hdGNoWzBdICk7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoOworICAgIH0sCisKKyAgICAi
UFNFVURPIjogZnVuY3Rpb24oIG1hdGNoICkgeworICAgIHZhciBleGNlc3MsCisgICAgdW5xdW90
ZWQgPSAhbWF0Y2hbNV0gJiYgbWF0Y2hbMl07CisKKyAgICBpZiAoIG1hdGNoRXhwclsiQ0hJTEQi
XS50ZXN0KCBtYXRjaFswXSApICkgeworICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8v
IEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzCisgICAgaWYgKCBtYXRjaFs0XSApIHsKKyAg
ICBtYXRjaFsyXSA9IG1hdGNoWzRdOworCisgICAgLy8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMg
ZnJvbSB1bnF1b3RlZCBhcmd1bWVudHMKKyAgICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNl
dWRvLnRlc3QoIHVucXVvdGVkICkgJiYKKyAgICAvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUg
KHJlY3Vyc2l2ZWx5KQorICAgIChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkg
JiYKKyAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXMKKyAgICAo
ZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3Mg
KSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7CisKKyAgICAvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBp
bmRleAorICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOworICAgIG1h
dGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOworICAgIH0KKworICAgIC8vIFJl
dHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5
cGUgYW5kIGFyZ3VtZW50KQorICAgIHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApOworICAgIH0K
KyAgICB9LAorCisgICAgZmlsdGVyOiB7CisKKyAgICAiVEFHIjogZnVuY3Rpb24oIG5vZGVOYW1l
ICkgeworICAgIGlmICggbm9kZU5hbWUgPT09ICIqIiApIHsKKyAgICByZXR1cm4gZnVuY3Rpb24o
KSB7IHJldHVybiB0cnVlOyB9OworICAgIH0KKworICAgIG5vZGVOYW1lID0gbm9kZU5hbWUucmVw
bGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBm
dW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVO
YW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lOworICAgIH07CisgICAgfSwKKworICAgICJD
TEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7CisgICAgdmFyIHBhdHRlcm4gPSBjbGFzc0Nh
Y2hlWyBjbGFzc05hbWUgKyAiICIgXTsKKworICAgIHJldHVybiBwYXR0ZXJuIHx8CisgICAgKHBh
dHRlcm4gPSBuZXcgUmVnRXhwKCAiKF58IiArIHdoaXRlc3BhY2UgKyAiKSIgKyBjbGFzc05hbWUg
KyAiKCIgKyB3aGl0ZXNwYWNlICsgInwkKSIgKSkgJiYKKyAgICBjbGFzc0NhY2hlKCBjbGFzc05h
bWUsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoIGVsZW0uY2xh
c3NOYW1lIHx8ICh0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IHN0cnVuZGVmaW5lZCAmJiBl
bGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgfHwgIiIgKTsKKyAgICB9KTsKKyAgICB9LAorCisg
ICAgIkFUVFIiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkgeworICAgIHJldHVy
biBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0s
IG5hbWUgKTsKKworICAgIGlmICggcmVzdWx0ID09IG51bGwgKSB7CisgICAgcmV0dXJuIG9wZXJh
dG9yID09PSAiIT0iOworICAgIH0KKyAgICBpZiAoICFvcGVyYXRvciApIHsKKyAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICByZXN1bHQgKz0gIiI7CisKKyAgICByZXR1cm4gb3BlcmF0b3Ig
PT09ICI9IiA/IHJlc3VsdCA9PT0gY2hlY2sgOgorICAgIG9wZXJhdG9yID09PSAiIT0iID8gcmVz
dWx0ICE9PSBjaGVjayA6CisgICAgb3BlcmF0b3IgPT09ICJePSIgPyBjaGVjayAmJiByZXN1bHQu
aW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6CisgICAgb3BlcmF0b3IgPT09ICIqPSIgPyBjaGVjayAm
JiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKyAgICBvcGVyYXRvciA9PT0gIiQ9IiA/
IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6CisgICAg
b3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiArIHJlc3VsdCArICIgIiApLmluZGV4T2YoIGNoZWNr
ICkgPiAtMSA6CisgICAgb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJl
c3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArICItIiA6CisgICAg
ZmFsc2U7CisgICAgfTsKKyAgICB9LAorCisgICAgIkNISUxEIjogZnVuY3Rpb24oIHR5cGUsIHdo
YXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHsKKyAgICB2YXIgc2ltcGxlID0gdHlwZS5zbGlj
ZSggMCwgMyApICE9PSAibnRoIiwKKyAgICBmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0g
Imxhc3QiLAorICAgIG9mVHlwZSA9IHdoYXQgPT09ICJvZi10eXBlIjsKKworICAgIHJldHVybiBm
aXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID8KKworICAgIC8vIFNob3J0Y3V0IGZvciA6bnRoLSoo
bikKKyAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7
CisgICAgfSA6CisKKyAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworICAgIHZh
ciBjYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgZGlmZiwgbm9kZUluZGV4LCBzdGFydCwKKyAgICBk
aXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGlu
ZyIsCisgICAgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLAorICAgIG5hbWUgPSBvZlR5cGUgJiYg
ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAorICAgIHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZU
eXBlOworCisgICAgaWYgKCBwYXJlbnQgKSB7CisKKyAgICAvLyA6KGZpcnN0fGxhc3R8b25seSkt
KGNoaWxkfG9mLXR5cGUpCisgICAgaWYgKCBzaW1wbGUgKSB7CisgICAgd2hpbGUgKCBkaXIgKSB7
CisgICAgbm9kZSA9IGVsZW07CisgICAgd2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHsK
KyAgICBpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6
IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB9
CisgICAgLy8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0
IGRvbmUgc28pCisgICAgc3RhcnQgPSBkaXIgPSB0eXBlID09PSAib25seSIgJiYgIXN0YXJ0ICYm
ICJuZXh0U2libGluZyI7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0
YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07
CisKKyAgICAvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBg
cGFyZW50YAorICAgIGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHsKKyAgICAvLyBTZWVrIGBl
bGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXgKKyAgICBvdXRlckNhY2hlID0gcGFy
ZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0ge30pOworICAgIGNhY2hlID0g
b3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdOworICAgIG5vZGVJbmRleCA9IGNhY2hlWzBdID09PSBk
aXJydW5zICYmIGNhY2hlWzFdOworICAgIGRpZmYgPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBj
YWNoZVsyXTsKKyAgICBub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2Rl
SW5kZXggXTsKKworICAgIHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5v
ZGVbIGRpciBdIHx8CisKKyAgICAvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRo
ZSBzdGFydAorICAgIChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewor
CisgICAgLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsK
KyAgICBpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0g
KSB7CisgICAgb3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYg
XTsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHByZXZpb3VzbHktY2Fj
aGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCisgICAgfSBlbHNlIGlmICggdXNlQ2FjaGUg
JiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsg
dHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKKyAgICBkaWZmID0gY2FjaGVbMV07
CisKKyAgICAvLyB4bWwgOm50aC1jaGlsZCguLi4pIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9y
IDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLikKKyAgICB9IGVsc2UgeworICAgIC8vIFVzZSB0aGUg
c2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0CisgICAgd2hp
bGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKKyAgICAo
ZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKKworICAgIGlmICggKCBv
ZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVU
eXBlID09PSAxICkgJiYgKytkaWZmICkgeworICAgIC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNo
IGVuY291bnRlcmVkIGVsZW1lbnQKKyAgICBpZiAoIHVzZUNhY2hlICkgeworICAgIChub2RlWyBl
eHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9IFsgZGlycnVucywg
ZGlmZiBdOworICAgIH0KKworICAgIGlmICggbm9kZSA9PT0gZWxlbSApIHsKKyAgICBicmVhazsK
KyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zm
c2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQorICAgIGRpZmYgLT0gbGFzdDsKKyAg
ICByZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAv
IGZpcnN0ID49IDAgKTsKKyAgICB9CisgICAgfTsKKyAgICB9LAorCisgICAgIlBTRVVETyI6IGZ1
bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgeworICAgIC8vIHBzZXVkby1jbGFzcyBuYW1lcyBh
cmUgY2FzZS1pbnNlbnNpdGl2ZQorICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9y
cy8jcHNldWRvLWNsYXNzZXMKKyAgICAvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkg
aW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwor
ICAgIC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKKyAg
ICB2YXIgYXJncywKKyAgICBmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRG
aWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8CisgICAgU2l6emxlLmVycm9yKCAidW5z
dXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CisKKyAgICAvLyBUaGUgdXNlciBtYXkgdXNl
IGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CisgICAgLy8gYXJndW1lbnRzIGFyZSBuZWVk
ZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KKyAgICAvLyBqdXN0IGFzIFNpenpsZSBk
b2VzCisgICAgaWYgKCBmblsgZXhwYW5kbyBdICkgeworICAgIHJldHVybiBmbiggYXJndW1lbnQg
KTsKKyAgICB9CisKKyAgICAvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVy
ZXMKKyAgICBpZiAoIGZuLmxlbmd0aCA+IDEgKSB7CisgICAgYXJncyA9IFsgcHNldWRvLCBwc2V1
ZG8sICIiLCBhcmd1bWVudCBdOworICAgIHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJv
cGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPworICAgIG1hcmtGdW5jdGlvbihmdW5jdGlv
biggc2VlZCwgbWF0Y2hlcyApIHsKKyAgICB2YXIgaWR4LAorICAgIG1hdGNoZWQgPSBmbiggc2Vl
ZCwgYXJndW1lbnQgKSwKKyAgICBpID0gbWF0Y2hlZC5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0g
KSB7CisgICAgaWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRjaGVkW2ldICk7CisgICAgc2Vl
ZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKKyAgICB9CisgICAg
fSkgOgorICAgIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBmbiggZWxlbSwgMCwgYXJn
cyApOworICAgIH07CisgICAgfQorCisgICAgcmV0dXJuIGZuOworICAgIH0KKyAgICB9LAorCisg
ICAgcHNldWRvczogeworICAgIC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvcworICAgICJu
b3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgIC8vIFRyaW0gdGhl
IHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCisgICAgLy8gdG8gYXZvaWQgdHJlYXRpbmcgbGVh
ZGluZyBhbmQgdHJhaWxpbmcKKyAgICAvLyBzcGFjZXMgYXMgY29tYmluYXRvcnMKKyAgICB2YXIg
aW5wdXQgPSBbXSwKKyAgICByZXN1bHRzID0gW10sCisgICAgbWF0Y2hlciA9IGNvbXBpbGUoIHNl
bGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICkgKTsKKworICAgIHJldHVybiBtYXRjaGVyWyBl
eHBhbmRvIF0gPworICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29u
dGV4dCwgeG1sICkgeworICAgIHZhciBlbGVtLAorICAgIHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNl
ZWQsIG51bGwsIHhtbCwgW10gKSwKKyAgICBpID0gc2VlZC5sZW5ndGg7CisKKyAgICAvLyBNYXRj
aCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgCisgICAgd2hpbGUgKCBpLS0gKSB7Cisg
ICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CisgICAgc2VlZFtpXSA9ICEobWF0Y2hl
c1tpXSA9IGVsZW0pOworICAgIH0KKyAgICB9CisgICAgfSkgOgorICAgIGZ1bmN0aW9uKCBlbGVt
LCBjb250ZXh0LCB4bWwgKSB7CisgICAgaW5wdXRbMF0gPSBlbGVtOworICAgIG1hdGNoZXIoIGlu
cHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKKyAgICByZXR1cm4gIXJlc3VsdHMucG9wKCk7Cisg
ICAgfTsKKyAgICB9KSwKKworICAgICJoYXMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVj
dG9yICkgeworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gU2l6emxl
KCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7CisgICAgfTsKKyAgICB9KSwKKworICAgICJj
b250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHsKKyAgICByZXR1cm4gZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlu
bmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTsKKyAgICB9
OworICAgIH0pLAorCisgICAgLy8gIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBi
eSBhIDpsYW5nKCkgc2VsZWN0b3IKKyAgICAvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1l
bnQncyBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVy
IEMsCisgICAgLy8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVs
eSBmb2xsb3dlZCBieSAiLSIuCisgICAgLy8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUg
ZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHku
CisgICAgLy8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFu
Z3VhZ2UgbmFtZS4iCisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5n
LXBzZXVkbworICAgICJsYW5nIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHsKKyAg
ICAvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWRlcgorICAgIGlmICggIXJp
ZGVudGlmaWVyLnRlc3QobGFuZyB8fCAiIikgKSB7CisgICAgU2l6emxlLmVycm9yKCAidW5zdXBw
b3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKKyAgICB9CisgICAgbGFuZyA9IGxhbmcucmVwbGFjZSgg
cnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBmdW5jdGlv
biggZWxlbSApIHsKKyAgICB2YXIgZWxlbUxhbmc7CisgICAgZG8geworICAgIGlmICggKGVsZW1M
YW5nID0gZG9jdW1lbnRJc1hNTCA/CisgICAgZWxlbS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIikg
fHwgZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSA6CisgICAgZWxlbS5sYW5nKSApIHsKKworICAg
IGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gZWxlbUxhbmcg
PT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOworICAgIH0K
KyAgICB9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUg
PT09IDEgKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAgICB9KSwKKworICAgIC8vIE1p
c2NlbGxhbmVvdXMKKyAgICAidGFyZ2V0IjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIGhh
c2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7CisgICAgcmV0dXJu
IGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOworICAgIH0sCisKKyAgICAicm9v
dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBlbGVtID09PSBkb2NFbGVtOworICAg
IH0sCisKKyAgICAiZm9jdXMiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbSA9
PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3Vt
ZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFi
SW5kZXgpOworICAgIH0sCisKKyAgICAvLyBCb29sZWFuIHByb3BlcnRpZXMKKyAgICAiZW5hYmxl
ZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxz
ZTsKKyAgICB9LAorCisgICAgImRpc2FibGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0
dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CisgICAgfSwKKworICAgICJjaGVja2VkIjogZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBi
b3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCisgICAgLy8gaHR0cDovL3d3dy53My5v
cmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKKyAgICB2YXIg
bm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIChub2Rl
TmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0
aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOworICAgIH0sCisKKyAgICAic2VsZWN0ZWQiOiBmdW5j
dGlvbiggZWxlbSApIHsKKyAgICAvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxl
Y3RlZC1ieS1kZWZhdWx0CisgICAgLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQor
ICAgIGlmICggZWxlbS5wYXJlbnROb2RlICkgeworICAgIGVsZW0ucGFyZW50Tm9kZS5zZWxlY3Rl
ZEluZGV4OworICAgIH0KKworICAgIHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOworICAg
IH0sCisKKyAgICAvLyBDb250ZW50cworICAgICJlbXB0eSI6IGZ1bmN0aW9uKCBlbGVtICkgewor
ICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvCisgICAg
Ly8gOmVtcHR5IGlzIG9ubHkgYWZmZWN0ZWQgYnkgZWxlbWVudCBub2RlcyBhbmQgY29udGVudCBu
b2RlcyhpbmNsdWRpbmcgdGV4dCgzKSwgY2RhdGEoNCkpLAorICAgIC8vICAgbm90IGNvbW1lbnQs
IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBvciBvdGhlcnMKKyAgICAvLyBUaGFua3MgdG8gRGll
Z28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXQKKyAgICAvLyAgIEdyZWF0ZXIgdGhh
biAiQCIgbWVhbnMgYWxwaGEgY2hhcmFjdGVycyAoc3BlY2lmaWNhbGx5IG5vdCBzdGFydGluZyB3
aXRoICIjIiBvciAiPyIpCisgICAgZm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsg
ZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7CisgICAgaWYgKCBlbGVtLm5vZGVOYW1lID4gIkAi
IHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKKyAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisg
ICAgInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiAhRXhwci5wc2V1ZG9z
WyJlbXB0eSJdKCBlbGVtICk7CisgICAgfSwKKworICAgIC8vIEVsZW1lbnQvaW5wdXQgdHlwZXMK
KyAgICAiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIHJoZWFkZXIudGVz
dCggZWxlbS5ub2RlTmFtZSApOworICAgIH0sCisKKyAgICAiaW5wdXQiOiBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICByZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisgICAgfSwK
KworICAgICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgbmFtZSA9IGVsZW0u
bm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBl
bGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0b24iOworICAgIH0sCisKKyAg
ICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBhdHRyOworICAgIC8vIElFNiBh
bmQgNyB3aWxsIG1hcCBlbGVtLnR5cGUgdG8gJ3RleHQnIGZvciBuZXcgSFRNTDUgdHlwZXMgKHNl
YXJjaCwgZXRjKQorICAgIC8vIHVzZSBnZXRBdHRyaWJ1dGUgaW5zdGVhZCB0byB0ZXN0IHRoaXMg
Y2FzZQorICAgIHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIg
JiYKKyAgICBlbGVtLnR5cGUgPT09ICJ0ZXh0IiAmJgorICAgICggKGF0dHIgPSBlbGVtLmdldEF0
dHJpYnV0ZSgidHlwZSIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gZWxlbS50
eXBlICk7CisgICAgfSwKKworICAgIC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb24KKyAgICAiZmly
c3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBbIDAg
XTsKKyAgICB9KSwKKworICAgICJsYXN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlv
biggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgcmV0dXJuIFsgbGVuZ3RoIC0gMSBdOwor
ICAgIH0pLAorCisgICAgImVxIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0
Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworICAgIHJldHVybiBbIGFyZ3VtZW50IDwg
MCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKKyAgICB9KSwKKworICAgICJldmVu
IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgg
KSB7CisgICAgdmFyIGkgPSAwOworICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewor
ICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgfQorICAgIHJldHVybiBtYXRjaEluZGV4
ZXM7CisgICAgfSksCisKKyAgICAib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlv
biggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgdmFyIGkgPSAxOworICAgIGZvciAoIDsg
aSA8IGxlbmd0aDsgaSArPSAyICkgeworICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAg
fQorICAgIHJldHVybiBtYXRjaEluZGV4ZXM7CisgICAgfSksCisKKyAgICAibHQiOiBjcmVhdGVQ
b3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQg
KSB7CisgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3Vt
ZW50OworICAgIGZvciAoIDsgLS1pID49IDA7ICkgeworICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBp
ICk7CisgICAgfQorICAgIHJldHVybiBtYXRjaEluZGV4ZXM7CisgICAgfSksCisKKyAgICAiZ3Qi
OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwg
YXJndW1lbnQgKSB7CisgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0
aCA6IGFyZ3VtZW50OworICAgIGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKKyAgICBtYXRjaElu
ZGV4ZXMucHVzaCggaSApOworICAgIH0KKyAgICByZXR1cm4gbWF0Y2hJbmRleGVzOworICAgIH0p
CisgICAgfQorfTsKKworLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3MKK2ZvciAoIGkg
aW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0
cnVlLCBpbWFnZTogdHJ1ZSB9ICkgeworICAgIEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5w
dXRQc2V1ZG8oIGkgKTsKK30KK2ZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVl
IH0gKSB7CisgICAgRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTsK
K30KKworZnVuY3Rpb24gdG9rZW5pemUoIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7CisgICAgdmFy
IG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsCisgICAgc29GYXIsIGdyb3VwcywgcHJlRmls
dGVycywKKyAgICBjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArICIgIiBdOworCisgICAg
aWYgKCBjYWNoZWQgKSB7CisgICAgcmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2Uo
IDAgKTsKKyAgICB9CisKKyAgICBzb0ZhciA9IHNlbGVjdG9yOworICAgIGdyb3VwcyA9IFtdOwor
ICAgIHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKKworICAgIHdoaWxlICggc29GYXIgKSB7
CisKKyAgICAvLyBDb21tYSBhbmQgZmlyc3QgcnVuCisgICAgaWYgKCAhbWF0Y2hlZCB8fCAobWF0
Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CisgICAgaWYgKCBtYXRjaCApIHsKKyAgICAv
LyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAorICAgIHNvRmFyID0gc29G
YXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOworICAgIH0KKyAgICBncm91cHMu
cHVzaCggdG9rZW5zID0gW10gKTsKKyAgICB9CisKKyAgICBtYXRjaGVkID0gZmFsc2U7CisKKyAg
ICAvLyBDb21iaW5hdG9ycworICAgIGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNv
RmFyICkpICkgeworICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOworICAgIHRva2Vucy5wdXNo
KCB7CisgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0
b3JzIHRvIHNwYWNlCisgICAgdHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApCisg
ICAgfSApOworICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CisgICAg
fQorCisgICAgLy8gRmlsdGVycworICAgIGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7Cisg
ICAgaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXBy
ZUZpbHRlcnNbIHR5cGUgXSB8fAorICAgIChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0
Y2ggKSkpICkgeworICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOworICAgIHRva2Vucy5wdXNo
KCB7CisgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgdHlwZTogdHlwZSwKKyAgICBtYXRjaGVzOiBt
YXRjaAorICAgIH0gKTsKKyAgICBzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCAp
OworICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFtYXRjaGVkICkgeworICAgIGJyZWFrOworICAg
IH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNl
c3MKKyAgICAvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmcKKyAgICAvLyBPdGhlcndpc2UsIHRocm93
IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnMKKyAgICByZXR1cm4gcGFyc2VPbmx5ID8KKyAgICBz
b0Zhci5sZW5ndGggOgorICAgIHNvRmFyID8KKyAgICBTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkg
OgorICAgIC8vIENhY2hlIHRoZSB0b2tlbnMKKyAgICB0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3Jv
dXBzICkuc2xpY2UoIDAgKTsKK30KKworZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkgewor
ICAgIHZhciBpID0gMCwKKyAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAorICAgIHNlbGVjdG9yID0g
IiI7CisgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgc2VsZWN0b3IgKz0gdG9rZW5z
W2ldLnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gc2VsZWN0b3I7Cit9CisKK2Z1bmN0aW9uIGFk
ZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7CisgICAgdmFyIGRpciA9
IGNvbWJpbmF0b3IuZGlyLAorICAgIGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGRpciA9PT0g
InBhcmVudE5vZGUiLAorICAgIGRvbmVOYW1lID0gZG9uZSsrOworCisgICAgcmV0dXJuIGNvbWJp
bmF0b3IuZmlyc3QgPworICAgIC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVj
ZWRpbmcgZWxlbWVudAorICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAg
d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUg
PT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICByZXR1cm4gbWF0Y2hlciggZWxlbSwg
Y29udGV4dCwgeG1sICk7CisgICAgfQorICAgIH0KKyAgICB9IDoKKworICAgIC8vIENoZWNrIGFn
YWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cworICAgIGZ1bmN0aW9uKCBlbGVt
LCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGRhdGEsIGNhY2hlLCBvdXRlckNhY2hlLAorICAg
IGRpcmtleSA9IGRpcnJ1bnMgKyAiICIgKyBkb25lTmFtZTsKKworICAgIC8vIFdlIGNhbid0IHNl
dCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9t
IGRpciBjYWNoaW5nCisgICAgaWYgKCB4bWwgKSB7CisgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1b
IGRpciBdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVt
ZW50cyApIHsKKyAgICBpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgeworICAg
IHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgd2hp
bGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICBvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5k
byBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSk7CisgICAgaWYgKCAoY2FjaGUgPSBvdXRlckNh
Y2hlWyBkaXIgXSkgJiYgY2FjaGVbMF0gPT09IGRpcmtleSApIHsKKyAgICBpZiAoIChkYXRhID0g
Y2FjaGVbMV0pID09PSB0cnVlIHx8IGRhdGEgPT09IGNhY2hlZHJ1bnMgKSB7CisgICAgcmV0dXJu
IGRhdGEgPT09IHRydWU7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgY2FjaGUgPSBvdXRlckNh
Y2hlWyBkaXIgXSA9IFsgZGlya2V5IF07CisgICAgY2FjaGVbMV0gPSBtYXRjaGVyKCBlbGVtLCBj
b250ZXh0LCB4bWwgKSB8fCBjYWNoZWRydW5zOworICAgIGlmICggY2FjaGVbMV0gPT09IHRydWUg
KSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0K
KyAgICB9OworfQorCitmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CisgICAg
cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPworICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0
LCB4bWwgKSB7CisgICAgdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0g
KSB7CisgICAgaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgeworICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICAgIH0gOgor
ICAgIG1hdGNoZXJzWzBdOworfQorCitmdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAs
IGZpbHRlciwgY29udGV4dCwgeG1sICkgeworICAgIHZhciBlbGVtLAorICAgIG5ld1VubWF0Y2hl
ZCA9IFtdLAorICAgIGkgPSAwLAorICAgIGxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCisgICAgbWFw
cGVkID0gbWFwICE9IG51bGw7CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBp
ZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKKyAgICBpZiAoICFmaWx0ZXIgfHwgZmlsdGVy
KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICBuZXdVbm1hdGNoZWQucHVzaCggZWxlbSAp
OworICAgIGlmICggbWFwcGVkICkgeworICAgIG1hcC5wdXNoKCBpICk7CisgICAgfQorICAgIH0K
KyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld1VubWF0Y2hlZDsKK30KKworZnVuY3Rpb24g
c2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9z
dEZpbmRlciwgcG9zdFNlbGVjdG9yICkgeworICAgIGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZp
bHRlclsgZXhwYW5kbyBdICkgeworICAgIHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0Rmls
dGVyICk7CisgICAgfQorICAgIGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5k
byBdICkgeworICAgIHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2Vs
ZWN0b3IgKTsKKyAgICB9CisgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwg
cmVzdWx0cywgY29udGV4dCwgeG1sICkgeworICAgIHZhciB0ZW1wLCBpLCBlbGVtLAorICAgIHBy
ZU1hcCA9IFtdLAorICAgIHBvc3RNYXAgPSBbXSwKKyAgICBwcmVleGlzdGluZyA9IHJlc3VsdHMu
bGVuZ3RoLAorCisgICAgLy8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRl
eHQKKyAgICBlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgIioi
LCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLAorCisgICAg
Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBz
ZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uCisgICAgbWF0Y2hlckluID0gcHJlRmlsdGVyICYm
ICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisgICAgY29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHBy
ZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorICAgIGVsZW1zLAorCisgICAgbWF0Y2hlck91dCA9
IG1hdGNoZXIgPworICAgIC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBz
ZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCisgICAg
cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0Rmls
dGVyICkgPworCisgICAgLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5
CisgICAgW10gOgorCisgICAgLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5Cisg
ICAgcmVzdWx0cyA6CisgICAgbWF0Y2hlckluOworCisgICAgLy8gRmluZCBwcmltYXJ5IG1hdGNo
ZXMKKyAgICBpZiAoIG1hdGNoZXIgKSB7CisgICAgbWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVy
T3V0LCBjb250ZXh0LCB4bWwgKTsKKyAgICB9CisKKyAgICAvLyBBcHBseSBwb3N0RmlsdGVyCisg
ICAgaWYgKCBwb3N0RmlsdGVyICkgeworICAgIHRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwg
cG9zdE1hcCApOworICAgIHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKKwor
ICAgIC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBt
YXRjaGVySW4KKyAgICBpID0gdGVtcC5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAg
aWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgeworICAgIG1hdGNoZXJPdXRbIHBvc3RNYXBbaV0gXSA9
ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKyAgICB9CisgICAgfQorICAgIH0K
KworICAgIGlmICggc2VlZCApIHsKKyAgICBpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkg
eworICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAgICAvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJP
dXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4
dHMKKyAgICB0ZW1wID0gW107CisgICAgaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworICAgIHdoaWxl
ICggaS0tICkgeworICAgIGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHsKKyAgICAvLyBS
ZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAorICAg
IHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7CisgICAgfQorICAgIH0KKyAgICBw
b3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CisgICAgfQor
CisgICAgLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtl
ZXAgdGhlbSBzeW5jaHJvbml6ZWQKKyAgICBpID0gbWF0Y2hlck91dC5sZW5ndGg7CisgICAgd2hp
bGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmCisgICAgKHRl
bXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZi5jYWxsKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0p
ID4gLTEgKSB7CisKKyAgICBzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7Cisg
ICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhy
b3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWQKKyAgICB9IGVsc2UgeworICAgIG1hdGNoZXJPdXQg
PSBjb25kZW5zZSgKKyAgICBtYXRjaGVyT3V0ID09PSByZXN1bHRzID8KKyAgICBtYXRjaGVyT3V0
LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgorICAgIG1hdGNoZXJP
dXQKKyAgICApOworICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAgICBwb3N0RmluZGVyKCBudWxs
LCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKKyAgICB9IGVsc2UgeworICAgIHB1c2guYXBw
bHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKKyAgICB9CisgICAgfQorICAgIH0pOworfQorCitm
dW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgeworICAgIHZhciBjaGVja0NvbnRl
eHQsIG1hdGNoZXIsIGosCisgICAgbGVuID0gdG9rZW5zLmxlbmd0aCwKKyAgICBsZWFkaW5nUmVs
YXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAorICAgIGltcGxpY2l0UmVs
YXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsiICJdLAorICAgIGkgPSBs
ZWFkaW5nUmVsYXRpdmUgPyAxIDogMCwKKworICAgIC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hl
ciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250
ZXh0KHMpCisgICAgbWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0g
KSB7CisgICAgcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKKyAgICB9LCBpbXBsaWNpdFJl
bGF0aXZlLCB0cnVlICksCisgICAgbWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGluZGV4T2YuY2FsbCggY2hlY2tDb250ZXh0LCBl
bGVtICkgPiAtMTsKKyAgICB9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCisgICAgbWF0Y2hl
cnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgcmV0dXJuICggIWxl
YWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkg
KSB8fCAoCisgICAgKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID8KKyAgICBtYXRj
aENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoKKyAgICBtYXRjaEFueUNvbnRleHQoIGVs
ZW0sIGNvbnRleHQsIHhtbCApICk7CisgICAgfSBdOworCisgICAgZm9yICggOyBpIDwgbGVuOyBp
KysgKSB7CisgICAgaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBl
IF0pICkgeworICAgIG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBt
YXRjaGVycyApLCBtYXRjaGVyKSBdOworICAgIH0gZWxzZSB7CisgICAgbWF0Y2hlciA9IEV4cHIu
ZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyAp
OworCisgICAgLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNo
ZXIKKyAgICBpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKKyAgICAvLyBGaW5kIHRoZSBuZXh0
IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmcKKyAgICBqID0g
KytpOworICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgeworICAgIGlmICggRXhwci5yZWxhdGl2
ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIHJl
dHVybiBzZXRNYXRjaGVyKAorICAgIGkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyAp
LAorICAgIGkgPiAxICYmIHRvU2VsZWN0b3IoIHRva2Vucy5zbGljZSggMCwgaSAtIDEgKSApLnJl
cGxhY2UoIHJ0cmltLCAiJDEiICksCisgICAgbWF0Y2hlciwKKyAgICBpIDwgaiAmJiBtYXRjaGVy
RnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKKyAgICBqIDwgbGVuICYmIG1hdGNo
ZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCisgICAgaiA8IGxl
biAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQorICAgICk7CisgICAgfQorICAgIG1hdGNoZXJzLnB1
c2goIG1hdGNoZXIgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVsZW1lbnRNYXRjaGVy
KCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVs
ZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7CisgICAgLy8gQSBjb3VudGVyIHRvIHNwZWNp
Znkgd2hpY2ggZWxlbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgbWF0Y2hlZAorICAgIHZhciBtYXRj
aGVyQ2FjaGVkUnVucyA9IDAsCisgICAgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLAor
ICAgIGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLAorICAgIHN1cGVyTWF0
Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIGV4cGFuZENvbnRl
eHQgKSB7CisgICAgdmFyIGVsZW0sIGosIG1hdGNoZXIsCisgICAgc2V0TWF0Y2hlZCA9IFtdLAor
ICAgIG1hdGNoZWRDb3VudCA9IDAsCisgICAgaSA9ICIwIiwKKyAgICB1bm1hdGNoZWQgPSBzZWVk
ICYmIFtdLAorICAgIG91dGVybW9zdCA9IGV4cGFuZENvbnRleHQgIT0gbnVsbCwKKyAgICBjb250
ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKyAgICAvLyBXZSBtdXN0IGFsd2F5cyBoYXZl
IGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIGNvbnRleHQKKyAgICBlbGVtcyA9IHNlZWQgfHwgYnlF
bGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgZXhwYW5kQ29udGV4dCAmJiBjb250ZXh0
LnBhcmVudE5vZGUgfHwgY29udGV4dCApLAorICAgIC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZm
IHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisgICAgZGlycnVuc1VuaXF1ZSA9IChkaXJy
dW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSk7
CisKKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4
dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKKyAgICBjYWNoZWRydW5zID0gbWF0Y2hlckNhY2hl
ZFJ1bnM7CisgICAgfQorCisgICAgLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNo
ZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKKyAgICAvLyBLZWVwIGBpYCBhIHN0cmluZyBpZiB0aGVy
ZSBhcmUgbm8gZWxlbWVudHMgc28gYG1hdGNoZWRDb3VudGAgd2lsbCBiZSAiMDAiIGJlbG93Cisg
ICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CisgICAgaWYgKCBi
eUVsZW1lbnQgJiYgZWxlbSApIHsKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoIChtYXRjaGVyID0g
ZWxlbWVudE1hdGNoZXJzW2orK10pICkgeworICAgIGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4
dCwgeG1sICkgKSB7CisgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7CisgICAgYnJlYWs7CisgICAg
fQorICAgIH0KKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBkaXJydW5zID0gZGlycnVuc1Vu
aXF1ZTsKKyAgICBjYWNoZWRydW5zID0gKyttYXRjaGVyQ2FjaGVkUnVuczsKKyAgICB9CisgICAg
fQorCisgICAgLy8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVycworICAg
IGlmICggYnlTZXQgKSB7CisgICAgLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBw
b3NzaWJsZSBtYXRjaGVycworICAgIGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsK
KyAgICBtYXRjaGVkQ291bnQtLTsKKyAgICB9CisKKyAgICAvLyBMZW5ndGhlbiB0aGUgYXJyYXkg
Zm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CisgICAgaWYgKCBzZWVkICkgeworICAg
IHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBB
cHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHMKKyAgICBtYXRjaGVkQ291bnQg
Kz0gaTsKKyAgICBpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHsKKyAgICBqID0g
MDsKKyAgICB3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CisgICAgbWF0
Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKKyAgICB9CisKKyAg
ICBpZiAoIHNlZWQgKSB7CisgICAgLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVs
aW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZworICAgIGlmICggbWF0Y2hlZENvdW50ID4gMCAp
IHsKKyAgICB3aGlsZSAoIGktLSApIHsKKyAgICBpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1h
dGNoZWRbaV0pICkgeworICAgIHNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwor
ICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2
YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXMKKyAgICBzZXRNYXRjaGVkID0gY29uZGVu
c2UoIHNldE1hdGNoZWQgKTsKKyAgICB9CisKKyAgICAvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRz
CisgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApOworCisgICAgLy8gU2VlZGxl
c3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0
aXB1bGF0ZSBzb3J0aW5nCisgICAgaWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hl
ZC5sZW5ndGggPiAwICYmCisgICAgKCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGgg
KSA+IDEgKSB7CisKKyAgICBTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOworICAgIH0KKyAg
ICB9CisKKyAgICAvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQg
bWF0Y2hlcnMKKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBkaXJydW5zID0gZGlycnVuc1Vu
aXF1ZTsKKyAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDsKKyAgICB9CisKKyAg
ICByZXR1cm4gdW5tYXRjaGVkOworICAgIH07CisKKyAgICByZXR1cm4gYnlTZXQgPworICAgIG1h
cmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOgorICAgIHN1cGVyTWF0Y2hlcjsKK30KKworY29t
cGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBncm91cCAvKiBJbnRl
cm5hbCBVc2UgT25seSAqLyApIHsKKyAgICB2YXIgaSwKKyAgICBzZXRNYXRjaGVycyA9IFtdLAor
ICAgIGVsZW1lbnRNYXRjaGVycyA9IFtdLAorICAgIGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNl
bGVjdG9yICsgIiAiIF07CisKKyAgICBpZiAoICFjYWNoZWQgKSB7CisgICAgLy8gR2VuZXJhdGUg
YSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hl
Y2sgZWFjaCBlbGVtZW50CisgICAgaWYgKCAhZ3JvdXAgKSB7CisgICAgZ3JvdXAgPSB0b2tlbml6
ZSggc2VsZWN0b3IgKTsKKyAgICB9CisgICAgaSA9IGdyb3VwLmxlbmd0aDsKKyAgICB3aGlsZSAo
IGktLSApIHsKKyAgICBjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggZ3JvdXBbaV0gKTsKKyAg
ICBpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgeworICAgIHNldE1hdGNoZXJzLnB1c2goIGNhY2hl
ZCApOworICAgIH0gZWxzZSB7CisgICAgZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwor
ICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KKyAgICBj
YWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJz
KCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKKyAgICB9CisgICAgcmV0dXJuIGNh
Y2hlZDsKK307CisKK2Z1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0
cywgcmVzdWx0cyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgbGVuID0gY29udGV4dHMubGVuZ3Ro
OworICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworICAgIFNpenpsZSggc2VsZWN0b3IsIGNv
bnRleHRzW2ldLCByZXN1bHRzICk7CisgICAgfQorICAgIHJldHVybiByZXN1bHRzOworfQorCitm
dW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgeworICAg
IHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLAorICAgIG1hdGNoID0gdG9rZW5pemUo
IHNlbGVjdG9yICk7CisKKyAgICBpZiAoICFzZWVkICkgeworICAgIC8vIFRyeSB0byBtaW5pbWl6
ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwCisgICAgaWYgKCBtYXRjaC5s
ZW5ndGggPT09IDEgKSB7CisKKyAgICAvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29u
dGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRAorICAgIHRva2VucyA9IG1hdGNoWzBd
ID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKKyAgICBpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0
b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgorICAgIGNvbnRleHQubm9kZVR5cGUg
PT09IDkgJiYgIWRvY3VtZW50SXNYTUwgJiYKKyAgICBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0u
dHlwZSBdICkgeworCisgICAgY29udGV4dCA9IEV4cHIuZmluZFsiSUQiXSggdG9rZW4ubWF0Y2hl
c1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLCBjb250ZXh0IClbMF07CisgICAg
aWYgKCAhY29udGV4dCApIHsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICBzZWxl
Y3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTsKKyAg
ICB9CisKKyAgICAvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5n
CisgICAgaSA9IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVzdCggc2VsZWN0b3IgKSA/IDAg
OiB0b2tlbnMubGVuZ3RoOworICAgIHdoaWxlICggaS0tICkgeworICAgIHRva2VuID0gdG9rZW5z
W2ldOworCisgICAgLy8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvcgorICAgIGlmICggRXhw
ci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgeworICAgIGJyZWFrOworICAgIH0K
KyAgICBpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkgeworICAgIC8vIFNlYXJjaCwg
ZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycworICAgIGlm
ICggKHNlZWQgPSBmaW5kKAorICAgIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBl
LCBmdW5lc2NhcGUgKSwKKyAgICByc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIGNv
bnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0CisgICAgKSkgKSB7CisKKyAgICAvLyBJZiBzZWVk
IGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKKyAgICB0
b2tlbnMuc3BsaWNlKCBpLCAxICk7CisgICAgc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1Nl
bGVjdG9yKCB0b2tlbnMgKTsKKyAgICBpZiAoICFzZWxlY3RvciApIHsKKyAgICBwdXNoLmFwcGx5
KCByZXN1bHRzLCBzbGljZS5jYWxsKCBzZWVkLCAwICkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgICB9CisKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQor
CisgICAgLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbgorICAgIC8v
IFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0
aGUgc2VsZWN0b3IgYWJvdmUKKyAgICBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSgKKyAgICBz
ZWVkLAorICAgIGNvbnRleHQsCisgICAgZG9jdW1lbnRJc1hNTCwKKyAgICByZXN1bHRzLAorICAg
IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkKKyAgICApOworICAgIHJldHVybiByZXN1bHRzOwor
fQorCisvLyBEZXByZWNhdGVkCitFeHByLnBzZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9zWyJl
cSJdOworCisvLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKK2Z1bmN0aW9u
IHNldEZpbHRlcnMoKSB7fQorRXhwci5maWx0ZXJzID0gc2V0RmlsdGVycy5wcm90b3R5cGUgPSBF
eHByLnBzZXVkb3M7CitFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOworCisvLyBJ
bml0aWFsaXplIHdpdGggdGhlIGRlZmF1bHQgZG9jdW1lbnQKK3NldERvY3VtZW50KCk7CisKKy8v
IE92ZXJyaWRlIHNpenpsZSBhdHRyaWJ1dGUgcmV0cmlldmFsCitTaXp6bGUuYXR0ciA9IGpRdWVy
eS5hdHRyOworalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxl
Y3RvcnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIucHNldWRvczsKK2pRdWVyeS51
bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7
CitqUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVlcnkuY29udGFpbnMgPSBTaXp6
bGUuY29udGFpbnM7CisKKworfSkoIHdpbmRvdyApOwordmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAor
ICAgIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAorICAg
IGlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKKyAgICBybmVlZHNDb250ZXh0ID0galF1ZXJ5
LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LAorICAgIC8vIG1ldGhvZHMgZ3VhcmFudGVlZCB0byBw
cm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CisgICAg
Z3VhcmFudGVlZFVuaXF1ZSA9IHsKKyAgICBjaGlsZHJlbjogdHJ1ZSwKKyAgICBjb250ZW50czog
dHJ1ZSwKKyAgICBuZXh0OiB0cnVlLAorICAgIHByZXY6IHRydWUKKyAgICB9OworCitqUXVlcnku
Zm4uZXh0ZW5kKHsKKyAgICBmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgdmFyIGks
IHJldCwgc2VsZiwKKyAgICBsZW4gPSB0aGlzLmxlbmd0aDsKKworICAgIGlmICggdHlwZW9mIHNl
bGVjdG9yICE9PSAic3RyaW5nIiApIHsKKyAgICBzZWxmID0gdGhpczsKKyAgICByZXR1cm4gdGhp
cy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CisgICAg
Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBpZiAoIGpRdWVyeS5jb250YWlucygg
c2VsZlsgaSBdLCB0aGlzICkgKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAg
ICB9KSApOworICAgIH0KKworICAgIHJldCA9IFtdOworICAgIGZvciAoIGkgPSAwOyBpIDwgbGVu
OyBpKysgKSB7CisgICAgalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzWyBpIF0sIHJldCApOwor
ICAgIH0KKworICAgIC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVj
b21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKQorICAgIHJldCA9IHRoaXMucHVzaFN0
YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTsKKyAgICByZXQuc2Vs
ZWN0b3IgPSAoIHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9yICsgIiAiIDogIiIgKSArIHNl
bGVjdG9yOworICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIGhhczogZnVuY3Rpb24oIHRh
cmdldCApIHsKKyAgICB2YXIgaSwKKyAgICB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMg
KSwKKyAgICBsZW4gPSB0YXJnZXRzLmxlbmd0aDsKKworICAgIHJldHVybiB0aGlzLmZpbHRlcihm
dW5jdGlvbigpIHsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgIGlmICgg
alF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7CisgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAgICB9LAorCisgICAgbm90OiBmdW5jdGlvbiggc2Vs
ZWN0b3IgKSB7CisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0
b3IsIGZhbHNlKSApOworICAgIH0sCisKKyAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciAp
IHsKKyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciwgdHJ1
ZSkgKTsKKyAgICB9LAorCisgICAgaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICByZXR1
cm4gISFzZWxlY3RvciAmJiAoCisgICAgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/Cisg
ICAgLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1l
bWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldAorICAgIC8vIHNvICQoInA6Zmlyc3QiKS5pcygi
cDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvICJwIi4KKyAgICBy
bmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPworICAgIGpRdWVyeSggc2VsZWN0b3IsIHRo
aXMuY29udGV4dCApLmluZGV4KCB0aGlzWzBdICkgPj0gMCA6CisgICAgalF1ZXJ5LmZpbHRlcigg
c2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKKyAgICB0aGlzLmZpbHRlciggc2VsZWN0b3Ig
KS5sZW5ndGggPiAwICk7CisgICAgfSwKKworICAgIGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3Rv
cnMsIGNvbnRleHQgKSB7CisgICAgdmFyIGN1ciwKKyAgICBpID0gMCwKKyAgICBsID0gdGhpcy5s
ZW5ndGgsCisgICAgcmV0ID0gW10sCisgICAgcG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxl
Y3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5nIiA/CisgICAgalF1ZXJ5KCBz
ZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgorICAgIDA7CisKKyAgICBmb3Ig
KCA7IGkgPCBsOyBpKysgKSB7CisgICAgY3VyID0gdGhpc1tpXTsKKworICAgIHdoaWxlICggY3Vy
ICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCAmJiBjdXIubm9kZVR5cGUg
IT09IDExICkgeworICAgIGlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeS5m
aW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykgKSB7CisgICAgcmV0LnB1c2goIGN1
ciApOworICAgIGJyZWFrOworICAgIH0KKyAgICBjdXIgPSBjdXIucGFyZW50Tm9kZTsKKyAgICB9
CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQubGVuZ3RoID4gMSA/IGpR
dWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7CisgICAgfSwKKworICAgIC8vIERldGVybWluZSB0
aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KKyAgICAvLyB0aGUgbWF0Y2hlZCBzZXQg
b2YgZWxlbWVudHMKKyAgICBpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7CisKKyAgICAvLyBObyBh
cmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudAorICAgIGlmICggIWVsZW0gKSB7CisgICAg
cmV0dXJuICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5w
cmV2QWxsKCkubGVuZ3RoIDogLTE7CisgICAgfQorCisgICAgLy8gaW5kZXggaW4gc2VsZWN0b3IK
KyAgICBpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKKyAgICByZXR1cm4galF1ZXJ5
LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CisgICAgfQorCisgICAgLy8gTG9j
YXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisgICAgcmV0dXJuIGpRdWVy
eS5pbkFycmF5KAorICAgIC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZp
cnN0IGVsZW1lbnQgaXMgdXNlZAorICAgIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0sIHRo
aXMgKTsKKyAgICB9LAorCisgICAgYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7
CisgICAgdmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPworICAgIGpRdWVy
eSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CisgICAgalF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3Ig
JiYgc2VsZWN0b3Iubm9kZVR5cGUgPyBbIHNlbGVjdG9yIF0gOiBzZWxlY3RvciApLAorICAgIGFs
bCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CisKKyAgICByZXR1cm4gdGhpcy5w
dXNoU3RhY2soIGpRdWVyeS51bmlxdWUoYWxsKSApOworICAgIH0sCisKKyAgICBhZGRCYWNrOiBm
dW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBu
dWxsID8KKyAgICB0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKHNlbGVj
dG9yKQorICAgICk7CisgICAgfQorfSk7CisKK2pRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZu
LmFkZEJhY2s7CisKK2Z1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgeworICAgIGRvIHsKKyAg
ICBjdXIgPSBjdXJbIGRpciBdOworICAgIH0gd2hpbGUgKCBjdXIgJiYgY3VyLm5vZGVUeXBlICE9
PSAxICk7CisKKyAgICByZXR1cm4gY3VyOworfQorCitqUXVlcnkuZWFjaCh7CisgICAgcGFyZW50
OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwor
ICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51
bGw7CisgICAgfSwKKyAgICBwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4g
alF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiICk7CisgICAgfSwKKyAgICBwYXJlbnRzVW50
aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICByZXR1cm4galF1ZXJ5LmRpcigg
ZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOworICAgIH0sCisgICAgbmV4dDogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKyAg
ICB9LAorICAgIHByZXY6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBzaWJsaW5nKCBl
bGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAgIH0sCisgICAgbmV4dEFsbDogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsK
KyAgICB9LAorICAgIHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBqUXVl
cnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAgIH0sCisgICAgbmV4dFVudGls
OiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVs
ZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAgICBwcmV2VW50aWw6IGZ1bmN0
aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICByZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBy
ZXZpb3VzU2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAgICBzaWJsaW5nczogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8
fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTsKKyAgICB9LAorICAgIGNoaWxkcmVuOiBmdW5jdGlv
biggZWxlbSApIHsKKyAgICByZXR1cm4galF1ZXJ5LnNpYmxpbmcoIGVsZW0uZmlyc3RDaGlsZCAp
OworICAgIH0sCisgICAgY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBq
UXVlcnkubm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgPworICAgIGVsZW0uY29udGVudERvY3Vt
ZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CisgICAgalF1ZXJ5Lm1lcmdlKCBb
XSwgZWxlbS5jaGlsZE5vZGVzICk7CisgICAgfQorfSwgZnVuY3Rpb24oIG5hbWUsIGZuICkgewor
ICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKKyAg
ICB2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7CisKKyAgICBpZiAoICFy
dW50aWwudGVzdCggbmFtZSApICkgeworICAgIHNlbGVjdG9yID0gdW50aWw7CisgICAgfQorCisg
ICAgaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAg
IHJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKKyAgICB9CisKKyAgICByZXQg
PSB0aGlzLmxlbmd0aCA+IDEgJiYgIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSA/IGpRdWVyeS51
bmlxdWUoIHJldCApIDogcmV0OworCisgICAgaWYgKCB0aGlzLmxlbmd0aCA+IDEgJiYgcnBhcmVu
dHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKKyAgICByZXQgPSByZXQucmV2ZXJzZSgpOworICAgIH0K
KworICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7CisgICAgfTsKK30pOworCitqUXVl
cnkuZXh0ZW5kKHsKKyAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkgewor
ICAgIGlmICggbm90ICkgeworICAgIGV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKKyAgICB9
CisKKyAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KKyAgICBqUXVlcnkuZmluZC5tYXRj
aGVzU2VsZWN0b3IoZWxlbXNbMF0sIGV4cHIpID8gWyBlbGVtc1swXSBdIDogW10gOgorICAgIGpR
dWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOworICAgIH0sCisKKyAgICBkaXI6IGZ1bmN0
aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgeworICAgIHZhciBtYXRjaGVkID0gW10sCisgICAgY3Vy
ID0gZWxlbVsgZGlyIF07CisKKyAgICB3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkg
JiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnko
IGN1ciApLmlzKCB1bnRpbCApKSApIHsKKyAgICBpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSApIHsK
KyAgICBtYXRjaGVkLnB1c2goIGN1ciApOworICAgIH0KKyAgICBjdXIgPSBjdXJbZGlyXTsKKyAg
ICB9CisgICAgcmV0dXJuIG1hdGNoZWQ7CisgICAgfSwKKworICAgIHNpYmxpbmc6IGZ1bmN0aW9u
KCBuLCBlbGVtICkgeworICAgIHZhciByID0gW107CisKKyAgICBmb3IgKCA7IG47IG4gPSBuLm5l
eHRTaWJsaW5nICkgeworICAgIGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkg
eworICAgIHIucHVzaCggbiApOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcjsKKyAgICB9
Cit9KTsKKworLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmls
dGVyIGFuZCBub3QKK2Z1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCAp
IHsKKworICAgIC8vIENhbid0IHBhc3MgbnVsbCBvciB1bmRlZmluZWQgdG8gaW5kZXhPZiBpbiBG
aXJlZm94IDQKKyAgICAvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjaworICAgIHF1YWxp
ZmllciA9IHF1YWxpZmllciB8fCAwOworCisgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVh
bGlmaWVyICkgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbigg
ZWxlbSwgaSApIHsKKyAgICB2YXIgcmV0VmFsID0gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwg
ZWxlbSApOworICAgIHJldHVybiByZXRWYWwgPT09IGtlZXA7CisgICAgfSk7CisKKyAgICB9IGVs
c2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5ncmVwKGVs
ZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gKCBlbGVtID09PSBxdWFsaWZp
ZXIgKSA9PT0ga2VlcDsKKyAgICB9KTsKKworICAgIH0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZp
ZXIgPT09ICJzdHJpbmciICkgeworICAgIHZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1l
bnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsK
KyAgICB9KTsKKworICAgIGlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CisgICAg
cmV0dXJuIGpRdWVyeS5maWx0ZXIocXVhbGlmaWVyLCBmaWx0ZXJlZCwgIWtlZXApOworICAgIH0g
ZWxzZSB7CisgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBmaWx0ZXJl
ZCApOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1
bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiAoIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBxdWFs
aWZpZXIgKSA+PSAwICkgPT09IGtlZXA7CisgICAgfSk7Cit9CitmdW5jdGlvbiBjcmVhdGVTYWZl
RnJhZ21lbnQoIGRvY3VtZW50ICkgeworICAgIHZhciBsaXN0ID0gbm9kZU5hbWVzLnNwbGl0KCAi
fCIgKSwKKyAgICBzYWZlRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsK
KworICAgIGlmICggc2FmZUZyYWcuY3JlYXRlRWxlbWVudCApIHsKKyAgICB3aGlsZSAoIGxpc3Qu
bGVuZ3RoICkgeworICAgIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQoCisgICAgbGlzdC5wb3AoKQor
ICAgICk7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FmZUZyYWc7Cit9CisKK3ZhciBub2Rl
TmFtZXMgPSAiYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlz
dHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnwiICsKKyAgICAiaGVhZGVyfGhncm91
cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlk
ZW8iLAorICAgIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLAor
ICAgIHJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoIjwoPzoiICsgbm9kZU5hbWVzICsgIilbXFxz
Lz5dIiwgImkiKSwKKyAgICBybGVhZGluZ1doaXRlc3BhY2UgPSAvXlxzKy8sCisgICAgcnhodG1s
VGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFt
KSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKKyAgICBydGFnTmFtZSA9IC88KFtcdzpdKykvLAorICAg
IHJ0Ym9keSA9IC88dGJvZHkvaSwKKyAgICByaHRtbCA9IC88fCYjP1x3KzsvLAorICAgIHJub0lu
bmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksCisgICAgbWFuaXB1bGF0aW9uX3Jj
aGVja2FibGVUeXBlID0gL14oPzpjaGVja2JveHxyYWRpbykkL2ksCisgICAgLy8gY2hlY2tlZD0i
Y2hlY2tlZCIgb3IgY2hlY2tlZAorICAgIHJjaGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1c
cyouY2hlY2tlZC4pL2ksCisgICAgcnNjcmlwdFR5cGUgPSAvXiR8XC8oPzpqYXZhfGVjbWEpc2Ny
aXB0L2ksCisgICAgcnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcLyguKikvLAorICAgIHJjbGVh
blNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZywKKwor
ICAgIC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMy
MDApCisgICAgd3JhcE1hcCA9IHsKKyAgICBvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9
J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAorICAgIGxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0
PiIsICI8L2ZpZWxkc2V0PiIgXSwKKyAgICBhcmVhOiBbIDEsICI8bWFwPiIsICI8L21hcD4iIF0s
CisgICAgcGFyYW06IFsgMSwgIjxvYmplY3Q+IiwgIjwvb2JqZWN0PiIgXSwKKyAgICB0aGVhZDog
WyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKyAgICB0cjogWyAyLCAiPHRhYmxlPjx0Ym9k
eT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKyAgICBjb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+
PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCisgICAgdGQ6IFsg
MywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCisKKyAg
ICAvLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0LCBzdHlsZSwgb3IgYW55IGh0
bWw1IChOb1Njb3BlKSB0YWdzLAorICAgIC8vIHVubGVzcyB3cmFwcGVkIGluIGEgZGl2IHdpdGgg
bm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQuCisgICAgX2RlZmF1bHQ6IGpR
dWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbIDAsICIiLCAiIiBdIDogWyAxLCAiWDxkaXY+
IiwgIjwvZGl2PiIgIF0KKyAgICB9LAorICAgIHNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFn
bWVudCggZG9jdW1lbnQgKSwKKyAgICBmcmFnbWVudERpdiA9IHNhZmVGcmFnbWVudC5hcHBlbmRD
aGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsKKword3JhcE1hcC5vcHRncm91
cCA9IHdyYXBNYXAub3B0aW9uOword3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFw
TWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsKK3dyYXBNYXAu
dGggPSB3cmFwTWFwLnRkOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICB0ZXh0OiBmdW5jdGlv
biggdmFsdWUgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2
YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisgICAgalF1ZXJ5LnRl
eHQoIHRoaXMgKSA6CisgICAgdGhpcy5lbXB0eSgpLmFwcGVuZCggKCB0aGlzWzBdICYmIHRoaXNb
MF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRleHROb2RlKCB2YWx1ZSApICk7
CisgICAgfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKyAgICB9LAorCisgICAg
d3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
aHRtbCApICkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgeworICAgIGpRdWVy
eSh0aGlzKS53cmFwQWxsKCBodG1sLmNhbGwodGhpcywgaSkgKTsKKyAgICB9KTsKKyAgICB9CisK
KyAgICBpZiAoIHRoaXNbMF0gKSB7CisgICAgLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRh
cmdldCBhcm91bmQKKyAgICB2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRv
Y3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CisKKyAgICBpZiAoIHRoaXNbMF0ucGFyZW50Tm9k
ZSApIHsKKyAgICB3cmFwLmluc2VydEJlZm9yZSggdGhpc1swXSApOworICAgIH0KKworICAgIHdy
YXAubWFwKGZ1bmN0aW9uKCkgeworICAgIHZhciBlbGVtID0gdGhpczsKKworICAgIHdoaWxlICgg
ZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKKyAg
ICBlbGVtID0gZWxlbS5maXJzdENoaWxkOworICAgIH0KKworICAgIHJldHVybiBlbGVtOworICAg
IH0pLmFwcGVuZCggdGhpcyApOworICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0sCisK
KyAgICB3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAgIGlmICggalF1ZXJ5LmlzRnVu
Y3Rpb24oIGh0bWwgKSApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKyAg
ICBqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKKyAgICB9KTsK
KyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworICAgIHZhciBzZWxm
ID0galF1ZXJ5KCB0aGlzICksCisgICAgY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CisKKyAg
ICBpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKKyAgICBjb250ZW50cy53cmFwQWxsKCBodG1sICk7
CisKKyAgICB9IGVsc2UgeworICAgIHNlbGYuYXBwZW5kKCBodG1sICk7CisgICAgfQorICAgIH0p
OworICAgIH0sCisKKyAgICB3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKKyAgICB2YXIgaXNGdW5j
dGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CisKKyAgICByZXR1cm4gdGhpcy5lYWNo
KGZ1bmN0aW9uKGkpIHsKKyAgICBqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8g
aHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOworICAgIH0pOworICAgIH0sCisKKyAgICB1bndy
YXA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24o
KSB7CisgICAgaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiYm9keSIgKSApIHsKKyAgICBq
UXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7CisgICAgfQorICAg
IH0pLmVuZCgpOworICAgIH0sCisKKyAgICBhcHBlbmQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMu
bm9kZVR5cGUgPT09IDkgKSB7CisgICAgdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOworICAgIH0K
KyAgICB9KTsKKyAgICB9LAorCisgICAgcHJlcGVuZDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICBp
ZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5u
b2RlVHlwZSA9PT0gOSApIHsKKyAgICB0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJz
dENoaWxkICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAgICBiZWZvcmU6IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlv
biggZWxlbSApIHsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKKyAgICB0aGlzLnBhcmVu
dE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisgICAgfQorICAgIH0pOworICAgIH0s
CisKKyAgICBhZnRlcjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFy
Z3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIGlmICggdGhpcy5wYXJlbnRO
b2RlICkgeworICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4
dFNpYmxpbmcgKTsKKyAgICB9CisgICAgfSk7CisgICAgfSwKKworICAgIC8vIGtlZXBEYXRhIGlz
IGZvciBpbnRlcm5hbCB1c2Ugb25seS0tZG8gbm90IGRvY3VtZW50CisgICAgcmVtb3ZlOiBmdW5j
dGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgeworICAgIHZhciBlbGVtLAorICAgIGkgPSAwOwor
CisgICAgZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICBpZiAo
ICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGgg
PiAwICkgeworICAgIGlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Cisg
ICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTsKKyAgICB9CisKKyAgICBpZiAo
IGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICBpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlu
cyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7CisgICAgc2V0R2xvYmFsRXZhbCggZ2V0
QWxsKCBlbGVtLCAic2NyaXB0IiApICk7CisgICAgfQorICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1v
dmVDaGlsZCggZWxlbSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7
CisgICAgfSwKKworICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZWxlbSwKKyAgICBp
ID0gMDsKKworICAgIGZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7Cisg
ICAgLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCisgICAg
aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFs
bCggZWxlbSwgZmFsc2UgKSApOworICAgIH0KKworICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5n
IG5vZGVzCisgICAgd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7CisgICAgZWxlbS5yZW1vdmVD
aGlsZCggZWxlbS5maXJzdENoaWxkICk7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyBhIHNl
bGVjdCwgZW5zdXJlIHRoYXQgaXQgZGlzcGxheXMgZW1wdHkgKCMxMjMzNikKKyAgICAvLyBTdXBw
b3J0OiBJRTw5CisgICAgaWYgKCBlbGVtLm9wdGlvbnMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVt
LCAic2VsZWN0IiApICkgeworICAgIGVsZW0ub3B0aW9ucy5sZW5ndGggPSAwOworICAgIH0KKyAg
ICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgY2xvbmU6IGZ1bmN0aW9uKCBk
YXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKyAgICBkYXRhQW5kRXZlbnRzID0g
ZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOworICAgIGRlZXBE
YXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMg
OiBkZWVwRGF0YUFuZEV2ZW50czsKKworICAgIHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24gKCkg
eworICAgIHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRh
QW5kRXZlbnRzICk7CisgICAgfSk7CisgICAgfSwKKworICAgIGh0bWw6IGZ1bmN0aW9uKCB2YWx1
ZSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkg
eworICAgIHZhciBlbGVtID0gdGhpc1swXSB8fCB7fSwKKyAgICBpID0gMCwKKyAgICBsID0gdGhp
cy5sZW5ndGg7CisKKyAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CisgICAgcmV0dXJu
IGVsZW0ubm9kZVR5cGUgPT09IDEgPworICAgIGVsZW0uaW5uZXJIVE1MLnJlcGxhY2UoIHJpbmxp
bmVqUXVlcnksICIiICkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYg
d2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCisgICAgaWYgKCB0
eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAm
JgorICAgICggalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8fCAhcm5vc2hpbWNhY2hlLnRl
c3QoIHZhbHVlICkgICkgJiYKKyAgICAoIGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNl
IHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSApICYmCisgICAgIXdyYXBNYXBb
ICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCkg
XSApIHsKKworICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSggcnhodG1sVGFnLCAiPCQxPjwvJDI+
IiApOworCisgICAgdHJ5IHsKKyAgICBmb3IgKDsgaSA8IGw7IGkrKyApIHsKKyAgICAvLyBSZW1v
dmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKyAgICBlbGVtID0gdGhp
c1tpXSB8fCB7fTsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisgICAgalF1ZXJ5
LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CisgICAgZWxlbS5pbm5lckhUTUwg
PSB2YWx1ZTsKKyAgICB9CisgICAgfQorCisgICAgZWxlbSA9IDA7CisKKyAgICAvLyBJZiB1c2lu
ZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QK
KyAgICB9IGNhdGNoKGUpIHt9CisgICAgfQorCisgICAgaWYgKCBlbGVtICkgeworICAgIHRoaXMu
ZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CisgICAgfQorICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1
bWVudHMubGVuZ3RoICk7CisgICAgfSwKKworICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFs
dWUgKSB7CisgICAgdmFyIGlzRnVuYyA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworCisg
ICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERP
TSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKKyAgICAvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBs
YWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cworICAgIGlmICggIWlzRnVuYyAmJiB0
eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgeworICAgIHZhbHVlID0galF1ZXJ5KCB2YWx1ZSAp
Lm5vdCggdGhpcyApLmRldGFjaCgpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmRvbU1hbmlw
KCBbIHZhbHVlIF0sIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBuZXh0ID0gdGhp
cy5uZXh0U2libGluZywKKyAgICBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CisKKyAgICBpZiAo
IHBhcmVudCApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5yZW1vdmUoKTsKKyAgICBwYXJlbnQuaW5z
ZXJ0QmVmb3JlKCBlbGVtLCBuZXh0ICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAgICBk
ZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICByZXR1cm4gdGhpcy5yZW1vdmUoIHNl
bGVjdG9yLCB0cnVlICk7CisgICAgfSwKKworICAgIGRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywg
dGFibGUsIGNhbGxiYWNrICkgeworCisgICAgLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwor
ICAgIGFyZ3MgPSBjb3JlX2NvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKKworICAgIHZhciBmaXJz
dCwgbm9kZSwgaGFzU2NyaXB0cywKKyAgICBzY3JpcHRzLCBkb2MsIGZyYWdtZW50LAorICAgIGkg
PSAwLAorICAgIGwgPSB0aGlzLmxlbmd0aCwKKyAgICBzZXQgPSB0aGlzLAorICAgIGlOb0Nsb25l
ID0gbCAtIDEsCisgICAgdmFsdWUgPSBhcmdzWzBdLAorICAgIGlzRnVuY3Rpb24gPSBqUXVlcnku
aXNGdW5jdGlvbiggdmFsdWUgKTsKKworICAgIC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVu
dHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAorICAgIGlmICggaXNGdW5jdGlvbiB8
fCAhKCBsIDw9IDEgfHwgdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiB8fCBqUXVlcnkuc3VwcG9y
dC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CisgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7CisgICAgdmFyIHNlbGYgPSBzZXQuZXEoIGlu
ZGV4ICk7CisgICAgaWYgKCBpc0Z1bmN0aW9uICkgeworICAgIGFyZ3NbMF0gPSB2YWx1ZS5jYWxs
KCB0aGlzLCBpbmRleCwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCApOworICAgIH0K
KyAgICBzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKTsKKyAgICB9KTsKKyAg
ICB9CisKKyAgICBpZiAoIGwgKSB7CisgICAgZnJhZ21lbnQgPSBqUXVlcnkuYnVpbGRGcmFnbWVu
dCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCB0aGlzICk7CisgICAgZmly
c3QgPSBmcmFnbWVudC5maXJzdENoaWxkOworCisgICAgaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVz
Lmxlbmd0aCA9PT0gMSApIHsKKyAgICBmcmFnbWVudCA9IGZpcnN0OworICAgIH0KKworICAgIGlm
ICggZmlyc3QgKSB7CisgICAgdGFibGUgPSB0YWJsZSAmJiBqUXVlcnkubm9kZU5hbWUoIGZpcnN0
LCAidHIiICk7CisgICAgc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJz
Y3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKKyAgICBoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5n
dGg7CisKKyAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVt
IGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cAorICAgIC8vIGJlaW5n
IGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuCisgICAg
Zm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIG5vZGUgPSBmcmFnbWVudDsKKworICAgIGlmICgg
aSAhPT0gaU5vQ2xvbmUgKSB7CisgICAgbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwg
dHJ1ZSApOworCisgICAgLy8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBs
YXRlciByZXN0b3JhdGlvbgorICAgIGlmICggaGFzU2NyaXB0cyApIHsKKyAgICBqUXVlcnkubWVy
Z2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgInNjcmlwdCIgKSApOworICAgIH0KKyAgICB9CisK
KyAgICBjYWxsYmFjay5jYWxsKAorICAgIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpc1tp
XSwgInRhYmxlIiApID8KKyAgICBmaW5kT3JBcHBlbmQoIHRoaXNbaV0sICJ0Ym9keSIgKSA6Cisg
ICAgdGhpc1tpXSwKKyAgICBub2RlLAorICAgIGkKKyAgICApOworICAgIH0KKworICAgIGlmICgg
aGFzU2NyaXB0cyApIHsKKyAgICBkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5v
d25lckRvY3VtZW50OworCisgICAgLy8gUmVlbmFibGUgc2NyaXB0cworICAgIGpRdWVyeS5tYXAo
IHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTsKKworICAgIC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUg
c2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KKyAgICBmb3IgKCBpID0gMDsgaSA8
IGhhc1NjcmlwdHM7IGkrKyApIHsKKyAgICBub2RlID0gc2NyaXB0c1sgaSBdOworICAgIGlmICgg
cnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkgJiYKKyAgICAhalF1ZXJ5Ll9kYXRh
KCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJiBqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkg
eworCisgICAgaWYgKCBub2RlLnNyYyApIHsKKyAgICAvLyBIb3BlIGFqYXggaXMgYXZhaWxhYmxl
Li4uCisgICAgalF1ZXJ5LmFqYXgoeworICAgIHVybDogbm9kZS5zcmMsCisgICAgdHlwZTogIkdF
VCIsCisgICAgZGF0YVR5cGU6ICJzY3JpcHQiLAorICAgIGFzeW5jOiBmYWxzZSwKKyAgICBnbG9i
YWw6IGZhbHNlLAorICAgICJ0aHJvd3MiOiB0cnVlCisgICAgfSk7CisgICAgfSBlbHNlIHsKKyAg
ICBqUXVlcnkuZ2xvYmFsRXZhbCggKCBub2RlLnRleHQgfHwgbm9kZS50ZXh0Q29udGVudCB8fCBu
b2RlLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIiIgKSApOworICAg
IH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZpeCAjMTE4MDk6IEF2b2lkIGxlYWtp
bmcgbWVtb3J5CisgICAgZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7CisgICAgfQorICAgIH0KKwor
ICAgIHJldHVybiB0aGlzOworICAgIH0KK30pOworCitmdW5jdGlvbiBmaW5kT3JBcHBlbmQoIGVs
ZW0sIHRhZyApIHsKKyAgICByZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIClb
MF0gfHwgZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
IHRhZyApICk7Cit9CisKKy8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Yg
c2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb24KK2Z1bmN0aW9uIGRpc2Fi
bGVTY3JpcHQoIGVsZW0gKSB7CisgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUo
InR5cGUiKTsKKyAgICBlbGVtLnR5cGUgPSAoIGF0dHIgJiYgYXR0ci5zcGVjaWZpZWQgKSArICIv
IiArIGVsZW0udHlwZTsKKyAgICByZXR1cm4gZWxlbTsKK30KK2Z1bmN0aW9uIHJlc3RvcmVTY3Jp
cHQoIGVsZW0gKSB7CisgICAgdmFyIG1hdGNoID0gcnNjcmlwdFR5cGVNYXNrZWQuZXhlYyggZWxl
bS50eXBlICk7CisgICAgaWYgKCBtYXRjaCApIHsKKyAgICBlbGVtLnR5cGUgPSBtYXRjaFsxXTsK
KyAgICB9IGVsc2UgeworICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIik7CisgICAgfQor
ICAgIHJldHVybiBlbGVtOworfQorCisvLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkg
YmVlbiBldmFsdWF0ZWQKK2Z1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50
cyApIHsKKyAgICB2YXIgZWxlbSwKKyAgICBpID0gMDsKKyAgICBmb3IgKCA7IChlbGVtID0gZWxl
bXNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICBqUXVlcnkuX2RhdGEoIGVsZW0sICJnbG9iYWxF
dmFsIiwgIXJlZkVsZW1lbnRzIHx8IGpRdWVyeS5fZGF0YSggcmVmRWxlbWVudHNbaV0sICJnbG9i
YWxFdmFsIiApICk7CisgICAgfQorfQorCitmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBk
ZXN0ICkgeworCisgICAgaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0
YSggc3JjICkgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciB0eXBlLCBpLCBsLAor
ICAgIG9sZERhdGEgPSBqUXVlcnkuX2RhdGEoIHNyYyApLAorICAgIGN1ckRhdGEgPSBqUXVlcnku
X2RhdGEoIGRlc3QsIG9sZERhdGEgKSwKKyAgICBldmVudHMgPSBvbGREYXRhLmV2ZW50czsKKwor
ICAgIGlmICggZXZlbnRzICkgeworICAgIGRlbGV0ZSBjdXJEYXRhLmhhbmRsZTsKKyAgICBjdXJE
YXRhLmV2ZW50cyA9IHt9OworCisgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7CisgICAgZm9y
ICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisgICAg
alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApOworICAg
IH0KKyAgICB9CisgICAgfQorCisgICAgLy8gbWFrZSB0aGUgY2xvbmVkIHB1YmxpYyBkYXRhIG9i
amVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKKyAgICBpZiAoIGN1ckRhdGEuZGF0YSApIHsK
KyAgICBjdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyRGF0YS5kYXRhICk7Cisg
ICAgfQorfQorCitmdW5jdGlvbiBmaXhDbG9uZU5vZGVJc3N1ZXMoIHNyYywgZGVzdCApIHsKKyAg
ICB2YXIgbm9kZU5hbWUsIGUsIGRhdGE7CisKKyAgICAvLyBXZSBkbyBub3QgbmVlZCB0byBkbyBh
bnl0aGluZyBmb3Igbm9uLUVsZW1lbnRzCisgICAgaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkg
eworICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9M
b3dlckNhc2UoKTsKKworICAgIC8vIElFNi04IGNvcGllcyBldmVudHMgYm91bmQgdmlhIGF0dGFj
aEV2ZW50IHdoZW4gdXNpbmcgY2xvbmVOb2RlLgorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0Lm5v
Q2xvbmVFdmVudCAmJiBkZXN0WyBqUXVlcnkuZXhwYW5kbyBdICkgeworICAgIGRhdGEgPSBqUXVl
cnkuX2RhdGEoIGRlc3QgKTsKKworICAgIGZvciAoIGUgaW4gZGF0YS5ldmVudHMgKSB7CisgICAg
alF1ZXJ5LnJlbW92ZUV2ZW50KCBkZXN0LCBlLCBkYXRhLmhhbmRsZSApOworICAgIH0KKworICAg
IC8vIEV2ZW50IGRhdGEgZ2V0cyByZWZlcmVuY2VkIGluc3RlYWQgb2YgY29waWVkIGlmIHRoZSBl
eHBhbmRvIGdldHMgY29waWVkIHRvbworICAgIGRlc3QucmVtb3ZlQXR0cmlidXRlKCBqUXVlcnku
ZXhwYW5kbyApOworICAgIH0KKworICAgIC8vIElFIGJsYW5rcyBjb250ZW50cyB3aGVuIGNsb25p
bmcgc2NyaXB0cywgYW5kIHRyaWVzIHRvIGV2YWx1YXRlIG5ld2x5LXNldCB0ZXh0CisgICAgaWYg
KCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9PSBzcmMudGV4dCApIHsKKyAg
ICBkaXNhYmxlU2NyaXB0KCBkZXN0ICkudGV4dCA9IHNyYy50ZXh0OworICAgIHJlc3RvcmVTY3Jp
cHQoIGRlc3QgKTsKKworICAgIC8vIElFNi0xMCBpbXByb3Blcmx5IGNsb25lcyBjaGlsZHJlbiBv
ZiBvYmplY3QgZWxlbWVudHMgdXNpbmcgY2xhc3NpZC4KKyAgICAvLyBJRTEwIHRocm93cyBOb01v
ZGlmaWNhdGlvbkFsbG93ZWRFcnJvciBpZiBwYXJlbnQgaXMgbnVsbCwgIzEyMTMyLgorICAgIH0g
ZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKKyAgICBpZiAoIGRlc3QucGFyZW50
Tm9kZSApIHsKKyAgICBkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CisgICAgfQorCisg
ICAgLy8gVGhpcyBwYXRoIGFwcGVhcnMgdW5hdm9pZGFibGUgZm9yIElFOS4gV2hlbiBjbG9uaW5n
IGFuIG9iamVjdAorICAgIC8vIGVsZW1lbnQgaW4gSUU5LCB0aGUgb3V0ZXJIVE1MIHN0cmF0ZWd5
IGFib3ZlIGlzIG5vdCBzdWZmaWNpZW50LgorICAgIC8vIElmIHRoZSBzcmMgaGFzIGlubmVySFRN
TCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAorICAgIC8vIGNvcHkgdGhlIHNyYy5pbm5l
ckhUTUwgaW50byB0aGUgZGVzdC5pbm5lckhUTUwuICMxMDMyNAorICAgIGlmICggalF1ZXJ5LnN1
cHBvcnQuaHRtbDVDbG9uZSAmJiAoIHNyYy5pbm5lckhUTUwgJiYgIWpRdWVyeS50cmltKGRlc3Qu
aW5uZXJIVE1MKSApICkgeworICAgIGRlc3QuaW5uZXJIVE1MID0gc3JjLmlubmVySFRNTDsKKyAg
ICB9CisKKyAgICB9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiAmJiBtYW5pcHVsYXRp
b25fcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKKyAgICAvLyBJRTYtOCBmYWls
cyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CisgICAg
Ly8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQg
ZWxlbWVudAorICAgIC8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tl
ZCB2YWx1ZSBpc24ndCBhbHNvIHNldAorCisgICAgZGVzdC5kZWZhdWx0Q2hlY2tlZCA9IGRlc3Qu
Y2hlY2tlZCA9IHNyYy5jaGVja2VkOworCisgICAgLy8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBl
bmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWQKKyAgICAvLyBjaGVja2JveC9yYWRp
byBidXR0b24gdG8gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgIm9uIgorICAgIGlmICggZGVz
dC52YWx1ZSAhPT0gc3JjLnZhbHVlICkgeworICAgIGRlc3QudmFsdWUgPSBzcmMudmFsdWU7Cisg
ICAgfQorCisgICAgLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24g
dG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKKyAgICAvLyBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9u
cworICAgIH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib3B0aW9uIiApIHsKKyAgICBkZXN0LmRl
ZmF1bHRTZWxlY3RlZCA9IGRlc3Quc2VsZWN0ZWQgPSBzcmMuZGVmYXVsdFNlbGVjdGVkOworCisg
ICAgLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3Qg
dmFsdWUgd2hlbgorICAgIC8vIGNsb25pbmcgb3RoZXIgdHlwZXMgb2YgaW5wdXQgZmllbGRzCisg
ICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0
YXJlYSIgKSB7CisgICAgZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOworICAg
IH0KK30KKworalF1ZXJ5LmVhY2goeworICAgIGFwcGVuZFRvOiAiYXBwZW5kIiwKKyAgICBwcmVw
ZW5kVG86ICJwcmVwZW5kIiwKKyAgICBpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAorICAgIGluc2Vy
dEFmdGVyOiAiYWZ0ZXIiLAorICAgIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30sIGZ1bmN0
aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9u
KCBzZWxlY3RvciApIHsKKyAgICB2YXIgZWxlbXMsCisgICAgaSA9IDAsCisgICAgcmV0ID0gW10s
CisgICAgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAorICAgIGxhc3QgPSBpbnNlcnQubGVu
Z3RoIC0gMTsKKworICAgIGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7CisgICAgZWxlbXMgPSBp
ID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUodHJ1ZSk7CisgICAgalF1ZXJ5KCBpbnNlcnRb
aV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTsKKworICAgIC8vIE1vZGVybiBicm93c2VycyBjYW4g
YXBwbHkgalF1ZXJ5IGNvbGxlY3Rpb25zIGFzIGFycmF5cywgYnV0IG9sZElFIG5lZWRzIGEgLmdl
dCgpCisgICAgY29yZV9wdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7CisgICAgfQorCisg
ICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKKyAgICB9OworfSk7CisKK2Z1bmN0aW9u
IGdldEFsbCggY29udGV4dCwgdGFnICkgeworICAgIHZhciBlbGVtcywgZWxlbSwKKyAgICBpID0g
MCwKKyAgICBmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBj
b3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAi
KiIgKSA6CisgICAgdHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCAhPT0gY29yZV9zdHJ1
bmRlZmluZWQgPyBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKSA6CisgICAg
dW5kZWZpbmVkOworCisgICAgaWYgKCAhZm91bmQgKSB7CisgICAgZm9yICggZm91bmQgPSBbXSwg
ZWxlbXMgPSBjb250ZXh0LmNoaWxkTm9kZXMgfHwgY29udGV4dDsgKGVsZW0gPSBlbGVtc1tpXSkg
IT0gbnVsbDsgaSsrICkgeworICAgIGlmICggIXRhZyB8fCBqUXVlcnkubm9kZU5hbWUoIGVsZW0s
IHRhZyApICkgeworICAgIGZvdW5kLnB1c2goIGVsZW0gKTsKKyAgICB9IGVsc2UgeworICAgIGpR
dWVyeS5tZXJnZSggZm91bmQsIGdldEFsbCggZWxlbSwgdGFnICkgKTsKKyAgICB9CisgICAgfQor
ICAgIH0KKworICAgIHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5v
ZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/CisgICAgalF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwg
Zm91bmQgKSA6CisgICAgZm91bmQ7Cit9CisKKy8vIFVzZWQgaW4gYnVpbGRGcmFnbWVudCwgZml4
ZXMgdGhlIGRlZmF1bHRDaGVja2VkIHByb3BlcnR5CitmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tl
ZCggZWxlbSApIHsKKyAgICBpZiAoIG1hbmlwdWxhdGlvbl9yY2hlY2thYmxlVHlwZS50ZXN0KCBl
bGVtLnR5cGUgKSApIHsKKyAgICBlbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwor
ICAgIH0KK30KKworalF1ZXJ5LmV4dGVuZCh7CisgICAgY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBk
YXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKyAgICB2YXIgZGVzdEVsZW1lbnRz
LCBub2RlLCBjbG9uZSwgaSwgc3JjRWxlbWVudHMsCisgICAgaW5QYWdlID0galF1ZXJ5LmNvbnRh
aW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAgIGlmICggalF1ZXJ5LnN1cHBv
cnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxlbSkgfHwgIXJub3NoaW1jYWNoZS50
ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsgIj4iICkgKSB7CisgICAgY2xvbmUgPSBlbGVtLmNs
b25lTm9kZSggdHJ1ZSApOworCisgICAgLy8gSUU8PTggZG9lcyBub3QgcHJvcGVybHkgY2xvbmUg
ZGV0YWNoZWQsIHVua25vd24gZWxlbWVudCBub2RlcworICAgIH0gZWxzZSB7CisgICAgZnJhZ21l
bnREaXYuaW5uZXJIVE1MID0gZWxlbS5vdXRlckhUTUw7CisgICAgZnJhZ21lbnREaXYucmVtb3Zl
Q2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCApOworICAgIH0KKworICAgIGlm
ICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpRdWVyeS5zdXBwb3J0Lm5vQ2xv
bmVDaGVja2VkKSAmJgorICAgIChlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUg
PT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgeworCisgICAgLy8gV2UgZXNjaGV3
IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwOi8vanNwZXJmLmNvbS9n
ZXRhbGwtdnMtc2l6emxlLzIKKyAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7Cisg
ICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKKworICAgIC8vIEZpeCBhbGwgSUUgY2xv
bmluZyBpc3N1ZXMKKyAgICBmb3IgKCBpID0gMDsgKG5vZGUgPSBzcmNFbGVtZW50c1tpXSkgIT0g
bnVsbDsgKytpICkgeworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlz
IG5vdCBudWxsOyBGaXhlcyAjOTU4NworICAgIGlmICggZGVzdEVsZW1lbnRzW2ldICkgeworICAg
IGZpeENsb25lTm9kZUlzc3Vlcyggbm9kZSwgZGVzdEVsZW1lbnRzW2ldICk7CisgICAgfQorICAg
IH0KKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8g
dGhlIGNsb25lCisgICAgaWYgKCBkYXRhQW5kRXZlbnRzICkgeworICAgIGlmICggZGVlcERhdGFB
bmRFdmVudHMgKSB7CisgICAgc3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVs
ZW0gKTsKKyAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSAp
OworCisgICAgZm9yICggaSA9IDA7IChub2RlID0gc3JjRWxlbWVudHNbaV0pICE9IG51bGw7IGkr
KyApIHsKKyAgICBjbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVsZW1lbnRzW2ldICk7CisgICAg
fQorICAgIH0gZWxzZSB7CisgICAgY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CisgICAg
fQorICAgIH0KKworICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKKyAg
ICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOworICAgIGlmICggZGVz
dEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CisgICAgc2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRz
LCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSApOworICAgIH0KKworICAgIGRl
c3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7CisKKyAgICAvLyBSZXR1cm4g
dGhlIGNsb25lZCBzZXQKKyAgICByZXR1cm4gY2xvbmU7CisgICAgfSwKKworICAgIGJ1aWxkRnJh
Z21lbnQ6IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uICkgewor
ICAgIHZhciBqLCBlbGVtLCBjb250YWlucywKKyAgICB0bXAsIHRhZywgdGJvZHksIHdyYXAsCisg
ICAgbCA9IGVsZW1zLmxlbmd0aCwKKworICAgIC8vIEVuc3VyZSBhIHNhZmUgZnJhZ21lbnQKKyAg
ICBzYWZlID0gY3JlYXRlU2FmZUZyYWdtZW50KCBjb250ZXh0ICksCisKKyAgICBub2RlcyA9IFtd
LAorICAgIGkgPSAwOworCisgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIGVsZW0gPSBl
bGVtc1sgaSBdOworCisgICAgaWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7CisKKyAgICAvLyBB
ZGQgbm9kZXMgZGlyZWN0bHkKKyAgICBpZiAoIGpRdWVyeS50eXBlKCBlbGVtICkgPT09ICJvYmpl
Y3QiICkgeworICAgIGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0g
XSA6IGVsZW0gKTsKKworICAgIC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQor
ICAgIH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7CisgICAgbm9kZXMucHVzaCgg
Y29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CisKKyAgICAvLyBDb252ZXJ0IGh0bWwg
aW50byBET00gbm9kZXMKKyAgICB9IGVsc2UgeworICAgIHRtcCA9IHRtcCB8fCBzYWZlLmFwcGVu
ZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7CisKKyAgICAvLyBEZXNlcmlh
bGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCisgICAgdGFnID0gKCBydGFnTmFtZS5leGVj
KCBlbGVtICkgfHwgWyIiLCAiIl0gKVsxXS50b0xvd2VyQ2FzZSgpOworICAgIHdyYXAgPSB3cmFw
TWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OworCisgICAgdG1wLmlubmVySFRNTCA9IHdy
YXBbMV0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKSArIHdyYXBbMl07
CisKKyAgICAvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnQK
KyAgICBqID0gd3JhcFswXTsKKyAgICB3aGlsZSAoIGotLSApIHsKKyAgICB0bXAgPSB0bXAubGFz
dENoaWxkOworICAgIH0KKworICAgIC8vIE1hbnVhbGx5IGFkZCBsZWFkaW5nIHdoaXRlc3BhY2Ug
cmVtb3ZlZCBieSBJRQorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNl
ICYmIHJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCBlbGVtICkgKSB7CisgICAgbm9kZXMucHVzaCgg
Y29udGV4dC5jcmVhdGVUZXh0Tm9kZSggcmxlYWRpbmdXaGl0ZXNwYWNlLmV4ZWMoIGVsZW0gKVsw
XSApICk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4g
ZnJvbSB0YWJsZSBmcmFnbWVudHMKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsK
KworICAgIC8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9k
eT4KKyAgICBlbGVtID0gdGFnID09PSAidGFibGUiICYmICFydGJvZHkudGVzdCggZWxlbSApID8K
KyAgICB0bXAuZmlyc3RDaGlsZCA6CisKKyAgICAvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+
IG9yIDx0Zm9vdD4KKyAgICB3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIXJ0Ym9keS50ZXN0KCBl
bGVtICkgPworICAgIHRtcCA6CisgICAgMDsKKworICAgIGogPSBlbGVtICYmIGVsZW0uY2hpbGRO
b2Rlcy5sZW5ndGg7CisgICAgd2hpbGUgKCBqLS0gKSB7CisgICAgaWYgKCBqUXVlcnkubm9kZU5h
bWUoICh0Ym9keSA9IGVsZW0uY2hpbGROb2Rlc1tqXSksICJ0Ym9keSIgKSAmJiAhdGJvZHkuY2hp
bGROb2Rlcy5sZW5ndGggKSB7CisgICAgZWxlbS5yZW1vdmVDaGlsZCggdGJvZHkgKTsKKyAgICB9
CisgICAgfQorICAgIH0KKworICAgIGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVz
ICk7CisKKyAgICAvLyBGaXggIzEyMzkyIGZvciBXZWJLaXQgYW5kIElFID4gOQorICAgIHRtcC50
ZXh0Q29udGVudCA9ICIiOworCisgICAgLy8gRml4ICMxMjM5MiBmb3Igb2xkSUUKKyAgICB3aGls
ZSAoIHRtcC5maXJzdENoaWxkICkgeworICAgIHRtcC5yZW1vdmVDaGlsZCggdG1wLmZpcnN0Q2hp
bGQgKTsKKyAgICB9CisKKyAgICAvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciBm
b3IgcHJvcGVyIGNsZWFudXAKKyAgICB0bXAgPSBzYWZlLmxhc3RDaGlsZDsKKyAgICB9CisgICAg
fQorICAgIH0KKworICAgIC8vIEZpeCAjMTEzNTY6IENsZWFyIGVsZW1lbnRzIGZyb20gZnJhZ21l
bnQKKyAgICBpZiAoIHRtcCApIHsKKyAgICBzYWZlLnJlbW92ZUNoaWxkKCB0bXAgKTsKKyAgICB9
CisKKyAgICAvLyBSZXNldCBkZWZhdWx0Q2hlY2tlZCBmb3IgYW55IHJhZGlvcyBhbmQgY2hlY2ti
b3hlcworICAgIC8vIGFib3V0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gaW4gSUUgNi83ICgj
ODA2MCkKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgeworICAgIGpR
dWVyeS5ncmVwKCBnZXRBbGwoIG5vZGVzLCAiaW5wdXQiICksIGZpeERlZmF1bHRDaGVja2VkICk7
CisgICAgfQorCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysgXSkg
KSB7CisKKyAgICAvLyAjNDA4NyAtIElmIG9yaWdpbiBhbmQgZGVzdGluYXRpb24gZWxlbWVudHMg
YXJlIHRoZSBzYW1lLCBhbmQgdGhpcyBpcworICAgIC8vIHRoYXQgZWxlbWVudCwgZG8gbm90IGRv
IGFueXRoaW5nCisgICAgaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNl
bGVjdGlvbiApICE9PSAtMSApIHsKKyAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb250YWlu
cyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7CisKKyAgICAv
LyBBcHBlbmQgdG8gZnJhZ21lbnQKKyAgICB0bXAgPSBnZXRBbGwoIHNhZmUuYXBwZW5kQ2hpbGQo
IGVsZW0gKSwgInNjcmlwdCIgKTsKKworICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9u
IGhpc3RvcnkKKyAgICBpZiAoIGNvbnRhaW5zICkgeworICAgIHNldEdsb2JhbEV2YWwoIHRtcCAp
OworICAgIH0KKworICAgIC8vIENhcHR1cmUgZXhlY3V0YWJsZXMKKyAgICBpZiAoIHNjcmlwdHMg
KSB7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoZWxlbSA9IHRtcFsgaisrIF0pICkgeworICAg
IGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CisgICAgc2NyaXB0
cy5wdXNoKCBlbGVtICk7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgdG1wID0g
bnVsbDsKKworICAgIHJldHVybiBzYWZlOworICAgIH0sCisKKyAgICBjbGVhbkRhdGE6IGZ1bmN0
aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSApIHsKKyAgICB2YXIgZWxlbSwg
dHlwZSwgaWQsIGRhdGEsCisgICAgaSA9IDAsCisgICAgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhw
YW5kbywKKyAgICBjYWNoZSA9IGpRdWVyeS5jYWNoZSwKKyAgICBkZWxldGVFeHBhbmRvID0galF1
ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbywKKyAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNw
ZWNpYWw7CisKKyAgICBmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsK
KworICAgIGlmICggYWNjZXB0RGF0YSB8fCBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewor
CisgICAgaWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdOworICAgIGRhdGEgPSBpZCAmJiBjYWNoZVsg
aWQgXTsKKworICAgIGlmICggZGF0YSApIHsKKyAgICBpZiAoIGRhdGEuZXZlbnRzICkgeworICAg
IGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CisgICAgaWYgKCBzcGVjaWFsWyB0eXBlIF0g
KSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOworCisgICAgLy8gVGhp
cyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAor
ICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhh
bmRsZSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gUmVtb3ZlIGNhY2hlIG9ubHkg
aWYgaXQgd2FzIG5vdCBhbHJlYWR5IHJlbW92ZWQgYnkgalF1ZXJ5LmV2ZW50LnJlbW92ZQorICAg
IGlmICggY2FjaGVbIGlkIF0gKSB7CisKKyAgICBkZWxldGUgY2FjaGVbIGlkIF07CisKKyAgICAv
LyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5kbyBwcm9wZXJ0aWVzIGZyb20g
bm9kZXMsCisgICAgLy8gbm9yIGRvZXMgaXQgaGF2ZSBhIHJlbW92ZUF0dHJpYnV0ZSBmdW5jdGlv
biBvbiBEb2N1bWVudCBub2RlczsKKyAgICAvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2Ug
Y2FzZXMKKyAgICBpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7CisgICAgZGVsZXRlIGVsZW1bIGludGVy
bmFsS2V5IF07CisKKyAgICB9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5yZW1vdmVBdHRyaWJ1dGUg
IT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBpbnRl
cm5hbEtleSApOworCisgICAgfSBlbHNlIHsKKyAgICBlbGVtWyBpbnRlcm5hbEtleSBdID0gbnVs
bDsKKyAgICB9CisKKyAgICBjb3JlX2RlbGV0ZWRJZHMucHVzaCggaWQgKTsKKyAgICB9CisgICAg
fQorICAgIH0KKyAgICB9CisgICAgfQorfSk7Cit2YXIgaWZyYW1lLCBnZXRTdHlsZXMsIGN1ckNT
UywKKyAgICByYWxwaGEgPSAvYWxwaGFcKFteKV0qXCkvaSwKKyAgICByb3BhY2l0eSA9IC9vcGFj
aXR5XHMqPVxzKihbXildKikvLAorICAgIHJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218
bGVmdCkkLywKKyAgICAvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3
aXRoIHRhYmxlIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9u
IgorICAgIC8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIu
bW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQorICAgIHJkaXNwbGF5c3dhcCA9IC9e
KG5vbmV8dGFibGUoPyEtY1tlYV0pLispLywKKyAgICBybWFyZ2luID0gL15tYXJnaW4vLAorICAg
IHJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3JlX3BudW0gKyAiKSguKikkIiwgImki
ICksCisgICAgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiArIGNvcmVfcG51bSArICIpKD8h
cHgpW2EteiVdKyQiLCAiaSIgKSwKKyAgICBycmVsTnVtID0gbmV3IFJlZ0V4cCggIl4oWystXSk9
KCIgKyBjb3JlX3BudW0gKyAiKSIsICJpIiApLAorICAgIGVsZW1kaXNwbGF5ID0geyBCT0RZOiAi
YmxvY2siIH0sCisKKyAgICBjc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJp
bGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKKyAgICBjc3NOb3JtYWxUcmFuc2Zv
cm0gPSB7CisgICAgbGV0dGVyU3BhY2luZzogMCwKKyAgICBmb250V2VpZ2h0OiA0MDAKKyAgICB9
LAorCisgICAgY3NzRXhwYW5kID0gWyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBd
LAorICAgIGNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk8iLCAiTW96IiwgIm1zIiBdOworCisv
LyByZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHBy
ZWZpeGVkIHByb3BlcnR5CitmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUgKSB7
CisKKyAgICAvLyBzaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhl
ZAorICAgIGlmICggbmFtZSBpbiBzdHlsZSApIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgICB9CisK
KyAgICAvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzCisgICAgdmFyIGNhcE5hbWUg
PSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKKyAgICBvcmln
TmFtZSA9IG5hbWUsCisgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aDsKKworICAgIHdoaWxlICgg
aS0tICkgeworICAgIG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKKyAgICBpZiAo
IG5hbWUgaW4gc3R5bGUgKSB7CisgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIH0KKworICAg
IHJldHVybiBvcmlnTmFtZTsKK30KKworZnVuY3Rpb24gaXNIaWRkZW4oIGVsZW0sIGVsICkgewor
ICAgIC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rp
b247CisgICAgLy8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50
CisgICAgZWxlbSA9IGVsIHx8IGVsZW07CisgICAgcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sICJk
aXNwbGF5IiApID09PSAibm9uZSIgfHwgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3Vt
ZW50LCBlbGVtICk7Cit9CisKK2Z1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHsK
KyAgICB2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLAorICAgIHZhbHVlcyA9IFtdLAorICAgIGlu
ZGV4ID0gMCwKKyAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CisKKyAgICBmb3IgKCA7IGlu
ZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworICAgIGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTsK
KyAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHZh
bHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXkiICk7CisgICAg
ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKyAgICBpZiAoIHNob3cgKSB7CisgICAgLy8g
UmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBp
cworICAgIC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3QKKyAgICBpZiAo
ICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgeworICAgIGVsZW0uc3R5
bGUuZGlzcGxheSA9ICIiOworICAgIH0KKworICAgIC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZl
IGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKKyAgICAvLyBpbiBhIHN0eWxlc2hl
ZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpcworICAgIC8vIGZvciBz
dWNoIGFuIGVsZW1lbnQKKyAgICBpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNI
aWRkZW4oIGVsZW0gKSApIHsKKyAgICB2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVs
ZW0sICJvbGRkaXNwbGF5IiwgY3NzX2RlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpICk7Cisg
ICAgfQorICAgIH0gZWxzZSB7CisKKyAgICBpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CisgICAg
aGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKKworICAgIGlmICggZGlzcGxheSAmJiBkaXNwbGF5
ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKKyAgICBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRk
aXNwbGF5IiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiAp
ICk7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBkaXNwbGF5
IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKyAgICAvLyB0byBhdm9p
ZCB0aGUgY29uc3RhbnQgcmVmbG93CisgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0
aDsgaW5kZXgrKyApIHsKKyAgICBlbGVtID0gZWxlbWVudHNbIGluZGV4IF07CisgICAgaWYgKCAh
ZWxlbS5zdHlsZSApIHsKKyAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCAhc2hvdyB8fCBl
bGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIi
ICkgeworICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwg
IiIgOiAibm9uZSI7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBlbGVtZW50czsKK30KKwor
alF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgY3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Cisg
ICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1
ZSApIHsKKyAgICB2YXIgbGVuLCBzdHlsZXMsCisgICAgbWFwID0ge30sCisgICAgaSA9IDA7CisK
KyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7CisgICAgc3R5bGVzID0gZ2V0U3R5
bGVzKCBlbGVtICk7CisgICAgbGVuID0gbmFtZS5sZW5ndGg7CisKKyAgICBmb3IgKCA7IGkgPCBs
ZW47IGkrKyApIHsKKyAgICBtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFt
ZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7CisgICAgfQorCisgICAgcmV0dXJuIG1hcDsKKyAgICB9
CisKKyAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CisgICAgalF1ZXJ5LnN0eWxlKCBl
bGVtLCBuYW1lLCB2YWx1ZSApIDoKKyAgICBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CisgICAg
fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7CisgICAgfSwKKyAgICBzaG93
OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTsKKyAgICB9
LAorICAgIGhpZGU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBzaG93SGlkZSggdGhpcyApOwor
ICAgIH0sCisgICAgdG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7CisgICAgdmFyIGJvb2wgPSB0
eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIjsKKworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oKSB7CisgICAgaWYgKCBib29sID8gc3RhdGUgOiBpc0hpZGRlbiggdGhpcyApICkgeworICAg
IGpRdWVyeSggdGhpcyApLnNob3coKTsKKyAgICB9IGVsc2UgeworICAgIGpRdWVyeSggdGhpcyAp
LmhpZGUoKTsKKyAgICB9CisgICAgfSk7CisgICAgfQorfSk7CisKK2pRdWVyeS5leHRlbmQoewor
ICAgIC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVm
YXVsdAorICAgIC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9w
ZXJ0eQorICAgIGNzc0hvb2tzOiB7CisgICAgb3BhY2l0eTogeworICAgIGdldDogZnVuY3Rpb24o
IGVsZW0sIGNvbXB1dGVkICkgeworICAgIGlmICggY29tcHV0ZWQgKSB7CisgICAgLy8gV2Ugc2hv
dWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKKyAgICB2YXIgcmV0ID0g
Y3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKKyAgICByZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6
IHJldDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9LAorCisgICAgLy8gRXhjbHVkZSB0aGUg
Zm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAorICAgIGNzc051bWJlcjogeworICAg
ICJjb2x1bW5Db3VudCI6IHRydWUsCisgICAgImZpbGxPcGFjaXR5IjogdHJ1ZSwKKyAgICAiZm9u
dFdlaWdodCI6IHRydWUsCisgICAgImxpbmVIZWlnaHQiOiB0cnVlLAorICAgICJvcGFjaXR5Ijog
dHJ1ZSwKKyAgICAib3JwaGFucyI6IHRydWUsCisgICAgIndpZG93cyI6IHRydWUsCisgICAgInpJ
bmRleCI6IHRydWUsCisgICAgInpvb20iOiB0cnVlCisgICAgfSwKKworICAgIC8vIEFkZCBpbiBw
cm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmUKKyAgICAvLyBzZXR0
aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlCisgICAgY3NzUHJvcHM6IHsKKyAgICAvLyBub3JtYWxp
emUgZmxvYXQgY3NzIHByb3BlcnR5CisgICAgImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxv
YXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCisgICAgfSwKKworICAgIC8vIEdldCBhbmQg
c2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCisgICAgc3R5bGU6IGZ1bmN0aW9u
KCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7CisgICAgLy8gRG9uJ3Qgc2V0IHN0eWxlcyBv
biB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisgICAgaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBl
ID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CisgICAgcmV0
dXJuOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0
aGUgcmlnaHQgbmFtZQorICAgIHZhciByZXQsIHR5cGUsIGhvb2tzLAorICAgIG9yaWdOYW1lID0g
alF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorICAgIHN0eWxlID0gZWxlbS5zdHlsZTsKKworICAg
IG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNb
IG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTsKKworICAg
IC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24KKyAgICAvLyBmb2xsb3dlZCBi
eSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCisgICAgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5h
bWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKyAgICAvLyBDaGVjayBpZiB3
ZSdyZSBzZXR0aW5nIGEgdmFsdWUKKyAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7Cisg
ICAgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKworICAgIC8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVy
IHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQorICAgIGlmICgg
dHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7Cisg
ICAgdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxvYXQoIGpRdWVyeS5j
c3MoIGVsZW0sIG5hbWUgKSApOworICAgIC8vIEZpeGVzIGJ1ZyAjOTIzNworICAgIHR5cGUgPSAi
bnVtYmVyIjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBOYU4gYW5kIG51bGwgdmFs
dWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKKyAgICBpZiAoIHZhbHVlID09IG51bGwgfHwgdHlw
ZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7CisgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCAncHgnIHRvIHRoZSAoZXhj
ZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQorICAgIGlmICggdHlwZSA9PT0gIm51bWJl
ciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CisgICAgdmFsdWUgKz0gInB4
IjsKKyAgICB9CisKKyAgICAvLyBGaXhlcyAjODkwOCwgaXQgY2FuIGJlIGRvbmUgbW9yZSBjb3Jy
ZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMgaW4gY3NzSG9va3MsCisgICAgLy8gYnV0IGl0IHdv
dWxkIG1lYW4gdG8gZGVmaW5lIGVpZ2h0IChmb3IgZXZlcnkgcHJvYmxlbWF0aWMgcHJvcGVydHkp
IGlkZW50aWNhbCBmdW5jdGlvbnMKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5jbGVhckNsb25l
U3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZigiYmFja2dyb3VuZCIpID09PSAw
ICkgeworICAgIHN0eWxlWyBuYW1lIF0gPSAiaW5oZXJpdCI7CisgICAgfQorCisgICAgLy8gSWYg
YSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0
aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykg
fHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5l
ZCApIHsKKworICAgIC8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGVycm9y
cyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkCisgICAgLy8gRml4ZXMgYnVnICM1
NTA5CisgICAgdHJ5IHsKKyAgICBzdHlsZVsgbmFtZSBdID0gdmFsdWU7CisgICAgfSBjYXRjaChl
KSB7fQorICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRl
ZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCisgICAgaWYgKCBob29rcyAm
JiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEg
KSkgIT09IHVuZGVmaW5lZCApIHsKKyAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIE90
aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CisgICAgcmV0
dXJuIHN0eWxlWyBuYW1lIF07CisgICAgfQorICAgIH0sCisKKyAgICBjc3M6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkgeworICAgIHZhciBudW0sIHZhbCwgaG9va3MsCisg
ICAgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7CisKKyAgICAvLyBNYWtlIHN1
cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKKyAgICBuYW1lID0galF1
ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBd
ID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTsKKworICAgIC8vIGdl
dHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24KKyAgICAvLyBmb2xsb3dlZCBieSB0aGUg
dW5wcmVmaXhlZCB2ZXJzaW9uCisgICAgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8
fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKyAgICAvLyBJZiBhIGhvb2sgd2FzIHBy
b3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorICAgIGlmICggaG9va3Mg
JiYgImdldCIgaW4gaG9va3MgKSB7CisgICAgdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBl
eHRyYSApOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBj
b21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CisgICAgaWYgKCB2YWwgPT09IHVuZGVmaW5l
ZCApIHsKKyAgICB2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOworICAgIH0KKwor
ICAgIC8vY29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQorICAgIGlmICggdmFsID09
PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKKyAgICB2YWwgPSBj
c3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4sIGNvbnZl
cnRpbmcgdG8gbnVtYmVyIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5k
IHZhbCBsb29rcyBudW1lcmljCisgICAgaWYgKCBleHRyYSA9PT0gIiIgfHwgZXh0cmEgKSB7Cisg
ICAgbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CisgICAgcmV0dXJuIGV4dHJhID09PSB0cnVlIHx8
IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7CisgICAgfQorICAgIHJl
dHVybiB2YWw7CisgICAgfSwKKworICAgIC8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5n
IGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKKyAgICBz
d2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7CisgICAgdmFy
IHJldCwgbmFtZSwKKyAgICBvbGQgPSB7fTsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFs
dWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcworICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyAp
IHsKKyAgICBvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKyAgICBlbGVtLnN0eWxl
WyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CisgICAgfQorCisgICAgcmV0ID0gY2FsbGJhY2su
YXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTsKKworICAgIC8vIFJldmVydCB0aGUgb2xkIHZhbHVl
cworICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICBlbGVtLnN0eWxlWyBuYW1lIF0g
PSBvbGRbIG5hbWUgXTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICAgIH0KK30pOworCisv
LyBOT1RFOiB3ZSd2ZSBpbmNsdWRlZCB0aGUgIndpbmRvdyIgaW4gd2luZG93LmdldENvbXB1dGVk
U3R5bGUKKy8vIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxsIGJyZWFrIHdpdGhvdXQgaXQu
CitpZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkgeworICAgIGdldFN0eWxlcyA9IGZ1bmN0
aW9uKCBlbGVtICkgeworICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwg
bnVsbCApOworICAgIH07CisKKyAgICBjdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgX2Nv
bXB1dGVkICkgeworICAgIHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLAorICAgIGNvbXB1
dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAorCisgICAgLy8gZ2V0UHJvcGVy
dHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgaW4gSUU5LCBzZWUgIzEy
NTM3CisgICAgcmV0ID0gY29tcHV0ZWQgPyBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1l
ICkgfHwgY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKKyAgICBzdHlsZSA9IGVsZW0uc3R5
bGU7CisKKyAgICBpZiAoIGNvbXB1dGVkICkgeworCisgICAgaWYgKCByZXQgPT09ICIiICYmICFq
UXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgeworICAgIHJldCA9
IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOworICAgIH0KKworICAgIC8vIEEgdHJpYnV0ZSB0
byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCisgICAgLy8gQ2hyb21lIDwgMTcg
YW5kIFNhZmFyaSA1LjAgdXNlcyAiY29tcHV0ZWQgdmFsdWUiIGluc3RlYWQgb2YgInVzZWQgdmFs
dWUiIGZvciBtYXJnaW4tcmlnaHQKKyAgICAvLyBTYWZhcmkgNS4xLjcgKGF0IGxlYXN0KSByZXR1
cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVt
cyB0byBiZSByZWxpYWJseSBwaXhlbHMKKyAgICAvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09N
IGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1
ZXMKKyAgICBpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUg
KSApIHsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICB3aWR0aCA9
IHN0eWxlLndpZHRoOworICAgIG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CisgICAgbWF4V2lk
dGggPSBzdHlsZS5tYXhXaWR0aDsKKworICAgIC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBn
ZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKyAgICBzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdp
ZHRoID0gc3R5bGUud2lkdGggPSByZXQ7CisgICAgcmV0ID0gY29tcHV0ZWQud2lkdGg7CisKKyAg
ICAvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCisgICAgc3R5bGUud2lkdGggPSB3aWR0aDsK
KyAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOworICAgIHN0eWxlLm1heFdpZHRoID0gbWF4
V2lkdGg7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7CisgICAgfTsKK30gZWxzZSBp
ZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUgKSB7CisgICAgZ2V0U3R5
bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uY3VycmVudFN0eWxlOwor
ICAgIH07CisKKyAgICBjdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgX2NvbXB1dGVkICkg
eworICAgIHZhciBsZWZ0LCBycywgcnNMZWZ0LAorICAgIGNvbXB1dGVkID0gX2NvbXB1dGVkIHx8
IGdldFN0eWxlcyggZWxlbSApLAorICAgIHJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWRbIG5hbWUg
XSA6IHVuZGVmaW5lZCwKKyAgICBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKyAgICAvLyBBdm9pZCBz
ZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZQorICAgIC8vIHNvIHdlIGRvbid0IGRlZmF1
bHQgdG8gYXV0bworICAgIGlmICggcmV0ID09IG51bGwgJiYgc3R5bGUgJiYgc3R5bGVbIG5hbWUg
XSApIHsKKyAgICByZXQgPSBzdHlsZVsgbmFtZSBdOworICAgIH0KKworICAgIC8vIEZyb20gdGhl
IGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKKyAgICAvLyBodHRwOi8vZXJpay5lYWUubmV0
L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCisKKyAgICAvLyBJ
ZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIKKyAgICAvLyBi
dXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBp
dCB0byBwaXhlbHMKKyAgICAvLyBidXQgbm90IHBvc2l0aW9uIGNzcyBhdHRyaWJ1dGVzLCBhcyB0
aG9zZSBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwYXJlbnQgZWxlbWVudCBpbnN0ZWFkCisgICAg
Ly8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0ZWFkIGJlY2F1c2UgaXQgbWln
aHQgdHJpZ2dlciBhICJzdGFja2luZyBkb2xscyIgcHJvYmxlbQorICAgIGlmICggcm51bW5vbnB4
LnRlc3QoIHJldCApICYmICFycG9zaXRpb24udGVzdCggbmFtZSApICkgeworCisgICAgLy8gUmVt
ZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgIGxlZnQgPSBzdHlsZS5sZWZ0OworICAgIHJz
ID0gZWxlbS5ydW50aW1lU3R5bGU7CisgICAgcnNMZWZ0ID0gcnMgJiYgcnMubGVmdDsKKworICAg
IC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKyAg
ICBpZiAoIHJzTGVmdCApIHsKKyAgICBycy5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsK
KyAgICB9CisgICAgc3R5bGUubGVmdCA9IG5hbWUgPT09ICJmb250U2l6ZSIgPyAiMWVtIiA6IHJl
dDsKKyAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOworCisgICAgLy8gUmV2ZXJ0IHRo
ZSBjaGFuZ2VkIHZhbHVlcworICAgIHN0eWxlLmxlZnQgPSBsZWZ0OworICAgIGlmICggcnNMZWZ0
ICkgeworICAgIHJzLmxlZnQgPSByc0xlZnQ7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBy
ZXQgPT09ICIiID8gImF1dG8iIDogcmV0OworICAgIH07Cit9CisKK2Z1bmN0aW9uIHNldFBvc2l0
aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7CisgICAgdmFyIG1hdGNoZXMgPSBy
bnVtc3BsaXQuZXhlYyggdmFsdWUgKTsKKyAgICByZXR1cm4gbWF0Y2hlcyA/CisgICAgLy8gR3Vh
cmQgYWdhaW5zdCB1bmRlZmluZWQgInN1YnRyYWN0IiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNz
c0hvb2tzCisgICAgTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAtICggc3VidHJhY3QgfHwgMCAp
ICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgorICAgIHZhbHVlOworfQorCitmdW5jdGlv
biBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBz
dHlsZXMgKSB7CisgICAgdmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/ICJib3JkZXIi
IDogImNvbnRlbnQiICkgPworICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVh
c3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbgorICAgIDQgOgorICAgIC8vIE90aGVyd2lzZSBp
bml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXMKKyAgICBuYW1l
ID09PSAid2lkdGgiID8gMSA6IDAsCisKKyAgICB2YWwgPSAwOworCisgICAgZm9yICggOyBpIDwg
NDsgaSArPSAyICkgeworICAgIC8vIGJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28g
YWRkIGl0IGlmIHdlIHdhbnQgaXQKKyAgICBpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsKKyAg
ICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwg
c3R5bGVzICk7CisgICAgfQorCisgICAgaWYgKCBpc0JvcmRlckJveCApIHsKKyAgICAvLyBib3Jk
ZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnQK
KyAgICBpZiAoIGV4dHJhID09PSAiY29udGVudCIgKSB7CisgICAgdmFsIC09IGpRdWVyeS5jc3Mo
IGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKKyAgICB9
CisKKyAgICAvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwg
c28gcmVtb3ZlIGJvcmRlcgorICAgIGlmICggZXh0cmEgIT09ICJtYXJnaW4iICkgeworICAgIHZh
bCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRo
IiwgdHJ1ZSwgc3R5bGVzICk7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgLy8gYXQgdGhpcyBw
b2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcKKyAgICB2YWwgKz0galF1
ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyAp
OworCisgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGlu
Zywgc28gYWRkIGJvcmRlcgorICAgIGlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKKyAgICB2
YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0
aCIsIHRydWUsIHN0eWxlcyApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZh
bDsKK30KKworZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7
CisKKyAgICAvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVu
dCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQorICAgIHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1
ZSwKKyAgICB2YWwgPSBuYW1lID09PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0u
b2Zmc2V0SGVpZ2h0LAorICAgIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAorICAgIGlzQm9y
ZGVyQm94ID0galF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nICYmIGpRdWVyeS5jc3MoIGVsZW0sICJi
b3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IjsKKworICAgIC8vIHNv
bWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNv
IGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZAorICAgIC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEu
bW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NQorICAgIC8vIE1hdGhNTCAtIGh0dHBz
Oi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTY2OAorICAgIGlmICgg
dmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7CisgICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVk
IHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5CisgICAgdmFsID0gY3VyQ1NTKCBlbGVt
LCBuYW1lLCBzdHlsZXMgKTsKKyAgICBpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7Cisg
ICAgdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOworICAgIH0KKworICAgIC8vIENvbXB1dGVkIHVu
aXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uCisgICAgaWYgKCBybnVtbm9u
cHgudGVzdCh2YWwpICkgeworICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgLy8gd2UgbmVl
ZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5y
ZWxpYWJsZSB2YWx1ZXMKKyAgICAvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxs
cyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlCisgICAgdmFsdWVJc0JvcmRlckJveCA9
IGlzQm9yZGVyQm94ICYmICggalF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUgfHwgdmFs
ID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKKworICAgIC8vIE5vcm1hbGl6ZSAiIiwgYXV0bywg
YW5kIHByZXBhcmUgZm9yIGV4dHJhCisgICAgdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsK
KyAgICB9CisKKyAgICAvLyB1c2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9z
dWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlcworICAgIHJldHVybiAoIHZhbCArCisgICAgYXVnbWVu
dFdpZHRoT3JIZWlnaHQoCisgICAgZWxlbSwKKyAgICBuYW1lLAorICAgIGV4dHJhIHx8ICggaXNC
b3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApLAorICAgIHZhbHVlSXNCb3JkZXJCb3gs
CisgICAgc3R5bGVzCisgICAgKQorICAgICkgKyAicHgiOworfQorCisvLyBUcnkgdG8gZGV0ZXJt
aW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudAorZnVuY3Rpb24gY3Nz
X2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHsKKyAgICB2YXIgZG9jID0gZG9jdW1lbnQsCisg
ICAgZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdOworCisgICAgaWYgKCAhZGlzcGxh
eSApIHsKKyAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOworCisg
ICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1l
CisgICAgaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgIWRpc3BsYXkgKSB7CisgICAgLy8gVXNl
IHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlCisgICAgaWZyYW1lID0gKCBp
ZnJhbWUgfHwKKyAgICBqUXVlcnkoIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBo
ZWlnaHQ9JzAnLz4iKQorICAgIC5jc3MoICJjc3NUZXh0IiwgImRpc3BsYXk6YmxvY2sgIWltcG9y
dGFudCIgKQorICAgICkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTsKKworICAgIC8v
IEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBk
b24ndCBjaG9rZSBvbiByZXVzZQorICAgIGRvYyA9ICggaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cg
fHwgaWZyYW1lWzBdLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50OworICAgIGRvYy53cml0ZSgi
PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+Iik7CisgICAgZG9jLmNsb3NlKCk7CisKKyAgICBk
aXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOworICAgIGlmcmFtZS5kZXRh
Y2goKTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXkK
KyAgICBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7CisgICAgfQorCisgICAgcmV0
dXJuIGRpc3BsYXk7Cit9CisKKy8vIENhbGxlZCBPTkxZIGZyb20gd2l0aGluIGNzc19kZWZhdWx0
RGlzcGxheQorZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwgZG9jICkgeworICAgIHZhciBl
bGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5i
b2R5ICksCisgICAgZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1bMF0sICJkaXNwbGF5IiApOwor
ICAgIGVsZW0ucmVtb3ZlKCk7CisgICAgcmV0dXJuIGRpc3BsYXk7Cit9CisKK2pRdWVyeS5lYWNo
KFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisgICAgalF1ZXJ5
LmNzc0hvb2tzWyBuYW1lIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQs
IGV4dHJhICkgeworICAgIGlmICggY29tcHV0ZWQgKSB7CisgICAgLy8gY2VydGFpbiBlbGVtZW50
cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCisgICAg
Ly8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291
bGQgYmVuZWZpdCBmcm9tIHRoaXMKKyAgICByZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCAm
JiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKSA/Cisg
ICAgalF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBn
ZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAgIH0pIDoKKyAgICBnZXRX
aWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAgIH0KKyAgICB9LAorCisgICAg
c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgeworICAgIHZhciBzdHlsZXMgPSBl
eHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTsKKyAgICByZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIo
IGVsZW0sIHZhbHVlLCBleHRyYSA/CisgICAgYXVnbWVudFdpZHRoT3JIZWlnaHQoCisgICAgZWxl
bSwKKyAgICBuYW1lLAorICAgIGV4dHJhLAorICAgIGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAm
JiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2UsIHN0eWxlcyApID09PSAiYm9y
ZGVyLWJveCIsCisgICAgc3R5bGVzCisgICAgKSA6IDAKKyAgICApOworICAgIH0KKyAgICB9Owor
fSk7CisKK2lmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisgICAgalF1ZXJ5LmNzc0hv
b2tzLm9wYWNpdHkgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Cisg
ICAgLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CisgICAgcmV0dXJuIHJvcGFjaXR5LnRl
c3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZp
bHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KKyAgICAoIDAuMDEgKiBwYXJzZUZs
b2F0KCBSZWdFeHAuJDEgKSApICsgIiIgOgorICAgIGNvbXB1dGVkID8gIjEiIDogIiI7CisgICAg
fSwKKworICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgIHZhciBzdHlsZSA9
IGVsZW0uc3R5bGUsCisgICAgY3VycmVudFN0eWxlID0gZWxlbS5jdXJyZW50U3R5bGUsCisgICAg
b3BhY2l0eSA9IGpRdWVyeS5pc051bWVyaWMoIHZhbHVlICkgPyAiYWxwaGEob3BhY2l0eT0iICsg
dmFsdWUgKiAxMDAgKyAiKSIgOiAiIiwKKyAgICBmaWx0ZXIgPSBjdXJyZW50U3R5bGUgJiYgY3Vy
cmVudFN0eWxlLmZpbHRlciB8fCBzdHlsZS5maWx0ZXIgfHwgIiI7CisKKyAgICAvLyBJRSBoYXMg
dHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXQKKyAgICAvLyBG
b3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCisgICAgc3R5bGUuem9vbSA9IDE7CisK
KyAgICAvLyBpZiBzZXR0aW5nIG9wYWNpdHkgdG8gMSwgYW5kIG5vIG90aGVyIGZpbHRlcnMgZXhp
c3QgLSBhdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgYXR0cmlidXRlICM2NjUyCisgICAgLy8gaWYg
dmFsdWUgPT09ICIiLCB0aGVuIHJlbW92ZSBpbmxpbmUgb3BhY2l0eSAjMTI2ODUKKyAgICBpZiAo
ICggdmFsdWUgPj0gMSB8fCB2YWx1ZSA9PT0gIiIgKSAmJgorICAgIGpRdWVyeS50cmltKCBmaWx0
ZXIucmVwbGFjZSggcmFscGhhLCAiIiApICkgPT09ICIiICYmCisgICAgc3R5bGUucmVtb3ZlQXR0
cmlidXRlICkgeworCisgICAgLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAi
ICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CisgICAgLy8gaWYgImZpbHRl
cjoiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUgaXMgZGlzYWJsZWQsIHdlIHdhbnQgdG8g
YXZvaWQgdGhpcworICAgIC8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSBpcyBJRSBPbmx5LCBidXQg
c28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4uLgorICAgIHN0eWxlLnJlbW92ZUF0dHJp
YnV0ZSggImZpbHRlciIgKTsKKworICAgIC8vIGlmIHRoZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBh
cHBsaWVkIGluIGEgY3NzIHJ1bGUgb3IgdW5zZXQgaW5saW5lIG9wYWNpdHksIHdlIGFyZSBkb25l
CisgICAgaWYgKCB2YWx1ZSA9PT0gIiIgfHwgY3VycmVudFN0eWxlICYmICFjdXJyZW50U3R5bGUu
ZmlsdGVyICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQorCisgICAgLy8gb3RoZXJ3aXNl
LCBzZXQgbmV3IGZpbHRlciB2YWx1ZXMKKyAgICBzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCgg
ZmlsdGVyICkgPworICAgIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6CisgICAg
ZmlsdGVyICsgIiAiICsgb3BhY2l0eTsKKyAgICB9CisgICAgfTsKK30KKworLy8gVGhlc2UgaG9v
a3MgY2Fubm90IGJlIGFkZGVkIHVudGlsIERPTSByZWFkeSBiZWNhdXNlIHRoZSBzdXBwb3J0IHRl
c3QKKy8vIGZvciBpdCBpcyBub3QgcnVuIHVudGlsIGFmdGVyIERPTSByZWFkeQoralF1ZXJ5KGZ1
bmN0aW9uKCkgeworICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQg
KSB7CisgICAgalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0geworICAgIGdldDogZnVuY3Rp
b24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgIGlmICggY29tcHV0ZWQgKSB7CisgICAgLy8gV2Vi
S2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3Ig
bWFyZ2luLXJpZ2h0CisgICAgLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBl
bGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCisgICAgcmV0dXJuIGpRdWVyeS5zd2FwKCBl
bGVtLCB7ICJkaXNwbGF5IjogImlubGluZS1ibG9jayIgfSwKKyAgICBjdXJDU1MsIFsgZWxlbSwg
Im1hcmdpblJpZ2h0IiBdICk7CisgICAgfQorICAgIH0KKyAgICB9OworICAgIH0KKworICAgIC8v
IFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4
NAorICAgIC8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVk
IGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQKKyAgICAvLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBj
c3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwgd2UganVzdCBjaGVjayBmb3Ig
aXQgaGVyZQorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LnBpeGVsUG9zaXRpb24gJiYgalF1ZXJ5
LmZuLnBvc2l0aW9uICkgeworICAgIGpRdWVyeS5lYWNoKCBbICJ0b3AiLCAibGVmdCIgXSwgZnVu
Y3Rpb24oIGksIHByb3AgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSB7CisgICAg
Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAgaWYgKCBjb21wdXRlZCApIHsK
KyAgICBjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApOworICAgIC8vIGlmIGN1ckNTUyBy
ZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldAorICAgIHJldHVybiBybnVtbm9u
cHgudGVzdCggY29tcHV0ZWQgKSA/CisgICAgalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJv
cCBdICsgInB4IiA6CisgICAgY29tcHV0ZWQ7CisgICAgfQorICAgIH0KKyAgICB9OworICAgIH0p
OworICAgIH0KKworfSk7CisKK2lmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVy
cyApIHsKKyAgICBqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgIC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyCisgICAgLy8gT3BlcmEgcmVwb3J0cyBv
ZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFuIHplcm8gb24gc29tZSBlbGVt
ZW50cworICAgIHJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAgJiYgZWxlbS5vZmZzZXRIZWln
aHQgPD0gMCB8fAorICAgICghalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzICYm
ICgoZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkpIHx8IGpRdWVyeS5jc3MoIGVsZW0s
ICJkaXNwbGF5IiApKSA9PT0gIm5vbmUiKTsKKyAgICB9OworCisgICAgalF1ZXJ5LmV4cHIuZmls
dGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuICFqUXVlcnkuZXhw
ci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOworICAgIH07Cit9CisKKy8vIFRoZXNlIGhvb2tzIGFy
ZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXMKK2pRdWVyeS5lYWNoKHsKKyAg
ICBtYXJnaW46ICIiLAorICAgIHBhZGRpbmc6ICIiLAorICAgIGJvcmRlcjogIldpZHRoIgorfSwg
ZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgeworICAgIGpRdWVyeS5jc3NIb29rc1sgcHJlZml4
ICsgc3VmZml4IF0gPSB7CisgICAgZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgdmFy
IGkgPSAwLAorICAgIGV4cGFuZGVkID0ge30sCisKKyAgICAvLyBhc3N1bWVzIGEgc2luZ2xlIG51
bWJlciBpZiBub3QgYSBzdHJpbmcKKyAgICBwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmlu
ZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBdOworCisgICAgZm9yICggOyBpIDwgNDsg
aSsrICkgeworICAgIGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBd
ID0KKyAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CisgICAg
fQorCisgICAgcmV0dXJuIGV4cGFuZGVkOworICAgIH0KKyAgICB9OworCisgICAgaWYgKCAhcm1h
cmdpbi50ZXN0KCBwcmVmaXggKSApIHsKKyAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1
ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOworICAgIH0KK30pOwordmFyIHIyMCA9IC8l
MjAvZywKKyAgICByYnJhY2tldCA9IC9cW1xdJC8sCisgICAgckNSTEYgPSAvXHI/XG4vZywKKyAg
ICByc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkk
L2ksCisgICAgcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2Vu
KS9pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOworICAgIH0s
CisgICAgc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm1hcChm
dW5jdGlvbigpeworICAgIC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmls
dGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCisgICAgdmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3Ao
IHRoaXMsICJlbGVtZW50cyIgKTsKKyAgICByZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFy
cmF5KCBlbGVtZW50cyApIDogdGhpczsKKyAgICB9KQorICAgIC5maWx0ZXIoZnVuY3Rpb24oKXsK
KyAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKKyAgICAvLyBVc2UgLmlzKCI6ZGlzYWJsZWQiKSBz
byB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcworICAgIHJldHVybiB0aGlzLm5hbWUgJiYg
IWpRdWVyeSggdGhpcyApLmlzKCAiOmRpc2FibGVkIiApICYmCisgICAgcnN1Ym1pdHRhYmxlLnRl
c3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJgor
ICAgICggdGhpcy5jaGVja2VkIHx8ICFtYW5pcHVsYXRpb25fcmNoZWNrYWJsZVR5cGUudGVzdCgg
dHlwZSApICk7CisgICAgfSkKKyAgICAubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICl7CisgICAgdmFy
IHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOworCisgICAgcmV0dXJuIHZhbCA9PSBudWxsID8K
KyAgICBudWxsIDoKKyAgICBqUXVlcnkuaXNBcnJheSggdmFsICkgPworICAgIGpRdWVyeS5tYXAo
IHZhbCwgZnVuY3Rpb24oIHZhbCApeworICAgIHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFs
dWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKKyAgICB9KSA6CisgICAgeyBuYW1l
OiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CisgICAg
fSkuZ2V0KCk7CisgICAgfQorfSk7CisKKy8vU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxl
bWVudHMgb3IgYSBzZXQgb2YKKy8va2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCitqUXVl
cnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CisgICAgdmFyIHByZWZpeCwK
KyAgICBzID0gW10sCisgICAgYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CisgICAgLy8g
SWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlCisg
ICAgdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVl
ID09IG51bGwgPyAiIiA6IHZhbHVlICk7CisgICAgc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNv
bXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlICk7CisgICAg
fTsKKworICAgIC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIg
YmVoYXZpb3IuCisgICAgaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgeworICAgIHRy
YWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRy
YWRpdGlvbmFsOworICAgIH0KKworICAgIC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFz
c3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCisgICAgaWYgKCBqUXVl
cnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBh
ICkgKSApIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHMKKyAgICBqUXVlcnku
ZWFjaCggYSwgZnVuY3Rpb24oKSB7CisgICAgYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsK
KyAgICB9KTsKKworICAgIH0gZWxzZSB7CisgICAgLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0
aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCisgICAgLy8gZGlkIGl0KSwgb3Ro
ZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCisgICAgZm9yICggcHJlZml4IGluIGEg
KSB7CisgICAgYnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBh
ZGQgKTsKKyAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFs
aXphdGlvbgorICAgIHJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwgIisiICk7Cit9
OworCitmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQg
KSB7CisgICAgdmFyIG5hbWU7CisKKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHsK
KyAgICAvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS4KKyAgICBqUXVlcnkuZWFjaCggb2JqLCBmdW5j
dGlvbiggaSwgdiApIHsKKyAgICBpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHBy
ZWZpeCApICkgeworICAgIC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci4KKyAg
ICBhZGQoIHByZWZpeCwgdiApOworCisgICAgfSBlbHNlIHsKKyAgICAvLyBJdGVtIGlzIG5vbi1z
Y2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC4KKyAgICBi
dWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgPyBpIDog
IiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOworICAgIH0KKyAgICB9KTsKKworICAg
IH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09ICJvYmpl
Y3QiICkgeworICAgIC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KKyAgICBmb3IgKCBuYW1lIGlu
IG9iaiApIHsKKyAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgbmFtZSArICJdIiwgb2Jq
WyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICB9CisKKyAgICB9IGVsc2UgeworICAg
IC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KKyAgICBhZGQoIHByZWZpeCwgb2JqICk7CisgICAg
fQorfQoralF1ZXJ5LmVhY2goICgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVz
aXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgIiArCisgICAgIm1vdXNlZG93biBtb3Vz
ZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlICIg
KworICAgICJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9y
IGNvbnRleHRtZW51Iikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisKKyAgICAv
LyBIYW5kbGUgZXZlbnQgYmluZGluZworICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24o
IGRhdGEsIGZuICkgeworICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CisgICAgdGhp
cy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CisgICAgdGhpcy50cmlnZ2VyKCBuYW1lICk7
CisgICAgfTsKK30pOworCitqUXVlcnkuZm4uaG92ZXIgPSBmdW5jdGlvbiggZm5PdmVyLCBmbk91
dCApIHsKKyAgICByZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBm
bk91dCB8fCBmbk92ZXIgKTsKK307Cit2YXIKKyAgICAvLyBEb2N1bWVudCBsb2NhdGlvbgorICAg
IGFqYXhMb2NQYXJ0cywKKyAgICBhamF4TG9jYXRpb24sCisgICAgYWpheF9ub25jZSA9IGpRdWVy
eS5ub3coKSwKKworICAgIGFqYXhfcnF1ZXJ5ID0gL1w/LywKKyAgICByaGFzaCA9IC8jLiokLywK
KyAgICBydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCisgICAgcmhlYWRlcnMgPSAvXiguKj8pOlsgXHRd
KihbXlxyXG5dKilccj8kL21nLCAvLyBJRSBsZWF2ZXMgYW4gXHIgY2hhcmFjdGVyIGF0IEVPTAor
ICAgIC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgorICAg
IHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9u
fGZpbGV8cmVzfHdpZGdldCk6JC8sCisgICAgcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8s
CisgICAgcnByb3RvY29sID0gL15cL1wvLywKKyAgICBydXJsID0gL14oW1x3ListXSs6KSg/Olwv
XC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLAorCisgICAgLy8gS2VlcCBhIGNvcHkgb2YgdGhl
IG9sZCBsb2FkIG1ldGhvZAorICAgIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCisKKyAgICAvKiBQ
cmVmaWx0ZXJzCisgICAgICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20g
ZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKKyAgICAgKiAyKSBU
aGVzZSBhcmUgY2FsbGVkOgorICAgICAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3Bv
cnQKKyAgICAgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0
cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCisgICAgICogMykga2V5IGlzIHRoZSBkYXRh
VHlwZQorICAgICAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCisgICAg
ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRI
RU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCisgICAgICovCisgICAgcHJlZmlsdGVy
cyA9IHt9LAorCisgICAgLyogVHJhbnNwb3J0cyBiaW5kaW5ncworICAgICAqIDEpIGtleSBpcyB0
aGUgZGF0YVR5cGUKKyAgICAgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNl
ZAorICAgICAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBl
IGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKKyAgICAgKi8KKyAgICB0cmFuc3BvcnRzID0g
e30sCisKKyAgICAvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgp
OyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KKyAgICBhbGxUeXBlcyA9
ICIqLyIuY29uY2F0KCIqIik7CisKKy8vICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9u
IHdoZW4gYWNjZXNzaW5nCisvLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3Vt
ZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKK3RyeSB7CisgICAgYWpheExvY2F0aW9uID0gbG9jYXRp
b24uaHJlZjsKK30gY2F0Y2goIGUgKSB7CisgICAgLy8gVXNlIHRoZSBocmVmIGF0dHJpYnV0ZSBv
ZiBhbiBBIGVsZW1lbnQKKyAgICAvLyBzaW5jZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZlbiBkb2N1
bWVudC5sb2NhdGlvbgorICAgIGFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ICJhIiApOworICAgIGFqYXhMb2NhdGlvbi5ocmVmID0gIiI7CisgICAgYWpheExvY2F0aW9uID0g
YWpheExvY2F0aW9uLmhyZWY7Cit9CisKKy8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0cwor
YWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8
IFtdOworCisvLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFu
ZCBqUXVlcnkuYWpheFRyYW5zcG9ydAorZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3Bv
cnRzKCBzdHJ1Y3R1cmUgKSB7CisKKyAgICAvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9u
YWwgYW5kIGRlZmF1bHRzIHRvICIqIgorICAgIHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHBy
ZXNzaW9uLCBmdW5jICkgeworCisgICAgaWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9
PSAic3RyaW5nIiApIHsKKyAgICBmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOworICAgIGRhdGFU
eXBlRXhwcmVzc2lvbiA9ICIqIjsKKyAgICB9CisKKyAgICB2YXIgZGF0YVR5cGUsCisgICAgaSA9
IDAsCisgICAgZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0
Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9u
KCBmdW5jICkgKSB7CisgICAgLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhw
cmVzc2lvbgorICAgIHdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5cGVzW2krK10pICkgeworICAg
IC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCisgICAgaWYgKCBkYXRhVHlwZVswXSA9PT0gIisiICkg
eworICAgIGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCAiKiI7CisgICAgKHN0cnVj
dHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkudW5zaGlmdCgg
ZnVuYyApOworCisgICAgLy8gT3RoZXJ3aXNlIGFwcGVuZAorICAgIH0gZWxzZSB7CisgICAgKHN0
cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkucHVzaCgg
ZnVuYyApOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH07Cit9CisKKy8vIEJhc2UgaW5zcGVj
dGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0cworZnVuY3Rpb24gaW5z
cGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxP
cHRpb25zLCBqcVhIUiApIHsKKworICAgIHZhciBpbnNwZWN0ZWQgPSB7fSwKKyAgICBzZWVraW5n
VHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTsKKworICAgIGZ1bmN0aW9u
IGluc3BlY3QoIGRhdGFUeXBlICkgeworICAgIHZhciBzZWxlY3RlZDsKKyAgICBpbnNwZWN0ZWRb
IGRhdGFUeXBlIF0gPSB0cnVlOworICAgIGpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBl
IF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7CisgICAgdmFyIGRh
dGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFs
T3B0aW9ucywganFYSFIgKTsKKyAgICBpZiggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09
ICJzdHJpbmciICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JU
cmFuc3BvcnQgXSApIHsKKyAgICBvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9y
VHJhbnNwb3J0ICk7CisgICAgaW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApOworICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkgeworICAgIHJl
dHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKyAgICB9CisgICAgfSk7
CisgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHJldHVybiBpbnNwZWN0KCBvcHRp
b25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioi
ICk7Cit9CisKKy8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucworLy8gdGhhdCB0
YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCisvLyBGaXhlcyAj
OTg4NworZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7CisgICAgdmFyIGRlZXAs
IGtleSwKKyAgICBmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMg
fHwge307CisKKyAgICBmb3IgKCBrZXkgaW4gc3JjICkgeworICAgIGlmICggc3JjWyBrZXkgXSAh
PT0gdW5kZWZpbmVkICkgeworICAgICggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBk
ZWVwIHx8IChkZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOworICAgIH0KKyAgICB9
CisgICAgaWYgKCBkZWVwICkgeworICAgIGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVl
cCApOworICAgIH0KKworICAgIHJldHVybiB0YXJnZXQ7Cit9CisKK2pRdWVyeS5mbi5sb2FkID0g
ZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKyAgICBpZiAoIHR5cGVvZiB1cmwg
IT09ICJzdHJpbmciICYmIF9sb2FkICkgeworICAgIHJldHVybiBfbG9hZC5hcHBseSggdGhpcywg
YXJndW1lbnRzICk7CisgICAgfQorCisgICAgdmFyIHNlbGVjdG9yLCByZXNwb25zZSwgdHlwZSwK
KyAgICBzZWxmID0gdGhpcywKKyAgICBvZmYgPSB1cmwuaW5kZXhPZigiICIpOworCisgICAgaWYg
KCBvZmYgPj0gMCApIHsKKyAgICBzZWxlY3RvciA9IHVybC5zbGljZSggb2ZmLCB1cmwubGVuZ3Ro
ICk7CisgICAgdXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTsKKyAgICB9CisKKyAgICAvLyBJZiBp
dCdzIGEgZnVuY3Rpb24KKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsK
KworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisgICAgY2FsbGJhY2sg
PSBwYXJhbXM7CisgICAgcGFyYW1zID0gdW5kZWZpbmVkOworCisgICAgLy8gT3RoZXJ3aXNlLCBi
dWlsZCBhIHBhcmFtIHN0cmluZworICAgIH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFy
YW1zID09PSAib2JqZWN0IiApIHsKKyAgICB0eXBlID0gIlBPU1QiOworICAgIH0KKworICAgIC8v
IElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0CisgICAgaWYg
KCBzZWxmLmxlbmd0aCA+IDAgKSB7CisgICAgalF1ZXJ5LmFqYXgoeworICAgIHVybDogdXJsLAor
CisgICAgLy8gaWYgInR5cGUiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiAiR0VUIiBtZXRo
b2Qgd2lsbCBiZSB1c2VkCisgICAgdHlwZTogdHlwZSwKKyAgICBkYXRhVHlwZTogImh0bWwiLAor
ICAgIGRhdGE6IHBhcmFtcworICAgIH0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsK
KworICAgIC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFjaworICAg
IHJlc3BvbnNlID0gYXJndW1lbnRzOworCisgICAgc2VsZi5odG1sKCBzZWxlY3RvciA/CisKKyAg
ICAvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVu
dHMgaW4gYSBkdW1teSBkaXYKKyAgICAvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Bl
cm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKKyAgICBqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBqUXVl
cnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgorCisgICAg
Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHQKKyAgICByZXNwb25zZVRleHQgKTsKKwor
ICAgIH0pLmNvbXBsZXRlKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsK
KyAgICBzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4
dCwgc3RhdHVzLCBqcVhIUiBdICk7CisgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7
Cit9OworCisvLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1v
biBBSkFYIGV2ZW50cworalF1ZXJ5LmVhY2goIFsgImFqYXhTdGFydCIsICJhamF4U3RvcCIsICJh
amF4Q29tcGxldGUiLCAiYWpheEVycm9yIiwgImFqYXhTdWNjZXNzIiwgImFqYXhTZW5kIiBdLCBm
dW5jdGlvbiggaSwgdHlwZSApeworICAgIGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZu
ICl7CisgICAgcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7CisgICAgfTsKK30pOworCitqUXVl
cnkuZWFjaCggWyAiZ2V0IiwgInBvc3QiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7CisgICAg
alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkg
eworICAgIC8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkCisg
ICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworICAgIHR5cGUgPSB0eXBlIHx8
IGNhbGxiYWNrOworICAgIGNhbGxiYWNrID0gZGF0YTsKKyAgICBkYXRhID0gdW5kZWZpbmVkOwor
ICAgIH0KKworICAgIHJldHVybiBqUXVlcnkuYWpheCh7CisgICAgdXJsOiB1cmwsCisgICAgdHlw
ZTogbWV0aG9kLAorICAgIGRhdGFUeXBlOiB0eXBlLAorICAgIGRhdGE6IGRhdGEsCisgICAgc3Vj
Y2VzczogY2FsbGJhY2sKKyAgICB9KTsKKyAgICB9OworfSk7CisKK2pRdWVyeS5leHRlbmQoewor
CisgICAgLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVz
CisgICAgYWN0aXZlOiAwLAorCisgICAgLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9y
IG5leHQgcmVxdWVzdAorICAgIGxhc3RNb2RpZmllZDoge30sCisgICAgZXRhZzoge30sCisKKyAg
ICBhamF4U2V0dGluZ3M6IHsKKyAgICB1cmw6IGFqYXhMb2NhdGlvbiwKKyAgICB0eXBlOiAiR0VU
IiwKKyAgICBpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSAp
LAorICAgIGdsb2JhbDogdHJ1ZSwKKyAgICBwcm9jZXNzRGF0YTogdHJ1ZSwKKyAgICBhc3luYzog
dHJ1ZSwKKyAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2Rl
ZDsgY2hhcnNldD1VVEYtOCIsCisgICAgLyoKKyAgICB0aW1lb3V0OiAwLAorICAgIGRhdGE6IG51
bGwsCisgICAgZGF0YVR5cGU6IG51bGwsCisgICAgdXNlcm5hbWU6IG51bGwsCisgICAgcGFzc3dv
cmQ6IG51bGwsCisgICAgY2FjaGU6IG51bGwsCisgICAgdGhyb3dzOiBmYWxzZSwKKyAgICB0cmFk
aXRpb25hbDogZmFsc2UsCisgICAgaGVhZGVyczoge30sCisgICAgKi8KKworICAgIGFjY2VwdHM6
IHsKKyAgICAiKiI6IGFsbFR5cGVzLAorICAgIHRleHQ6ICJ0ZXh0L3BsYWluIiwKKyAgICBodG1s
OiAidGV4dC9odG1sIiwKKyAgICB4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwKKyAg
ICBqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IgorICAgIH0sCisKKyAg
ICBjb250ZW50czogeworICAgIHhtbDogL3htbC8sCisgICAgaHRtbDogL2h0bWwvLAorICAgIGpz
b246IC9qc29uLworICAgIH0sCisKKyAgICByZXNwb25zZUZpZWxkczogeworICAgIHhtbDogInJl
c3BvbnNlWE1MIiwKKyAgICB0ZXh0OiAicmVzcG9uc2VUZXh0IgorICAgIH0sCisKKyAgICAvLyBE
YXRhIGNvbnZlcnRlcnMKKyAgICAvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwg
IioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQorICAgIGNvbnZl
cnRlcnM6IHsKKworICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAorICAgICIqIHRleHQi
OiB3aW5kb3cuU3RyaW5nLAorCisgICAgLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNm
b3JtYXRpb24pCisgICAgInRleHQgaHRtbCI6IHRydWUsCisKKyAgICAvLyBFdmFsdWF0ZSB0ZXh0
IGFzIGEganNvbiBleHByZXNzaW9uCisgICAgInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04s
CisKKyAgICAvLyBQYXJzZSB0ZXh0IGFzIHhtbAorICAgICJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJz
ZVhNTAorICAgIH0sCisKKyAgICAvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVw
IGV4dGVuZGVkOgorICAgIC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhl
cmUgaWYKKyAgICAvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZQor
ICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQorICAgIGZsYXRPcHRpb25zOiB7
CisgICAgdXJsOiB0cnVlLAorICAgIGNvbnRleHQ6IHRydWUKKyAgICB9CisgICAgfSwKKworICAg
IC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0Cisg
ICAgLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgorICAgIC8v
IElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCisgICAgYWph
eFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsKKyAgICByZXR1cm4gc2V0dGlu
Z3MgPworCisgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKKyAgICBhamF4RXh0ZW5k
KCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6
CisKKyAgICAvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisgICAgYWpheEV4dGVuZCggalF1ZXJ5
LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7CisgICAgfSwKKworICAgIGFqYXhQcmVmaWx0ZXI6IGFk
ZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAorICAgIGFqYXhUcmFuc3Bv
cnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLAorCisgICAgLy8g
TWFpbiBtZXRob2QKKyAgICBhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgeworCisgICAg
Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKKyAgICBp
ZiAoIHR5cGVvZiB1cmwgPT09ICJvYmplY3QiICkgeworICAgIG9wdGlvbnMgPSB1cmw7CisgICAg
dXJsID0gdW5kZWZpbmVkOworICAgIH0KKworICAgIC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4g
b2JqZWN0CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKyAgICB2YXIgLy8gQ3Jvc3Mt
ZG9tYWluIGRldGVjdGlvbiB2YXJzCisgICAgcGFydHMsCisgICAgLy8gTG9vcCB2YXJpYWJsZQor
ICAgIGksCisgICAgLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQorICAgIGNhY2hlVVJM
LAorICAgIC8vIFJlc3BvbnNlIGhlYWRlcnMgYXMgc3RyaW5nCisgICAgcmVzcG9uc2VIZWFkZXJz
U3RyaW5nLAorICAgIC8vIHRpbWVvdXQgaGFuZGxlCisgICAgdGltZW91dFRpbWVyLAorCisgICAg
Ly8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCisgICAgZmly
ZUdsb2JhbHMsCisKKyAgICB0cmFuc3BvcnQsCisgICAgLy8gUmVzcG9uc2UgaGVhZGVycworICAg
IHJlc3BvbnNlSGVhZGVycywKKyAgICAvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0
CisgICAgcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCisgICAgLy8gQ2FsbGJh
Y2tzIGNvbnRleHQKKyAgICBjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcywKKyAgICAv
LyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBh
IERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uCisgICAgZ2xvYmFsRXZlbnRDb250ZXh0ID0g
cy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4
dC5qcXVlcnkgKSA/CisgICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CisgICAgalF1ZXJ5
LmV2ZW50LAorICAgIC8vIERlZmVycmVkcworICAgIGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVk
KCksCisgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5
IiksCisgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKyAgICBzdGF0dXNDb2RlID0g
cy5zdGF0dXNDb2RlIHx8IHt9LAorICAgIC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0
IG9uY2UpCisgICAgcmVxdWVzdEhlYWRlcnMgPSB7fSwKKyAgICByZXF1ZXN0SGVhZGVyc05hbWVz
ID0ge30sCisgICAgLy8gVGhlIGpxWEhSIHN0YXRlCisgICAgc3RhdGUgPSAwLAorICAgIC8vIERl
ZmF1bHQgYWJvcnQgbWVzc2FnZQorICAgIHN0ckFib3J0ID0gImNhbmNlbGVkIiwKKyAgICAvLyBG
YWtlIHhocgorICAgIGpxWEhSID0geworICAgIHJlYWR5U3RhdGU6IDAsCisKKyAgICAvLyBCdWls
ZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCisgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1
bmN0aW9uKCBrZXkgKSB7CisgICAgdmFyIG1hdGNoOworICAgIGlmICggc3RhdGUgPT09IDIgKSB7
CisgICAgaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgeworICAgIHJlc3BvbnNlSGVhZGVycyA9IHt9
OworICAgIHdoaWxlICggKG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3Ry
aW5nICkpICkgeworICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBd
ID0gbWF0Y2hbIDIgXTsKKyAgICB9CisgICAgfQorICAgIG1hdGNoID0gcmVzcG9uc2VIZWFkZXJz
WyBrZXkudG9Mb3dlckNhc2UoKSBdOworICAgIH0KKyAgICByZXR1cm4gbWF0Y2ggPT0gbnVsbCA/
IG51bGwgOiBtYXRjaDsKKyAgICB9LAorCisgICAgLy8gUmF3IHN0cmluZworICAgIGdldEFsbFJl
c3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHN0YXRlID09PSAyID8gcmVz
cG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKKyAgICB9LAorCisgICAgLy8gQ2FjaGVzIHRoZSBo
ZWFkZXIKKyAgICBzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Cisg
ICAgdmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIGlmICggIXN0YXRlICkgewor
ICAgIG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNO
YW1lc1sgbG5hbWUgXSB8fCBuYW1lOworICAgIHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1
ZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8vIE92ZXJyaWRlcyBy
ZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCisgICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rp
b24oIHR5cGUgKSB7CisgICAgaWYgKCAhc3RhdGUgKSB7CisgICAgcy5taW1lVHlwZSA9IHR5cGU7
CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBTdGF0dXMtZGVwZW5k
ZW50IGNhbGxiYWNrcworICAgIHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7CisgICAgdmFy
IGNvZGU7CisgICAgaWYgKCBtYXAgKSB7CisgICAgaWYgKCBzdGF0ZSA8IDIgKSB7CisgICAgZm9y
ICggY29kZSBpbiBtYXAgKSB7CisgICAgLy8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBh
IHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lcworICAgIHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsg
c3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdOworICAgIH0KKyAgICB9IGVsc2Ugewor
ICAgIC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcworICAgIGpxWEhSLmFsd2F5
cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRoaXM7
CisgICAgfSwKKworICAgIC8vIENhbmNlbCB0aGUgcmVxdWVzdAorICAgIGFib3J0OiBmdW5jdGlv
biggc3RhdHVzVGV4dCApIHsKKyAgICB2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJB
Ym9ydDsKKyAgICBpZiAoIHRyYW5zcG9ydCApIHsKKyAgICB0cmFuc3BvcnQuYWJvcnQoIGZpbmFs
VGV4dCApOworICAgIH0KKyAgICBkb25lKCAwLCBmaW5hbFRleHQgKTsKKyAgICByZXR1cm4gdGhp
czsKKyAgICB9CisgICAgfTsKKworICAgIC8vIEF0dGFjaCBkZWZlcnJlZHMKKyAgICBkZWZlcnJl
ZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7CisgICAg
anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7CisgICAganFYSFIuZXJyb3IgPSBqcVhIUi5mYWls
OworCisgICAgLy8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9t
b3Rpb24pCisgICAgLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAoIzU4NjY6IElFNyBp
c3N1ZSB3aXRoIHByb3RvY29sLWxlc3MgdXJscykKKyAgICAvLyBIYW5kbGUgZmFsc3kgdXJsIGlu
IHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0
dXJlKQorICAgIC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZQor
ICAgIHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9jYXRpb24gKSArICIiICkucmVw
bGFjZSggcmhhc2gsICIiICkucmVwbGFjZSggcnByb3RvY29sLCBhamF4TG9jUGFydHNbIDEgXSAr
ICIvLyIgKTsKKworICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlj
a2V0ICMxMjAwNAorICAgIHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8
fCBzLm1ldGhvZCB8fCBzLnR5cGU7CisKKyAgICAvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0Cisg
ICAgcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCAiKiIgKS50b0xvd2Vy
Q2FzZSgpLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFsiIl07CisKKyAgICAvLyBBIGNyb3Nz
LWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2ZSBhIHByb3RvY29sOmhvc3Q6
cG9ydCBtaXNtYXRjaAorICAgIGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgeworICAgIHBh
cnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CisgICAgcy5jcm9zc0RvbWFp
biA9ICEhKCBwYXJ0cyAmJgorICAgICggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0g
fHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwKKyAgICAoIHBhcnRzWyAzIF0g
fHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0NDMgKSApICE9CisgICAgKCBhamF4
TG9jUGFydHNbIDMgXSB8fCAoIGFqYXhMb2NQYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0
NDMgKSApICkKKyAgICApOworICAgIH0KKworICAgIC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxy
ZWFkeSBhIHN0cmluZworICAgIGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9m
IHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CisgICAgcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRh
dGEsIHMudHJhZGl0aW9uYWwgKTsKKyAgICB9CisKKyAgICAvLyBBcHBseSBwcmVmaWx0ZXJzCisg
ICAgaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMs
IGpxWEhSICk7CisKKyAgICAvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZp
bHRlciwgc3RvcCB0aGVyZQorICAgIGlmICggc3RhdGUgPT09IDIgKSB7CisgICAgcmV0dXJuIGpx
WEhSOworICAgIH0KKworICAgIC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93
IGlmIGFza2VkIHRvCisgICAgZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKKworICAgIC8vIFdhdGNo
IGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKKyAgICBpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVy
eS5hY3RpdmUrKyA9PT0gMCApIHsKKyAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0
Iik7CisgICAgfQorCisgICAgLy8gVXBwZXJjYXNlIHRoZSB0eXBlCisgICAgcy50eXBlID0gcy50
eXBlLnRvVXBwZXJDYXNlKCk7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29u
dGVudAorICAgIHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApOworCisg
ICAgLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlm
aWVkLVNpbmNlCisgICAgLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCisg
ICAgY2FjaGVVUkwgPSBzLnVybDsKKworICAgIC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3Ig
cmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisgICAgaWYgKCAhcy5oYXNDb250ZW50ICkgeworCisg
ICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybAorICAgIGlmICgg
cy5kYXRhICkgeworICAgIGNhY2hlVVJMID0gKCBzLnVybCArPSAoIGFqYXhfcnF1ZXJ5LnRlc3Qo
IGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOworICAgIC8vICM5NjgyOiByZW1v
dmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKKyAgICBk
ZWxldGUgcy5kYXRhOworICAgIH0KKworICAgIC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBu
ZWVkZWQKKyAgICBpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkgeworICAgIHMudXJsID0gcnRzLnRl
c3QoIGNhY2hlVVJMICkgPworCisgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJh
bWV0ZXIsIHNldCBpdHMgdmFsdWUKKyAgICBjYWNoZVVSTC5yZXBsYWNlKCBydHMsICIkMV89IiAr
IGFqYXhfbm9uY2UrKyApIDoKKworICAgIC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmQK
KyAgICBjYWNoZVVSTCArICggYWpheF9ycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/
IiApICsgIl89IiArIGFqYXhfbm9uY2UrKzsKKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRo
ZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlm
TW9kaWZpZWQgbW9kZS4KKyAgICBpZiAoIHMuaWZNb2RpZmllZCApIHsKKyAgICBpZiAoIGpRdWVy
eS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7CisgICAganFYSFIuc2V0UmVxdWVzdEhlYWRl
ciggIklmLU1vZGlmaWVkLVNpbmNlIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSAp
OworICAgIH0KKyAgICBpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgeworICAgIGpxWEhS
LnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJM
IF0gKTsKKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYg
ZGF0YSBpcyBiZWluZyBzZW50CisgICAgaWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMu
Y29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7CisgICAganFY
SFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKKyAg
ICB9CisKKyAgICAvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBl
bmRpbmcgb24gdGhlIGRhdGFUeXBlCisgICAganFYSFIuc2V0UmVxdWVzdEhlYWRlcigKKyAgICAi
QWNjZXB0IiwKKyAgICBzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNb
MF0gXSA/CisgICAgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdICsgKCBzLmRhdGFUeXBlc1sg
MCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CisgICAg
cy5hY2NlcHRzWyAiKiIgXQorICAgICk7CisKKyAgICAvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRp
b24KKyAgICBmb3IgKCBpIGluIHMuaGVhZGVycyApIHsKKyAgICBqcVhIUi5zZXRSZXF1ZXN0SGVh
ZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOworICAgIH0KKworICAgIC8vIEFsbG93IGN1c3RvbSBo
ZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKyAgICBpZiAoIHMuYmVmb3JlU2VuZCAm
JiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZh
bHNlIHx8IHN0YXRlID09PSAyICkgKSB7CisgICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFk
eSBhbmQgcmV0dXJuCisgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7CisgICAgfQorCisgICAgLy8g
YWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uCisgICAgc3RyQWJvcnQgPSAiYWJv
cnQiOworCisgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCisgICAgZm9yICgg
aSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgeworICAgIGpxWEhS
WyBpIF0oIHNbIGkgXSApOworICAgIH0KKworICAgIC8vIEdldCB0cmFuc3BvcnQKKyAgICB0cmFu
c3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0
aW9ucywganFYSFIgKTsKKworICAgIC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydAor
ICAgIGlmICggIXRyYW5zcG9ydCApIHsKKyAgICBkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsK
KyAgICB9IGVsc2UgeworICAgIGpxWEhSLnJlYWR5U3RhdGUgPSAxOworCisgICAgLy8gU2VuZCBn
bG9iYWwgZXZlbnQKKyAgICBpZiAoIGZpcmVHbG9iYWxzICkgeworICAgIGdsb2JhbEV2ZW50Q29u
dGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKKyAgICB9CisgICAgLy8g
VGltZW91dAorICAgIGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgeworICAgIHRpbWVv
dXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAganFYSFIuYWJvcnQoInRpbWVv
dXQiKTsKKyAgICB9LCBzLnRpbWVvdXQgKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgIHN0YXRl
ID0gMTsKKyAgICB0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKKyAgICB9
IGNhdGNoICggZSApIHsKKyAgICAvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5v
dCBkb25lCisgICAgaWYgKCBzdGF0ZSA8IDIgKSB7CisgICAgZG9uZSggLTEsIGUgKTsKKyAgICAv
LyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2UKKyAgICB9IGVsc2UgeworICAgIHRocm93IGU7Cisg
ICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5n
IGlzIGRvbmUKKyAgICBmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJl
c3BvbnNlcywgaGVhZGVycyApIHsKKyAgICB2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwg
cmVzcG9uc2UsIG1vZGlmaWVkLAorICAgIHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0Owor
CisgICAgLy8gQ2FsbGVkIG9uY2UKKyAgICBpZiAoIHN0YXRlID09PSAyICkgeworICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICAvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CisgICAgc3RhdGUgPSAyOwor
CisgICAgLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKKyAgICBpZiAoIHRpbWVvdXRUaW1l
ciApIHsKKyAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApOworICAgIH0KKworICAgIC8v
IERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uCisgICAg
Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKKyAg
ICB0cmFuc3BvcnQgPSB1bmRlZmluZWQ7CisKKyAgICAvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJz
CisgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCAiIjsKKworICAgIC8vIFNl
dCByZWFkeVN0YXRlCisgICAganFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsK
KworICAgIC8vIEdldCByZXNwb25zZSBkYXRhCisgICAgaWYgKCByZXNwb25zZXMgKSB7CisgICAg
cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7Cisg
ICAgfQorCisgICAgLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKKyAgICBp
ZiAoIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0ICkgewor
CisgICAgLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBo
ZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKyAgICBpZiAoIHMuaWZNb2RpZmllZCApIHsK
KyAgICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7
CisgICAgaWYgKCBtb2RpZmllZCApIHsKKyAgICBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVS
TCBdID0gbW9kaWZpZWQ7CisgICAgfQorICAgIG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VI
ZWFkZXIoImV0YWciKTsKKyAgICBpZiAoIG1vZGlmaWVkICkgeworICAgIGpRdWVyeS5ldGFnWyBj
YWNoZVVSTCBdID0gbW9kaWZpZWQ7CisgICAgfQorICAgIH0KKworICAgIC8vIGlmIG5vIGNvbnRl
bnQKKyAgICBpZiAoIHN0YXR1cyA9PT0gMjA0ICkgeworICAgIGlzU3VjY2VzcyA9IHRydWU7Cisg
ICAgc3RhdHVzVGV4dCA9ICJub2NvbnRlbnQiOworCisgICAgLy8gaWYgbm90IG1vZGlmaWVkCisg
ICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7CisgICAgaXNTdWNjZXNzID0gdHJ1ZTsK
KyAgICBzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKKworICAgIC8vIElmIHdlIGhhdmUgZGF0
YSwgbGV0J3MgY29udmVydCBpdAorICAgIH0gZWxzZSB7CisgICAgaXNTdWNjZXNzID0gYWpheENv
bnZlcnQoIHMsIHJlc3BvbnNlICk7CisgICAgc3RhdHVzVGV4dCA9IGlzU3VjY2Vzcy5zdGF0ZTsK
KyAgICBzdWNjZXNzID0gaXNTdWNjZXNzLmRhdGE7CisgICAgZXJyb3IgPSBpc1N1Y2Nlc3MuZXJy
b3I7CisgICAgaXNTdWNjZXNzID0gIWVycm9yOworICAgIH0KKyAgICB9IGVsc2UgeworICAgIC8v
IFdlIGV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0CisgICAgLy8gdGhlbiBub3JtYWxpemUg
c3RhdHVzVGV4dCBhbmQgc3RhdHVzIGZvciBub24tYWJvcnRzCisgICAgZXJyb3IgPSBzdGF0dXNU
ZXh0OworICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgeworICAgIHN0YXR1c1RleHQg
PSAiZXJyb3IiOworICAgIGlmICggc3RhdHVzIDwgMCApIHsKKyAgICBzdGF0dXMgPSAwOworICAg
IH0KKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmpl
Y3QKKyAgICBqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CisgICAganFYSFIuc3RhdHVzVGV4dCA9ICgg
bmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKKworICAgIC8vIFN1Y2Nlc3Mv
RXJyb3IKKyAgICBpZiAoIGlzU3VjY2VzcyApIHsKKyAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCgg
Y2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKKyAgICB9
IGVsc2UgeworICAgIGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhI
Uiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOworICAgIH0KKworICAgIC8vIFN0YXR1cy1kZXBlbmRl
bnQgY2FsbGJhY2tzCisgICAganFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOworICAgIHN0
YXR1c0NvZGUgPSB1bmRlZmluZWQ7CisKKyAgICBpZiAoIGZpcmVHbG9iYWxzICkgeworICAgIGds
b2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAiYWpheFN1Y2Nlc3MiIDogImFq
YXhFcnJvciIsCisgICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0g
KTsKKyAgICB9CisKKyAgICAvLyBDb21wbGV0ZQorICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdp
dGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7CisKKyAgICBpZiAo
IGZpcmVHbG9iYWxzICkgeworICAgIGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENv
bXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CisgICAgLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBj
b3VudGVyCisgICAgaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHsKKyAgICBqUXVlcnkuZXZl
bnQudHJpZ2dlcigiYWpheFN0b3AiKTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVy
biBqcVhIUjsKKyAgICB9LAorCisgICAgZ2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFj
ayApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAi
c2NyaXB0IiApOworICAgIH0sCisKKyAgICBnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBj
YWxsYmFjayApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywg
Impzb24iICk7CisgICAgfQorfSk7CisKKy8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXgg
cmVxdWVzdDoKKyAqIC0gc2V0cyBhbGwgcmVzcG9uc2VYWFggZmllbGRzIGFjY29yZGluZ2x5Cisg
KiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5
cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQorICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5n
IHJlc3BvbnNlCisgKi8KK2Z1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCBy
ZXNwb25zZXMgKSB7CisgICAgdmFyIGZpcnN0RGF0YVR5cGUsIGN0LCBmaW5hbERhdGFUeXBlLCB0
eXBlLAorICAgIGNvbnRlbnRzID0gcy5jb250ZW50cywKKyAgICBkYXRhVHlwZXMgPSBzLmRhdGFU
eXBlcywKKyAgICByZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHM7CisKKyAgICAvLyBG
aWxsIHJlc3BvbnNlWFhYIGZpZWxkcworICAgIGZvciAoIHR5cGUgaW4gcmVzcG9uc2VGaWVsZHMg
KSB7CisgICAgaWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKKyAgICBqcVhIUlsgcmVzcG9uc2VG
aWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOworICAgIH0KKyAgICB9CisKKyAgICAv
LyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vz
cworICAgIHdoaWxlKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkgeworICAgIGRhdGFUeXBlcy5z
aGlmdCgpOworICAgIGlmICggY3QgPT09IHVuZGVmaW5lZCApIHsKKyAgICBjdCA9IHMubWltZVR5
cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpOworICAgIH0KKyAg
ICB9CisKKyAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50
LXR5cGUKKyAgICBpZiAoIGN0ICkgeworICAgIGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7Cisg
ICAgaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSAp
IHsKKyAgICBkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworICAgIGJyZWFrOworICAgIH0KKyAg
ICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBm
b3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisgICAgaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNw
b25zZXMgKSB7CisgICAgZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOworICAgIH0gZWxz
ZSB7CisgICAgLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcworICAgIGZvciAoIHR5cGUgaW4g
cmVzcG9uc2VzICkgeworICAgIGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sg
dHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgeworICAgIGZpbmFsRGF0YVR5cGUgPSB0eXBl
OworICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoICFmaXJzdERhdGFUeXBlICkgeworICAgIGZp
cnN0RGF0YVR5cGUgPSB0eXBlOworICAgIH0KKyAgICB9CisgICAgLy8gT3IganVzdCB1c2UgZmly
c3Qgb25lCisgICAgZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlw
ZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCisgICAgLy8gV2UgYWRk
IHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKKyAgICAvLyBhbmQgcmV0dXJuIHRo
ZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgICAgaWYgKCBmaW5hbERhdGFUeXBlICkgeworICAg
IGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CisgICAgZGF0YVR5cGVz
LnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3BvbnNlc1sg
ZmluYWxEYXRhVHlwZSBdOworICAgIH0KK30KKworLy8gQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4g
dGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQorZnVuY3Rpb24gYWpheENvbnZl
cnQoIHMsIHJlc3BvbnNlICkgeworICAgIHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLAor
ICAgIGNvbnZlcnRlcnMgPSB7fSwKKyAgICBpID0gMCwKKyAgICAvLyBXb3JrIHdpdGggYSBjb3B5
IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9u
CisgICAgZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKSwKKyAgICBwcmV2ID0gZGF0YVR5
cGVzWyAwIF07CisKKyAgICAvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZAorICAg
IGlmICggcy5kYXRhRmlsdGVyICkgeworICAgIHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNw
b25zZSwgcy5kYXRhVHlwZSApOworICAgIH0KKworICAgIC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1h
cCB3aXRoIGxvd2VyY2FzZWQga2V5cworICAgIGlmICggZGF0YVR5cGVzWyAxIF0gKSB7CisgICAg
Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CisgICAgY29udmVydGVyc1sgY29udi50b0xv
d2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKKyAgICB9CisgICAgfQorCisgICAg
Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUsIHRvbGVyYXRpbmcgbGlzdCBt
b2RpZmljYXRpb24KKyAgICBmb3IgKCA7IChjdXJyZW50ID0gZGF0YVR5cGVzWysraV0pOyApIHsK
KworICAgIC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMg
bm9uLWF1dG8KKyAgICBpZiAoIGN1cnJlbnQgIT09ICIqIiApIHsKKworICAgIC8vIENvbnZlcnQg
cmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1
cnJlbnQKKyAgICBpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkgeworCisg
ICAgLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKKyAgICBjb252ID0gY29udmVydGVyc1sgcHJl
diArICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3VycmVudCBdOworCisg
ICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKKyAgICBpZiAoICFjb252ICkgeworICAg
IGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CisKKyAgICAvLyBJZiBjb252MiBvdXRwdXRz
IGN1cnJlbnQKKyAgICB0bXAgPSBjb252Mi5zcGxpdCgiICIpOworICAgIGlmICggdG1wWyAxIF0g
PT09IGN1cnJlbnQgKSB7CisKKyAgICAvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNj
ZXB0ZWQgaW5wdXQKKyAgICBjb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBd
IF0gfHwKKyAgICBjb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKKyAgICBpZiAoIGNvbnYg
KSB7CisgICAgLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycworICAgIGlmICggY29u
diA9PT0gdHJ1ZSApIHsKKyAgICBjb252ID0gY29udmVydGVyc1sgY29udjIgXTsKKworICAgIC8v
IE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKKyAgICB9IGVsc2Ug
aWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgeworICAgIGN1cnJlbnQgPSB0bXBb
IDAgXTsKKyAgICBkYXRhVHlwZXMuc3BsaWNlKCBpLS0sIDAsIGN1cnJlbnQgKTsKKyAgICB9CisK
KyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBcHBseSBj
b252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKKyAgICBpZiAoIGNvbnYgIT09IHRydWUg
KSB7CisKKyAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2gg
YW5kIHJldHVybiB0aGVtCisgICAgaWYgKCBjb252ICYmIHNbInRocm93cyJdICkgeworICAgIHJl
c3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKKyAgICB9IGVsc2UgeworICAgIHRyeSB7CisgICAg
cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOworICAgIH0gY2F0Y2ggKCBlICkgeworICAgIHJl
dHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3IiLCBlcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVy
c2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudCB9OworICAgIH0KKyAgICB9Cisg
ICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSBwcmV2IGZvciBuZXh0IGl0ZXJhdGlvbgorICAg
IHByZXYgPSBjdXJyZW50OworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4geyBzdGF0ZTogInN1
Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9OworfQorLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUK
K2pRdWVyeS5hamF4U2V0dXAoeworICAgIGFjY2VwdHM6IHsKKyAgICBzY3JpcHQ6ICJ0ZXh0L2ph
dmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQs
IGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKKyAgICB9LAorICAgIGNvbnRlbnRzOiB7CisgICAg
c2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC8KKyAgICB9LAorICAgIGNvbnZlcnRlcnM6IHsK
KyAgICAidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKKyAgICBqUXVlcnkuZ2xvYmFs
RXZhbCggdGV4dCApOworICAgIHJldHVybiB0ZXh0OworICAgIH0KKyAgICB9Cit9KTsKKworLy8g
SGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBnbG9iYWwKK2pRdWVyeS5hamF4UHJlZmls
dGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CisgICAgaWYgKCBzLmNhY2hlID09PSB1bmRl
ZmluZWQgKSB7CisgICAgcy5jYWNoZSA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoIHMuY3Jvc3NE
b21haW4gKSB7CisgICAgcy50eXBlID0gIkdFVCI7CisgICAgcy5nbG9iYWwgPSBmYWxzZTsKKyAg
ICB9Cit9KTsKKworLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0CitqUXVlcnkuYWph
eFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKHMpIHsKKworICAgIC8vIFRoaXMgdHJhbnNw
b3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKKyAgICBpZiAoIHMuY3Jv
c3NEb21haW4gKSB7CisKKyAgICB2YXIgc2NyaXB0LAorICAgIGhlYWQgPSBkb2N1bWVudC5oZWFk
IHx8IGpRdWVyeSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworICAg
IHJldHVybiB7CisKKyAgICBzZW5kOiBmdW5jdGlvbiggXywgY2FsbGJhY2sgKSB7CisKKyAgICBz
Y3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKworICAgIHNjcmlwdC5h
c3luYyA9IHRydWU7CisKKyAgICBpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKKyAgICBzY3JpcHQu
Y2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKyAgICB9CisKKyAgICBzY3JpcHQuc3JjID0gcy51
cmw7CisKKyAgICAvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2VycworICAgIHNjcmlw
dC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJv
cnQgKSB7CisKKyAgICBpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2Fk
ZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkgKSB7CisKKyAgICAvLyBIYW5k
bGUgbWVtb3J5IGxlYWsgaW4gSUUKKyAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlz
dGF0ZWNoYW5nZSA9IG51bGw7CisKKyAgICAvLyBSZW1vdmUgdGhlIHNjcmlwdAorICAgIGlmICgg
c2NyaXB0LnBhcmVudE5vZGUgKSB7CisgICAgc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo
IHNjcmlwdCApOworICAgIH0KKworICAgIC8vIERlcmVmZXJlbmNlIHRoZSBzY3JpcHQKKyAgICBz
Y3JpcHQgPSBudWxsOworCisgICAgLy8gQ2FsbGJhY2sgaWYgbm90IGFib3J0CisgICAgaWYgKCAh
aXNBYm9ydCApIHsKKyAgICBjYWxsYmFjayggMjAwLCAic3VjY2VzcyIgKTsKKyAgICB9CisgICAg
fQorICAgIH07CisKKyAgICAvLyBDaXJjdW12ZW50IElFNiBidWdzIHdpdGggYmFzZSBlbGVtZW50
cyAoIzI3MDkgYW5kICM0Mzc4KSBieSBwcmVwZW5kaW5nCisgICAgLy8gVXNlIG5hdGl2ZSBET00g
bWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5CisgICAgaGVh
ZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CisgICAgfSwKKworICAg
IGFib3J0OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIHNjcmlwdCApIHsKKyAgICBzY3JpcHQub25s
b2FkKCB1bmRlZmluZWQsIHRydWUgKTsKKyAgICB9CisgICAgfQorICAgIH07CisgICAgfQorfSk7
Cit2YXIgb2xkQ2FsbGJhY2tzID0gW10sCisgICAgcmpzb25wID0gLyg9KVw/KD89JnwkKXxcP1w/
LzsKKworLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncworalF1ZXJ5LmFqYXhTZXR1cCh7CisgICAg
anNvbnA6ICJjYWxsYmFjayIsCisgICAganNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CisgICAg
dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAi
XyIgKyAoIGFqYXhfbm9uY2UrKyApICk7CisgICAgdGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7Cisg
ICAgcmV0dXJuIGNhbGxiYWNrOworICAgIH0KK30pOworCisvLyBEZXRlY3QsIG5vcm1hbGl6ZSBv
cHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHMKK2pRdWVyeS5h
amF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdz
LCBqcVhIUiApIHsKKworICAgIHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25z
ZUNvbnRhaW5lciwKKyAgICBqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25w
LnRlc3QoIHMudXJsICkgPworICAgICJ1cmwiIDoKKyAgICB0eXBlb2Ygcy5kYXRhID09PSAic3Ry
aW5nIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkuaW5kZXhPZigiYXBwbGljYXRpb24veC13
d3ctZm9ybS11cmxlbmNvZGVkIikgJiYgcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgor
ICAgICk7CisKKyAgICAvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgImpz
b25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldAorICAgIGlmICgganNvblByb3AgfHwg
cy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKKworICAgIC8vIEdldCBjYWxsYmFjayBu
YW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQKKyAg
ICBjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5q
c29ucENhbGxiYWNrICkgPworICAgIHMuanNvbnBDYWxsYmFjaygpIDoKKyAgICBzLmpzb25wQ2Fs
bGJhY2s7CisKKyAgICAvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhCisg
ICAgaWYgKCBqc29uUHJvcCApIHsKKyAgICBzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5y
ZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKKyAgICB9IGVsc2UgaWYgKCBz
Lmpzb25wICE9PSBmYWxzZSApIHsKKyAgICBzLnVybCArPSAoIGFqYXhfcnF1ZXJ5LnRlc3QoIHMu
dXJsICkgPyAiJiIgOiAiPyIgKSArIHMuanNvbnAgKyAiPSIgKyBjYWxsYmFja05hbWU7CisgICAg
fQorCisgICAgLy8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2Ny
aXB0IGV4ZWN1dGlvbgorICAgIHMuY29udmVydGVyc1sic2NyaXB0IGpzb24iXSA9IGZ1bmN0aW9u
KCkgeworICAgIGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgeworICAgIGpRdWVyeS5lcnJvcigg
Y2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKKyAgICB9CisgICAgcmV0dXJuIHJl
c3BvbnNlQ29udGFpbmVyWyAwIF07CisgICAgfTsKKworICAgIC8vIGZvcmNlIGpzb24gZGF0YVR5
cGUKKyAgICBzLmRhdGFUeXBlc1sgMCBdID0gImpzb24iOworCisgICAgLy8gSW5zdGFsbCBjYWxs
YmFjaworICAgIG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKKyAgICB3aW5k
b3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CisgICAgcmVzcG9uc2VDb250YWluZXIg
PSBhcmd1bWVudHM7CisgICAgfTsKKworICAgIC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBh
ZnRlciBjb252ZXJ0ZXJzKQorICAgIGpxWEhSLmFsd2F5cyhmdW5jdGlvbigpIHsKKyAgICAvLyBS
ZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCisgICAgd2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92
ZXJ3cml0dGVuOworCisgICAgLy8gU2F2ZSBiYWNrIGFzIGZyZWUKKyAgICBpZiAoIHNbIGNhbGxi
YWNrTmFtZSBdICkgeworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25z
IGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAorICAgIHMuanNvbnBDYWxsYmFjayA9IG9yaWdp
bmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKKworICAgIC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5h
bWUgZm9yIGZ1dHVyZSB1c2UKKyAgICBvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7
CisgICAgfQorCisgICAgLy8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBh
IHJlc3BvbnNlCisgICAgaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlv
biggb3ZlcndyaXR0ZW4gKSApIHsKKyAgICBvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJb
IDAgXSApOworICAgIH0KKworICAgIHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1
bmRlZmluZWQ7CisgICAgfSk7CisKKyAgICAvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKKyAgICByZXR1
cm4gInNjcmlwdCI7CisgICAgfQorfSk7Cit2YXIgeGhyQ2FsbGJhY2tzLCB4aHJTdXBwb3J0ZWQs
CisgICAgeGhySWQgPSAwLAorICAgIC8vICM1MjgwOiBJbnRlcm5ldCBFeHBsb3JlciB3aWxsIGtl
ZXAgY29ubmVjdGlvbnMgYWxpdmUgaWYgd2UgZG9uJ3QgYWJvcnQgb24gdW5sb2FkCisgICAgeGhy
T25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ICYmIGZ1bmN0aW9uKCkgeworICAg
IC8vIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzCisgICAgdmFyIGtleTsKKyAgICBmb3IgKCBr
ZXkgaW4geGhyQ2FsbGJhY2tzICkgeworICAgIHhockNhbGxiYWNrc1sga2V5IF0oIHVuZGVmaW5l
ZCwgdHJ1ZSApOworICAgIH0KKyAgICB9OworCisvLyBGdW5jdGlvbnMgdG8gY3JlYXRlIHhocnMK
K2Z1bmN0aW9uIGNyZWF0ZVN0YW5kYXJkWEhSKCkgeworICAgIHRyeSB7CisgICAgcmV0dXJuIG5l
dyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKKyAgICB9IGNhdGNoKCBlICkge30KK30KKworZnVu
Y3Rpb24gY3JlYXRlQWN0aXZlWEhSKCkgeworICAgIHRyeSB7CisgICAgcmV0dXJuIG5ldyB3aW5k
b3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKKyAgICB9IGNhdGNoKCBlICkg
e30KK30KKworLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAorLy8gKFRoaXMgaXMgc3RpbGwg
YXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KQoralF1
ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CisgICAgLyogTWlj
cm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQorICAgICAqIGltcGxlbWVudCB0aGUgWE1MSHR0cFJl
cXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVzKSwKKyAgICAgKiBzbyB3ZSB1
c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKKyAgICAgKiBBZGRpdGlv
bmFsbHkgWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIGluIElFNy9JRTggc28KKyAgICAg
KiB3ZSBuZWVkIGEgZmFsbGJhY2suCisgICAgICovCisgICAgZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuICF0aGlzLmlzTG9jYWwgJiYgY3JlYXRlU3RhbmRhcmRYSFIoKSB8fCBjcmVhdGVBY3RpdmVY
SFIoKTsKKyAgICB9IDoKKyAgICAvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0
YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorICAgIGNyZWF0ZVN0YW5kYXJkWEhSOworCisv
LyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCit4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWph
eFNldHRpbmdzLnhocigpOworalF1ZXJ5LnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYm
ICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyU3VwcG9ydGVkICk7Cit4aHJTdXBwb3J0ZWQgPSBq
UXVlcnkuc3VwcG9ydC5hamF4ID0gISF4aHJTdXBwb3J0ZWQ7CisKKy8vIENyZWF0ZSB0cmFuc3Bv
cnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCitpZiAoIHhoclN1cHBvcnRlZCAp
IHsKKworICAgIGpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkgeworICAgIC8vIENy
b3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVl
c3QKKyAgICBpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5zdXBwb3J0LmNvcnMgKSB7CisK
KyAgICB2YXIgY2FsbGJhY2s7CisKKyAgICByZXR1cm4geworICAgIHNlbmQ6IGZ1bmN0aW9uKCBo
ZWFkZXJzLCBjb21wbGV0ZSApIHsKKworICAgIC8vIEdldCBhIG5ldyB4aHIKKyAgICB2YXIgaGFu
ZGxlLCBpLAorICAgIHhociA9IHMueGhyKCk7CisKKyAgICAvLyBPcGVuIHRoZSBzb2NrZXQKKyAg
ICAvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxvZ2luIHBvcHVwIG9uIE9w
ZXJhICgjMjg2NSkKKyAgICBpZiAoIHMudXNlcm5hbWUgKSB7CisgICAgeGhyLm9wZW4oIHMudHlw
ZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKKyAgICB9IGVsc2Ug
eworICAgIHhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5jICk7CisgICAgfQorCisgICAg
Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAorICAgIGlmICggcy54aHJGaWVsZHMg
KSB7CisgICAgZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsKKyAgICB4aHJbIGkgXSA9IHMueGhy
RmllbGRzWyBpIF07CisgICAgfQorICAgIH0KKworICAgIC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBp
ZiBuZWVkZWQKKyAgICBpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7
CisgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUgKTsKKyAgICB9CisKKyAgICAv
LyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgorICAgIC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVz
dHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKKyAgICAvLyBha2lu
IHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgor
ICAgIC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2
ZW4gdXNpbmcgYWpheFNldHVwKQorICAgIC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29u
J3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgorICAgIGlmICggIXMuY3Jvc3NE
b21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKKyAgICBoZWFkZXJzWyJY
LVJlcXVlc3RlZC1XaXRoIl0gPSAiWE1MSHR0cFJlcXVlc3QiOworICAgIH0KKworICAgIC8vIE5l
ZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZv
eCAzCisgICAgdHJ5IHsKKyAgICBmb3IgKCBpIGluIGhlYWRlcnMgKSB7CisgICAgeGhyLnNldFJl
cXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApOworICAgIH0KKyAgICB9IGNhdGNoKCBlcnIg
KSB7fQorCisgICAgLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAorICAgIC8vIFRoaXMgbWF5IHJhaXNl
IGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQorICAgIC8vIGhhbmRsZWQgaW4galF1ZXJ5
LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQorICAgIHhoci5zZW5kKCAoIHMuaGFzQ29udGVu
dCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CisKKyAgICAvLyBMaXN0ZW5lcgorICAgIGNhbGxiYWNr
ID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CisgICAgdmFyIHN0YXR1cywgcmVzcG9uc2VIZWFk
ZXJzLCBzdGF0dXNUZXh0LCByZXNwb25zZXM7CisKKyAgICAvLyBGaXJlZm94IHRocm93cyBleGNl
cHRpb25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMKKyAgICAvLyBvZiBhbiB4aHIgd2hlbiBh
IG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQKKyAgICAvLyBodHRwOi8vaGVscGZ1bC5rbm9icy1kaWFs
cy5jb20vaW5kZXgucGhwL0NvbXBvbmVudF9yZXR1cm5lZF9mYWlsdXJlX2NvZGU6XzB4ODAwNDAx
MTFfKE5TX0VSUk9SX05PVF9BVkFJTEFCTEUpCisgICAgdHJ5IHsKKworICAgIC8vIFdhcyBuZXZl
ciBjYWxsZWQgYW5kIGlzIGFib3J0ZWQgb3IgY29tcGxldGUKKyAgICBpZiAoIGNhbGxiYWNrICYm
ICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgeworCisgICAgLy8gT25seSBj
YWxsZWQgb25jZQorICAgIGNhbGxiYWNrID0gdW5kZWZpbmVkOworCisgICAgLy8gRG8gbm90IGtl
ZXAgYXMgYWN0aXZlIGFueW1vcmUKKyAgICBpZiAoIGhhbmRsZSApIHsKKyAgICB4aHIub25yZWFk
eXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisgICAgaWYgKCB4aHJPblVubG9hZEFib3J0ICkg
eworICAgIGRlbGV0ZSB4aHJDYWxsYmFja3NbIGhhbmRsZSBdOworICAgIH0KKyAgICB9CisKKyAg
ICAvLyBJZiBpdCdzIGFuIGFib3J0CisgICAgaWYgKCBpc0Fib3J0ICkgeworICAgIC8vIEFib3J0
IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAorICAgIGlmICggeGhyLnJlYWR5U3RhdGUgIT09IDQgKSB7
CisgICAgeGhyLmFib3J0KCk7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgcmVzcG9uc2VzID0g
e307CisgICAgc3RhdHVzID0geGhyLnN0YXR1czsKKyAgICByZXNwb25zZUhlYWRlcnMgPSB4aHIu
Z2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisKKyAgICAvLyBXaGVuIHJlcXVlc3RpbmcgYmluYXJ5
IGRhdGEsIElFNi05IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgLy8gb24gYW55IGF0dGVt
cHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAoIzExNDI2KQorICAgIGlmICggdHlwZW9mIHhoci5y
ZXNwb25zZVRleHQgPT09ICJzdHJpbmciICkgeworICAgIHJlc3BvbnNlcy50ZXh0ID0geGhyLnJl
c3BvbnNlVGV4dDsKKyAgICB9CisKKyAgICAvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24g
d2hlbiBhY2Nlc3NpbmcKKyAgICAvLyBzdGF0dXNUZXh0IGZvciBmYXVsdHkgY3Jvc3MtZG9tYWlu
IHJlcXVlc3RzCisgICAgdHJ5IHsKKyAgICBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQ7Cisg
ICAgfSBjYXRjaCggZSApIHsKKyAgICAvLyBXZSBub3JtYWxpemUgd2l0aCBXZWJraXQgZ2l2aW5n
IGFuIGVtcHR5IHN0YXR1c1RleHQKKyAgICBzdGF0dXNUZXh0ID0gIiI7CisgICAgfQorCisgICAg
Ly8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2aW9ycworCisgICAgLy8gSWYg
dGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2Vzcwor
ICAgIC8vIChzdWNjZXNzIHdpdGggbm8gZGF0YSB3b24ndCBnZXQgbm90aWZpZWQsIHRoYXQncyB0
aGUgYmVzdCB3ZQorICAgIC8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykK
KyAgICBpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNyb3NzRG9tYWluICkgeworICAg
IHN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OworICAgIC8vIElFIC0gIzE0NTA6
IHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0CisgICAgfSBlbHNl
IGlmICggc3RhdHVzID09PSAxMjIzICkgeworICAgIHN0YXR1cyA9IDIwNDsKKyAgICB9CisgICAg
fQorICAgIH0KKyAgICB9IGNhdGNoKCBmaXJlZm94QWNjZXNzRXhjZXB0aW9uICkgeworICAgIGlm
ICggIWlzQWJvcnQgKSB7CisgICAgY29tcGxldGUoIC0xLCBmaXJlZm94QWNjZXNzRXhjZXB0aW9u
ICk7CisgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkCisgICAg
aWYgKCByZXNwb25zZXMgKSB7CisgICAgY29tcGxldGUoIHN0YXR1cywgc3RhdHVzVGV4dCwgcmVz
cG9uc2VzLCByZXNwb25zZUhlYWRlcnMgKTsKKyAgICB9CisgICAgfTsKKworICAgIGlmICggIXMu
YXN5bmMgKSB7CisgICAgLy8gaWYgd2UncmUgaW4gc3luYyBtb2RlIHdlIGZpcmUgdGhlIGNhbGxi
YWNrCisgICAgY2FsbGJhY2soKTsKKyAgICB9IGVsc2UgaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0g
NCApIHsKKyAgICAvLyAoSUU2ICYgSUU3KSBpZiBpdCdzIGluIGNhY2hlIGFuZCBoYXMgYmVlbgor
ICAgIC8vIHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZpcmUgdGhlIGNhbGxiYWNrCisg
ICAgc2V0VGltZW91dCggY2FsbGJhY2sgKTsKKyAgICB9IGVsc2UgeworICAgIGhhbmRsZSA9ICsr
eGhySWQ7CisgICAgaWYgKCB4aHJPblVubG9hZEFib3J0ICkgeworICAgIC8vIENyZWF0ZSB0aGUg
YWN0aXZlIHhocnMgY2FsbGJhY2tzIGxpc3QgaWYgbmVlZGVkCisgICAgLy8gYW5kIGF0dGFjaCB0
aGUgdW5sb2FkIGhhbmRsZXIKKyAgICBpZiAoICF4aHJDYWxsYmFja3MgKSB7CisgICAgeGhyQ2Fs
bGJhY2tzID0ge307CisgICAgalF1ZXJ5KCB3aW5kb3cgKS51bmxvYWQoIHhock9uVW5sb2FkQWJv
cnQgKTsKKyAgICB9CisgICAgLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tz
CisgICAgeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXSA9IGNhbGxiYWNrOworICAgIH0KKyAgICB4aHIu
b25yZWFkeXN0YXRlY2hhbmdlID0gY2FsbGJhY2s7CisgICAgfQorICAgIH0sCisKKyAgICBhYm9y
dDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCBjYWxsYmFjayApIHsKKyAgICBjYWxsYmFjayggdW5k
ZWZpbmVkLCB0cnVlICk7CisgICAgfQorICAgIH0KKyAgICB9OworICAgIH0KKyAgICB9KTsKK30K
K3ZhciBmeE5vdywgdGltZXJJZCwKKyAgICByZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlk
ZSkkLywKKyAgICByZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/OihbKy1dKT18KSgiICsgY29yZV9w
bnVtICsgIikoW2EteiVdKikkIiwgImkiICksCisgICAgcnJ1biA9IC9xdWV1ZUhvb2tzJC8sCisg
ICAgYW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLAorICAgIHR3ZWVu
ZXJzID0geworICAgICIqIjogW2Z1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKKyAgICB2YXIgZW5k
LCB1bml0LAorICAgIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKSwKKyAg
ICBwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLAorICAgIHRhcmdldCA9IHR3ZWVuLmN1cigp
LAorICAgIHN0YXJ0ID0gK3RhcmdldCB8fCAwLAorICAgIHNjYWxlID0gMSwKKyAgICBtYXhJdGVy
YXRpb25zID0gMjA7CisKKyAgICBpZiAoIHBhcnRzICkgeworICAgIGVuZCA9ICtwYXJ0c1syXTsK
KyAgICB1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6
ICJweCIgKTsKKworICAgIC8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQorICAg
IGlmICggdW5pdCAhPT0gInB4IiAmJiBzdGFydCApIHsKKyAgICAvLyBJdGVyYXRpdmVseSBhcHBy
b3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAorICAgIC8vIFByZWZlciB0aGUg
Y3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0aGlzIHByb2Nlc3Mgd2lsbCBiZSB0cml2aWFsIGlm
IGl0IHVzZXMgdGhlIHNhbWUgdW5pdHMKKyAgICAvLyBGYWxsYmFjayB0byBlbmQgb3IgYSBzaW1w
bGUgY29uc3RhbnQKKyAgICBzdGFydCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHByb3AsIHRy
dWUgKSB8fCBlbmQgfHwgMTsKKworICAgIGRvIHsKKyAgICAvLyBJZiBwcmV2aW91cyBpdGVyYXRp
b24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKgorICAgIC8vIFVz
ZSBhIHN0cmluZyBmb3IgZG91YmxpbmcgZmFjdG9yIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBz
ZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93CisgICAgc2NhbGUgPSBzY2FsZSB8fCAiLjUiOwor
CisgICAgLy8gQWRqdXN0IGFuZCBhcHBseQorICAgIHN0YXJ0ID0gc3RhcnQgLyBzY2FsZTsKKyAg
ICBqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApOworCisgICAg
Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCkK
KyAgICAvLyBBbmQgYnJlYWtpbmcgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBl
cmZlY3QsIG9yIGlmIHdlJ3ZlIGp1c3QgaGFkIGVub3VnaAorICAgIH0gd2hpbGUgKCBzY2FsZSAh
PT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4
SXRlcmF0aW9ucyApOworICAgIH0KKworICAgIHR3ZWVuLnVuaXQgPSB1bml0OworICAgIHR3ZWVu
LnN0YXJ0ID0gc3RhcnQ7CisgICAgLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdl
J3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisgICAgdHdlZW4uZW5kID0gcGFydHNbMV0g
PyBzdGFydCArICggcGFydHNbMV0gKyAxICkgKiBlbmQgOiBlbmQ7CisgICAgfQorICAgIHJldHVy
biB0d2VlbjsKKyAgICB9XQorICAgIH07CisKKy8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJv
bm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKK2Z1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkgewor
ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgZnhOb3cgPSB1bmRlZmluZWQ7CisgICAg
fSk7CisgICAgcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTsKK30KKworZnVuY3Rpb24g
Y3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICkgeworICAgIGpRdWVyeS5lYWNoKCBwcm9w
cywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgeworICAgIHZhciBjb2xsZWN0aW9uID0gKCB0d2Vl
bmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKKyAgICBpbmRl
eCA9IDAsCisgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7CisgICAgZm9yICggOyBpbmRl
eCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBpZiAoIGNvbGxlY3Rpb25bIGluZGV4IF0uY2Fs
bCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgeworCisgICAgLy8gd2UncmUgZG9uZSB3aXRo
IHRoaXMgcHJvcGVydHkKKyAgICByZXR1cm47CisgICAgfQorICAgIH0KKyAgICB9KTsKK30KKwor
ZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkgeworICAgIHZh
ciByZXN1bHQsCisgICAgc3RvcHBlZCwKKyAgICBpbmRleCA9IDAsCisgICAgbGVuZ3RoID0gYW5p
bWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCisgICAgZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQo
KS5hbHdheXMoIGZ1bmN0aW9uKCkgeworICAgIC8vIGRvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDph
bmltYXRlZCBzZWxlY3RvcgorICAgIGRlbGV0ZSB0aWNrLmVsZW07CisgICAgfSksCisgICAgdGlj
ayA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggc3RvcHBlZCApIHsKKyAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisg
ICAgcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRp
b24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAorICAgIC8vIGFyY2hhaWMgY3Jhc2ggYnVnIHdv
bid0IGFsbG93IHVzIHRvIHVzZSAxIC0gKCAwLjUgfHwgMCApICgjMTI0OTcpCisgICAgdGVtcCA9
IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLAorICAgIHBlcmNlbnQgPSAxIC0g
dGVtcCwKKyAgICBpbmRleCA9IDAsCisgICAgbGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5n
dGg7CisKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKKyAgICBhbmlt
YXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApOworICAgIH0KKworICAgIGRlZmVy
cmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7
CisKKyAgICBpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKKyAgICByZXR1cm4gcmVtYWlu
aW5nOworICAgIH0gZWxzZSB7CisgICAgZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5p
bWF0aW9uIF0gKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0sCisgICAgYW5pbWF0
aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7CisgICAgZWxlbTogZWxlbSwKKyAgICBwcm9wczogalF1
ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSwKKyAgICBvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0
cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSwKKyAgICBvcmlnaW5hbFByb3Bl
cnRpZXM6IHByb3BlcnRpZXMsCisgICAgb3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLAorICAgIHN0
YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKKyAgICBkdXJhdGlvbjogb3B0aW9ucy5k
dXJhdGlvbiwKKyAgICB0d2VlbnM6IFtdLAorICAgIGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJv
cCwgZW5kICkgeworICAgIHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9u
Lm9wdHMsIHByb3AsIGVuZCwKKyAgICBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9w
IF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CisgICAgYW5pbWF0aW9uLnR3ZWVucy5wdXNo
KCB0d2VlbiApOworICAgIHJldHVybiB0d2VlbjsKKyAgICB9LAorICAgIHN0b3A6IGZ1bmN0aW9u
KCBnb3RvRW5kICkgeworICAgIHZhciBpbmRleCA9IDAsCisgICAgLy8gaWYgd2UgYXJlIGdvaW5n
IHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCisgICAgLy8gb3RoZXJ3
aXNlIHdlIHNraXAgdGhpcyBwYXJ0CisgICAgbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50
d2VlbnMubGVuZ3RoIDogMDsKKyAgICBpZiAoIHN0b3BwZWQgKSB7CisgICAgcmV0dXJuIHRoaXM7
CisgICAgfQorICAgIHN0b3BwZWQgPSB0cnVlOworICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGgg
OyBpbmRleCsrICkgeworICAgIGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7Cisg
ICAgfQorCisgICAgLy8gcmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZQorICAg
IC8vIG90aGVyd2lzZSwgcmVqZWN0CisgICAgaWYgKCBnb3RvRW5kICkgeworICAgIGRlZmVycmVk
LnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CisgICAgfSBlbHNl
IHsKKyAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBd
ICk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICB9KSwKKyAgICBwcm9wcyA9
IGFuaW1hdGlvbi5wcm9wczsKKworICAgIHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0
cy5zcGVjaWFsRWFzaW5nICk7CisKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgr
KyApIHsKKyAgICByZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFu
aW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7CisgICAgaWYgKCByZXN1bHQg
KSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgfQorCisgICAgY3JlYXRlVHdlZW5z
KCBhbmltYXRpb24sIHByb3BzICk7CisKKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmlt
YXRpb24ub3B0cy5zdGFydCApICkgeworICAgIGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVs
ZW0sIGFuaW1hdGlvbiApOworICAgIH0KKworICAgIGpRdWVyeS5meC50aW1lcigKKyAgICBqUXVl
cnkuZXh0ZW5kKCB0aWNrLCB7CisgICAgZWxlbTogZWxlbSwKKyAgICBhbmltOiBhbmltYXRpb24s
CisgICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCisgICAgfSkKKyAgICApOworCisgICAg
Ly8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKKyAgICByZXR1cm4gYW5pbWF0aW9uLnBy
b2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCisgICAgLmRvbmUoIGFuaW1hdGlvbi5v
cHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKKyAgICAuZmFpbCggYW5pbWF0aW9u
Lm9wdHMuZmFpbCApCisgICAgLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Cit9CisK
K2Z1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgeworICAgIHZhciB2
YWx1ZSwgbmFtZSwgaW5kZXgsIGVhc2luZywgaG9va3M7CisKKyAgICAvLyBjYW1lbENhc2UsIHNw
ZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKKyAgICBmb3IgKCBpbmRleCBpbiBw
cm9wcyApIHsKKyAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTsKKyAgICBlYXNp
bmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07CisgICAgdmFsdWUgPSBwcm9wc1sgaW5kZXggXTsK
KyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgeworICAgIGVhc2luZyA9IHZhbHVl
WyAxIF07CisgICAgdmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07CisgICAgfQor
CisgICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKyAgICBwcm9wc1sgbmFtZSBdID0gdmFsdWU7
CisgICAgZGVsZXRlIHByb3BzWyBpbmRleCBdOworICAgIH0KKworICAgIGhvb2tzID0galF1ZXJ5
LmNzc0hvb2tzWyBuYW1lIF07CisgICAgaWYgKCBob29rcyAmJiAiZXhwYW5kIiBpbiBob29rcyAp
IHsKKyAgICB2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKKyAgICBkZWxldGUgcHJvcHNb
IG5hbWUgXTsKKworICAgIC8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0
ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KKyAgICAvLyBhbHNvIC0gcmV1c2luZyAnaW5kZXgnIGZy
b20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgorICAgIGZvciAoIGlu
ZGV4IGluIHZhbHVlICkgeworICAgIGlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHsKKyAgICBw
cm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdOworICAgIHNwZWNpYWxFYXNpbmdbIGluZGV4
IF0gPSBlYXNpbmc7CisgICAgfQorICAgIH0KKyAgICB9IGVsc2UgeworICAgIHNwZWNpYWxFYXNp
bmdbIG5hbWUgXSA9IGVhc2luZzsKKyAgICB9CisgICAgfQorfQorCitqUXVlcnkuQW5pbWF0aW9u
ID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CisKKyAgICB0d2VlbmVyOiBmdW5jdGlvbigg
cHJvcHMsIGNhbGxiYWNrICkgeworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkg
KSB7CisgICAgY2FsbGJhY2sgPSBwcm9wczsKKyAgICBwcm9wcyA9IFsgIioiIF07CisgICAgfSBl
bHNlIHsKKyAgICBwcm9wcyA9IHByb3BzLnNwbGl0KCIgIik7CisgICAgfQorCisgICAgdmFyIHBy
b3AsCisgICAgaW5kZXggPSAwLAorICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKKworICAgIGZv
ciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgIHByb3AgPSBwcm9wc1sgaW5k
ZXggXTsKKyAgICB0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKKyAg
ICB0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7CisgICAgfQorICAgIH0sCisK
KyAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHsKKyAgICBpZiAo
IHByZXBlbmQgKSB7CisgICAgYW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayAp
OworICAgIH0gZWxzZSB7CisgICAgYW5pbWF0aW9uUHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayAp
OworICAgIH0KKyAgICB9Cit9KTsKKworZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwg
cHJvcHMsIG9wdHMgKSB7CisgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KKyAgICB2YXIg
cHJvcCwgaW5kZXgsIGxlbmd0aCwKKyAgICB2YWx1ZSwgZGF0YVNob3csIHRvZ2dsZSwKKyAgICB0
d2VlbiwgaG9va3MsIG9sZGZpcmUsCisgICAgYW5pbSA9IHRoaXMsCisgICAgc3R5bGUgPSBlbGVt
LnN0eWxlLAorICAgIG9yaWcgPSB7fSwKKyAgICBoYW5kbGVkID0gW10sCisgICAgaGlkZGVuID0g
ZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApOworCisgICAgLy8gaGFuZGxlIHF1ZXVl
OiBmYWxzZSBwcm9taXNlcworICAgIGlmICggIW9wdHMucXVldWUgKSB7CisgICAgaG9va3MgPSBq
UXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sICJmeCIgKTsKKyAgICBpZiAoIGhvb2tzLnVucXVldWVk
ID09IG51bGwgKSB7CisgICAgaG9va3MudW5xdWV1ZWQgPSAwOworICAgIG9sZGZpcmUgPSBob29r
cy5lbXB0eS5maXJlOworICAgIGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHsKKyAgICBp
ZiAoICFob29rcy51bnF1ZXVlZCApIHsKKyAgICBvbGRmaXJlKCk7CisgICAgfQorICAgIH07Cisg
ICAgfQorICAgIGhvb2tzLnVucXVldWVkKys7CisKKyAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigp
IHsKKyAgICAvLyBkb2luZyB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgY29tcGxldGUgaGFuZGxl
ciB3aWxsIGJlIGNhbGxlZAorICAgIC8vIGJlZm9yZSB0aGlzIGNvbXBsZXRlcworICAgIGFuaW0u
YWx3YXlzKGZ1bmN0aW9uKCkgeworICAgIGhvb2tzLnVucXVldWVkLS07CisgICAgaWYgKCAhalF1
ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkgeworICAgIGhvb2tzLmVtcHR5LmZpcmUo
KTsKKyAgICB9CisgICAgfSk7CisgICAgfSk7CisgICAgfQorCisgICAgLy8gaGVpZ2h0L3dpZHRo
IG92ZXJmbG93IHBhc3MKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCAiaGVpZ2h0
IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7CisgICAgLy8gTWFrZSBzdXJlIHRo
YXQgbm90aGluZyBzbmVha3Mgb3V0CisgICAgLy8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJp
YnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAorICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0
cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAorICAgIC8vIG92ZXJmbG93WSBhcmUgc2V0IHRvIHRo
ZSBzYW1lIHZhbHVlCisgICAgb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxl
Lm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CisKKyAgICAvLyBTZXQgZGlzcGxheSBwcm9w
ZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAorICAgIC8vIGFuaW1hdGlvbnMg
b24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5pbWF0ZWQK
KyAgICBpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAiaW5saW5lIiAmJgor
ICAgIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgeworCisgICAgLy8g
aW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CisgICAgLy8gYmxvY2st
bGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBsYXlvdXQKKyAgICBpZiAoICFq
UXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0IHx8IGNzc19kZWZhdWx0RGlzcGxh
eSggZWxlbS5ub2RlTmFtZSApID09PSAiaW5saW5lIiApIHsKKyAgICBzdHlsZS5kaXNwbGF5ID0g
ImlubGluZS1ibG9jayI7CisKKyAgICB9IGVsc2UgeworICAgIHN0eWxlLnpvb20gPSAxOworICAg
IH0KKyAgICB9CisgICAgfQorCisgICAgaWYgKCBvcHRzLm92ZXJmbG93ICkgeworICAgIHN0eWxl
Lm92ZXJmbG93ID0gImhpZGRlbiI7CisgICAgaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc2hyaW5rV3Jh
cEJsb2NrcyApIHsKKyAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKKyAgICBzdHlsZS5vdmVy
ZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKKyAgICBzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92
ZXJmbG93WyAxIF07CisgICAgc3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdOwor
ICAgIH0pOworICAgIH0KKyAgICB9CisKKworICAgIC8vIHNob3cvaGlkZSBwYXNzCisgICAgZm9y
ICggaW5kZXggaW4gcHJvcHMgKSB7CisgICAgdmFsdWUgPSBwcm9wc1sgaW5kZXggXTsKKyAgICBp
ZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7CisgICAgZGVsZXRlIHByb3BzWyBpbmRleCBd
OworICAgIHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRvZ2dsZSI7CisgICAgaWYgKCB2
YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKKyAgICBjb250aW51ZTsK
KyAgICB9CisgICAgaGFuZGxlZC5wdXNoKCBpbmRleCApOworICAgIH0KKyAgICB9CisKKyAgICBs
ZW5ndGggPSBoYW5kbGVkLmxlbmd0aDsKKyAgICBpZiAoIGxlbmd0aCApIHsKKyAgICBkYXRhU2hv
dyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIgKSB8fCBqUXVlcnkuX2RhdGEoIGVsZW0s
ICJmeHNob3ciLCB7fSApOworICAgIGlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7CisgICAg
aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOworICAgIH0KKworICAgIC8vIHN0b3JlIHN0YXRlIGlm
IGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gInJldmVyc2UiCisgICAg
aWYgKCB0b2dnbGUgKSB7CisgICAgZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKKyAgICB9Cisg
ICAgaWYgKCBoaWRkZW4gKSB7CisgICAgalF1ZXJ5KCBlbGVtICkuc2hvdygpOworICAgIH0gZWxz
ZSB7CisgICAgYW5pbS5kb25lKGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeSggZWxlbSApLmhpZGUo
KTsKKyAgICB9KTsKKyAgICB9CisgICAgYW5pbS5kb25lKGZ1bmN0aW9uKCkgeworICAgIHZhciBw
cm9wOworICAgIGpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwgImZ4c2hvdyIgKTsKKyAgICBmb3Ig
KCBwcm9wIGluIG9yaWcgKSB7CisgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBw
cm9wIF0gKTsKKyAgICB9CisgICAgfSk7CisgICAgZm9yICggaW5kZXggPSAwIDsgaW5kZXggPCBs
ZW5ndGggOyBpbmRleCsrICkgeworICAgIHByb3AgPSBoYW5kbGVkWyBpbmRleCBdOworICAgIHR3
ZWVuID0gYW5pbS5jcmVhdGVUd2VlbiggcHJvcCwgaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6
IDAgKTsKKyAgICBvcmlnWyBwcm9wIF0gPSBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHls
ZSggZWxlbSwgcHJvcCApOworCisgICAgaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7Cisg
ICAgZGF0YVNob3dbIHByb3AgXSA9IHR3ZWVuLnN0YXJ0OworICAgIGlmICggaGlkZGVuICkgewor
ICAgIHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0OworICAgIHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0g
IndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0IiA/IDEgOiAwOworICAgIH0KKyAgICB9CisgICAg
fQorICAgIH0KK30KKworZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwg
ZWFzaW5nICkgeworICAgIHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9w
dGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7Cit9CitqUXVlcnkuVHdlZW4gPSBUd2VlbjsKKwor
VHdlZW4ucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBUd2VlbiwKKyAgICBpbml0OiBm
dW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7CisgICAg
dGhpcy5lbGVtID0gZWxlbTsKKyAgICB0aGlzLnByb3AgPSBwcm9wOworICAgIHRoaXMuZWFzaW5n
ID0gZWFzaW5nIHx8ICJzd2luZyI7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICB0
aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOworICAgIHRoaXMuZW5kID0gZW5kOwor
ICAgIHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6
ICJweCIgKTsKKyAgICB9LAorICAgIGN1cjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGhvb2tzID0g
VHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKKworICAgIHJldHVybiBob29rcyAmJiBob29r
cy5nZXQgPworICAgIGhvb2tzLmdldCggdGhpcyApIDoKKyAgICBUd2Vlbi5wcm9wSG9va3MuX2Rl
ZmF1bHQuZ2V0KCB0aGlzICk7CisgICAgfSwKKyAgICBydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkg
eworICAgIHZhciBlYXNlZCwKKyAgICBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9w
IF07CisKKyAgICBpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsKKyAgICB0aGlzLnBvcyA9
IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgKKyAgICBwZXJjZW50LCB0aGlz
Lm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24K
KyAgICApOworICAgIH0gZWxzZSB7CisgICAgdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7Cisg
ICAgfQorICAgIHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsg
dGhpcy5zdGFydDsKKworICAgIGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7CisgICAgdGhpcy5v
cHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOworICAgIH0KKwor
ICAgIGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkgeworICAgIGhvb2tzLnNldCggdGhpcyApOwor
ICAgIH0gZWxzZSB7CisgICAgVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApOwor
ICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9OworCitUd2Vlbi5wcm90b3R5cGUuaW5p
dC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CisKK1R3ZWVuLnByb3BIb29rcyA9IHsKKyAg
ICBfZGVmYXVsdDogeworICAgIGdldDogZnVuY3Rpb24oIHR3ZWVuICkgeworICAgIHZhciByZXN1
bHQ7CisKKyAgICBpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmCisgICAg
KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBu
dWxsKSApIHsKKyAgICByZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdOworICAgIH0KKwor
ICAgIC8vIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3Nz
IHdpbGwgYXV0b21hdGljYWxseQorICAgIC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxs
YmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMKKyAgICAvLyBzbywgc2ltcGxlIHZh
bHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgorICAgIC8vIGNvbXBsZXgg
dmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzIGlzLgorICAgIHJl
c3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsICIiICk7CisgICAgLy8g
RW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0
byAwLgorICAgIHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gImF1dG8iID8gMCA6IHJlc3Vs
dDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgeworICAgIC8vIHVzZSBzdGVw
IGhvb2sgZm9yIGJhY2sgY29tcGF0IC0gdXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlIC0gdXNlIC5z
dHlsZSBpZiBpdHMKKyAgICAvLyBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdo
ZXJlIGF2YWlsYWJsZQorICAgIGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsK
KyAgICBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApOworICAgIH0gZWxzZSBp
ZiAoIHR3ZWVuLmVsZW0uc3R5bGUgJiYgKCB0d2Vlbi5lbGVtLnN0eWxlWyBqUXVlcnkuY3NzUHJv
cHNbIHR3ZWVuLnByb3AgXSBdICE9IG51bGwgfHwgalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9w
IF0gKSApIHsKKyAgICBqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVu
Lm5vdyArIHR3ZWVuLnVuaXQgKTsKKyAgICB9IGVsc2UgeworICAgIHR3ZWVuLmVsZW1bIHR3ZWVu
LnByb3AgXSA9IHR3ZWVuLm5vdzsKKyAgICB9CisgICAgfQorICAgIH0KK307CisKKy8vIFJlbW92
ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJhc2VkIGFwcHJvYWNoCisvLyB0
byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKKworVHdlZW4ucHJvcEhvb2tz
LnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0geworICAgIHNldDogZnVu
Y3Rpb24oIHR3ZWVuICkgeworICAgIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5l
bGVtLnBhcmVudE5vZGUgKSB7CisgICAgdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4u
bm93OworICAgIH0KKyAgICB9Cit9OworCitqUXVlcnkuZWFjaChbICJ0b2dnbGUiLCAic2hvdyIs
ICJoaWRlIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICB2YXIgY3NzRm4gPSBqUXVlcnku
Zm5bIG5hbWUgXTsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFz
aW5nLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3Bl
ZWQgPT09ICJib29sZWFuIiA/CisgICAgY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoK
KyAgICB0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNh
bGxiYWNrICk7CisgICAgfTsKK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBmYWRlVG86
IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7CisKKyAgICAvLyBzaG93
IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKKyAgICByZXR1
cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkKKwor
ICAgIC8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAorICAgIC5lbmQoKS5hbmltYXRl
KHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKKyAgICB9LAorICAg
IGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKyAg
ICB2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLAorICAgIG9wdGFsbCA9
IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSwKKyAgICBkb0FuaW1hdGlv
biA9IGZ1bmN0aW9uKCkgeworICAgIC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVy
LXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CisgICAgdmFyIGFuaW0gPSBBbmltYXRpb24o
IHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOworICAgIGRvQW5pbWF0
aW9uLmZpbmlzaCA9IGZ1bmN0aW9uKCkgeworICAgIGFuaW0uc3RvcCggdHJ1ZSApOworICAgIH07
CisgICAgLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0
ZWx5CisgICAgaWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRoaXMsICJmaW5pc2giICkgKSB7
CisgICAgYW5pbS5zdG9wKCB0cnVlICk7CisgICAgfQorICAgIH07CisgICAgZG9BbmltYXRpb24u
ZmluaXNoID0gZG9BbmltYXRpb247CisKKyAgICByZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVl
ID09PSBmYWxzZSA/CisgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKKyAgICB0aGlzLnF1
ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7CisgICAgfSwKKyAgICBzdG9wOiBmdW5j
dGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKKyAgICB2YXIgc3RvcFF1ZXVlID0g
ZnVuY3Rpb24oIGhvb2tzICkgeworICAgIHZhciBzdG9wID0gaG9va3Muc3RvcDsKKyAgICBkZWxl
dGUgaG9va3Muc3RvcDsKKyAgICBzdG9wKCBnb3RvRW5kICk7CisgICAgfTsKKworICAgIGlmICgg
dHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgeworICAgIGdvdG9FbmQgPSBjbGVhclF1ZXVlOwor
ICAgIGNsZWFyUXVldWUgPSB0eXBlOworICAgIHR5cGUgPSB1bmRlZmluZWQ7CisgICAgfQorICAg
IGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHsKKyAgICB0aGlzLnF1ZXVlKCB0
eXBlIHx8ICJmeCIsIFtdICk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv
bigpIHsKKyAgICB2YXIgZGVxdWV1ZSA9IHRydWUsCisgICAgaW5kZXggPSB0eXBlICE9IG51bGwg
JiYgdHlwZSArICJxdWV1ZUhvb2tzIiwKKyAgICB0aW1lcnMgPSBqUXVlcnkudGltZXJzLAorICAg
IGRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKTsKKworICAgIGlmICggaW5kZXggKSB7CisgICAg
aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHsKKyAgICBzdG9wUXVl
dWUoIGRhdGFbIGluZGV4IF0gKTsKKyAgICB9CisgICAgfSBlbHNlIHsKKyAgICBmb3IgKCBpbmRl
eCBpbiBkYXRhICkgeworICAgIGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0
b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkgeworICAgIHN0b3BRdWV1ZSggZGF0YVsgaW5kZXgg
XSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZm9yICggaW5kZXggPSB0aW1lcnMubGVu
Z3RoOyBpbmRleC0tOyApIHsKKyAgICBpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlz
ICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsK
KyAgICB0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CisgICAgZGVxdWV1ZSA9
IGZhbHNlOworICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisgICAgfQorICAgIH0KKwor
ICAgIC8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24n
dCBmb3JjZWQKKyAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0
ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQorICAgIC8vIGJ1dCBvbmx5IGlmIHRoZXkg
d2VyZSBnb3RvRW5kCisgICAgaWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkgeworICAgIGpRdWVy
eS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisgICAgZmlu
aXNoOiBmdW5jdGlvbiggdHlwZSApIHsKKyAgICBpZiAoIHR5cGUgIT09IGZhbHNlICkgeworICAg
IHR5cGUgPSB0eXBlIHx8ICJmeCI7CisgICAgfQorICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oKSB7CisgICAgdmFyIGluZGV4LAorICAgIGRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKSwK
KyAgICBxdWV1ZSA9IGRhdGFbIHR5cGUgKyAicXVldWUiIF0sCisgICAgaG9va3MgPSBkYXRhWyB0
eXBlICsgInF1ZXVlSG9va3MiIF0sCisgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKKyAgICBs
ZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7CisKKyAgICAvLyBlbmFibGUgZmluaXNo
aW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhCisgICAgZGF0YS5maW5pc2ggPSB0cnVlOworCisgICAg
Ly8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0CisgICAgalF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBb
XSApOworCisgICAgaWYgKCBob29rcyAmJiBob29rcy5jdXIgJiYgaG9va3MuY3VyLmZpbmlzaCAp
IHsKKyAgICBob29rcy5jdXIuZmluaXNoLmNhbGwoIHRoaXMgKTsKKyAgICB9CisKKyAgICAvLyBs
b29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQorICAgIGZvciAo
IGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7CisgICAgaWYgKCB0aW1lcnNbIGlu
ZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7
CisgICAgdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOworICAgIHRpbWVycy5zcGxp
Y2UoIGluZGV4LCAxICk7CisgICAgfQorICAgIH0KKworICAgIC8vIGxvb2sgZm9yIGFueSBhbmlt
YXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCisgICAgZm9yICggaW5kZXgg
PSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBpZiAoIHF1ZXVlWyBpbmRleCBd
ICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKKyAgICBxdWV1ZVsgaW5kZXggXS5maW5pc2gu
Y2FsbCggdGhpcyApOworICAgIH0KKyAgICB9CisKKyAgICAvLyB0dXJuIG9mZiBmaW5pc2hpbmcg
ZmxhZworICAgIGRlbGV0ZSBkYXRhLmZpbmlzaDsKKyAgICB9KTsKKyAgICB9Cit9KTsKKworLy8g
R2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb24KK2Z1bmN0
aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7CisgICAgdmFyIHdoaWNoLAorICAgIGF0
dHJzID0geyBoZWlnaHQ6IHR5cGUgfSwKKyAgICBpID0gMDsKKworICAgIC8vIGlmIHdlIGluY2x1
ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcywKKyAg
ICAvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBv
dmVyIExlZnQgYW5kIFJpZ2h0CisgICAgaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoPyAxIDog
MDsKKyAgICBmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CisgICAgd2hp
Y2ggPSBjc3NFeHBhbmRbIGkgXTsKKyAgICBhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0
cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOworICAgIH0KKworICAgIGlmICggaW5jbHVk
ZVdpZHRoICkgeworICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7CisgICAg
fQorCisgICAgcmV0dXJuIGF0dHJzOworfQorCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1
c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCh7CisgICAgc2xpZGVEb3duOiBnZW5GeCgic2hv
dyIpLAorICAgIHNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCisgICAgc2xpZGVUb2dnbGU6IGdlbkZ4
KCJ0b2dnbGUiKSwKKyAgICBmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCisgICAgZmFkZU91
dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKKyAgICBmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6ICJ0b2dn
bGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKKyAgICBqUXVlcnkuZm5bIG5hbWUg
XSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4gdGhp
cy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKKyAgICB9OworfSk7
CisKK2pRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHsKKyAgICB2
YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRl
bmQoIHt9LCBzcGVlZCApIDogeworICAgIGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8
CisgICAgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCisgICAgZHVyYXRpb246
IHNwZWVkLAorICAgIGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5Lmlz
RnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZworICAgIH07CisKKyAgICBvcHQuZHVyYXRpb24g
PSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09ICJudW1iZXIiID8g
b3B0LmR1cmF0aW9uIDoKKyAgICBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpR
dWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVs
dDsKKworICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+
ICJmeCIKKyAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSAp
IHsKKyAgICBvcHQucXVldWUgPSAiZngiOworICAgIH0KKworICAgIC8vIFF1ZXVlaW5nCisgICAg
b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTsKKworICAgIG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkg
eworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHsKKyAgICBvcHQub2xk
LmNhbGwoIHRoaXMgKTsKKyAgICB9CisKKyAgICBpZiAoIG9wdC5xdWV1ZSApIHsKKyAgICBqUXVl
cnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CisgICAgfQorICAgIH07CisKKyAgICByZXR1
cm4gb3B0OworfTsKKworalF1ZXJ5LmVhc2luZyA9IHsKKyAgICBsaW5lYXI6IGZ1bmN0aW9uKCBw
ICkgeworICAgIHJldHVybiBwOworICAgIH0sCisgICAgc3dpbmc6IGZ1bmN0aW9uKCBwICkgewor
ICAgIHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkgLyAyOworICAgIH0KK307CisK
K2pRdWVyeS50aW1lcnMgPSBbXTsKK2pRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0Owor
alF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgdGltZXIsCisgICAgdGltZXJz
ID0galF1ZXJ5LnRpbWVycywKKyAgICBpID0gMDsKKworICAgIGZ4Tm93ID0galF1ZXJ5Lm5vdygp
OworCisgICAgZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkgeworICAgIHRpbWVyID0g
dGltZXJzWyBpIF07CisgICAgLy8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVl
biByZW1vdmVkCisgICAgaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7
CisgICAgdGltZXJzLnNwbGljZSggaS0tLCAxICk7CisgICAgfQorICAgIH0KKworICAgIGlmICgg
IXRpbWVycy5sZW5ndGggKSB7CisgICAgalF1ZXJ5LmZ4LnN0b3AoKTsKKyAgICB9CisgICAgZnhO
b3cgPSB1bmRlZmluZWQ7Cit9OworCitqUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIg
KSB7CisgICAgaWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKSApIHsK
KyAgICBqUXVlcnkuZnguc3RhcnQoKTsKKyAgICB9Cit9OworCitqUXVlcnkuZnguaW50ZXJ2YWwg
PSAxMzsKKworalF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKCAhdGltZXJJ
ZCApIHsKKyAgICB0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnku
ZnguaW50ZXJ2YWwgKTsKKyAgICB9Cit9OworCitqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkg
eworICAgIGNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKyAgICB0aW1lcklkID0gbnVsbDsKK307
CisKK2pRdWVyeS5meC5zcGVlZHMgPSB7CisgICAgc2xvdzogNjAwLAorICAgIGZhc3Q6IDIwMCwK
KyAgICAvLyBEZWZhdWx0IHNwZWVkCisgICAgX2RlZmF1bHQ6IDQwMAorfTsKKworLy8gQmFjayBD
b21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnQKK2pRdWVyeS5meC5zdGVwID0ge307CisKK2lmICgg
alF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsKKyAgICBqUXVlcnkuZXhwci5m
aWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5n
cmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKyAgICByZXR1cm4gZWxlbSA9PT0g
Zm4uZWxlbTsKKyAgICB9KS5sZW5ndGg7CisgICAgfTsKK30KK2pRdWVyeS5mbi5vZmZzZXQgPSBm
dW5jdGlvbiggb3B0aW9ucyApIHsKKyAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CisgICAg
cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CisgICAgdGhpcyA6CisgICAgdGhpcy5lYWNo
KGZ1bmN0aW9uKCBpICkgeworICAgIGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRp
b25zLCBpICk7CisgICAgfSk7CisgICAgfQorCisgICAgdmFyIGRvY0VsZW0sIHdpbiwKKyAgICBi
b3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAgIGVsZW0gPSB0aGlzWyAwIF0sCisgICAgZG9j
ID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKyAgICBpZiAoICFkb2MgKSB7CisgICAg
cmV0dXJuOworICAgIH0KKworICAgIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50OworCisg
ICAgLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVkIERPTSBub2RlCisgICAgaWYg
KCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7CisgICAgcmV0dXJuIGJveDsK
KyAgICB9CisKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGdCQ1IsIGp1c3QgdXNlIDAsMCByYXRo
ZXIgdGhhbiBlcnJvcgorICAgIC8vIEJsYWNrQmVycnkgNSwgaU9TIDMgKG9yaWdpbmFsIGlQaG9u
ZSkKKyAgICBpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gY29yZV9z
dHJ1bmRlZmluZWQgKSB7CisgICAgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsK
KyAgICB9CisgICAgd2luID0gZ2V0V2luZG93KCBkb2MgKTsKKyAgICByZXR1cm4geworICAgIHRv
cDogYm94LnRvcCAgKyAoIHdpbi5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbFRvcCApICAt
ICggZG9jRWxlbS5jbGllbnRUb3AgIHx8IDAgKSwKKyAgICBsZWZ0OiBib3gubGVmdCArICggd2lu
LnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCApIC0gKCBkb2NFbGVtLmNsaWVudExl
ZnQgfHwgMCApCisgICAgfTsKK307CisKK2pRdWVyeS5vZmZzZXQgPSB7CisKKyAgICBzZXRPZmZz
ZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgeworICAgIHZhciBwb3NpdGlvbiA9IGpR
dWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKTsKKworICAgIC8vIHNldCBwb3NpdGlvbiBmaXJz
dCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KKyAgICBpZiAo
IHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKKyAgICBlbGVtLnN0eWxlLnBvc2l0aW9uID0gInJl
bGF0aXZlIjsKKyAgICB9CisKKyAgICB2YXIgY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAorICAg
IGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksCisgICAgY3VyQ1NTVG9wID0galF1ZXJ5LmNz
cyggZWxlbSwgInRvcCIgKSwKKyAgICBjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxl
ZnQiICksCisgICAgY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUi
IHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3Vy
Q1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKKyAgICBwcm9wcyA9IHt9LCBjdXJQb3NpdGlvbiA9
IHt9LCBjdXJUb3AsIGN1ckxlZnQ7CisKKyAgICAvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3Vs
YXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBp
cyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKKyAgICBpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkg
eworICAgIGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOworICAgIGN1clRvcCA9IGN1
clBvc2l0aW9uLnRvcDsKKyAgICBjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKKyAgICB9IGVs
c2UgeworICAgIGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7CisgICAgY3Vy
TGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwOworICAgIH0KKworICAgIGlmICgg
alF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKKyAgICBvcHRpb25zID0gb3B0aW9ucy5j
YWxsKCBlbGVtLCBpLCBjdXJPZmZzZXQgKTsKKyAgICB9CisKKyAgICBpZiAoIG9wdGlvbnMudG9w
ICE9IG51bGwgKSB7CisgICAgcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50
b3AgKSArIGN1clRvcDsKKyAgICB9CisgICAgaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsK
KyAgICBwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3Vy
TGVmdDsKKyAgICB9CisKKyAgICBpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKKyAgICBvcHRp
b25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7CisgICAgfSBlbHNlIHsKKyAgICBjdXJFbGVt
LmNzcyggcHJvcHMgKTsKKyAgICB9CisgICAgfQorfTsKKworCitqUXVlcnkuZm4uZXh0ZW5kKHsK
KworICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoICF0aGlzWyAwIF0gKSB7Cisg
ICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwKKyAgICBw
YXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAgIGVsZW0gPSB0aGlzWyAwIF07
CisKKyAgICAvLyBmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRP
ZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlzIGl0J3Mgb25seSBvZmZzZXQg
cGFyZW50CisgICAgaWYgKCBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24iICkgPT09ICJmaXhl
ZCIgKSB7CisgICAgLy8gd2UgYXNzdW1lIHRoYXQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIGF2
YWlsYWJsZSB3aGVuIGNvbXB1dGVkIHBvc2l0aW9uIGlzIGZpeGVkCisgICAgb2Zmc2V0ID0gZWxl
bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICB9IGVsc2UgeworICAgIC8vIEdldCAqcmVh
bCogb2Zmc2V0UGFyZW50CisgICAgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTsK
KworICAgIC8vIEdldCBjb3JyZWN0IG9mZnNldHMKKyAgICBvZmZzZXQgPSB0aGlzLm9mZnNldCgp
OworICAgIGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sICJodG1sIiAp
ICkgeworICAgIHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKKyAgICB9CisK
KyAgICAvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKyAgICBwYXJlbnRPZmZzZXQudG9wICAr
PSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJvcmRlclRvcFdpZHRoIiwgdHJ1ZSAp
OworICAgIHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBd
LCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOworICAgIH0KKworICAgIC8vIFN1YnRyYWN0IHBh
cmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnMKKyAgICAvLyBub3RlOiB3aGVuIGFuIGVs
ZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAorICAg
IC8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJl
Y3RseSBiZSAwCisgICAgcmV0dXJuIHsKKyAgICB0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9m
ZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAorICAgIGxl
ZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAi
bWFyZ2luTGVmdCIsIHRydWUpCisgICAgfTsKKyAgICB9LAorCisgICAgb2Zmc2V0UGFyZW50OiBm
dW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CisgICAgdmFyIG9m
ZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dDsKKyAgICB3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNl
dFBhcmVudCwgImh0bWwiICkgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24i
KSA9PT0gInN0YXRpYyIgKSApIHsKKyAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zm
c2V0UGFyZW50OworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudDsKKyAgICB9KTsKKyAgICB9Cit9KTsKKworCisvLyBDcmVhdGUgc2Nyb2xs
TGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNoKCB7c2Nyb2xsTGVmdDogInBh
Z2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQifSwgZnVuY3Rpb24oIG1ldGhvZCwg
cHJvcCApIHsKKyAgICB2YXIgdG9wID0gL1kvLnRlc3QoIHByb3AgKTsKKworICAgIGpRdWVyeS5m
blsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkgeworICAgIHJldHVybiBqUXVlcnkuYWNjZXNz
KCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CisgICAgdmFyIHdpbiA9IGdl
dFdpbmRvdyggZWxlbSApOworCisgICAgaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKKyAgICBy
ZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBdIDoKKyAgICB3aW4uZG9jdW1l
bnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSA6CisgICAgZWxlbVsgbWV0aG9kIF07CisgICAg
fQorCisgICAgaWYgKCB3aW4gKSB7CisgICAgd2luLnNjcm9sbFRvKAorICAgICF0b3AgPyB2YWwg
OiBqUXVlcnkoIHdpbiApLnNjcm9sbExlZnQoKSwKKyAgICB0b3AgPyB2YWwgOiBqUXVlcnkoIHdp
biApLnNjcm9sbFRvcCgpCisgICAgKTsKKworICAgIH0gZWxzZSB7CisgICAgZWxlbVsgbWV0aG9k
IF0gPSB2YWw7CisgICAgfQorICAgIH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoLCBu
dWxsICk7CisgICAgfTsKK30pOworCitmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CisgICAg
cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8KKyAgICBlbGVtIDoKKyAgICBlbGVtLm5v
ZGVUeXBlID09PSA5ID8KKyAgICBlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93
IDoKKyAgICBmYWxzZTsKK30KKy8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVp
Z2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcworalF1ZXJ5LmVh
Y2goIHsgSGVpZ2h0OiAiaGVpZ2h0IiwgV2lkdGg6ICJ3aWR0aCIgfSwgZnVuY3Rpb24oIG5hbWUs
IHR5cGUgKSB7CisgICAgalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNv
bnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LCBmdW5jdGlvbiggZGVmYXVsdEV4dHJh
LCBmdW5jTmFtZSApIHsKKyAgICAvLyBtYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91
dGVyV2lkdGgKKyAgICBqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2
YWx1ZSApIHsKKyAgICB2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1
bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSAiYm9vbGVhbiIgKSwKKyAgICBleHRyYSA9IGRl
ZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJn
aW4iIDogImJvcmRlciIgKTsKKworICAgIHJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5j
dGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CisgICAgdmFyIGRvYzsKKworICAgIGlmICggalF1
ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisgICAgLy8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxs
IHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmUKKyAg
ICAvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhp
cyBVUkwgZm9yIGRpc2N1c3Npb246CisgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9q
cXVlcnkvcHVsbC83NjQKKyAgICByZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRb
ICJjbGllbnQiICsgbmFtZSBdOworICAgIH0KKworICAgIC8vIEdldCBkb2N1bWVudCB3aWR0aCBv
ciBoZWlnaHQKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CisgICAgZG9jID0gZWxl
bS5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICAvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0g
b3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sIHdoaWNoZXZl
ciBpcyBncmVhdGVzdAorICAgIC8vIHVuZm9ydHVuYXRlbHksIHRoaXMgY2F1c2VzIGJ1ZyAjMzgz
OCBpbiBJRTYvOCBvbmx5LCBidXQgdGhlcmUgaXMgY3VycmVudGx5IG5vIGdvb2QsIHNtYWxsIHdh
eSB0byBmaXggaXQuCisgICAgcmV0dXJuIE1hdGgubWF4KAorICAgIGVsZW0uYm9keVsgInNjcm9s
bCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisgICAgZWxlbS5ib2R5WyAib2Zm
c2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKKyAgICBkb2NbICJjbGllbnQi
ICsgbmFtZSBdCisgICAgKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5l
ZCA/CisgICAgLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGlu
ZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAorICAgIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUs
IGV4dHJhICkgOgorCisgICAgLy8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAor
ICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7CisgICAgfSwgdHlw
ZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTsKKyAg
ICB9OworICAgIH0pOworfSk7CisvLyBMaW1pdCBzY29wZSBwb2xsdXRpb24gZnJvbSBhbnkgZGVw
cmVjYXRlZCBBUEkKKy8vIChmdW5jdGlvbigpIHsKKworLy8gfSkoKTsKKy8vIEV4cG9zZSBqUXVl
cnkgdG8gdGhlIGdsb2JhbCBvYmplY3QKK3dpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVy
eTsKKworLy8gRXhwb3NlIGpRdWVyeSBhcyBhbiBBTUQgbW9kdWxlLCBidXQgb25seSBmb3IgQU1E
IGxvYWRlcnMgdGhhdAorLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVzIHdpdGggbG9hZGluZyBtdWx0
aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnkKKy8vIGluIGEgcGFnZSB0aGF0IGFsbCBtaWdodCBjYWxs
IGRlZmluZSgpLiBUaGUgbG9hZGVyIHdpbGwgaW5kaWNhdGUKKy8vIHRoZXkgaGF2ZSBzcGVjaWFs
IGFsbG93YW5jZXMgZm9yIG11bHRpcGxlIGpRdWVyeSB2ZXJzaW9ucyBieQorLy8gc3BlY2lmeWlu
ZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFzIGEgbmFtZWQgbW9kdWxlLAor
Ly8gc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlciBmaWxlcyB0aGF0
IG1heSB1c2UgZGVmaW5lLAorLy8gYnV0IG5vdCB1c2UgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBz
Y3JpcHQgdGhhdCB1bmRlcnN0YW5kcyBhbm9ueW1vdXMKKy8vIEFNRCBtb2R1bGVzLiBBIG5hbWVk
IEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byByZWdpc3Rlci4KKy8vIExvd2Vy
Y2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlIGRlcml2ZWQg
ZnJvbQorLy8gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4g
YSBsb3dlcmNhc2UgZmlsZSBuYW1lLgorLy8gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xv
YmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBjYWxsCisvLyBub0NvbmZsaWN0
IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoraWYgKCB0eXBl
b2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lLmFtZC5qUXVl
cnkgKSB7CisgICAgZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpR
dWVyeTsgfSApOworfQorCit9KSggd2luZG93ICk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9ib3dlcl9jb21wb25lbnRz
L3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMv
Tm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcwko
cmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29t
cG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU1NSBAQAoraHRtbCwKK2JvZHkgeworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOwor
fQorCitidXR0b24geworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGJvcmRl
cjogMDsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworICAgIGZvbnQtc2l6ZTogMTAwJTsKKyAgICB2
ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CisgICAg
Y29sb3I6IGluaGVyaXQ7CisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAgIC8qLW1v
ei1hcHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7CisgICAgLW8t
YXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQorCitib2R5IHsKKyAg
ICBmb250OiAxNHB4ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2Vy
aWY7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJhY2tncm91bmQ6ICNlYWVhZWEgdXJs
KCdiZy5wbmcnKTsKKyAgICBjb2xvcjogIzRkNGQ0ZDsKKyAgICB3aWR0aDogNTUwcHg7CisgICAg
bWFyZ2luOiAwIGF1dG87CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7
CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1zLWZvbnQtc21v
b3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7
CisgICAgZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisjdG9kb2FwcCB7CisgICAg
YmFja2dyb3VuZDogI2ZmZjsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAu
OSk7CisgICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAj
Y2NjOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVz
OiAycHg7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKKyAgICBib3gtc2hhZG93
OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAgMCAyNXB4IDUwcHggMCByZ2Jh
KDAsIDAsIDAsIDAuMTUpOworfQorCisjdG9kb2FwcDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICcn
OworICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y1ZDZkNjsKKyAgICBib3JkZXItcmlnaHQ6
IDFweCBzb2xpZCAjZjVkNmQ2OworICAgIHdpZHRoOiAycHg7CisgICAgcG9zaXRpb246IGFic29s
dXRlOworICAgIHRvcDogMDsKKyAgICBsZWZ0OiA0MHB4OworICAgIGhlaWdodDogMTAwJTsKK30K
KworI3RvZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeworICAgIGZvbnQt
c3R5bGU6IGl0YWxpYzsKK30KKworI3RvZG9hcHAgaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIgewor
ICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBjb2xvcjogI2E5YTlhOTsKK30KKworI3RvZG9h
cHAgaDEgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0xMjBweDsKKyAgICB3
aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDcwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7
CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGNvbG9yOiAjYjNiM2IzOworICAgIGNvbG9y
OiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CisgICAgdGV4dC1zaGFkb3c6IC0xcHggLTFweCBy
Z2JhKDAsIDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVM
ZWdpYmlsaXR5OworICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsK
KyAgICAtbXMtdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKKyAgICAtby10ZXh0
LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQtcmVuZGVyaW5nOiBvcHRp
bWl6ZUxlZ2liaWxpdHk7Cit9CisKKyNoZWFkZXIgeworICAgIHBhZGRpbmctdG9wOiAxNXB4Owor
ICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7Cit9CisKKyNoZWFkZXI6YmVmb3JlIHsKKyAgICBj
b250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworICAgIHJp
Z2h0OiAwOworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiAxNXB4OworICAgIHotaW5kZXg6IDI7
CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2YzYxNWM7CisgICAgYmFja2dyb3VuZDog
IzhkN2Q3NzsKKyAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0
b3AsIGxlZnQgYm90dG9tLCBmcm9tKHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSksdG8ocmdiYSgx
MDEsIDg0LCA3NiwgMC44KSkpOworICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRp
ZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgp
KTsKKyAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMTMyLCAx
MTAsIDEwMCwgMC44KSwgcmdiYSgxMDEsIDg0LCA3NiwgMC44KSk7CisgICAgYmFja2dyb3VuZDog
LW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEw
MSwgODQsIDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRv
cCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKKyAg
ICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDEzMiwgMTEwLCAxMDAsIDAu
OCksIHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpOworICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VU
cmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLFN0YXJ0Q29sb3JTdHI9
JyM5ZDhiODMnLCBFbmRDb2xvclN0cj0nIzg0NzY3MCcpOworICAgIGJvcmRlci10b3AtbGVmdC1y
YWRpdXM6IDFweDsKKyAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMXB4OworfQorCisjbmV3
LXRvZG8sCisuZWRpdCB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbjogMDsK
KyAgICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDI0cHg7CisgICAgZm9udC1mYW1pbHk6
IGluaGVyaXQ7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJvcmRlcjogMDsKKyAgICBv
dXRsaW5lOiBub25lOworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHBhZGRpbmc6IDZweDsKKyAg
ICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAgIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCA1
cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXIt
Ym94OworICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAtbXMtYm94LXNpemlu
ZzogYm9yZGVyLWJveDsKKyAgICAtby1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIGJveC1z
aXppbmc6IGJvcmRlci1ib3g7CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFz
ZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1zLWZvbnQt
c21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGluZzogYW50aWFsaWFz
ZWQ7CisgICAgZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisjbmV3LXRvZG8gewor
ICAgIHBhZGRpbmc6IDE2cHggMTZweCAxNnB4IDYwcHg7CisgICAgYm9yZGVyOiBub25lOworICAg
IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMik7CisgICAgei1pbmRleDogMjsKKyAgICBi
b3gtc2hhZG93OiBub25lOworfQorCisjbWFpbiB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOwor
ICAgIHotaW5kZXg6IDI7CisgICAgYm9yZGVyLXRvcDogMXB4IGRvdHRlZCAjYWRhZGFkOworfQor
CitsYWJlbFtmb3I9J3RvZ2dsZS1hbGwnXSB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworI3Rv
Z2dsZS1hbGwgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC00MnB4OworICAg
IGxlZnQ6IC00cHg7CisgICAgd2lkdGg6IDQwcHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOwor
ICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQorCisjdG9nZ2xlLWFsbDpi
ZWZvcmUgeworICAgIGNvbnRlbnQ6ICfCuyc7CisgICAgZm9udC1zaXplOiAyOHB4OworICAgIGNv
bG9yOiAjZDlkOWQ5OworICAgIHBhZGRpbmc6IDAgMjVweCA3cHg7Cit9CisKKyN0b2dnbGUtYWxs
OmNoZWNrZWQ6YmVmb3JlIHsKKyAgICBjb2xvcjogIzczNzM3MzsKK30KKworI3RvZG8tbGlzdCB7
CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsK
K30KKworI3RvZG8tbGlzdCBsaSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGZvbnQt
c2l6ZTogMjRweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNjY2M7Cit9CisKKyN0
b2RvLWxpc3QgbGk6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKwor
I3RvZG8tbGlzdCBsaS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIHBh
ZGRpbmc6IDA7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRpdCB7CisgICAgZGlzcGxh
eTogYmxvY2s7CisgICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6IDEzcHggMTdweCAxMnB4
IDE3cHg7CisgICAgbWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9kby1saXN0IGxpLmVkaXRp
bmcgLnZpZXcgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkgLnRvZ2ds
ZSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0MHB4OworICAgIC8qIGF1
dG8sIHNpbmNlIG5vbi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBwb3J0IGlucHV0IHN0eWxp
bmcgKi8KKyAgICBoZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRv
cDogMDsKKyAgICBib3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7CisgICAgYm9yZGVyOiBu
b25lOyAvKiBNb2JpbGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwor
ICAgIC8qLW1vei1hcHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7
CisgICAgLW8tYXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQorCisj
dG9kby1saXN0IGxpIC50b2dnbGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfinJQnOworICAgIGxp
bmUtaGVpZ2h0OiA0M3B4OyAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVscyB2aXN1YWwgYWRqdXN0
bWVudCAqLworICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICBjb2xvcjogI2Q5ZDlkOTsKKyAgICB0
ZXh0LXNoYWRvdzogMCAtMXB4IDAgI2JmYmZiZjsKK30KKworI3RvZG8tbGlzdCBsaSAudG9nZ2xl
OmNoZWNrZWQ6YWZ0ZXIgeworICAgIGNvbG9yOiAjODVhZGE3OworICAgIHRleHQtc2hhZG93OiAw
IDFweCAwICM2Njk5OTE7CisgICAgYm90dG9tOiAxcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZl
OworfQorCisjdG9kby1saXN0IGxpIGxhYmVsIHsKKyAgICB3b3JkLWJyZWFrOiBicmVhay13b3Jk
OworICAgIHBhZGRpbmc6IDE1cHg7CisgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7CisgICAgZGlzcGxh
eTogYmxvY2s7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICAtd2Via2l0LXRyYW5zaXRpb246
IGNvbG9yIDAuNHM7CisgICAgLW1vei10cmFuc2l0aW9uOiBjb2xvciAwLjRzOworICAgIC1tcy10
cmFuc2l0aW9uOiBjb2xvciAwLjRzOworICAgIC1vLXRyYW5zaXRpb246IGNvbG9yIDAuNHM7Cisg
ICAgdHJhbnNpdGlvbjogY29sb3IgMC40czsKK30KKworI3RvZG8tbGlzdCBsaS5jb21wbGV0ZWQg
bGFiZWwgeworICAgIGNvbG9yOiAjYTlhOWE5OworICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10
aHJvdWdoOworfQorCisjdG9kby1saXN0IGxpIC5kZXN0cm95IHsKKyAgICBkaXNwbGF5OiBub25l
OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7CisgICAgcmlnaHQ6IDEwcHg7
CisgICAgYm90dG9tOiAwOworICAgIHdpZHRoOiA0MHB4OworICAgIGhlaWdodDogNDBweDsKKyAg
ICBtYXJnaW46IGF1dG8gMDsKKyAgICBmb250LXNpemU6IDIycHg7CisgICAgY29sb3I6ICNhODhh
OGE7CisgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICAtbW96LXRyYW5zaXRp
b246IGFsbCAwLjJzOworICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICAtby10cmFu
c2l0aW9uOiBhbGwgMC4yczsKKyAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKK30KKworI3RvZG8t
bGlzdCBsaSAuZGVzdHJveTpob3ZlciB7CisgICAgdGV4dC1zaGFkb3c6IDAgMCAxcHggIzAwMCwK
KyAgICAgMCAwIDEwcHggcmdiYSgxOTksIDEwNywgMTA3LCAwLjgpOworICAgIC13ZWJraXQtdHJh
bnNmb3JtOiBzY2FsZSgxLjMpOworICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjMpOworICAg
IC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMyk7CisgICAgLW8tdHJhbnNmb3JtOiBzY2FsZSgxLjMp
OworICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zKTsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJv
eTphZnRlciB7CisgICAgY29udGVudDogJ+Kclic7Cit9CisKKyN0b2RvLWxpc3QgbGk6aG92ZXIg
LmRlc3Ryb3kgeworICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisjdG9kby1saXN0IGxpIC5lZGl0
IHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1j
aGlsZCB7CisgICAgbWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworI2Zvb3RlciB7CisgICAgY29s
b3I6ICM3Nzc7CisgICAgcGFkZGluZzogMCAxNXB4OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsK
KyAgICByaWdodDogMDsKKyAgICBib3R0b206IC0zMXB4OworICAgIGxlZnQ6IDA7CisgICAgaGVp
Z2h0OiAyMHB4OworICAgIHotaW5kZXg6IDE7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQor
CisjZm9vdGVyOmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29s
dXRlOworICAgIHJpZ2h0OiAwOworICAgIGJvdHRvbTogMzFweDsKKyAgICBsZWZ0OiAwOworICAg
IGhlaWdodDogNTBweDsKKyAgICB6LWluZGV4OiAtMTsKKyAgICBib3gtc2hhZG93OiAwIDFweCAx
cHggcmdiYSgwLCAwLCAwLCAwLjMpLAorICAgIDAgNnB4IDAgLTNweCByZ2JhKDI1NSwgMjU1LCAy
NTUsIDAuOCksCisgICAgMCA3cHggMXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjMpLAorICAgIDAg
NDNweCAwIC02cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpLAorICAgIDAgNDRweCAycHggLTZw
eCByZ2JhKDAsIDAsIDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsKKyAgICBmbG9hdDogbGVm
dDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisjZmlsdGVycyB7CisgICAgbWFyZ2luOiAw
OworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwb3NpdGlvbjog
YWJzb2x1dGU7CisgICAgcmlnaHQ6IDA7CisgICAgbGVmdDogMDsKK30KKworI2ZpbHRlcnMgbGkg
eworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2ZpbHRlcnMgbGkgYSB7CisgICAgY29sb3I6
ICM4Mzc1NmY7CisgICAgbWFyZ2luOiAycHg7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwor
fQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30K
KworI2NsZWFyLWNvbXBsZXRlZCB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHBvc2l0aW9uOiBy
ZWxhdGl2ZTsKKyAgICBsaW5lLWhlaWdodDogMjBweDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5v
bmU7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjEpOworICAgIGZvbnQtc2l6ZTog
MTFweDsKKyAgICBwYWRkaW5nOiAwIDEwcHg7CisgICAgYm9yZGVyLXJhZGl1czogM3B4OworICAg
IGJveC1zaGFkb3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjIpOworfQorCisjY2xlYXIt
Y29tcGxldGVkOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpOwor
ICAgIGJveC1zaGFkb3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjMpOworfQorCisjaW5m
byB7CisgICAgbWFyZ2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjogI2E2YTZhNjsKKyAgICBm
b250LXNpemU6IDEycHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwg
MjU1LCAwLjcpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworI2luZm8gYSB7CisgICAg
Y29sb3I6IGluaGVyaXQ7Cit9CisKKy8qCisgICAgSGFjayB0byByZW1vdmUgYmFja2dyb3VuZCBm
cm9tIE1vYmlsZSBTYWZhcmkuCisgICAgQ2FuJ3QgdXNlIGl0IGdsb2JhbGx5IHNpbmNlIGl0IGRl
c3Ryb3lzIGNoZWNrYm94ZXMgaW4gRmlyZWZveCBhbmQgT3BlcmEKKyovCitAbWVkaWEgc2NyZWVu
IGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsKKyAgICAjdG9nZ2xlLWFs
bCwKKyAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgeworICAgIGJhY2tncm91bmQ6IG5vbmU7Cisg
ICAgfQorCisgICAgI3RvZG8tbGlzdCBsaSAudG9nZ2xlIHsKKyAgICBoZWlnaHQ6IDQwcHg7Cisg
ICAgfQorCisgICAgI3RvZ2dsZS1hbGwgeworICAgIHRvcDogLTU2cHg7CisgICAgbGVmdDogLTE1
cHg7CisgICAgd2lkdGg6IDY1cHg7CisgICAgaGVpZ2h0OiA0MXB4OworICAgIC13ZWJraXQtdHJh
bnNmb3JtOiByb3RhdGUoOTBkZWcpOworICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAg
ICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgICAgYXBwZWFyYW5jZTogbm9uZTsKKyAgICB9
Cit9CisKKy5oaWRkZW57CisgICAgZGlzcGxheTpub25lOworfQorCitociB7CisgICAgbWFyZ2lu
OiAyMHB4IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI0M1
QzVDNTsKKyAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNGN0Y3Rjc7Cit9CisKKy5sZWFy
biBhIHsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9u
ZTsKKyAgICBjb2xvcjogI2I4M2Y0NTsKK30KKworLmxlYXJuIGE6aG92ZXIgeworICAgIHRleHQt
ZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIGNvbG9yOiAjNzg3ZTdlOworfQorCisubGVhcm4g
aDMsCisubGVhcm4gaDQsCisubGVhcm4gaDUgeworICAgIG1hcmdpbjogMTBweCAwOworICAgIGZv
bnQtd2VpZ2h0OiA1MDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICBjb2xvcjogIzAwMDsK
K30KKworLmxlYXJuIGgzIHsKKyAgICBmb250LXNpemU6IDI0cHg7Cit9CisKKy5sZWFybiBoNCB7
CisgICAgZm9udC1zaXplOiAxOHB4OworfQorCisubGVhcm4gaDUgeworICAgIG1hcmdpbi1ib3R0
b206IDA7CisgICAgZm9udC1zaXplOiAxNHB4OworfQorCisubGVhcm4gdWwgeworICAgIHBhZGRp
bmc6IDA7CisgICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OworfQorCisubGVhcm4gbGkgeworICAg
IGxpbmUtaGVpZ2h0OiAyMHB4OworfQorCisubGVhcm4gcCB7CisgICAgZm9udC1zaXplOiAxNXB4
OworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMzsKKyAgICBtYXJn
aW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5xdW90ZSB7CisgICAgYm9y
ZGVyOiBub25lOworICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKK30KKworLnF1b3RlIHAgewor
ICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLnF1b3RlIHA6YmVmb3JlIHsKKyAgICBjb250
ZW50OiAn4oCcJzsKKyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3BhY2l0eTogLjE1OworICAg
IHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0yMHB4OworICAgIGxlZnQ6IDNweDsKK30K
KworLnF1b3RlIHA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfigJ0nOworICAgIGZvbnQtc2l6ZTog
NTBweDsKKyAgICBvcGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGJv
dHRvbTogLTQycHg7CisgICAgcmlnaHQ6IDNweDsKK30KKworLnF1b3RlIGZvb3RlciB7CisgICAg
cG9zaXRpb246IGFic29sdXRlOworICAgIGJvdHRvbTogLTQwcHg7CisgICAgcmlnaHQ6IDA7Cit9
CisKKy5xdW90ZSBmb290ZXIgaW1nIHsKKyAgICBib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKy5x
dW90ZSBmb290ZXIgYSB7CisgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICB2ZXJ0aWNhbC1hbGln
bjogbWlkZGxlOworfQorCisuc3BlZWNoLWJ1YmJsZSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZl
OworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQp
OworICAgIGJvcmRlci1yYWRpdXM6IDVweDsKK30KKworLnNwZWVjaC1idWJibGU6YWZ0ZXIgewor
ICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDEwMCU7
CisgICAgcmlnaHQ6IDMwcHg7CisgICAgYm9yZGVyOiAxM3B4IHNvbGlkIHRyYW5zcGFyZW50Owor
ICAgIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsKK30KKworLyoqYm9keSov
LmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHdpZHRo
OiAyNzJweDsKKyAgICB0b3A6IDhweDsKKyAgICBsZWZ0OiAtMzAwcHg7CisgICAgcGFkZGluZzog
MTBweDsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogcmdi
YSgyNTUsIDI1NSwgMjU1LCAuNik7CisgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogbGVmdDsKKyAg
ICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKK30KKworQG1lZGlhIChtaW4td2lkdGg6IDg5
OXB4KSB7CisgICAgLyoqYm9keSovLmxlYXJuLWJhciB7CisgICAgd2lkdGg6IGF1dG87CisgICAg
bWFyZ2luOiAwIDAgMCAzMDBweDsKKyAgICB9CisgICAgLyoqYm9keSovLmxlYXJuLWJhciA+IC5s
ZWFybiB7CisgICAgbGVmdDogOHB4OworICAgIH0KKyAgICAvKipib2R5Ki8ubGVhcm4tYmFyICN0
b2RvYXBwIHsKKyAgICB3aWR0aDogNTUwcHg7CisgICAgbWFyZ2luOiAxMzBweCBhdXRvIDQwcHgg
YXV0bzsKKyAgICB9Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJl
YWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jv
d2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJm
b3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21t
b24vYmFzZS5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVs
eVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2Jv
bmUvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMjA5IEBACisoZnVuY3Rpb24gKCkgeworICAgICd1c2Ugc3RyaWN0JzsKKwor
ICAgIC8vIFVuZGVyc2NvcmUncyBUZW1wbGF0ZSBNb2R1bGUKKyAgICAvLyBDb3VydGVzeSBvZiB1
bmRlcnNjb3JlanMub3JnCisgICAgdmFyIF8gPSAoZnVuY3Rpb24gKF8pIHsKKyAgICBfLmRlZmF1
bHRzID0gZnVuY3Rpb24gKG9iamVjdCkgeworICAgIGlmICghb2JqZWN0KSB7CisgICAgcmV0dXJu
IG9iamVjdDsKKyAgICB9CisgICAgZm9yICh2YXIgYXJnc0luZGV4ID0gMSwgYXJnc0xlbmd0aCA9
IGFyZ3VtZW50cy5sZW5ndGg7IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGg7IGFyZ3NJbmRleCsrKSB7
CisgICAgdmFyIGl0ZXJhYmxlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07CisgICAgaWYgKGl0ZXJh
YmxlKSB7CisgICAgZm9yICh2YXIga2V5IGluIGl0ZXJhYmxlKSB7CisgICAgaWYgKG9iamVjdFtr
ZXldID09IG51bGwpIHsKKyAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxlW2tleV07CisgICAgfQor
ICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgLy8g
QnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzIEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJz
LCBjaGFuZ2UgdGhlCisgICAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBh
bHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgorICAgIF8udGVtcGxhdGVTZXR0aW5ncyA9IHsKKyAgICBl
dmFsdWF0ZSAgICA6IC88JShbXHNcU10rPyklPi9nLAorICAgIGludGVycG9sYXRlIDogLzwlPShb
XHNcU10rPyklPi9nLAorICAgIGVzY2FwZSAgICAgIDogLzwlLShbXHNcU10rPyklPi9nCisgICAg
fTsKKworICAgIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3Ug
ZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW4KKyAgICAvLyBpbnRlcnBvbGF0aW9uLCBldmFsdWF0aW9u
IG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBuZWVkIG9uZSB0aGF0IGlzCisgICAgLy8gZ3VhcmFudGVl
ZCBub3QgdG8gbWF0Y2guCisgICAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87CisKKyAgICAvLyBDZXJ0
YWluIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcHV0
IGludG8gYQorICAgIC8vIHN0cmluZyBsaXRlcmFsLgorICAgIHZhciBlc2NhcGVzID0geworICAg
ICInIjogICAgICAiJyIsCisgICAgJ1xcJzogICAgICdcXCcsCisgICAgJ1xyJzogICAgICdyJywK
KyAgICAnXG4nOiAgICAgJ24nLAorICAgICdcdCc6ICAgICAndCcsCisgICAgJ1x1MjAyOCc6ICd1
MjAyOCcsCisgICAgJ1x1MjAyOSc6ICd1MjAyOScKKyAgICB9OworCisgICAgdmFyIGVzY2FwZXIg
PSAvXFx8J3xccnxcbnxcdHxcdTIwMjh8XHUyMDI5L2c7CisKKyAgICAvLyBKYXZhU2NyaXB0IG1p
Y3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLgor
ICAgIC8vIFVuZGVyc2NvcmUgdGVtcGxhdGluZyBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJz
LCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSwKKyAgICAvLyBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVv
dGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQgY29kZS4KKyAgICBfLnRlbXBsYXRlID0gZnVuY3Rpb24o
dGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKKyAgICB2YXIgcmVuZGVyOworICAgIHNldHRpbmdzID0g
Xy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7CisKKyAgICAvLyBD
b21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5h
dGlvbi4KKyAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoWworICAgIChzZXR0aW5ncy5lc2Nh
cGUgfHwgbm9NYXRjaCkuc291cmNlLAorICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01h
dGNoKS5zb3VyY2UsCisgICAgKHNldHRpbmdzLmV2YWx1YXRlIHx8IG5vTWF0Y2gpLnNvdXJjZQor
ICAgIF0uam9pbignfCcpICsgJ3wkJywgJ2cnKTsKKworICAgIC8vIENvbXBpbGUgdGhlIHRlbXBs
YXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVyYWxzIGFwcHJvcHJpYXRlbHkuCisgICAg
dmFyIGluZGV4ID0gMDsKKyAgICB2YXIgc291cmNlID0gIl9fcCs9JyI7CisgICAgdGV4dC5yZXBs
YWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0
ZSwgb2Zmc2V0KSB7CisgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkKKyAg
ICAucmVwbGFjZShlc2NhcGVyLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gJ1xcJyArIGVzY2Fw
ZXNbbWF0Y2hdOyB9KTsKKworICAgIGlmIChlc2NhcGUpIHsKKyAgICBzb3VyY2UgKz0gIicrXG4o
KF9fdD0oIiArIGVzY2FwZSArICIpKT09bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcbiciOworICAg
IH0KKyAgICBpZiAoaW50ZXJwb2xhdGUpIHsKKyAgICBzb3VyY2UgKz0gIicrXG4oKF9fdD0oIiAr
IGludGVycG9sYXRlICsgIikpPT1udWxsPycnOl9fdCkrXG4nIjsKKyAgICB9CisgICAgaWYgKGV2
YWx1YXRlKSB7CisgICAgc291cmNlICs9ICInO1xuIiArIGV2YWx1YXRlICsgIlxuX19wKz0nIjsK
KyAgICB9CisgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7CisgICAgcmV0dXJuIG1h
dGNoOworICAgIH0pOworICAgIHNvdXJjZSArPSAiJztcbiI7CisKKyAgICAvLyBJZiBhIHZhcmlh
YmxlIGlzIG5vdCBzcGVjaWZpZWQsIHBsYWNlIGRhdGEgdmFsdWVzIGluIGxvY2FsIHNjb3BlLgor
ICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xuJyAr
IHNvdXJjZSArICd9XG4nOworCisgICAgc291cmNlID0gInZhciBfX3QsX19wPScnLF9faj1BcnJh
eS5wcm90b3R5cGUuam9pbiwiICsKKyAgICAicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxs
KGFyZ3VtZW50cywnJyk7fTtcbiIgKworICAgIHNvdXJjZSArICJyZXR1cm4gX19wO1xuIjsKKwor
ICAgIHRyeSB7CisgICAgcmVuZGVyID0gbmV3IEZ1bmN0aW9uKHNldHRpbmdzLnZhcmlhYmxlIHx8
ICdvYmonLCAnXycsIHNvdXJjZSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgIGUuc291cmNlID0g
c291cmNlOworICAgIHRocm93IGU7CisgICAgfQorCisgICAgaWYgKGRhdGEpIHJldHVybiByZW5k
ZXIoZGF0YSwgXyk7CisgICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHJl
dHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTsKKyAgICB9OworCisgICAgLy8gUHJvdmlk
ZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24gc291cmNlIGFzIGEgY29udmVuaWVuY2UgZm9yIHByZWNv
bXBpbGF0aW9uLgorICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRpbmdz
LnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsKKworICAgIHJldHVy
biB0ZW1wbGF0ZTsKKyAgICB9OworCisgICAgcmV0dXJuIF87CisgICAgfSkoe30pOworCisgICAg
aWYgKGxvY2F0aW9uLmhvc3RuYW1lID09PSAndG9kb212Yy5jb20nKSB7CisgICAgd2luZG93Ll9n
YXEgPSBbWydfc2V0QWNjb3VudCcsJ1VBLTMxMDgxMDYyLTEnXSxbJ190cmFja1BhZ2V2aWV3J11d
OyhmdW5jdGlvbihkLHQpe3ZhciBnPWQuY3JlYXRlRWxlbWVudCh0KSxzPWQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUodClbMF07Zy5zcmM9Jy8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJztz
LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcscyl9KGRvY3VtZW50LCdzY3JpcHQnKSk7CisgICAg
fQorCisgICAgZnVuY3Rpb24gcmVkaXJlY3QoKSB7CisgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1l
ID09PSAndGFzdGVqcy5naXRodWIuaW8nKSB7CisgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9u
LmhyZWYucmVwbGFjZSgndGFzdGVqcy5naXRodWIuaW8vdG9kb212YycsICd0b2RvbXZjLmNvbScp
OworICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaW5kUm9vdCgpIHsKKyAgICB2YXIgYmFz
ZTsKKworICAgIFsvbGFicy8sIC9cdyotZXhhbXBsZXMvXS5mb3JFYWNoKGZ1bmN0aW9uIChocmVm
KSB7CisgICAgdmFyIG1hdGNoID0gbG9jYXRpb24uaHJlZi5tYXRjaChocmVmKTsKKworICAgIGlm
ICghYmFzZSAmJiBtYXRjaCkgeworICAgIGJhc2UgPSBsb2NhdGlvbi5ocmVmLmluZGV4T2YobWF0
Y2gpOworICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLnN1YnN0cigw
LCBiYXNlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBnZXRGaWxlKGZpbGUsIGNhbGxiYWNrKSB7
CisgICAgaWYgKCFsb2NhdGlvbi5ob3N0KSB7CisgICAgcmV0dXJuIGNvbnNvbGUuaW5mbygnTWlz
cyB0aGUgaW5mbyBiYXI/IFJ1biBUb2RvTVZDIGZyb20gYSBzZXJ2ZXIgdG8gYXZvaWQgYSBjcm9z
cy1vcmlnaW4gZXJyb3IuJyk7CisgICAgfQorCisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVx
dWVzdCgpOworCisgICAgeGhyLm9wZW4oJ0dFVCcsIGZpbmRSb290KCkgKyBmaWxlLCB0cnVlKTsK
KyAgICB4aHIuc2VuZCgpOworCisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKKyAgICBp
ZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIGNhbGxiYWNrKSB7CisgICAgY2FsbGJhY2soeGhyLnJl
c3BvbnNlVGV4dCk7CisgICAgfQorICAgIH07CisgICAgfQorCisgICAgZnVuY3Rpb24gTGVhcm4o
bGVhcm5KU09OLCBjb25maWcpIHsKKyAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGVhcm4pKSB7
CisgICAgcmV0dXJuIG5ldyBMZWFybihsZWFybkpTT04sIGNvbmZpZyk7CisgICAgfQorCisgICAg
dmFyIHRlbXBsYXRlLCBmcmFtZXdvcms7CisKKyAgICBpZiAodHlwZW9mIGxlYXJuSlNPTiAhPT0g
J29iamVjdCcpIHsKKyAgICB0cnkgeworICAgIGxlYXJuSlNPTiA9IEpTT04ucGFyc2UobGVhcm5K
U09OKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuOworICAgIH0KKyAgICB9CisKKyAg
ICBpZiAoY29uZmlnKSB7CisgICAgdGVtcGxhdGUgPSBjb25maWcudGVtcGxhdGU7CisgICAgZnJh
bWV3b3JrID0gY29uZmlnLmZyYW1ld29yazsKKyAgICB9CisKKyAgICBpZiAoIXRlbXBsYXRlICYm
IGxlYXJuSlNPTi50ZW1wbGF0ZXMpIHsKKyAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNPTi50ZW1wbGF0
ZXMudG9kb212YzsKKyAgICB9CisKKyAgICBpZiAoIWZyYW1ld29yayAmJiBkb2N1bWVudC5xdWVy
eVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdvcmtdJykpIHsKKyAgICBmcmFtZXdvcmsgPSBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdvcmtdJykuZ2V0QXR0cmlidXRlKCdkYXRhLWZy
YW1ld29yaycpOworICAgIH0KKworCisgICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNPTltmcmFt
ZXdvcmtdKSB7CisgICAgdGhpcy5mcmFtZXdvcmtKU09OID0gbGVhcm5KU09OW2ZyYW1ld29ya107
CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworCisgICAgdGhpcy5hcHBlbmQoKTsKKyAg
ICB9CisgICAgfQorCisgICAgTGVhcm4ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uICgpIHsK
KyAgICB2YXIgYXNpZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhc2lkZScpOworICAgIGFz
aWRlLmlubmVySFRNTCA9IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhpcy5mcmFtZXdvcmtK
U09OKTsKKyAgICBhc2lkZS5jbGFzc05hbWUgPSAnbGVhcm4nOworCisgICAgLy8gTG9jYWxpemUg
ZGVtbyBsaW5rcworICAgIHZhciBkZW1vTGlua3MgPSBhc2lkZS5xdWVyeVNlbGVjdG9yQWxsKCcu
ZGVtby1saW5rJyk7CisgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkZW1vTGlua3Ms
IGZ1bmN0aW9uIChkZW1vTGluaykgeworICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0ZSgnaHJlZics
IGZpbmRSb290KCkgKyBkZW1vTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7CisgICAgfSk7CisK
KyAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSAr
ICcgbGVhcm4tYmFyJykudHJpbSgpOworICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRI
VE1MKCdhZnRlckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsKKyAgICB9OworCisgICAgcmVkaXJl
Y3QoKTsKKyAgICBnZXRGaWxlKCdsZWFybi5qc29uJywgTGVhcm4pOworfSkoKTsKSW5kZXg6IFBl
cmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy91bmRlcnNjb3Jl
L3VuZGVyc2NvcmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0
ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNr
Ym9uZS9ib3dlcl9jb21wb25lbnRzL3VuZGVyc2NvcmUvdW5kZXJzY29yZS5qcwkocmV2aXNpb24g
MCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy91
bmRlcnNjb3JlL3VuZGVyc2NvcmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjI2IEBA
CisvLyAgICAgVW5kZXJzY29yZS5qcyAxLjQuNAorLy8gICAgIGh0dHA6Ly91bmRlcnNjb3JlanMu
b3JnCisvLyAgICAgKGMpIDIwMDktMjAxMyBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQg
SW5jLgorLy8gICAgIFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0
aGUgTUlUIGxpY2Vuc2UuCisKKyhmdW5jdGlvbigpIHsKKworICAvLyBCYXNlbGluZSBzZXR1cAor
ICAvLyAtLS0tLS0tLS0tLS0tLQorCisgIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3
aW5kb3dgIGluIHRoZSBicm93c2VyLCBvciBgZ2xvYmFsYCBvbiB0aGUgc2VydmVyLgorICB2YXIg
cm9vdCA9IHRoaXM7CisKKyAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGBfYCB2
YXJpYWJsZS4KKyAgdmFyIHByZXZpb3VzVW5kZXJzY29yZSA9IHJvb3QuXzsKKworICAvLyBFc3Rh
Ymxpc2ggdGhlIG9iamVjdCB0aGF0IGdldHMgcmV0dXJuZWQgdG8gYnJlYWsgb3V0IG9mIGEgbG9v
cCBpdGVyYXRpb24uCisgIHZhciBicmVha2VyID0ge307CisKKyAgLy8gU2F2ZSBieXRlcyBpbiB0
aGUgbWluaWZpZWQgKGJ1dCBub3QgZ3ppcHBlZCkgdmVyc2lvbjoKKyAgdmFyIEFycmF5UHJvdG8g
PSBBcnJheS5wcm90b3R5cGUsIE9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZSwgRnVuY1Byb3Rv
ID0gRnVuY3Rpb24ucHJvdG90eXBlOworCisgIC8vIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFy
aWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLgorICB2YXIgcHVzaCAg
ICAgICAgICAgICA9IEFycmF5UHJvdG8ucHVzaCwKKyAgICAgIHNsaWNlICAgICAgICAgICAgPSBB
cnJheVByb3RvLnNsaWNlLAorICAgICAgY29uY2F0ICAgICAgICAgICA9IEFycmF5UHJvdG8uY29u
Y2F0LAorICAgICAgdG9TdHJpbmcgICAgICAgICA9IE9ialByb3RvLnRvU3RyaW5nLAorICAgICAg
aGFzT3duUHJvcGVydHkgICA9IE9ialByb3RvLmhhc093blByb3BlcnR5OworCisgIC8vIEFsbCAq
KkVDTUFTY3JpcHQgNSoqIG5hdGl2ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZSBo
b3BlIHRvIHVzZQorICAvLyBhcmUgZGVjbGFyZWQgaGVyZS4KKyAgdmFyCisgICAgbmF0aXZlRm9y
RWFjaCAgICAgID0gQXJyYXlQcm90by5mb3JFYWNoLAorICAgIG5hdGl2ZU1hcCAgICAgICAgICA9
IEFycmF5UHJvdG8ubWFwLAorICAgIG5hdGl2ZVJlZHVjZSAgICAgICA9IEFycmF5UHJvdG8ucmVk
dWNlLAorICAgIG5hdGl2ZVJlZHVjZVJpZ2h0ICA9IEFycmF5UHJvdG8ucmVkdWNlUmlnaHQsCisg
ICAgbmF0aXZlRmlsdGVyICAgICAgID0gQXJyYXlQcm90by5maWx0ZXIsCisgICAgbmF0aXZlRXZl
cnkgICAgICAgID0gQXJyYXlQcm90by5ldmVyeSwKKyAgICBuYXRpdmVTb21lICAgICAgICAgPSBB
cnJheVByb3RvLnNvbWUsCisgICAgbmF0aXZlSW5kZXhPZiAgICAgID0gQXJyYXlQcm90by5pbmRl
eE9mLAorICAgIG5hdGl2ZUxhc3RJbmRleE9mICA9IEFycmF5UHJvdG8ubGFzdEluZGV4T2YsCisg
ICAgbmF0aXZlSXNBcnJheSAgICAgID0gQXJyYXkuaXNBcnJheSwKKyAgICBuYXRpdmVLZXlzICAg
ICAgICAgPSBPYmplY3Qua2V5cywKKyAgICBuYXRpdmVCaW5kICAgICAgICAgPSBGdW5jUHJvdG8u
YmluZDsKKworICAvLyBDcmVhdGUgYSBzYWZlIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBv
YmplY3QgZm9yIHVzZSBiZWxvdy4KKyAgdmFyIF8gPSBmdW5jdGlvbihvYmopIHsKKyAgICBpZiAo
b2JqIGluc3RhbmNlb2YgXykgcmV0dXJuIG9iajsKKyAgICBpZiAoISh0aGlzIGluc3RhbmNlb2Yg
XykpIHJldHVybiBuZXcgXyhvYmopOworICAgIHRoaXMuX3dyYXBwZWQgPSBvYmo7CisgIH07CisK
KyAgLy8gRXhwb3J0IHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgKipOb2RlLmpzKiosIHdpdGgK
KyAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHRoZSBvbGQgYHJlcXVpcmUoKWAgQVBJ
LiBJZiB3ZSdyZSBpbgorICAvLyB0aGUgYnJvd3NlciwgYWRkIGBfYCBhcyBhIGdsb2JhbCBvYmpl
Y3QgdmlhIGEgc3RyaW5nIGlkZW50aWZpZXIsCisgIC8vIGZvciBDbG9zdXJlIENvbXBpbGVyICJh
ZHZhbmNlZCIgbW9kZS4KKyAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykgewor
ICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykg
eworICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gXzsKKyAgICB9CisgICAgZXhwb3J0
cy5fID0gXzsKKyAgfSBlbHNlIHsKKyAgICByb290Ll8gPSBfOworICB9CisKKyAgLy8gQ3VycmVu
dCB2ZXJzaW9uLgorICBfLlZFUlNJT04gPSAnMS40LjQnOworCisgIC8vIENvbGxlY3Rpb24gRnVu
Y3Rpb25zCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVGhlIGNvcm5lcnN0b25l
LCBhbiBgZWFjaGAgaW1wbGVtZW50YXRpb24sIGFrYSBgZm9yRWFjaGAuCisgIC8vIEhhbmRsZXMg
b2JqZWN0cyB3aXRoIHRoZSBidWlsdC1pbiBgZm9yRWFjaGAsIGFycmF5cywgYW5kIHJhdyBvYmpl
Y3RzLgorICAvLyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgZm9yRWFj
aGAgaWYgYXZhaWxhYmxlLgorICB2YXIgZWFjaCA9IF8uZWFjaCA9IF8uZm9yRWFjaCA9IGZ1bmN0
aW9uKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpZiAob2JqID09IG51bGwpIHJldHVy
bjsKKyAgICBpZiAobmF0aXZlRm9yRWFjaCAmJiBvYmouZm9yRWFjaCA9PT0gbmF0aXZlRm9yRWFj
aCkgeworICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpOworICAgIH0gZWxzZSBp
ZiAob2JqLmxlbmd0aCA9PT0gK29iai5sZW5ndGgpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBs
ID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBpZiAoaXRlcmF0b3IuY2FsbChj
b250ZXh0LCBvYmpbaV0sIGksIG9iaikgPT09IGJyZWFrZXIpIHJldHVybjsKKyAgICAgIH0KKyAg
ICB9IGVsc2UgeworICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgeworICAgICAgICBpZiAoXy5o
YXMob2JqLCBrZXkpKSB7CisgICAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2Jq
W2tleV0sIGtleSwgb2JqKSA9PT0gYnJlYWtlcikgcmV0dXJuOworICAgICAgICB9CisgICAgICB9
CisgICAgfQorICB9OworCisgIC8vIFJldHVybiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUg
aXRlcmF0b3IgdG8gZWFjaCBlbGVtZW50LgorICAvLyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0
IDUqKidzIG5hdGl2ZSBgbWFwYCBpZiBhdmFpbGFibGUuCisgIF8ubWFwID0gXy5jb2xsZWN0ID0g
ZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciByZXN1bHRzID0gW107
CisgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gcmVzdWx0czsKKyAgICBpZiAobmF0aXZlTWFw
ICYmIG9iai5tYXAgPT09IG5hdGl2ZU1hcCkgcmV0dXJuIG9iai5tYXAoaXRlcmF0b3IsIGNvbnRl
eHQpOworICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAg
IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGhdID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwg
aW5kZXgsIGxpc3QpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9OworCisgIHZh
ciByZWR1Y2VFcnJvciA9ICdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZh
bHVlJzsKKworICAvLyAqKlJlZHVjZSoqIGJ1aWxkcyB1cCBhIHNpbmdsZSByZXN1bHQgZnJvbSBh
IGxpc3Qgb2YgdmFsdWVzLCBha2EgYGluamVjdGAsCisgIC8vIG9yIGBmb2xkbGAuIERlbGVnYXRl
cyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGByZWR1Y2VgIGlmIGF2YWlsYWJsZS4KKyAg
Xy5yZWR1Y2UgPSBfLmZvbGRsID0gXy5pbmplY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBt
ZW1vLCBjb250ZXh0KSB7CisgICAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsK
KyAgICBpZiAob2JqID09IG51bGwpIG9iaiA9IFtdOworICAgIGlmIChuYXRpdmVSZWR1Y2UgJiYg
b2JqLnJlZHVjZSA9PT0gbmF0aXZlUmVkdWNlKSB7CisgICAgICBpZiAoY29udGV4dCkgaXRlcmF0
b3IgPSBfLmJpbmQoaXRlcmF0b3IsIGNvbnRleHQpOworICAgICAgcmV0dXJuIGluaXRpYWwgPyBv
YmoucmVkdWNlKGl0ZXJhdG9yLCBtZW1vKSA6IG9iai5yZWR1Y2UoaXRlcmF0b3IpOworICAgIH0K
KyAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICBpZiAo
IWluaXRpYWwpIHsKKyAgICAgICAgbWVtbyA9IHZhbHVlOworICAgICAgICBpbml0aWFsID0gdHJ1
ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbW8gPSBpdGVyYXRvci5jYWxsKGNvbnRleHQs
IG1lbW8sIHZhbHVlLCBpbmRleCwgbGlzdCk7CisgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFp
bml0aWFsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHJlZHVjZUVycm9yKTsKKyAgICByZXR1cm4gbWVt
bzsKKyAgfTsKKworICAvLyBUaGUgcmlnaHQtYXNzb2NpYXRpdmUgdmVyc2lvbiBvZiByZWR1Y2Us
IGFsc28ga25vd24gYXMgYGZvbGRyYC4KKyAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1
KioncyBuYXRpdmUgYHJlZHVjZVJpZ2h0YCBpZiBhdmFpbGFibGUuCisgIF8ucmVkdWNlUmlnaHQg
PSBfLmZvbGRyID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgbWVtbywgY29udGV4dCkgeworICAg
IHZhciBpbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CisgICAgaWYgKG9iaiA9PSBudWxs
KSBvYmogPSBbXTsKKyAgICBpZiAobmF0aXZlUmVkdWNlUmlnaHQgJiYgb2JqLnJlZHVjZVJpZ2h0
ID09PSBuYXRpdmVSZWR1Y2VSaWdodCkgeworICAgICAgaWYgKGNvbnRleHQpIGl0ZXJhdG9yID0g
Xy5iaW5kKGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAgICAgIHJldHVybiBpbml0aWFsID8gb2JqLnJl
ZHVjZVJpZ2h0KGl0ZXJhdG9yLCBtZW1vKSA6IG9iai5yZWR1Y2VSaWdodChpdGVyYXRvcik7Cisg
ICAgfQorICAgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoOworICAgIGlmIChsZW5ndGggIT09ICts
ZW5ndGgpIHsKKyAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7CisgICAgICBsZW5ndGggPSBr
ZXlzLmxlbmd0aDsKKyAgICB9CisgICAgZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwg
bGlzdCkgeworICAgICAgaW5kZXggPSBrZXlzID8ga2V5c1stLWxlbmd0aF0gOiAtLWxlbmd0aDsK
KyAgICAgIGlmICghaW5pdGlhbCkgeworICAgICAgICBtZW1vID0gb2JqW2luZGV4XTsKKyAgICAg
ICAgaW5pdGlhbCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1vID0gaXRlcmF0
b3IuY2FsbChjb250ZXh0LCBtZW1vLCBvYmpbaW5kZXhdLCBpbmRleCwgbGlzdCk7CisgICAgICB9
CisgICAgfSk7CisgICAgaWYgKCFpbml0aWFsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHJlZHVjZUVy
cm9yKTsKKyAgICByZXR1cm4gbWVtbzsKKyAgfTsKKworICAvLyBSZXR1cm4gdGhlIGZpcnN0IHZh
bHVlIHdoaWNoIHBhc3NlcyBhIHRydXRoIHRlc3QuIEFsaWFzZWQgYXMgYGRldGVjdGAuCisgIF8u
ZmluZCA9IF8uZGV0ZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAg
IHZhciByZXN1bHQ7CisgICAgYW55KG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7
CisgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpKSB7
CisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0K
KyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9OworCisgIC8vIFJldHVybiBhbGwgdGhl
IGVsZW1lbnRzIHRoYXQgcGFzcyBhIHRydXRoIHRlc3QuCisgIC8vIERlbGVnYXRlcyB0byAqKkVD
TUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBmaWx0ZXJgIGlmIGF2YWlsYWJsZS4KKyAgLy8gQWxpYXNl
ZCBhcyBgc2VsZWN0YC4KKyAgXy5maWx0ZXIgPSBfLnNlbGVjdCA9IGZ1bmN0aW9uKG9iaiwgaXRl
cmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIGlmIChvYmogPT0g
bnVsbCkgcmV0dXJuIHJlc3VsdHM7CisgICAgaWYgKG5hdGl2ZUZpbHRlciAmJiBvYmouZmlsdGVy
ID09PSBuYXRpdmVGaWx0ZXIpIHJldHVybiBvYmouZmlsdGVyKGl0ZXJhdG9yLCBjb250ZXh0KTsK
KyAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICBpZiAo
aXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpKSByZXN1bHRzW3Jlc3Vs
dHMubGVuZ3RoXSA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9Owor
CisgIC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGZvciB3aGljaCBhIHRydXRoIHRlc3QgZmFp
bHMuCisgIF8ucmVqZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAg
IHJldHVybiBfLmZpbHRlcihvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgbGlzdCkgeworICAg
ICAgcmV0dXJuICFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCk7Cisg
ICAgfSwgY29udGV4dCk7CisgIH07CisKKyAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIG9mIHRo
ZSBlbGVtZW50cyBtYXRjaCBhIHRydXRoIHRlc3QuCisgIC8vIERlbGVnYXRlcyB0byAqKkVDTUFT
Y3JpcHQgNSoqJ3MgbmF0aXZlIGBldmVyeWAgaWYgYXZhaWxhYmxlLgorICAvLyBBbGlhc2VkIGFz
IGBhbGxgLgorICBfLmV2ZXJ5ID0gXy5hbGwgPSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250
ZXh0KSB7CisgICAgaXRlcmF0b3IgfHwgKGl0ZXJhdG9yID0gXy5pZGVudGl0eSk7CisgICAgdmFy
IHJlc3VsdCA9IHRydWU7CisgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gcmVzdWx0OworICAg
IGlmIChuYXRpdmVFdmVyeSAmJiBvYmouZXZlcnkgPT09IG5hdGl2ZUV2ZXJ5KSByZXR1cm4gb2Jq
LmV2ZXJ5KGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUs
IGluZGV4LCBsaXN0KSB7CisgICAgICBpZiAoIShyZXN1bHQgPSByZXN1bHQgJiYgaXRlcmF0b3Iu
Y2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpKSkgcmV0dXJuIGJyZWFrZXI7CisgICAg
fSk7CisgICAgcmV0dXJuICEhcmVzdWx0OworICB9OworCisgIC8vIERldGVybWluZSBpZiBhdCBs
ZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IG1hdGNoZXMgYSB0cnV0aCB0ZXN0LgorICAv
LyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgc29tZWAgaWYgYXZhaWxh
YmxlLgorICAvLyBBbGlhc2VkIGFzIGBhbnlgLgorICB2YXIgYW55ID0gXy5zb21lID0gXy5hbnkg
PSBmdW5jdGlvbihvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgfHwgKGl0
ZXJhdG9yID0gXy5pZGVudGl0eSk7CisgICAgdmFyIHJlc3VsdCA9IGZhbHNlOworICAgIGlmIChv
YmogPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAobmF0aXZlU29tZSAmJiBvYmouc29t
ZSA9PT0gbmF0aXZlU29tZSkgcmV0dXJuIG9iai5zb21lKGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAg
ICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICBpZiAocmVz
dWx0IHx8IChyZXN1bHQgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlz
dCkpKSByZXR1cm4gYnJlYWtlcjsKKyAgICB9KTsKKyAgICByZXR1cm4gISFyZXN1bHQ7CisgIH07
CisKKyAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhcnJheSBvciBvYmplY3QgY29udGFpbnMgYSBnaXZl
biB2YWx1ZSAodXNpbmcgYD09PWApLgorICAvLyBBbGlhc2VkIGFzIGBpbmNsdWRlYC4KKyAgXy5j
b250YWlucyA9IF8uaW5jbHVkZSA9IGZ1bmN0aW9uKG9iaiwgdGFyZ2V0KSB7CisgICAgaWYgKG9i
aiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKG5hdGl2ZUluZGV4T2YgJiYgb2JqLmlu
ZGV4T2YgPT09IG5hdGl2ZUluZGV4T2YpIHJldHVybiBvYmouaW5kZXhPZih0YXJnZXQpICE9IC0x
OworICAgIHJldHVybiBhbnkob2JqLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZh
bHVlID09PSB0YXJnZXQ7CisgICAgfSk7CisgIH07CisKKyAgLy8gSW52b2tlIGEgbWV0aG9kICh3
aXRoIGFyZ3VtZW50cykgb24gZXZlcnkgaXRlbSBpbiBhIGNvbGxlY3Rpb24uCisgIF8uaW52b2tl
ID0gZnVuY3Rpb24ob2JqLCBtZXRob2QpIHsKKyAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJn
dW1lbnRzLCAyKTsKKyAgICB2YXIgaXNGdW5jID0gXy5pc0Z1bmN0aW9uKG1ldGhvZCk7CisgICAg
cmV0dXJuIF8ubWFwKG9iaiwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiAoaXNGdW5j
ID8gbWV0aG9kIDogdmFsdWVbbWV0aG9kXSkuYXBwbHkodmFsdWUsIGFyZ3MpOworICAgIH0pOwor
ICB9OworCisgIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2Yg
YG1hcGA6IGZldGNoaW5nIGEgcHJvcGVydHkuCisgIF8ucGx1Y2sgPSBmdW5jdGlvbihvYmosIGtl
eSkgeworICAgIHJldHVybiBfLm1hcChvYmosIGZ1bmN0aW9uKHZhbHVlKXsgcmV0dXJuIHZhbHVl
W2tleV07IH0pOworICB9OworCisgIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24g
dXNlIGNhc2Ugb2YgYGZpbHRlcmA6IHNlbGVjdGluZyBvbmx5IG9iamVjdHMKKyAgLy8gY29udGFp
bmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy4KKyAgXy53aGVyZSA9IGZ1bmN0aW9uKG9i
aiwgYXR0cnMsIGZpcnN0KSB7CisgICAgaWYgKF8uaXNFbXB0eShhdHRycykpIHJldHVybiBmaXJz
dCA/IG51bGwgOiBbXTsKKyAgICByZXR1cm4gX1tmaXJzdCA/ICdmaW5kJyA6ICdmaWx0ZXInXShv
YmosIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gYXR0cnMpIHsKKyAg
ICAgICAgaWYgKGF0dHJzW2tleV0gIT09IHZhbHVlW2tleV0pIHJldHVybiBmYWxzZTsKKyAgICAg
IH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworICB9OworCisgIC8vIENvbnZlbmllbmNl
IHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYGZpbmRgOiBnZXR0aW5nIHRoZSBmaXJz
dCBvYmplY3QKKyAgLy8gY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy4KKyAg
Xy5maW5kV2hlcmUgPSBmdW5jdGlvbihvYmosIGF0dHJzKSB7CisgICAgcmV0dXJuIF8ud2hlcmUo
b2JqLCBhdHRycywgdHJ1ZSk7CisgIH07CisKKyAgLy8gUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1l
bnQgb3IgKGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLgorICAvLyBDYW4ndCBvcHRpbWl6ZSBh
cnJheXMgb2YgaW50ZWdlcnMgbG9uZ2VyIHRoYW4gNjUsNTM1IGVsZW1lbnRzLgorICAvLyBTZWU6
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MDc5NworICBfLm1heCA9
IGZ1bmN0aW9uKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpZiAoIWl0ZXJhdG9yICYm
IF8uaXNBcnJheShvYmopICYmIG9ialswXSA9PT0gK29ialswXSAmJiBvYmoubGVuZ3RoIDwgNjU1
MzUpIHsKKyAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBvYmopOworICAgIH0KKyAg
ICBpZiAoIWl0ZXJhdG9yICYmIF8uaXNFbXB0eShvYmopKSByZXR1cm4gLUluZmluaXR5OworICAg
IHZhciByZXN1bHQgPSB7Y29tcHV0ZWQgOiAtSW5maW5pdHksIHZhbHVlOiAtSW5maW5pdHl9Owor
ICAgIGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHsKKyAgICAgIHZhciBj
b21wdXRlZCA9IGl0ZXJhdG9yID8gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgs
IGxpc3QpIDogdmFsdWU7CisgICAgICBjb21wdXRlZCA+PSByZXN1bHQuY29tcHV0ZWQgJiYgKHJl
c3VsdCA9IHt2YWx1ZSA6IHZhbHVlLCBjb21wdXRlZCA6IGNvbXB1dGVkfSk7CisgICAgfSk7Cisg
ICAgcmV0dXJuIHJlc3VsdC52YWx1ZTsKKyAgfTsKKworICAvLyBSZXR1cm4gdGhlIG1pbmltdW0g
ZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuCisgIF8ubWluID0gZnVuY3Rp
b24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIGlmICghaXRlcmF0b3IgJiYgXy5pc0Fy
cmF5KG9iaikgJiYgb2JqWzBdID09PSArb2JqWzBdICYmIG9iai5sZW5ndGggPCA2NTUzNSkgewor
ICAgICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KE1hdGgsIG9iaik7CisgICAgfQorICAgIGlmICgh
aXRlcmF0b3IgJiYgXy5pc0VtcHR5KG9iaikpIHJldHVybiBJbmZpbml0eTsKKyAgICB2YXIgcmVz
dWx0ID0ge2NvbXB1dGVkIDogSW5maW5pdHksIHZhbHVlOiBJbmZpbml0eX07CisgICAgZWFjaChv
YmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgbGlzdCkgeworICAgICAgdmFyIGNvbXB1dGVkID0g
aXRlcmF0b3IgPyBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkgOiB2
YWx1ZTsKKyAgICAgIGNvbXB1dGVkIDwgcmVzdWx0LmNvbXB1dGVkICYmIChyZXN1bHQgPSB7dmFs
dWUgOiB2YWx1ZSwgY29tcHV0ZWQgOiBjb21wdXRlZH0pOworICAgIH0pOworICAgIHJldHVybiBy
ZXN1bHQudmFsdWU7CisgIH07CisKKyAgLy8gU2h1ZmZsZSBhbiBhcnJheS4KKyAgXy5zaHVmZmxl
ID0gZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIHJhbmQ7CisgICAgdmFyIGluZGV4ID0gMDsKKyAg
ICB2YXIgc2h1ZmZsZWQgPSBbXTsKKyAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUpIHsKKyAg
ICAgIHJhbmQgPSBfLnJhbmRvbShpbmRleCsrKTsKKyAgICAgIHNodWZmbGVkW2luZGV4IC0gMV0g
PSBzaHVmZmxlZFtyYW5kXTsKKyAgICAgIHNodWZmbGVkW3JhbmRdID0gdmFsdWU7CisgICAgfSk7
CisgICAgcmV0dXJuIHNodWZmbGVkOworICB9OworCisgIC8vIEFuIGludGVybmFsIGZ1bmN0aW9u
IHRvIGdlbmVyYXRlIGxvb2t1cCBpdGVyYXRvcnMuCisgIHZhciBsb29rdXBJdGVyYXRvciA9IGZ1
bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIF8uaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSA6
IGZ1bmN0aW9uKG9iail7IHJldHVybiBvYmpbdmFsdWVdOyB9OworICB9OworCisgIC8vIFNvcnQg
dGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbiBwcm9kdWNlZCBieSBhbiBpdGVyYXRv
ci4KKyAgXy5zb3J0QnkgPSBmdW5jdGlvbihvYmosIHZhbHVlLCBjb250ZXh0KSB7CisgICAgdmFy
IGl0ZXJhdG9yID0gbG9va3VwSXRlcmF0b3IodmFsdWUpOworICAgIHJldHVybiBfLnBsdWNrKF8u
bWFwKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7CisgICAgICByZXR1cm4gewor
ICAgICAgICB2YWx1ZSA6IHZhbHVlLAorICAgICAgICBpbmRleCA6IGluZGV4LAorICAgICAgICBj
cml0ZXJpYSA6IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KQorICAg
ICAgfTsKKyAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CisgICAgICB2YXIgYSA9
IGxlZnQuY3JpdGVyaWE7CisgICAgICB2YXIgYiA9IHJpZ2h0LmNyaXRlcmlhOworICAgICAgaWYg
KGEgIT09IGIpIHsKKyAgICAgICAgaWYgKGEgPiBiIHx8IGEgPT09IHZvaWQgMCkgcmV0dXJuIDE7
CisgICAgICAgIGlmIChhIDwgYiB8fCBiID09PSB2b2lkIDApIHJldHVybiAtMTsKKyAgICAgIH0K
KyAgICAgIHJldHVybiBsZWZ0LmluZGV4IDwgcmlnaHQuaW5kZXggPyAtMSA6IDE7CisgICAgfSks
ICd2YWx1ZScpOworICB9OworCisgIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgZm9yIGFn
Z3JlZ2F0ZSAiZ3JvdXAgYnkiIG9wZXJhdGlvbnMuCisgIHZhciBncm91cCA9IGZ1bmN0aW9uKG9i
aiwgdmFsdWUsIGNvbnRleHQsIGJlaGF2aW9yKSB7CisgICAgdmFyIHJlc3VsdCA9IHt9OworICAg
IHZhciBpdGVyYXRvciA9IGxvb2t1cEl0ZXJhdG9yKHZhbHVlIHx8IF8uaWRlbnRpdHkpOworICAg
IGVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHZhciBrZXkgPSBpdGVy
YXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgb2JqKTsKKyAgICAgIGJlaGF2aW9yKHJl
c3VsdCwga2V5LCB2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKwor
ICAvLyBHcm91cHMgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbi4gUGFzcyBlaXRo
ZXIgYSBzdHJpbmcgYXR0cmlidXRlCisgIC8vIHRvIGdyb3VwIGJ5LCBvciBhIGZ1bmN0aW9uIHRo
YXQgcmV0dXJucyB0aGUgY3JpdGVyaW9uLgorICBfLmdyb3VwQnkgPSBmdW5jdGlvbihvYmosIHZh
bHVlLCBjb250ZXh0KSB7CisgICAgcmV0dXJuIGdyb3VwKG9iaiwgdmFsdWUsIGNvbnRleHQsIGZ1
bmN0aW9uKHJlc3VsdCwga2V5LCB2YWx1ZSkgeworICAgICAgKF8uaGFzKHJlc3VsdCwga2V5KSA/
IHJlc3VsdFtrZXldIDogKHJlc3VsdFtrZXldID0gW10pKS5wdXNoKHZhbHVlKTsKKyAgICB9KTsK
KyAgfTsKKworICAvLyBDb3VudHMgaW5zdGFuY2VzIG9mIGFuIG9iamVjdCB0aGF0IGdyb3VwIGJ5
IGEgY2VydGFpbiBjcml0ZXJpb24uIFBhc3MKKyAgLy8gZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0
ZSB0byBjb3VudCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlCisgIC8vIGNyaXRl
cmlvbi4KKyAgXy5jb3VudEJ5ID0gZnVuY3Rpb24ob2JqLCB2YWx1ZSwgY29udGV4dCkgeworICAg
IHJldHVybiBncm91cChvYmosIHZhbHVlLCBjb250ZXh0LCBmdW5jdGlvbihyZXN1bHQsIGtleSkg
eworICAgICAgaWYgKCFfLmhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldID0gMDsKKyAgICAg
IHJlc3VsdFtrZXldKys7CisgICAgfSk7CisgIH07CisKKyAgLy8gVXNlIGEgY29tcGFyYXRvciBm
dW5jdGlvbiB0byBmaWd1cmUgb3V0IHRoZSBzbWFsbGVzdCBpbmRleCBhdCB3aGljaAorICAvLyBh
biBvYmplY3Qgc2hvdWxkIGJlIGluc2VydGVkIHNvIGFzIHRvIG1haW50YWluIG9yZGVyLiBVc2Vz
IGJpbmFyeSBzZWFyY2guCisgIF8uc29ydGVkSW5kZXggPSBmdW5jdGlvbihhcnJheSwgb2JqLCBp
dGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgPT0gbnVsbCA/IF8u
aWRlbnRpdHkgOiBsb29rdXBJdGVyYXRvcihpdGVyYXRvcik7CisgICAgdmFyIHZhbHVlID0gaXRl
cmF0b3IuY2FsbChjb250ZXh0LCBvYmopOworICAgIHZhciBsb3cgPSAwLCBoaWdoID0gYXJyYXku
bGVuZ3RoOworICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CisgICAgICB2YXIgbWlkID0gKGxvdyAr
IGhpZ2gpID4+PiAxOworICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBhcnJheVttaWRdKSA8
IHZhbHVlID8gbG93ID0gbWlkICsgMSA6IGhpZ2ggPSBtaWQ7CisgICAgfQorICAgIHJldHVybiBs
b3c7CisgIH07CisKKyAgLy8gU2FmZWx5IGNvbnZlcnQgYW55dGhpbmcgaXRlcmFibGUgaW50byBh
IHJlYWwsIGxpdmUgYXJyYXkuCisgIF8udG9BcnJheSA9IGZ1bmN0aW9uKG9iaikgeworICAgIGlm
ICghb2JqKSByZXR1cm4gW107CisgICAgaWYgKF8uaXNBcnJheShvYmopKSByZXR1cm4gc2xpY2Uu
Y2FsbChvYmopOworICAgIGlmIChvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCkgcmV0dXJuIF8u
bWFwKG9iaiwgXy5pZGVudGl0eSk7CisgICAgcmV0dXJuIF8udmFsdWVzKG9iaik7CisgIH07CisK
KyAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JqZWN0LgorICBfLnNp
emUgPSBmdW5jdGlvbihvYmopIHsKKyAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAwOworICAg
IHJldHVybiAob2JqLmxlbmd0aCA9PT0gK29iai5sZW5ndGgpID8gb2JqLmxlbmd0aCA6IF8ua2V5
cyhvYmopLmxlbmd0aDsKKyAgfTsKKworICAvLyBBcnJheSBGdW5jdGlvbnMKKyAgLy8gLS0tLS0t
LS0tLS0tLS0tCisKKyAgLy8gR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNz
aW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBOCisgIC8vIHZhbHVlcyBpbiB0aGUgYXJy
YXkuIEFsaWFzZWQgYXMgYGhlYWRgIGFuZCBgdGFrZWAuIFRoZSAqKmd1YXJkKiogY2hlY2sKKyAg
Ly8gYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLgorICBfLmZpcnN0ID0gXy5oZWFkID0g
Xy50YWtlID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7CisgICAgaWYgKGFycmF5ID09IG51
bGwpIHJldHVybiB2b2lkIDA7CisgICAgcmV0dXJuIChuICE9IG51bGwpICYmICFndWFyZCA/IHNs
aWNlLmNhbGwoYXJyYXksIDAsIG4pIDogYXJyYXlbMF07CisgIH07CisKKyAgLy8gUmV0dXJucyBl
dmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBlbnRyeSBvZiB0aGUgYXJyYXkuIEVzcGVjaWFsbHkgdXNl
ZnVsIG9uCisgIC8vIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0
dXJuIGFsbCB0aGUgdmFsdWVzIGluCisgIC8vIHRoZSBhcnJheSwgZXhjbHVkaW5nIHRoZSBsYXN0
IE4uIFRoZSAqKmd1YXJkKiogY2hlY2sgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aAorICAvLyBgXy5t
YXBgLgorICBfLmluaXRpYWwgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHsKKyAgICByZXR1
cm4gc2xpY2UuY2FsbChhcnJheSwgMCwgYXJyYXkubGVuZ3RoIC0gKChuID09IG51bGwpIHx8IGd1
YXJkID8gMSA6IG4pKTsKKyAgfTsKKworICAvLyBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBhbiBh
cnJheS4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiB0aGUgbGFzdCBOCisgIC8vIHZhbHVlcyBp
biB0aGUgYXJyYXkuIFRoZSAqKmd1YXJkKiogY2hlY2sgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBg
Xy5tYXBgLgorICBfLmxhc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHsKKyAgICBpZiAo
YXJyYXkgPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDsKKyAgICBpZiAoKG4gIT0gbnVsbCkgJiYgIWd1
YXJkKSB7CisgICAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgTWF0aC5tYXgoYXJyYXkubGVu
Z3RoIC0gbiwgMCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYXJyYXlbYXJyYXkubGVu
Z3RoIC0gMV07CisgICAgfQorICB9OworCisgIC8vIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhl
IGZpcnN0IGVudHJ5IG9mIHRoZSBhcnJheS4gQWxpYXNlZCBhcyBgdGFpbGAgYW5kIGBkcm9wYC4K
KyAgLy8gRXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3Npbmcg
YW4gKipuKiogd2lsbCByZXR1cm4KKyAgLy8gdGhlIHJlc3QgTiB2YWx1ZXMgaW4gdGhlIGFycmF5
LiBUaGUgKipndWFyZCoqCisgIC8vIGNoZWNrIGFsbG93cyBpdCB0byB3b3JrIHdpdGggYF8ubWFw
YC4KKyAgXy5yZXN0ID0gXy50YWlsID0gXy5kcm9wID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJk
KSB7CisgICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXksIChuID09IG51bGwpIHx8IGd1YXJkID8g
MSA6IG4pOworICB9OworCisgIC8vIFRyaW0gb3V0IGFsbCBmYWxzeSB2YWx1ZXMgZnJvbSBhbiBh
cnJheS4KKyAgXy5jb21wYWN0ID0gZnVuY3Rpb24oYXJyYXkpIHsKKyAgICByZXR1cm4gXy5maWx0
ZXIoYXJyYXksIF8uaWRlbnRpdHkpOworICB9OworCisgIC8vIEludGVybmFsIGltcGxlbWVudGF0
aW9uIG9mIGEgcmVjdXJzaXZlIGBmbGF0dGVuYCBmdW5jdGlvbi4KKyAgdmFyIGZsYXR0ZW4gPSBm
dW5jdGlvbihpbnB1dCwgc2hhbGxvdywgb3V0cHV0KSB7CisgICAgZWFjaChpbnB1dCwgZnVuY3Rp
b24odmFsdWUpIHsKKyAgICAgIGlmIChfLmlzQXJyYXkodmFsdWUpKSB7CisgICAgICAgIHNoYWxs
b3cgPyBwdXNoLmFwcGx5KG91dHB1dCwgdmFsdWUpIDogZmxhdHRlbih2YWx1ZSwgc2hhbGxvdywg
b3V0cHV0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTsKKyAg
ICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gb3V0cHV0OworICB9OworCisgIC8vIFJldHVybiBh
IGNvbXBsZXRlbHkgZmxhdHRlbmVkIHZlcnNpb24gb2YgYW4gYXJyYXkuCisgIF8uZmxhdHRlbiA9
IGZ1bmN0aW9uKGFycmF5LCBzaGFsbG93KSB7CisgICAgcmV0dXJuIGZsYXR0ZW4oYXJyYXksIHNo
YWxsb3csIFtdKTsKKyAgfTsKKworICAvLyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0
aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS4KKyAgXy53aXRob3V0
ID0gZnVuY3Rpb24oYXJyYXkpIHsKKyAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFycmF5LCBzbGlj
ZS5jYWxsKGFyZ3VtZW50cywgMSkpOworICB9OworCisgIC8vIFByb2R1Y2UgYSBkdXBsaWNhdGUt
ZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheS4gSWYgdGhlIGFycmF5IGhhcyBhbHJlYWR5CisgIC8v
IGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29y
aXRobS4KKyAgLy8gQWxpYXNlZCBhcyBgdW5pcXVlYC4KKyAgXy51bmlxID0gXy51bmlxdWUgPSBm
dW5jdGlvbihhcnJheSwgaXNTb3J0ZWQsIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaWYgKF8u
aXNGdW5jdGlvbihpc1NvcnRlZCkpIHsKKyAgICAgIGNvbnRleHQgPSBpdGVyYXRvcjsKKyAgICAg
IGl0ZXJhdG9yID0gaXNTb3J0ZWQ7CisgICAgICBpc1NvcnRlZCA9IGZhbHNlOworICAgIH0KKyAg
ICB2YXIgaW5pdGlhbCA9IGl0ZXJhdG9yID8gXy5tYXAoYXJyYXksIGl0ZXJhdG9yLCBjb250ZXh0
KSA6IGFycmF5OworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdmFyIHNlZW4gPSBbXTsKKyAg
ICBlYWNoKGluaXRpYWwsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKGlzU29y
dGVkID8gKCFpbmRleCB8fCBzZWVuW3NlZW4ubGVuZ3RoIC0gMV0gIT09IHZhbHVlKSA6ICFfLmNv
bnRhaW5zKHNlZW4sIHZhbHVlKSkgeworICAgICAgICBzZWVuLnB1c2godmFsdWUpOworICAgICAg
ICByZXN1bHRzLnB1c2goYXJyYXlbaW5kZXhdKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1
cm4gcmVzdWx0czsKKyAgfTsKKworICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMg
dGhlIHVuaW9uOiBlYWNoIGRpc3RpbmN0IGVsZW1lbnQgZnJvbSBhbGwgb2YKKyAgLy8gdGhlIHBh
c3NlZC1pbiBhcnJheXMuCisgIF8udW5pb24gPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gXy51
bmlxKGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBhcmd1bWVudHMpKTsKKyAgfTsKKworICAvLyBQ
cm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBh
bGwgdGhlCisgIC8vIHBhc3NlZC1pbiBhcnJheXMuCisgIF8uaW50ZXJzZWN0aW9uID0gZnVuY3Rp
b24oYXJyYXkpIHsKKyAgICB2YXIgcmVzdCA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAg
ICByZXR1cm4gXy5maWx0ZXIoXy51bmlxKGFycmF5KSwgZnVuY3Rpb24oaXRlbSkgeworICAgICAg
cmV0dXJuIF8uZXZlcnkocmVzdCwgZnVuY3Rpb24ob3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIF8u
aW5kZXhPZihvdGhlciwgaXRlbSkgPj0gMDsKKyAgICAgIH0pOworICAgIH0pOworICB9OworCisg
IC8vIFRha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvbmUgYXJyYXkgYW5kIGEgbnVtYmVyIG9m
IG90aGVyIGFycmF5cy4KKyAgLy8gT25seSB0aGUgZWxlbWVudHMgcHJlc2VudCBpbiBqdXN0IHRo
ZSBmaXJzdCBhcnJheSB3aWxsIHJlbWFpbi4KKyAgXy5kaWZmZXJlbmNlID0gZnVuY3Rpb24oYXJy
YXkpIHsKKyAgICB2YXIgcmVzdCA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBzbGljZS5jYWxs
KGFyZ3VtZW50cywgMSkpOworICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgZnVuY3Rpb24odmFs
dWUpeyByZXR1cm4gIV8uY29udGFpbnMocmVzdCwgdmFsdWUpOyB9KTsKKyAgfTsKKworICAvLyBa
aXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50
cyB0aGF0IHNoYXJlCisgIC8vIGFuIGluZGV4IGdvIHRvZ2V0aGVyLgorICBfLnppcCA9IGZ1bmN0
aW9uKCkgeworICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOworICAgIHZhciBs
ZW5ndGggPSBfLm1heChfLnBsdWNrKGFyZ3MsICdsZW5ndGgnKSk7CisgICAgdmFyIHJlc3VsdHMg
PSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsr
KSB7CisgICAgICByZXN1bHRzW2ldID0gXy5wbHVjayhhcmdzLCAiIiArIGkpOworICAgIH0KKyAg
ICByZXR1cm4gcmVzdWx0czsKKyAgfTsKKworICAvLyBDb252ZXJ0cyBsaXN0cyBpbnRvIG9iamVj
dHMuIFBhc3MgZWl0aGVyIGEgc2luZ2xlIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gCisgIC8vIHBh
aXJzLCBvciB0d28gcGFyYWxsZWwgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCAtLSBvbmUgb2Yg
a2V5cywgYW5kIG9uZSBvZgorICAvLyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuCisgIF8ub2Jq
ZWN0ID0gZnVuY3Rpb24obGlzdCwgdmFsdWVzKSB7CisgICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0
dXJuIHt9OworICAgIHZhciByZXN1bHQgPSB7fTsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxp
c3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBpZiAodmFsdWVzKSB7CisgICAgICAgIHJl
c3VsdFtsaXN0W2ldXSA9IHZhbHVlc1tpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3Vs
dFtsaXN0W2ldWzBdXSA9IGxpc3RbaV1bMV07CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBy
ZXN1bHQ7CisgIH07CisKKyAgLy8gSWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwbHkgdXMgd2l0
aCBpbmRleE9mIChJJ20gbG9va2luZyBhdCB5b3UsICoqTVNJRSoqKSwKKyAgLy8gd2UgbmVlZCB0
aGlzIGZ1bmN0aW9uLiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNl
IG9mIGFuCisgIC8vIGl0ZW0gaW4gYW4gYXJyYXksIG9yIC0xIGlmIHRoZSBpdGVtIGlzIG5vdCBp
bmNsdWRlZCBpbiB0aGUgYXJyYXkuCisgIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoq
J3MgbmF0aXZlIGBpbmRleE9mYCBpZiBhdmFpbGFibGUuCisgIC8vIElmIHRoZSBhcnJheSBpcyBs
YXJnZSBhbmQgYWxyZWFkeSBpbiBzb3J0IG9yZGVyLCBwYXNzIGB0cnVlYAorICAvLyBmb3IgKipp
c1NvcnRlZCoqIHRvIHVzZSBiaW5hcnkgc2VhcmNoLgorICBfLmluZGV4T2YgPSBmdW5jdGlvbihh
cnJheSwgaXRlbSwgaXNTb3J0ZWQpIHsKKyAgICBpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIC0x
OworICAgIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsKKyAgICBpZiAoaXNTb3J0ZWQpIHsK
KyAgICAgIGlmICh0eXBlb2YgaXNTb3J0ZWQgPT0gJ251bWJlcicpIHsKKyAgICAgICAgaSA9IChp
c1NvcnRlZCA8IDAgPyBNYXRoLm1heCgwLCBsICsgaXNTb3J0ZWQpIDogaXNTb3J0ZWQpOworICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgaSA9IF8uc29ydGVkSW5kZXgoYXJyYXksIGl0ZW0pOworICAg
ICAgICByZXR1cm4gYXJyYXlbaV0gPT09IGl0ZW0gPyBpIDogLTE7CisgICAgICB9CisgICAgfQor
ICAgIGlmIChuYXRpdmVJbmRleE9mICYmIGFycmF5LmluZGV4T2YgPT09IG5hdGl2ZUluZGV4T2Yp
IHJldHVybiBhcnJheS5pbmRleE9mKGl0ZW0sIGlzU29ydGVkKTsKKyAgICBmb3IgKDsgaSA8IGw7
IGkrKykgaWYgKGFycmF5W2ldID09PSBpdGVtKSByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7Cisg
IH07CisKKyAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYGxhc3RJ
bmRleE9mYCBpZiBhdmFpbGFibGUuCisgIF8ubGFzdEluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwg
aXRlbSwgZnJvbSkgeworICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gLTE7CisgICAgdmFy
IGhhc0luZGV4ID0gZnJvbSAhPSBudWxsOworICAgIGlmIChuYXRpdmVMYXN0SW5kZXhPZiAmJiBh
cnJheS5sYXN0SW5kZXhPZiA9PT0gbmF0aXZlTGFzdEluZGV4T2YpIHsKKyAgICAgIHJldHVybiBo
YXNJbmRleCA/IGFycmF5Lmxhc3RJbmRleE9mKGl0ZW0sIGZyb20pIDogYXJyYXkubGFzdEluZGV4
T2YoaXRlbSk7CisgICAgfQorICAgIHZhciBpID0gKGhhc0luZGV4ID8gZnJvbSA6IGFycmF5Lmxl
bmd0aCk7CisgICAgd2hpbGUgKGktLSkgaWYgKGFycmF5W2ldID09PSBpdGVtKSByZXR1cm4gaTsK
KyAgICByZXR1cm4gLTE7CisgIH07CisKKyAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBj
b250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZgorICAvLyB0aGUg
bmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZQorICAvLyBbdGhlIFB5dGhvbiBk
b2N1bWVudGF0aW9uXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZnVuY3Rpb25zLmh0
bWwjcmFuZ2UpLgorICBfLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHsKKyAg
ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxKSB7CisgICAgICBzdG9wID0gc3RhcnQgfHwgMDsK
KyAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisgICAgc3RlcCA9IGFyZ3VtZW50c1syXSB8fCAxOwor
CisgICAgdmFyIGxlbiA9IE1hdGgubWF4KE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXAp
LCAwKTsKKyAgICB2YXIgaWR4ID0gMDsKKyAgICB2YXIgcmFuZ2UgPSBuZXcgQXJyYXkobGVuKTsK
KworICAgIHdoaWxlKGlkeCA8IGxlbikgeworICAgICAgcmFuZ2VbaWR4KytdID0gc3RhcnQ7Cisg
ICAgICBzdGFydCArPSBzdGVwOworICAgIH0KKworICAgIHJldHVybiByYW5nZTsKKyAgfTsKKwor
ICAvLyBGdW5jdGlvbiAoYWhlbSkgRnVuY3Rpb25zCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLQor
CisgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25p
bmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLAorICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRv
ICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmCisgIC8vIGF2YWls
YWJsZS4KKyAgXy5iaW5kID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCkgeworICAgIGlmIChmdW5j
LmJpbmQgPT09IG5hdGl2ZUJpbmQgJiYgbmF0aXZlQmluZCkgcmV0dXJuIG5hdGl2ZUJpbmQuYXBw
bHkoZnVuYywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKKyAgICB2YXIgYXJncyA9IHNsaWNl
LmNhbGwoYXJndW1lbnRzLCAyKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICByZXR1
cm4gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykp
KTsKKyAgICB9OworICB9OworCisgIC8vIFBhcnRpYWxseSBhcHBseSBhIGZ1bmN0aW9uIGJ5IGNy
ZWF0aW5nIGEgdmVyc2lvbiB0aGF0IGhhcyBoYWQgc29tZSBvZiBpdHMKKyAgLy8gYXJndW1lbnRz
IHByZS1maWxsZWQsIHdpdGhvdXQgY2hhbmdpbmcgaXRzIGR5bmFtaWMgYHRoaXNgIGNvbnRleHQu
CisgIF8ucGFydGlhbCA9IGZ1bmN0aW9uKGZ1bmMpIHsKKyAgICB2YXIgYXJncyA9IHNsaWNlLmNh
bGwoYXJndW1lbnRzLCAxKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4g
ZnVuYy5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKKyAg
ICB9OworICB9OworCisgIC8vIEJpbmQgYWxsIG9mIGFuIG9iamVjdCdzIG1ldGhvZHMgdG8gdGhh
dCBvYmplY3QuIFVzZWZ1bCBmb3IgZW5zdXJpbmcgdGhhdAorICAvLyBhbGwgY2FsbGJhY2tzIGRl
ZmluZWQgb24gYW4gb2JqZWN0IGJlbG9uZyB0byBpdC4KKyAgXy5iaW5kQWxsID0gZnVuY3Rpb24o
b2JqKSB7CisgICAgdmFyIGZ1bmNzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIGlm
IChmdW5jcy5sZW5ndGggPT09IDApIGZ1bmNzID0gXy5mdW5jdGlvbnMob2JqKTsKKyAgICBlYWNo
KGZ1bmNzLCBmdW5jdGlvbihmKSB7IG9ialtmXSA9IF8uYmluZChvYmpbZl0sIG9iaik7IH0pOwor
ICAgIHJldHVybiBvYmo7CisgIH07CisKKyAgLy8gTWVtb2l6ZSBhbiBleHBlbnNpdmUgZnVuY3Rp
b24gYnkgc3RvcmluZyBpdHMgcmVzdWx0cy4KKyAgXy5tZW1vaXplID0gZnVuY3Rpb24oZnVuYywg
aGFzaGVyKSB7CisgICAgdmFyIG1lbW8gPSB7fTsKKyAgICBoYXNoZXIgfHwgKGhhc2hlciA9IF8u
aWRlbnRpdHkpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBrZXkgPSBoYXNo
ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHJldHVybiBfLmhhcyhtZW1vLCBrZXkp
ID8gbWVtb1trZXldIDogKG1lbW9ba2V5XSA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7
CisgICAgfTsKKyAgfTsKKworICAvLyBEZWxheXMgYSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIG51
bWJlciBvZiBtaWxsaXNlY29uZHMsIGFuZCB0aGVuIGNhbGxzCisgIC8vIGl0IHdpdGggdGhlIGFy
Z3VtZW50cyBzdXBwbGllZC4KKyAgXy5kZWxheSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHsKKyAg
ICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKKyAgICByZXR1cm4gc2V0VGlt
ZW91dChmdW5jdGlvbigpeyByZXR1cm4gZnVuYy5hcHBseShudWxsLCBhcmdzKTsgfSwgd2FpdCk7
CisgIH07CisKKyAgLy8gRGVmZXJzIGEgZnVuY3Rpb24sIHNjaGVkdWxpbmcgaXQgdG8gcnVuIGFm
dGVyIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzCisgIC8vIGNsZWFyZWQuCisgIF8uZGVmZXIg
PSBmdW5jdGlvbihmdW5jKSB7CisgICAgcmV0dXJuIF8uZGVsYXkuYXBwbHkoXywgW2Z1bmMsIDFd
LmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpKTsKKyAgfTsKKworICAvLyBSZXR1cm5z
IGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBh
dCBtb3N0IG9uY2UKKyAgLy8gZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuCisgIF8udGhy
b3R0bGUgPSBmdW5jdGlvbihmdW5jLCB3YWl0KSB7CisgICAgdmFyIGNvbnRleHQsIGFyZ3MsIHRp
bWVvdXQsIHJlc3VsdDsKKyAgICB2YXIgcHJldmlvdXMgPSAwOworICAgIHZhciBsYXRlciA9IGZ1
bmN0aW9uKCkgeworICAgICAgcHJldmlvdXMgPSBuZXcgRGF0ZTsKKyAgICAgIHRpbWVvdXQgPSBu
dWxsOworICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTsKKyAgICB9Owor
ICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBub3cgPSBuZXcgRGF0ZTsKKyAgICAg
IHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTsKKyAgICAgIGNvbnRleHQg
PSB0aGlzOworICAgICAgYXJncyA9IGFyZ3VtZW50czsKKyAgICAgIGlmIChyZW1haW5pbmcgPD0g
MCkgeworICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CisgICAgICAgIHRpbWVvdXQgPSBu
dWxsOworICAgICAgICBwcmV2aW91cyA9IG5vdzsKKyAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBs
eShjb250ZXh0LCBhcmdzKTsKKyAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQpIHsKKyAgICAgICAg
dGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7CisgICAgICB9CisgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH07CisgIH07CisKKyAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uLCB0
aGF0LCBhcyBsb25nIGFzIGl0IGNvbnRpbnVlcyB0byBiZSBpbnZva2VkLCB3aWxsIG5vdAorICAv
LyBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9w
cyBiZWluZyBjYWxsZWQgZm9yCisgIC8vIE4gbWlsbGlzZWNvbmRzLiBJZiBgaW1tZWRpYXRlYCBp
cyBwYXNzZWQsIHRyaWdnZXIgdGhlIGZ1bmN0aW9uIG9uIHRoZQorICAvLyBsZWFkaW5nIGVkZ2Us
IGluc3RlYWQgb2YgdGhlIHRyYWlsaW5nLgorICBfLmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywg
d2FpdCwgaW1tZWRpYXRlKSB7CisgICAgdmFyIHRpbWVvdXQsIHJlc3VsdDsKKyAgICByZXR1cm4g
ZnVuY3Rpb24oKSB7CisgICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7
CisgICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdGltZW91dCA9IG51bGw7
CisgICAgICAgIGlmICghaW1tZWRpYXRlKSByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFy
Z3MpOworICAgICAgfTsKKyAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0
OworICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOworICAgICAgdGltZW91dCA9IHNldFRpbWVv
dXQobGF0ZXIsIHdhaXQpOworICAgICAgaWYgKGNhbGxOb3cpIHJlc3VsdCA9IGZ1bmMuYXBwbHko
Y29udGV4dCwgYXJncyk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07CisgIH07CisKKyAg
Ly8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0
aW1lLCBubyBtYXR0ZXIgaG93CisgIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxh
enkgaW5pdGlhbGl6YXRpb24uCisgIF8ub25jZSA9IGZ1bmN0aW9uKGZ1bmMpIHsKKyAgICB2YXIg
cmFuID0gZmFsc2UsIG1lbW87CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgaWYgKHJh
bikgcmV0dXJuIG1lbW87CisgICAgICByYW4gPSB0cnVlOworICAgICAgbWVtbyA9IGZ1bmMuYXBw
bHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIGZ1bmMgPSBudWxsOworICAgICAgcmV0dXJuIG1l
bW87CisgICAgfTsKKyAgfTsKKworICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBmdW5jdGlvbiBwYXNz
ZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHNlY29uZCwKKyAgLy8gYWxsb3dpbmcgeW91IHRvIGFk
anVzdCBhcmd1bWVudHMsIHJ1biBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIsIGFuZAorICAvLyBjb25k
aXRpb25hbGx5IGV4ZWN1dGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLgorICBfLndyYXAgPSBmdW5j
dGlvbihmdW5jLCB3cmFwcGVyKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgdmFy
IGFyZ3MgPSBbZnVuY107CisgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7CisgICAg
ICByZXR1cm4gd3JhcHBlci5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICB9OworICB9OworCisgIC8v
IFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2Yg
ZnVuY3Rpb25zLCBlYWNoCisgIC8vIGNvbnN1bWluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBm
dW5jdGlvbiB0aGF0IGZvbGxvd3MuCisgIF8uY29tcG9zZSA9IGZ1bmN0aW9uKCkgeworICAgIHZh
ciBmdW5jcyA9IGFyZ3VtZW50czsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICB2YXIg
YXJncyA9IGFyZ3VtZW50czsKKyAgICAgIGZvciAodmFyIGkgPSBmdW5jcy5sZW5ndGggLSAxOyBp
ID49IDA7IGktLSkgeworICAgICAgICBhcmdzID0gW2Z1bmNzW2ldLmFwcGx5KHRoaXMsIGFyZ3Mp
XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhcmdzWzBdOworICAgIH07CisgIH07CisKKyAgLy8g
UmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGFmdGVyIGJlaW5n
IGNhbGxlZCBOIHRpbWVzLgorICBfLmFmdGVyID0gZnVuY3Rpb24odGltZXMsIGZ1bmMpIHsKKyAg
ICBpZiAodGltZXMgPD0gMCkgcmV0dXJuIGZ1bmMoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7
CisgICAgICBpZiAoLS10aW1lcyA8IDEpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKKyAgICAgIH0KKyAgICB9OworICB9OworCisgIC8vIE9iamVjdCBGdW5j
dGlvbnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFJldHJpZXZlIHRoZSBuYW1lcyBv
ZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzLgorICAvLyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0
IDUqKidzIG5hdGl2ZSBgT2JqZWN0LmtleXNgCisgIF8ua2V5cyA9IG5hdGl2ZUtleXMgfHwgZnVu
Y3Rpb24ob2JqKSB7CisgICAgaWYgKG9iaiAhPT0gT2JqZWN0KG9iaikpIHRocm93IG5ldyBUeXBl
RXJyb3IoJ0ludmFsaWQgb2JqZWN0Jyk7CisgICAgdmFyIGtleXMgPSBbXTsKKyAgICBmb3IgKHZh
ciBrZXkgaW4gb2JqKSBpZiAoXy5oYXMob2JqLCBrZXkpKSBrZXlzW2tleXMubGVuZ3RoXSA9IGtl
eTsKKyAgICByZXR1cm4ga2V5czsKKyAgfTsKKworICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWVzIG9m
IGFuIG9iamVjdCdzIHByb3BlcnRpZXMuCisgIF8udmFsdWVzID0gZnVuY3Rpb24ob2JqKSB7Cisg
ICAgdmFyIHZhbHVlcyA9IFtdOworICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChfLmhhcyhv
YmosIGtleSkpIHZhbHVlcy5wdXNoKG9ialtrZXldKTsKKyAgICByZXR1cm4gdmFsdWVzOworICB9
OworCisgIC8vIENvbnZlcnQgYW4gb2JqZWN0IGludG8gYSBsaXN0IG9mIGBba2V5LCB2YWx1ZV1g
IHBhaXJzLgorICBfLnBhaXJzID0gZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIHBhaXJzID0gW107
CisgICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKF8uaGFzKG9iaiwga2V5KSkgcGFpcnMucHVz
aChba2V5LCBvYmpba2V5XV0pOworICAgIHJldHVybiBwYWlyczsKKyAgfTsKKworICAvLyBJbnZl
cnQgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiBhbiBvYmplY3QuIFRoZSB2YWx1ZXMgbXVzdCBiZSBz
ZXJpYWxpemFibGUuCisgIF8uaW52ZXJ0ID0gZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIHJlc3Vs
dCA9IHt9OworICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChfLmhhcyhvYmosIGtleSkpIHJl
c3VsdFtvYmpba2V5XV0gPSBrZXk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsKKworICAvLyBS
ZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYXZhaWxhYmxlIG9uIHRo
ZSBvYmplY3QuCisgIC8vIEFsaWFzZWQgYXMgYG1ldGhvZHNgCisgIF8uZnVuY3Rpb25zID0gXy5t
ZXRob2RzID0gZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIG5hbWVzID0gW107CisgICAgZm9yICh2
YXIga2V5IGluIG9iaikgeworICAgICAgaWYgKF8uaXNGdW5jdGlvbihvYmpba2V5XSkpIG5hbWVz
LnB1c2goa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIG5hbWVzLnNvcnQoKTsKKyAgfTsKKworICAv
LyBFeHRlbmQgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgaW4gcGFzc2Vk
LWluIG9iamVjdChzKS4KKyAgXy5leHRlbmQgPSBmdW5jdGlvbihvYmopIHsKKyAgICBlYWNoKHNs
aWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgZnVuY3Rpb24oc291cmNlKSB7CisgICAgICBpZiAoc291
cmNlKSB7CisgICAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CisgICAgICAgICAgb2Jq
W3Byb3BdID0gc291cmNlW3Byb3BdOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAg
cmV0dXJuIG9iajsKKyAgfTsKKworICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgb25s
eSBjb250YWluaW5nIHRoZSB3aGl0ZWxpc3RlZCBwcm9wZXJ0aWVzLgorICBfLnBpY2sgPSBmdW5j
dGlvbihvYmopIHsKKyAgICB2YXIgY29weSA9IHt9OworICAgIHZhciBrZXlzID0gY29uY2F0LmFw
cGx5KEFycmF5UHJvdG8sIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CisgICAgZWFjaChrZXlz
LCBmdW5jdGlvbihrZXkpIHsKKyAgICAgIGlmIChrZXkgaW4gb2JqKSBjb3B5W2tleV0gPSBvYmpb
a2V5XTsKKyAgICB9KTsKKyAgICByZXR1cm4gY29weTsKKyAgfTsKKworICAgLy8gUmV0dXJuIGEg
Y29weSBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdGhlIGJsYWNrbGlzdGVkIHByb3BlcnRpZXMuCisg
IF8ub21pdCA9IGZ1bmN0aW9uKG9iaikgeworICAgIHZhciBjb3B5ID0ge307CisgICAgdmFyIGtl
eXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsK
KyAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CisgICAgICBpZiAoIV8uY29udGFpbnMoa2V5cywg
a2V5KSkgY29weVtrZXldID0gb2JqW2tleV07CisgICAgfQorICAgIHJldHVybiBjb3B5OworICB9
OworCisgIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMu
CisgIF8uZGVmYXVsdHMgPSBmdW5jdGlvbihvYmopIHsKKyAgICBlYWNoKHNsaWNlLmNhbGwoYXJn
dW1lbnRzLCAxKSwgZnVuY3Rpb24oc291cmNlKSB7CisgICAgICBpZiAoc291cmNlKSB7CisgICAg
ICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CisgICAgICAgICAgaWYgKG9ialtwcm9wXSA9
PSBudWxsKSBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9KTsKKyAgICByZXR1cm4gb2JqOworICB9OworCisgIC8vIENyZWF0ZSBhIChzaGFsbG93LWNs
b25lZCkgZHVwbGljYXRlIG9mIGFuIG9iamVjdC4KKyAgXy5jbG9uZSA9IGZ1bmN0aW9uKG9iaikg
eworICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqOworICAgIHJldHVybiBfLmlz
QXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogXy5leHRlbmQoe30sIG9iaik7CisgIH07CisKKyAg
Ly8gSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2Jq
LgorICAvLyBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJ0YXAgaW50
byIgYSBtZXRob2QgY2hhaW4sIGluCisgIC8vIG9yZGVyIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBv
biBpbnRlcm1lZGlhdGUgcmVzdWx0cyB3aXRoaW4gdGhlIGNoYWluLgorICBfLnRhcCA9IGZ1bmN0
aW9uKG9iaiwgaW50ZXJjZXB0b3IpIHsKKyAgICBpbnRlcmNlcHRvcihvYmopOworICAgIHJldHVy
biBvYmo7CisgIH07CisKKyAgLy8gSW50ZXJuYWwgcmVjdXJzaXZlIGNvbXBhcmlzb24gZnVuY3Rp
b24gZm9yIGBpc0VxdWFsYC4KKyAgdmFyIGVxID0gZnVuY3Rpb24oYSwgYiwgYVN0YWNrLCBiU3Rh
Y2spIHsKKyAgICAvLyBJZGVudGljYWwgb2JqZWN0cyBhcmUgZXF1YWwuIGAwID09PSAtMGAsIGJ1
dCB0aGV5IGFyZW4ndCBpZGVudGljYWwuCisgICAgLy8gU2VlIHRoZSBIYXJtb255IGBlZ2FsYCBw
cm9wb3NhbDogaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9aGFybW9ueTpl
Z2FsLgorICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PSAxIC8gYjsK
KyAgICAvLyBBIHN0cmljdCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGBudWxsID09
IHVuZGVmaW5lZGAuCisgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBhID09
PSBiOworICAgIC8vIFVud3JhcCBhbnkgd3JhcHBlZCBvYmplY3RzLgorICAgIGlmIChhIGluc3Rh
bmNlb2YgXykgYSA9IGEuX3dyYXBwZWQ7CisgICAgaWYgKGIgaW5zdGFuY2VvZiBfKSBiID0gYi5f
d3JhcHBlZDsKKyAgICAvLyBDb21wYXJlIGBbW0NsYXNzXV1gIG5hbWVzLgorICAgIHZhciBjbGFz
c05hbWUgPSB0b1N0cmluZy5jYWxsKGEpOworICAgIGlmIChjbGFzc05hbWUgIT0gdG9TdHJpbmcu
Y2FsbChiKSkgcmV0dXJuIGZhbHNlOworICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7CisgICAgICAv
LyBTdHJpbmdzLCBudW1iZXJzLCBkYXRlcywgYW5kIGJvb2xlYW5zIGFyZSBjb21wYXJlZCBieSB2
YWx1ZS4KKyAgICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6CisgICAgICAgIC8vIFByaW1pdGl2
ZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgb2JqZWN0IHdyYXBwZXJzIGFyZSBlcXVpdmFsZW50
OyB0aHVzLCBgIjUiYCBpcworICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKCI1
IilgLgorICAgICAgICByZXR1cm4gYSA9PSBTdHJpbmcoYik7CisgICAgICBjYXNlICdbb2JqZWN0
IE51bWJlcl0nOgorICAgICAgICAvLyBgTmFOYHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBub24tcmVm
bGV4aXZlLiBBbiBgZWdhbGAgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgZm9yCisgICAgICAgIC8v
IG90aGVyIG51bWVyaWMgdmFsdWVzLgorICAgICAgICByZXR1cm4gYSAhPSArYSA/IGIgIT0gK2Ig
OiAoYSA9PSAwID8gMSAvIGEgPT0gMSAvIGIgOiBhID09ICtiKTsKKyAgICAgIGNhc2UgJ1tvYmpl
Y3QgRGF0ZV0nOgorICAgICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6CisgICAgICAgIC8vIENv
ZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtZXJpYyBwcmltaXRpdmUgdmFsdWVzLiBEYXRl
cyBhcmUgY29tcGFyZWQgYnkgdGhlaXIKKyAgICAgICAgLy8gbWlsbGlzZWNvbmQgcmVwcmVzZW50
YXRpb25zLiBOb3RlIHRoYXQgaW52YWxpZCBkYXRlcyB3aXRoIG1pbGxpc2Vjb25kIHJlcHJlc2Vu
dGF0aW9ucworICAgICAgICAvLyBvZiBgTmFOYCBhcmUgbm90IGVxdWl2YWxlbnQuCisgICAgICAg
IHJldHVybiArYSA9PSArYjsKKyAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvbXBhcmVkIGJ5IHRoZWly
IHNvdXJjZSBwYXR0ZXJucyBhbmQgZmxhZ3MuCisgICAgICBjYXNlICdbb2JqZWN0IFJlZ0V4cF0n
OgorICAgICAgICByZXR1cm4gYS5zb3VyY2UgPT0gYi5zb3VyY2UgJiYKKyAgICAgICAgICAgICAg
IGEuZ2xvYmFsID09IGIuZ2xvYmFsICYmCisgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PSBi
Lm11bHRpbGluZSAmJgorICAgICAgICAgICAgICAgYS5pZ25vcmVDYXNlID09IGIuaWdub3JlQ2Fz
ZTsKKyAgICB9CisgICAgaWYgKHR5cGVvZiBhICE9ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9ICdv
YmplY3QnKSByZXR1cm4gZmFsc2U7CisgICAgLy8gQXNzdW1lIGVxdWFsaXR5IGZvciBjeWNsaWMg
c3RydWN0dXJlcy4gVGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpYworICAgIC8vIHN0
cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjMsIGFic3RyYWN0
IG9wZXJhdGlvbiBgSk9gLgorICAgIHZhciBsZW5ndGggPSBhU3RhY2subGVuZ3RoOworICAgIHdo
aWxlIChsZW5ndGgtLSkgeworICAgICAgLy8gTGluZWFyIHNlYXJjaC4gUGVyZm9ybWFuY2UgaXMg
aW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mCisgICAgICAvLyB1bmlxdWUg
bmVzdGVkIHN0cnVjdHVyZXMuCisgICAgICBpZiAoYVN0YWNrW2xlbmd0aF0gPT0gYSkgcmV0dXJu
IGJTdGFja1tsZW5ndGhdID09IGI7CisgICAgfQorICAgIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0
IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy4KKyAgICBhU3RhY2sucHVzaChhKTsK
KyAgICBiU3RhY2sucHVzaChiKTsKKyAgICB2YXIgc2l6ZSA9IDAsIHJlc3VsdCA9IHRydWU7Cisg
ICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMuCisgICAgaWYgKGNs
YXNzTmFtZSA9PSAnW29iamVjdCBBcnJheV0nKSB7CisgICAgICAvLyBDb21wYXJlIGFycmF5IGxl
bmd0aHMgdG8gZGV0ZXJtaW5lIGlmIGEgZGVlcCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeS4KKyAg
ICAgIHNpemUgPSBhLmxlbmd0aDsKKyAgICAgIHJlc3VsdCA9IHNpemUgPT0gYi5sZW5ndGg7Cisg
ICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIC8vIERlZXAgY29tcGFyZSB0aGUgY29udGVudHMs
IGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMuCisgICAgICAgIHdoaWxlIChzaXplLS0p
IHsKKyAgICAgICAgICBpZiAoIShyZXN1bHQgPSBlcShhW3NpemVdLCBiW3NpemVdLCBhU3RhY2ss
IGJTdGFjaykpKSBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICAvLyBPYmplY3RzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWl2YWxl
bnQsIGJ1dCBgT2JqZWN0YHMKKyAgICAgIC8vIGZyb20gZGlmZmVyZW50IGZyYW1lcyBhcmUuCisg
ICAgICB2YXIgYUN0b3IgPSBhLmNvbnN0cnVjdG9yLCBiQ3RvciA9IGIuY29uc3RydWN0b3I7Cisg
ICAgICBpZiAoYUN0b3IgIT09IGJDdG9yICYmICEoXy5pc0Z1bmN0aW9uKGFDdG9yKSAmJiAoYUN0
b3IgaW5zdGFuY2VvZiBhQ3RvcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf
LmlzRnVuY3Rpb24oYkN0b3IpICYmIChiQ3RvciBpbnN0YW5jZW9mIGJDdG9yKSkpIHsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gRGVlcCBjb21wYXJlIG9iamVjdHMu
CisgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgeworICAgICAgICBpZiAoXy5oYXMoYSwga2V5KSkg
eworICAgICAgICAgIC8vIENvdW50IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcHJvcGVydGllcy4K
KyAgICAgICAgICBzaXplKys7CisgICAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVy
LgorICAgICAgICAgIGlmICghKHJlc3VsdCA9IF8uaGFzKGIsIGtleSkgJiYgZXEoYVtrZXldLCBi
W2tleV0sIGFTdGFjaywgYlN0YWNrKSkpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAg
ICAvLyBFbnN1cmUgdGhhdCBib3RoIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2Yg
cHJvcGVydGllcy4KKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgZm9yIChrZXkgaW4gYikg
eworICAgICAgICAgIGlmIChfLmhhcyhiLCBrZXkpICYmICEoc2l6ZS0tKSkgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgcmVzdWx0ID0gIXNpemU7CisgICAgICB9CisgICAgfQorICAgIC8vIFJl
bW92ZSB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3Rz
LgorICAgIGFTdGFjay5wb3AoKTsKKyAgICBiU3RhY2sucG9wKCk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgfTsKKworICAvLyBQZXJmb3JtIGEgZGVlcCBjb21wYXJpc29uIHRvIGNoZWNrIGlmIHR3
byBvYmplY3RzIGFyZSBlcXVhbC4KKyAgXy5pc0VxdWFsID0gZnVuY3Rpb24oYSwgYikgeworICAg
IHJldHVybiBlcShhLCBiLCBbXSwgW10pOworICB9OworCisgIC8vIElzIGEgZ2l2ZW4gYXJyYXks
IHN0cmluZywgb3Igb2JqZWN0IGVtcHR5PworICAvLyBBbiAiZW1wdHkiIG9iamVjdCBoYXMgbm8g
ZW51bWVyYWJsZSBvd24tcHJvcGVydGllcy4KKyAgXy5pc0VtcHR5ID0gZnVuY3Rpb24ob2JqKSB7
CisgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoXy5pc0FycmF5KG9i
aikgfHwgXy5pc1N0cmluZyhvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PT0gMDsKKyAgICBmb3Ig
KHZhciBrZXkgaW4gb2JqKSBpZiAoXy5oYXMob2JqLCBrZXkpKSByZXR1cm4gZmFsc2U7CisgICAg
cmV0dXJuIHRydWU7CisgIH07CisKKyAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhIERPTSBlbGVtZW50
PworICBfLmlzRWxlbWVudCA9IGZ1bmN0aW9uKG9iaikgeworICAgIHJldHVybiAhIShvYmogJiYg
b2JqLm5vZGVUeXBlID09PSAxKTsKKyAgfTsKKworICAvLyBJcyBhIGdpdmVuIHZhbHVlIGFuIGFy
cmF5PworICAvLyBEZWxlZ2F0ZXMgdG8gRUNNQTUncyBuYXRpdmUgQXJyYXkuaXNBcnJheQorICBf
LmlzQXJyYXkgPSBuYXRpdmVJc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikgeworICAgIHJldHVybiB0
b1N0cmluZy5jYWxsKG9iaikgPT0gJ1tvYmplY3QgQXJyYXldJzsKKyAgfTsKKworICAvLyBJcyBh
IGdpdmVuIHZhcmlhYmxlIGFuIG9iamVjdD8KKyAgXy5pc09iamVjdCA9IGZ1bmN0aW9uKG9iaikg
eworICAgIHJldHVybiBvYmogPT09IE9iamVjdChvYmopOworICB9OworCisgIC8vIEFkZCBzb21l
IGlzVHlwZSBtZXRob2RzOiBpc0FyZ3VtZW50cywgaXNGdW5jdGlvbiwgaXNTdHJpbmcsIGlzTnVt
YmVyLCBpc0RhdGUsIGlzUmVnRXhwLgorICBlYWNoKFsnQXJndW1lbnRzJywgJ0Z1bmN0aW9uJywg
J1N0cmluZycsICdOdW1iZXInLCAnRGF0ZScsICdSZWdFeHAnXSwgZnVuY3Rpb24obmFtZSkgewor
ICAgIF9bJ2lzJyArIG5hbWVdID0gZnVuY3Rpb24ob2JqKSB7CisgICAgICByZXR1cm4gdG9TdHJp
bmcuY2FsbChvYmopID09ICdbb2JqZWN0ICcgKyBuYW1lICsgJ10nOworICAgIH07CisgIH0pOwor
CisgIC8vIERlZmluZSBhIGZhbGxiYWNrIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBpbiBicm93c2Vy
cyAoYWhlbSwgSUUpLCB3aGVyZQorICAvLyB0aGVyZSBpc24ndCBhbnkgaW5zcGVjdGFibGUgIkFy
Z3VtZW50cyIgdHlwZS4KKyAgaWYgKCFfLmlzQXJndW1lbnRzKGFyZ3VtZW50cykpIHsKKyAgICBf
LmlzQXJndW1lbnRzID0gZnVuY3Rpb24ob2JqKSB7CisgICAgICByZXR1cm4gISEob2JqICYmIF8u
aGFzKG9iaiwgJ2NhbGxlZScpKTsKKyAgICB9OworICB9CisKKyAgLy8gT3B0aW1pemUgYGlzRnVu
Y3Rpb25gIGlmIGFwcHJvcHJpYXRlLgorICBpZiAodHlwZW9mICgvLi8pICE9PSAnZnVuY3Rpb24n
KSB7CisgICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7CisgICAgICByZXR1cm4gdHlw
ZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJzsKKyAgICB9OworICB9CisKKyAgLy8gSXMgYSBnaXZlbiBv
YmplY3QgYSBmaW5pdGUgbnVtYmVyPworICBfLmlzRmluaXRlID0gZnVuY3Rpb24ob2JqKSB7Cisg
ICAgcmV0dXJuIGlzRmluaXRlKG9iaikgJiYgIWlzTmFOKHBhcnNlRmxvYXQob2JqKSk7CisgIH07
CisKKyAgLy8gSXMgdGhlIGdpdmVuIHZhbHVlIGBOYU5gPyAoTmFOIGlzIHRoZSBvbmx5IG51bWJl
ciB3aGljaCBkb2VzIG5vdCBlcXVhbCBpdHNlbGYpLgorICBfLmlzTmFOID0gZnVuY3Rpb24ob2Jq
KSB7CisgICAgcmV0dXJuIF8uaXNOdW1iZXIob2JqKSAmJiBvYmogIT0gK29iajsKKyAgfTsKKwor
ICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj8KKyAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlv
bihvYmopIHsKKyAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9T
dHJpbmcuY2FsbChvYmopID09ICdbb2JqZWN0IEJvb2xlYW5dJzsKKyAgfTsKKworICAvLyBJcyBh
IGdpdmVuIHZhbHVlIGVxdWFsIHRvIG51bGw/CisgIF8uaXNOdWxsID0gZnVuY3Rpb24ob2JqKSB7
CisgICAgcmV0dXJuIG9iaiA9PT0gbnVsbDsKKyAgfTsKKworICAvLyBJcyBhIGdpdmVuIHZhcmlh
YmxlIHVuZGVmaW5lZD8KKyAgXy5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKG9iaikgeworICAgIHJl
dHVybiBvYmogPT09IHZvaWQgMDsKKyAgfTsKKworICAvLyBTaG9ydGN1dCBmdW5jdGlvbiBmb3Ig
Y2hlY2tpbmcgaWYgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHByb3BlcnR5IGRpcmVjdGx5CisgIC8v
IG9uIGl0c2VsZiAoaW4gb3RoZXIgd29yZHMsIG5vdCBvbiBhIHByb3RvdHlwZSkuCisgIF8uaGFz
ID0gZnVuY3Rpb24ob2JqLCBrZXkpIHsKKyAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChv
YmosIGtleSk7CisgIH07CisKKyAgLy8gVXRpbGl0eSBGdW5jdGlvbnMKKyAgLy8gLS0tLS0tLS0t
LS0tLS0tLS0KKworICAvLyBSdW4gVW5kZXJzY29yZS5qcyBpbiAqbm9Db25mbGljdCogbW9kZSwg
cmV0dXJuaW5nIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzCisgIC8vIHByZXZpb3VzIG93bmVyLiBS
ZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC4KKyAgXy5ub0NvbmZs
aWN0ID0gZnVuY3Rpb24oKSB7CisgICAgcm9vdC5fID0gcHJldmlvdXNVbmRlcnNjb3JlOworICAg
IHJldHVybiB0aGlzOworICB9OworCisgIC8vIEtlZXAgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGFy
b3VuZCBmb3IgZGVmYXVsdCBpdGVyYXRvcnMuCisgIF8uaWRlbnRpdHkgPSBmdW5jdGlvbih2YWx1
ZSkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfTsKKworICAvLyBSdW4gYSBmdW5jdGlvbiAqKm4q
KiB0aW1lcy4KKyAgXy50aW1lcyA9IGZ1bmN0aW9uKG4sIGl0ZXJhdG9yLCBjb250ZXh0KSB7Cisg
ICAgdmFyIGFjY3VtID0gQXJyYXkobik7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKysp
IGFjY3VtW2ldID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCBpKTsKKyAgICByZXR1cm4gYWNjdW07
CisgIH07CisKKyAgLy8gUmV0dXJuIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1h
eCAoaW5jbHVzaXZlKS4KKyAgXy5yYW5kb20gPSBmdW5jdGlvbihtaW4sIG1heCkgeworICAgIGlm
IChtYXggPT0gbnVsbCkgeworICAgICAgbWF4ID0gbWluOworICAgICAgbWluID0gMDsKKyAgICB9
CisgICAgcmV0dXJuIG1pbiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4g
KyAxKSk7CisgIH07CisKKyAgLy8gTGlzdCBvZiBIVE1MIGVudGl0aWVzIGZvciBlc2NhcGluZy4K
KyAgdmFyIGVudGl0eU1hcCA9IHsKKyAgICBlc2NhcGU6IHsKKyAgICAgICcmJzogJyZhbXA7JywK
KyAgICAgICc8JzogJyZsdDsnLAorICAgICAgJz4nOiAnJmd0OycsCisgICAgICAnIic6ICcmcXVv
dDsnLAorICAgICAgIiciOiAnJiN4Mjc7JywKKyAgICAgICcvJzogJyYjeDJGOycKKyAgICB9Cisg
IH07CisgIGVudGl0eU1hcC51bmVzY2FwZSA9IF8uaW52ZXJ0KGVudGl0eU1hcC5lc2NhcGUpOwor
CisgIC8vIFJlZ2V4ZXMgY29udGFpbmluZyB0aGUga2V5cyBhbmQgdmFsdWVzIGxpc3RlZCBpbW1l
ZGlhdGVseSBhYm92ZS4KKyAgdmFyIGVudGl0eVJlZ2V4ZXMgPSB7CisgICAgZXNjYXBlOiAgIG5l
dyBSZWdFeHAoJ1snICsgXy5rZXlzKGVudGl0eU1hcC5lc2NhcGUpLmpvaW4oJycpICsgJ10nLCAn
ZycpLAorICAgIHVuZXNjYXBlOiBuZXcgUmVnRXhwKCcoJyArIF8ua2V5cyhlbnRpdHlNYXAudW5l
c2NhcGUpLmpvaW4oJ3wnKSArICcpJywgJ2cnKQorICB9OworCisgIC8vIEZ1bmN0aW9ucyBmb3Ig
ZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcgc3RyaW5ncyB0by9mcm9tIEhUTUwgaW50ZXJwb2xhdGlv
bi4KKyAgXy5lYWNoKFsnZXNjYXBlJywgJ3VuZXNjYXBlJ10sIGZ1bmN0aW9uKG1ldGhvZCkgewor
ICAgIF9bbWV0aG9kXSA9IGZ1bmN0aW9uKHN0cmluZykgeworICAgICAgaWYgKHN0cmluZyA9PSBu
dWxsKSByZXR1cm4gJyc7CisgICAgICByZXR1cm4gKCcnICsgc3RyaW5nKS5yZXBsYWNlKGVudGl0
eVJlZ2V4ZXNbbWV0aG9kXSwgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgICAgcmV0dXJuIGVudGl0
eU1hcFttZXRob2RdW21hdGNoXTsKKyAgICAgIH0pOworICAgIH07CisgIH0pOworCisgIC8vIElm
IHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMgYSBmdW5jdGlvbiB0aGVuIGludm9r
ZSBpdDsKKyAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gaXQuCisgIF8ucmVzdWx0ID0gZnVuY3Rpb24o
b2JqZWN0LCBwcm9wZXJ0eSkgeworICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7
CisgICAgdmFyIHZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTsKKyAgICByZXR1cm4gXy5pc0Z1bmN0
aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlOworICB9OworCisgIC8vIEFk
ZCB5b3VyIG93biBjdXN0b20gZnVuY3Rpb25zIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC4KKyAg
Xy5taXhpbiA9IGZ1bmN0aW9uKG9iaikgeworICAgIGVhY2goXy5mdW5jdGlvbnMob2JqKSwgZnVu
Y3Rpb24obmFtZSl7CisgICAgICB2YXIgZnVuYyA9IF9bbmFtZV0gPSBvYmpbbmFtZV07CisgICAg
ICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgYXJncyA9IFt0
aGlzLl93cmFwcGVkXTsKKyAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpOworICAg
ICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgZnVuYy5hcHBseShfLCBhcmdzKSk7CisgICAg
ICB9OworICAgIH0pOworICB9OworCisgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQg
KHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuCisgIC8vIFVzZWZ1bCBm
b3IgdGVtcG9yYXJ5IERPTSBpZHMuCisgIHZhciBpZENvdW50ZXIgPSAwOworICBfLnVuaXF1ZUlk
ID0gZnVuY3Rpb24ocHJlZml4KSB7CisgICAgdmFyIGlkID0gKytpZENvdW50ZXIgKyAnJzsKKyAg
ICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDsKKyAgfTsKKworICAvLyBCeSBkZWZh
dWx0LCBVbmRlcnNjb3JlIHVzZXMgRVJCLXN0eWxlIHRlbXBsYXRlIGRlbGltaXRlcnMsIGNoYW5n
ZSB0aGUKKyAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2
ZSBkZWxpbWl0ZXJzLgorICBfLnRlbXBsYXRlU2V0dGluZ3MgPSB7CisgICAgZXZhbHVhdGUgICAg
OiAvPCUoW1xzXFNdKz8pJT4vZywKKyAgICBpbnRlcnBvbGF0ZSA6IC88JT0oW1xzXFNdKz8pJT4v
ZywKKyAgICBlc2NhcGUgICAgICA6IC88JS0oW1xzXFNdKz8pJT4vZworICB9OworCisgIC8vIFdo
ZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBk
ZWZpbmUgYW4KKyAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdl
eCwgd2UgbmVlZCBvbmUgdGhhdCBpcworICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC4KKyAg
dmFyIG5vTWF0Y2ggPSAvKC4pXi87CisKKyAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8g
YmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGEKKyAgLy8gc3RyaW5nIGxp
dGVyYWwuCisgIHZhciBlc2NhcGVzID0geworICAgICInIjogICAgICAiJyIsCisgICAgJ1xcJzog
ICAgICdcXCcsCisgICAgJ1xyJzogICAgICdyJywKKyAgICAnXG4nOiAgICAgJ24nLAorICAgICdc
dCc6ICAgICAndCcsCisgICAgJ1x1MjAyOCc6ICd1MjAyOCcsCisgICAgJ1x1MjAyOSc6ICd1MjAy
OScKKyAgfTsKKworICB2YXIgZXNjYXBlciA9IC9cXHwnfFxyfFxufFx0fFx1MjAyOHxcdTIwMjkv
ZzsKKworICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBS
ZXNpZydzIGltcGxlbWVudGF0aW9uLgorICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxl
cyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsCisgIC8vIGFuZCBj
b3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLgorICBfLnRl
bXBsYXRlID0gZnVuY3Rpb24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKKyAgICB2YXIgcmVuZGVy
OworICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0
aW5ncyk7CisKKyAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHBy
ZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi4KKyAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoWwor
ICAgICAgKHNldHRpbmdzLmVzY2FwZSB8fCBub01hdGNoKS5zb3VyY2UsCisgICAgICAoc2V0dGlu
Z3MuaW50ZXJwb2xhdGUgfHwgbm9NYXRjaCkuc291cmNlLAorICAgICAgKHNldHRpbmdzLmV2YWx1
YXRlIHx8IG5vTWF0Y2gpLnNvdXJjZQorICAgIF0uam9pbignfCcpICsgJ3wkJywgJ2cnKTsKKwor
ICAgIC8vIENvbXBpbGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVy
YWxzIGFwcHJvcHJpYXRlbHkuCisgICAgdmFyIGluZGV4ID0gMDsKKyAgICB2YXIgc291cmNlID0g
Il9fcCs9JyI7CisgICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2Nh
cGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7CisgICAgICBzb3VyY2UgKz0gdGV4
dC5zbGljZShpbmRleCwgb2Zmc2V0KQorICAgICAgICAucmVwbGFjZShlc2NhcGVyLCBmdW5jdGlv
bihtYXRjaCkgeyByZXR1cm4gJ1xcJyArIGVzY2FwZXNbbWF0Y2hdOyB9KTsKKworICAgICAgaWYg
KGVzY2FwZSkgeworICAgICAgICBzb3VyY2UgKz0gIicrXG4oKF9fdD0oIiArIGVzY2FwZSArICIp
KT09bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcbiciOworICAgICAgfQorICAgICAgaWYgKGludGVy
cG9sYXRlKSB7CisgICAgICAgIHNvdXJjZSArPSAiJytcbigoX190PSgiICsgaW50ZXJwb2xhdGUg
KyAiKSk9PW51bGw/Jyc6X190KStcbiciOworICAgICAgfQorICAgICAgaWYgKGV2YWx1YXRlKSB7
CisgICAgICAgIHNvdXJjZSArPSAiJztcbiIgKyBldmFsdWF0ZSArICJcbl9fcCs9JyI7CisgICAg
ICB9CisgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDsKKyAgICAgIHJldHVybiBt
YXRjaDsKKyAgICB9KTsKKyAgICBzb3VyY2UgKz0gIic7XG4iOworCisgICAgLy8gSWYgYSB2YXJp
YWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS4K
KyAgICBpZiAoIXNldHRpbmdzLnZhcmlhYmxlKSBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcbicg
KyBzb3VyY2UgKyAnfVxuJzsKKworICAgIHNvdXJjZSA9ICJ2YXIgX190LF9fcD0nJyxfX2o9QXJy
YXkucHJvdG90eXBlLmpvaW4sIiArCisgICAgICAicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5j
YWxsKGFyZ3VtZW50cywnJyk7fTtcbiIgKworICAgICAgc291cmNlICsgInJldHVybiBfX3A7XG4i
OworCisgICAgdHJ5IHsKKyAgICAgIHJlbmRlciA9IG5ldyBGdW5jdGlvbihzZXR0aW5ncy52YXJp
YWJsZSB8fCAnb2JqJywgJ18nLCBzb3VyY2UpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGUu
c291cmNlID0gc291cmNlOworICAgICAgdGhyb3cgZTsKKyAgICB9CisKKyAgICBpZiAoZGF0YSkg
cmV0dXJuIHJlbmRlcihkYXRhLCBfKTsKKyAgICB2YXIgdGVtcGxhdGUgPSBmdW5jdGlvbihkYXRh
KSB7CisgICAgICByZXR1cm4gcmVuZGVyLmNhbGwodGhpcywgZGF0YSwgXyk7CisgICAgfTsKKwor
ICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIHNvdXJjZSBhcyBhIGNvbnZlbmll
bmNlIGZvciBwcmVjb21waWxhdGlvbi4KKyAgICB0ZW1wbGF0ZS5zb3VyY2UgPSAnZnVuY3Rpb24o
JyArIChzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJykgKyAnKXtcbicgKyBzb3VyY2UgKyAnfSc7
CisKKyAgICByZXR1cm4gdGVtcGxhdGU7CisgIH07CisKKyAgLy8gQWRkIGEgImNoYWluIiBmdW5j
dGlvbiwgd2hpY2ggd2lsbCBkZWxlZ2F0ZSB0byB0aGUgd3JhcHBlci4KKyAgXy5jaGFpbiA9IGZ1
bmN0aW9uKG9iaikgeworICAgIHJldHVybiBfKG9iaikuY2hhaW4oKTsKKyAgfTsKKworICAvLyBP
T1AKKyAgLy8gLS0tLS0tLS0tLS0tLS0tCisgIC8vIElmIFVuZGVyc2NvcmUgaXMgY2FsbGVkIGFz
IGEgZnVuY3Rpb24sIGl0IHJldHVybnMgYSB3cmFwcGVkIG9iamVjdCB0aGF0CisgIC8vIGNhbiBi
ZSB1c2VkIE9PLXN0eWxlLiBUaGlzIHdyYXBwZXIgaG9sZHMgYWx0ZXJlZCB2ZXJzaW9ucyBvZiBh
bGwgdGhlCisgIC8vIHVuZGVyc2NvcmUgZnVuY3Rpb25zLiBXcmFwcGVkIG9iamVjdHMgbWF5IGJl
IGNoYWluZWQuCisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnRpbnVlIGNoYWluaW5nIGlu
dGVybWVkaWF0ZSByZXN1bHRzLgorICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24ob2JqKSB7CisgICAg
cmV0dXJuIHRoaXMuX2NoYWluID8gXyhvYmopLmNoYWluKCkgOiBvYmo7CisgIH07CisKKyAgLy8g
QWRkIGFsbCBvZiB0aGUgVW5kZXJzY29yZSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIgb2JqZWN0
LgorICBfLm1peGluKF8pOworCisgIC8vIEFkZCBhbGwgbXV0YXRvciBBcnJheSBmdW5jdGlvbnMg
dG8gdGhlIHdyYXBwZXIuCisgIGVhY2goWydwb3AnLCAncHVzaCcsICdyZXZlcnNlJywgJ3NoaWZ0
JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obmFtZSkgeworICAgIHZh
ciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdOworICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVu
Y3Rpb24oKSB7CisgICAgICB2YXIgb2JqID0gdGhpcy5fd3JhcHBlZDsKKyAgICAgIG1ldGhvZC5h
cHBseShvYmosIGFyZ3VtZW50cyk7CisgICAgICBpZiAoKG5hbWUgPT0gJ3NoaWZ0JyB8fCBuYW1l
ID09ICdzcGxpY2UnKSAmJiBvYmoubGVuZ3RoID09PSAwKSBkZWxldGUgb2JqWzBdOworICAgICAg
cmV0dXJuIHJlc3VsdC5jYWxsKHRoaXMsIG9iaik7CisgICAgfTsKKyAgfSk7CisKKyAgLy8gQWRk
IGFsbCBhY2Nlc3NvciBBcnJheSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIuCisgIGVhY2goWydj
b25jYXQnLCAnam9pbicsICdzbGljZSddLCBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIG1ldGhv
ZCA9IEFycmF5UHJvdG9bbmFtZV07CisgICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigp
IHsKKyAgICAgIHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCBtZXRob2QuYXBwbHkodGhpcy5fd3Jh
cHBlZCwgYXJndW1lbnRzKSk7CisgICAgfTsKKyAgfSk7CisKKyAgXy5leHRlbmQoXy5wcm90b3R5
cGUsIHsKKworICAgIC8vIFN0YXJ0IGNoYWluaW5nIGEgd3JhcHBlZCBVbmRlcnNjb3JlIG9iamVj
dC4KKyAgICBjaGFpbjogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLl9jaGFpbiA9IHRydWU7Cisg
ICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gRXh0cmFjdHMgdGhlIHJlc3VsdCBm
cm9tIGEgd3JhcHBlZCBhbmQgY2hhaW5lZCBvYmplY3QuCisgICAgdmFsdWU6IGZ1bmN0aW9uKCkg
eworICAgICAgcmV0dXJuIHRoaXMuX3dyYXBwZWQ7CisgICAgfQorCisgIH0pOworCit9KS5jYWxs
KHRoaXMpOwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNE
T01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9qcy9hcHAuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNE
T01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9qcy9hcHAuanMJ
KHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2pzL2FwcC5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExIEBACisvKmdsb2JhbCAkICovCisvKmpzaGlu
dCB1bnVzZWQ6ZmFsc2UgKi8KK3ZhciBhcHAgPSBhcHAgfHwge307Cit2YXIgRU5URVJfS0VZID0g
MTM7CisKKyQoZnVuY3Rpb24gKCkgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8vIGtpY2sg
dGhpbmdzIG9mZiBieSBjcmVhdGluZyB0aGUgYEFwcGAKKyAgICB3aW5kb3cuYXBwVmlldyA9IG5l
dyBhcHAuQXBwVmlldygpOworfSk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2ti
b25lL2pzL2NvbGxlY3Rpb25zL3RvZG9zLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVz
dHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvYmFja2JvbmUvanMvY29sbGVjdGlvbnMvdG9kb3MuanMJKHJldmlzaW9uIDApCisr
KyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2pzL2NvbGxlY3Rpb25zL3RvZG9zLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDggQEAKKy8qZ2xvYmFsIEJhY2tib25lICovCit2
YXIgYXBwID0gYXBwIHx8IHt9OworCisoZnVuY3Rpb24gKCkgeworICAgICd1c2Ugc3RyaWN0JzsK
KworICAgIC8vIFRvZG8gQ29sbGVjdGlvbgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLQorCisgICAg
Ly8gVGhlIGNvbGxlY3Rpb24gb2YgdG9kb3MgaXMgYmFja2VkIGJ5ICpsb2NhbFN0b3JhZ2UqIGlu
c3RlYWQgb2YgYSByZW1vdGUKKyAgICAvLyBzZXJ2ZXIuCisgICAgdmFyIFRvZG9zID0gQmFja2Jv
bmUuQ29sbGVjdGlvbi5leHRlbmQoeworICAgIC8vIFJlZmVyZW5jZSB0byB0aGlzIGNvbGxlY3Rp
b24ncyBtb2RlbC4KKyAgICBtb2RlbDogYXBwLlRvZG8sCisKKyAgICAvLyBTYXZlIGFsbCBvZiB0
aGUgdG9kbyBpdGVtcyB1bmRlciB0aGUgYCJ0b2RvcyJgIG5hbWVzcGFjZS4KKyAgICBsb2NhbFN0
b3JhZ2U6IG5ldyBCYWNrYm9uZS5Mb2NhbFN0b3JhZ2UoJ3RvZG9zLWJhY2tib25lJyksCisKKyAg
ICAvLyBGaWx0ZXIgZG93biB0aGUgbGlzdCBvZiBhbGwgdG9kbyBpdGVtcyB0aGF0IGFyZSBmaW5p
c2hlZC4KKyAgICBjb21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gdGhpcy5maWx0
ZXIoZnVuY3Rpb24gKHRvZG8pIHsKKyAgICByZXR1cm4gdG9kby5nZXQoJ2NvbXBsZXRlZCcpOwor
ICAgIH0pOworICAgIH0sCisKKyAgICAvLyBGaWx0ZXIgZG93biB0aGUgbGlzdCB0byBvbmx5IHRv
ZG8gaXRlbXMgdGhhdCBhcmUgc3RpbGwgbm90IGZpbmlzaGVkLgorICAgIHJlbWFpbmluZzogZnVu
Y3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLndpdGhvdXQuYXBwbHkodGhpcywgdGhpcy5jb21w
bGV0ZWQoKSk7CisgICAgfSwKKworICAgIC8vIFdlIGtlZXAgdGhlIFRvZG9zIGluIHNlcXVlbnRp
YWwgb3JkZXIsIGRlc3BpdGUgYmVpbmcgc2F2ZWQgYnkgdW5vcmRlcmVkCisgICAgLy8gR1VJRCBp
biB0aGUgZGF0YWJhc2UuIFRoaXMgZ2VuZXJhdGVzIHRoZSBuZXh0IG9yZGVyIG51bWJlciBmb3Ig
bmV3IGl0ZW1zLgorICAgIG5leHRPcmRlcjogZnVuY3Rpb24gKCkgeworICAgIGlmICghdGhpcy5s
ZW5ndGgpIHsKKyAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMubGFzdCgpLmdl
dCgnb3JkZXInKSArIDE7CisgICAgfSwKKworICAgIC8vIFRvZG9zIGFyZSBzb3J0ZWQgYnkgdGhl
aXIgb3JpZ2luYWwgaW5zZXJ0aW9uIG9yZGVyLgorICAgIGNvbXBhcmF0b3I6IGZ1bmN0aW9uICh0
b2RvKSB7CisgICAgcmV0dXJuIHRvZG8uZ2V0KCdvcmRlcicpOworICAgIH0KKyAgICB9KTsKKwor
ICAgIC8vIENyZWF0ZSBvdXIgZ2xvYmFsIGNvbGxlY3Rpb24gb2YgKipUb2RvcyoqLgorICAgIGFw
cC50b2RvcyA9IG5ldyBUb2RvcygpOworfSkoKTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvYmFja2JvbmUvanMvbW9kZWxzL3RvZG8uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VU
ZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9iYWNrYm9uZS9qcy9tb2RlbHMvdG9kby5qcwkocmV2aXNpb24gMCkKKysrIFBl
cmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvanMvbW9kZWxzL3RvZG8uanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwyNiBAQAorLypnbG9iYWwgQmFja2JvbmUgKi8KK3ZhciBhcHAgPSBh
cHAgfHwge307CisKKyhmdW5jdGlvbiAoKSB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgLy8g
VG9kbyBNb2RlbAorICAgIC8vIC0tLS0tLS0tLS0KKworICAgIC8vIE91ciBiYXNpYyAqKlRvZG8q
KiBtb2RlbCBoYXMgYHRpdGxlYCwgYG9yZGVyYCwgYW5kIGBjb21wbGV0ZWRgIGF0dHJpYnV0ZXMu
CisgICAgYXBwLlRvZG8gPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoeworICAgIC8vIERlZmF1bHQg
YXR0cmlidXRlcyBmb3IgdGhlIHRvZG8KKyAgICAvLyBhbmQgZW5zdXJlIHRoYXQgZWFjaCB0b2Rv
IGNyZWF0ZWQgaGFzIGB0aXRsZWAgYW5kIGBjb21wbGV0ZWRgIGtleXMuCisgICAgZGVmYXVsdHM6
IHsKKyAgICB0aXRsZTogJycsCisgICAgY29tcGxldGVkOiBmYWxzZQorICAgIH0sCisKKyAgICAv
LyBUb2dnbGUgdGhlIGBjb21wbGV0ZWRgIHN0YXRlIG9mIHRoaXMgdG9kbyBpdGVtLgorICAgIHRv
Z2dsZTogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuc2F2ZSh7CisgICAgY29tcGxldGVkOiAhdGhp
cy5nZXQoJ2NvbXBsZXRlZCcpCisgICAgfSk7CisgICAgfQorICAgIH0pOworfSkoKTsKSW5kZXg6
IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvanMvcm91dGVycy9yb3V0ZXIuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01C
ZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9qcy9yb3V0ZXJzL3Jv
dXRlci5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVu
cmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUv
anMvcm91dGVycy9yb3V0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAorLypn
bG9iYWwgQmFja2JvbmUgKi8KK3ZhciBhcHAgPSBhcHAgfHwge307CisKKyhmdW5jdGlvbiAoKSB7
CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgLy8gVG9kbyBSb3V0ZXIKKyAgICAvLyAtLS0tLS0t
LS0tCisgICAgdmFyIFRvZG9Sb3V0ZXIgPSBCYWNrYm9uZS5Sb3V0ZXIuZXh0ZW5kKHsKKyAgICBy
b3V0ZXM6IHsKKyAgICAnKmZpbHRlcic6ICdzZXRGaWx0ZXInCisgICAgfSwKKworICAgIHNldEZp
bHRlcjogZnVuY3Rpb24gKHBhcmFtKSB7CisgICAgLy8gU2V0IHRoZSBjdXJyZW50IGZpbHRlciB0
byBiZSB1c2VkCisgICAgYXBwLlRvZG9GaWx0ZXIgPSBwYXJhbSB8fCAnJzsKKworICAgIC8vIFRy
aWdnZXIgYSBjb2xsZWN0aW9uIGZpbHRlciBldmVudCwgY2F1c2luZyBoaWRpbmcvdW5oaWRpbmcK
KyAgICAvLyBvZiBUb2RvIHZpZXcgaXRlbXMKKyAgICBhcHAudG9kb3MudHJpZ2dlcignZmlsdGVy
Jyk7CisgICAgfQorICAgIH0pOworCisgICAgYXBwLlRvZG9Sb3V0ZXIgPSBuZXcgVG9kb1JvdXRl
cigpOworICAgIEJhY2tib25lLmhpc3Rvcnkuc3RhcnQoKTsKK30pKCk7CkluZGV4OiBQZXJmb3Jt
YW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2pzL3ZpZXdzL2FwcC12aWV3LmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvanMvdmlld3MvYXBwLXZpZXcuanMJ
KHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2pzL3ZpZXdz
L2FwcC12aWV3LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMyIEBACisvKmdsb2JhbCBC
YWNrYm9uZSwgalF1ZXJ5LCBfLCBFTlRFUl9LRVkgKi8KK3ZhciBhcHAgPSBhcHAgfHwge307CisK
KyhmdW5jdGlvbiAoJCkgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8vIFRoZSBBcHBsaWNh
dGlvbgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gT3VyIG92ZXJhbGwgKipBcHBW
aWV3KiogaXMgdGhlIHRvcC1sZXZlbCBwaWVjZSBvZiBVSS4KKyAgICBhcHAuQXBwVmlldyA9IEJh
Y2tib25lLlZpZXcuZXh0ZW5kKHsKKworICAgIC8vIEluc3RlYWQgb2YgZ2VuZXJhdGluZyBhIG5l
dyBlbGVtZW50LCBiaW5kIHRvIHRoZSBleGlzdGluZyBza2VsZXRvbiBvZgorICAgIC8vIHRoZSBB
cHAgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBIVE1MLgorICAgIGVsOiAnI3RvZG9hcHAnLAorCisg
ICAgLy8gT3VyIHRlbXBsYXRlIGZvciB0aGUgbGluZSBvZiBzdGF0aXN0aWNzIGF0IHRoZSBib3R0
b20gb2YgdGhlIGFwcC4KKyAgICBzdGF0c1RlbXBsYXRlOiBfLnRlbXBsYXRlKCQoJyNzdGF0cy10
ZW1wbGF0ZScpLmh0bWwoKSksCisKKyAgICAvLyBEZWxlZ2F0ZWQgZXZlbnRzIGZvciBjcmVhdGlu
ZyBuZXcgaXRlbXMsIGFuZCBjbGVhcmluZyBjb21wbGV0ZWQgb25lcy4KKyAgICBldmVudHM6IHsK
KyAgICAna2V5cHJlc3MgI25ldy10b2RvJzogJ2NyZWF0ZU9uRW50ZXInLAorICAgICdjbGljayAj
Y2xlYXItY29tcGxldGVkJzogJ2NsZWFyQ29tcGxldGVkJywKKyAgICAnY2xpY2sgI3RvZ2dsZS1h
bGwnOiAndG9nZ2xlQWxsQ29tcGxldGUnCisgICAgfSwKKworICAgIC8vIEF0IGluaXRpYWxpemF0
aW9uIHdlIGJpbmQgdG8gdGhlIHJlbGV2YW50IGV2ZW50cyBvbiB0aGUgYFRvZG9zYAorICAgIC8v
IGNvbGxlY3Rpb24sIHdoZW4gaXRlbXMgYXJlIGFkZGVkIG9yIGNoYW5nZWQuIEtpY2sgdGhpbmdz
IG9mZiBieQorICAgIC8vIGxvYWRpbmcgYW55IHByZWV4aXN0aW5nIHRvZG9zIHRoYXQgbWlnaHQg
YmUgc2F2ZWQgaW4gKmxvY2FsU3RvcmFnZSouCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkg
eworICAgIHRoaXMuYWxsQ2hlY2tib3ggPSB0aGlzLiQoJyN0b2dnbGUtYWxsJylbMF07CisgICAg
dGhpcy4kaW5wdXQgPSB0aGlzLiQoJyNuZXctdG9kbycpOworICAgIHRoaXMuJGZvb3RlciA9IHRo
aXMuJCgnI2Zvb3RlcicpOworICAgIHRoaXMuJG1haW4gPSB0aGlzLiQoJyNtYWluJyk7CisKKyAg
ICB0aGlzLmxpc3RlblRvKGFwcC50b2RvcywgJ2FkZCcsIHRoaXMuYWRkT25lKTsKKyAgICB0aGlz
Lmxpc3RlblRvKGFwcC50b2RvcywgJ3Jlc2V0JywgdGhpcy5hZGRBbGwpOworICAgIHRoaXMubGlz
dGVuVG8oYXBwLnRvZG9zLCAnY2hhbmdlOmNvbXBsZXRlZCcsIHRoaXMuZmlsdGVyT25lKTsKKyAg
ICB0aGlzLmxpc3RlblRvKGFwcC50b2RvcywgJ2ZpbHRlcicsIHRoaXMuZmlsdGVyQWxsKTsKKyAg
ICB0aGlzLmxpc3RlblRvKGFwcC50b2RvcywgJ2FsbCcsIHRoaXMucmVuZGVyKTsKKworICAgIC8v
IFN1cHByZXNzZXMgJ2FkZCcgZXZlbnRzIHdpdGgge3Jlc2V0OiB0cnVlfSBhbmQgcHJldmVudHMg
dGhlIGFwcCB2aWV3IAorICAgIC8vIGZyb20gYmVpbmcgcmUtcmVuZGVyZWQgZm9yIGV2ZXJ5IG1v
ZGVsLiBPbmx5IHJlbmRlcnMgd2hlbiB0aGUgJ3Jlc2V0JworICAgIC8vIGV2ZW50IGlzIHRyaWdn
ZXJlZCBhdCB0aGUgZW5kIG9mIHRoZSBmZXRjaC4KKyAgICBhcHAudG9kb3MuZmV0Y2goe3Jlc2V0
OiB0cnVlfSk7CisgICAgfSwKKworICAgIC8vIFJlLXJlbmRlcmluZyB0aGUgQXBwIGp1c3QgbWVh
bnMgcmVmcmVzaGluZyB0aGUgc3RhdGlzdGljcyAtLSB0aGUgcmVzdAorICAgIC8vIG9mIHRoZSBh
cHAgZG9lc24ndCBjaGFuZ2UuCisgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGNv
bXBsZXRlZCA9IGFwcC50b2Rvcy5jb21wbGV0ZWQoKS5sZW5ndGg7CisgICAgdmFyIHJlbWFpbmlu
ZyA9IGFwcC50b2Rvcy5yZW1haW5pbmcoKS5sZW5ndGg7CisKKyAgICBpZiAoYXBwLnRvZG9zLmxl
bmd0aCkgeworICAgIHRoaXMuJG1haW4uc2hvdygpOworICAgIHRoaXMuJGZvb3Rlci5zaG93KCk7
CisKKyAgICB0aGlzLiRmb290ZXIuaHRtbCh0aGlzLnN0YXRzVGVtcGxhdGUoeworICAgIGNvbXBs
ZXRlZDogY29tcGxldGVkLAorICAgIHJlbWFpbmluZzogcmVtYWluaW5nCisgICAgfSkpOworCisg
ICAgdGhpcy4kKCcjZmlsdGVycyBsaSBhJykKKyAgICAucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJykK
KyAgICAuZmlsdGVyKCdbaHJlZj0iIy8nICsgKGFwcC5Ub2RvRmlsdGVyIHx8ICcnKSArICciXScp
CisgICAgLmFkZENsYXNzKCdzZWxlY3RlZCcpOworICAgIH0gZWxzZSB7CisgICAgdGhpcy4kbWFp
bi5oaWRlKCk7CisgICAgdGhpcy4kZm9vdGVyLmhpZGUoKTsKKyAgICB9CisKKyAgICB0aGlzLmFs
bENoZWNrYm94LmNoZWNrZWQgPSAhcmVtYWluaW5nOworICAgIH0sCisKKyAgICAvLyBBZGQgYSBz
aW5nbGUgdG9kbyBpdGVtIHRvIHRoZSBsaXN0IGJ5IGNyZWF0aW5nIGEgdmlldyBmb3IgaXQsIGFu
ZAorICAgIC8vIGFwcGVuZGluZyBpdHMgZWxlbWVudCB0byB0aGUgYDx1bD5gLgorICAgIGFkZE9u
ZTogZnVuY3Rpb24gKHRvZG8pIHsKKyAgICB2YXIgdmlldyA9IG5ldyBhcHAuVG9kb1ZpZXcoeyBt
b2RlbDogdG9kbyB9KTsKKyAgICAkKCcjdG9kby1saXN0JykuYXBwZW5kKHZpZXcucmVuZGVyKCku
ZWwpOworICAgIH0sCisKKyAgICAvLyBBZGQgYWxsIGl0ZW1zIGluIHRoZSAqKlRvZG9zKiogY29s
bGVjdGlvbiBhdCBvbmNlLgorICAgIGFkZEFsbDogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuJCgn
I3RvZG8tbGlzdCcpLmh0bWwoJycpOworICAgIGFwcC50b2Rvcy5lYWNoKHRoaXMuYWRkT25lLCB0
aGlzKTsKKyAgICB9LAorCisgICAgZmlsdGVyT25lOiBmdW5jdGlvbiAodG9kbykgeworICAgIHRv
ZG8udHJpZ2dlcigndmlzaWJsZScpOworICAgIH0sCisKKyAgICBmaWx0ZXJBbGw6IGZ1bmN0aW9u
ICgpIHsKKyAgICBhcHAudG9kb3MuZWFjaCh0aGlzLmZpbHRlck9uZSwgdGhpcyk7CisgICAgfSwK
KworICAgIC8vIEdlbmVyYXRlIHRoZSBhdHRyaWJ1dGVzIGZvciBhIG5ldyBUb2RvIGl0ZW0uCisg
ICAgbmV3QXR0cmlidXRlczogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgdGl0bGU6
IHRoaXMuJGlucHV0LnZhbCgpLnRyaW0oKSwKKyAgICBvcmRlcjogYXBwLnRvZG9zLm5leHRPcmRl
cigpLAorICAgIGNvbXBsZXRlZDogZmFsc2UKKyAgICB9OworICAgIH0sCisKKyAgICAvLyBJZiB5
b3UgaGl0IHJldHVybiBpbiB0aGUgbWFpbiBpbnB1dCBmaWVsZCwgY3JlYXRlIG5ldyAqKlRvZG8q
KiBtb2RlbCwKKyAgICAvLyBwZXJzaXN0aW5nIGl0IHRvICpsb2NhbFN0b3JhZ2UqLgorICAgIGNy
ZWF0ZU9uRW50ZXI6IGZ1bmN0aW9uIChlKSB7CisgICAgaWYgKGUud2hpY2ggIT09IEVOVEVSX0tF
WSB8fCAhdGhpcy4kaW5wdXQudmFsKCkudHJpbSgpKSB7CisgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGFwcC50b2Rvcy5jcmVhdGUodGhpcy5uZXdBdHRyaWJ1dGVzKCkpOworICAgIHRoaXMuJGlu
cHV0LnZhbCgnJyk7CisgICAgfSwKKworICAgIC8vIENsZWFyIGFsbCBjb21wbGV0ZWQgdG9kbyBp
dGVtcywgZGVzdHJveWluZyB0aGVpciBtb2RlbHMuCisgICAgY2xlYXJDb21wbGV0ZWQ6IGZ1bmN0
aW9uICgpIHsKKyAgICBfLmludm9rZShhcHAudG9kb3MuY29tcGxldGVkKCksICdkZXN0cm95Jyk7
CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICB0b2dnbGVBbGxDb21wbGV0ZTogZnVu
Y3Rpb24gKCkgeworICAgIHZhciBjb21wbGV0ZWQgPSB0aGlzLmFsbENoZWNrYm94LmNoZWNrZWQ7
CisKKyAgICBhcHAudG9kb3MuZWFjaChmdW5jdGlvbiAodG9kbykgeworICAgIHRvZG8uc2F2ZSh7
CisgICAgJ2NvbXBsZXRlZCc6IGNvbXBsZXRlZAorICAgIH0pOworICAgIH0pOworICAgIH0KKyAg
ICB9KTsKK30pKGpRdWVyeSk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlV
bnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25l
L2pzL3ZpZXdzL3RvZG8tdmlldy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2JhY2tib25lL2pzL3ZpZXdzL3RvZG8tdmlldy5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZv
cm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvYmFja2JvbmUvanMvdmlld3MvdG9kby12aWV3LmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsOTQgQEAKKy8qZ2xvYmFsIEJhY2tib25lLCBqUXVlcnksIF8sIEVO
VEVSX0tFWSAqLwordmFyIGFwcCA9IGFwcCB8fCB7fTsKKworKGZ1bmN0aW9uICgkKSB7CisgICAg
J3VzZSBzdHJpY3QnOworCisgICAgLy8gVG9kbyBJdGVtIFZpZXcKKyAgICAvLyAtLS0tLS0tLS0t
LS0tLQorCisgICAgLy8gVGhlIERPTSBlbGVtZW50IGZvciBhIHRvZG8gaXRlbS4uLgorICAgIGFw
cC5Ub2RvVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHsKKyAgICAvLy4uLiBpcyBhIGxpc3Qg
dGFnLgorICAgIHRhZ05hbWU6ICAnbGknLAorCisgICAgLy8gQ2FjaGUgdGhlIHRlbXBsYXRlIGZ1
bmN0aW9uIGZvciBhIHNpbmdsZSBpdGVtLgorICAgIHRlbXBsYXRlOiBfLnRlbXBsYXRlKCQoJyNp
dGVtLXRlbXBsYXRlJykuaHRtbCgpKSwKKworICAgIC8vIFRoZSBET00gZXZlbnRzIHNwZWNpZmlj
IHRvIGFuIGl0ZW0uCisgICAgZXZlbnRzOiB7CisgICAgJ2NsaWNrIC50b2dnbGUnOiAndG9nZ2xl
Q29tcGxldGVkJywKKyAgICAnZGJsY2xpY2sgbGFiZWwnOiAnZWRpdCcsCisgICAgJ2NsaWNrIC5k
ZXN0cm95JzogJ2NsZWFyJywKKyAgICAna2V5cHJlc3MgLmVkaXQnOiAndXBkYXRlT25FbnRlcics
CisgICAgJ2JsdXIgLmVkaXQnOiAnY2xvc2UnCisgICAgfSwKKworICAgIC8vIFRoZSBUb2RvVmll
dyBsaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIGl0cyBtb2RlbCwgcmUtcmVuZGVyaW5nLiBTaW5jZSB0
aGVyZSdzCisgICAgLy8gYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gYSAqKlRv
ZG8qKiBhbmQgYSAqKlRvZG9WaWV3KiogaW4gdGhpcworICAgIC8vIGFwcCwgd2Ugc2V0IGEgZGly
ZWN0IHJlZmVyZW5jZSBvbiB0aGUgbW9kZWwgZm9yIGNvbnZlbmllbmNlLgorICAgIGluaXRpYWxp
emU6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICdjaGFuZ2Un
LCB0aGlzLnJlbmRlcik7CisgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCAnZGVzdHJveScs
IHRoaXMucmVtb3ZlKTsKKyAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICd2aXNpYmxlJywg
dGhpcy50b2dnbGVWaXNpYmxlKTsKKyAgICB9LAorCisgICAgLy8gUmUtcmVuZGVyIHRoZSB0aXRs
ZXMgb2YgdGhlIHRvZG8gaXRlbS4KKyAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlz
LiRlbC5odG1sKHRoaXMudGVtcGxhdGUodGhpcy5tb2RlbC50b0pTT04oKSkpOworICAgIHRoaXMu
JGVsLnRvZ2dsZUNsYXNzKCdjb21wbGV0ZWQnLCB0aGlzLm1vZGVsLmdldCgnY29tcGxldGVkJykp
OworICAgIHRoaXMudG9nZ2xlVmlzaWJsZSgpOworICAgIHRoaXMuJGlucHV0ID0gdGhpcy4kKCcu
ZWRpdCcpOworICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICB0b2dnbGVWaXNpYmxlOiBm
dW5jdGlvbiAoKSB7CisgICAgdGhpcy4kZWwudG9nZ2xlQ2xhc3MoJ2hpZGRlbicsIHRoaXMuaXNI
aWRkZW4oKSk7CisgICAgfSwKKworICAgIGlzSGlkZGVuOiBmdW5jdGlvbiAoKSB7CisgICAgdmFy
IGlzQ29tcGxldGVkID0gdGhpcy5tb2RlbC5nZXQoJ2NvbXBsZXRlZCcpOworICAgIHJldHVybiAo
Ly8gaGlkZGVuIGNhc2VzIG9ubHkKKyAgICAoIWlzQ29tcGxldGVkICYmIGFwcC5Ub2RvRmlsdGVy
ID09PSAnY29tcGxldGVkJykgfHwKKyAgICAoaXNDb21wbGV0ZWQgJiYgYXBwLlRvZG9GaWx0ZXIg
PT09ICdhY3RpdmUnKQorICAgICk7CisgICAgfSwKKworICAgIC8vIFRvZ2dsZSB0aGUgYCJjb21w
bGV0ZWQiYCBzdGF0ZSBvZiB0aGUgbW9kZWwuCisgICAgdG9nZ2xlQ29tcGxldGVkOiBmdW5jdGlv
biAoKSB7CisgICAgdGhpcy5tb2RlbC50b2dnbGUoKTsKKyAgICB9LAorCisgICAgLy8gU3dpdGNo
IHRoaXMgdmlldyBpbnRvIGAiZWRpdGluZyJgIG1vZGUsIGRpc3BsYXlpbmcgdGhlIGlucHV0IGZp
ZWxkLgorICAgIGVkaXQ6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLiRlbC5hZGRDbGFzcygnZWRp
dGluZycpOworICAgIHRoaXMuJGlucHV0LmZvY3VzKCk7CisgICAgfSwKKworICAgIC8vIENsb3Nl
IHRoZSBgImVkaXRpbmciYCBtb2RlLCBzYXZpbmcgY2hhbmdlcyB0byB0aGUgdG9kby4KKyAgICBj
bG9zZTogZnVuY3Rpb24gKCkgeworICAgIHZhciB0cmltbWVkVmFsdWUgPSB0aGlzLiRpbnB1dC52
YWwoKS50cmltKCk7CisgICAgdGhpcy4kaW5wdXQudmFsKHRyaW1tZWRWYWx1ZSk7CisKKyAgICBp
ZiAodHJpbW1lZFZhbHVlKSB7CisgICAgdGhpcy5tb2RlbC5zYXZlKHsgdGl0bGU6IHRyaW1tZWRW
YWx1ZSB9KTsKKyAgICB9IGVsc2UgeworICAgIHRoaXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICB0
aGlzLiRlbC5yZW1vdmVDbGFzcygnZWRpdGluZycpOworICAgIH0sCisKKyAgICAvLyBJZiB5b3Ug
aGl0IGBlbnRlcmAsIHdlJ3JlIHRocm91Z2ggZWRpdGluZyB0aGUgaXRlbS4KKyAgICB1cGRhdGVP
bkVudGVyOiBmdW5jdGlvbiAoZSkgeworICAgIGlmIChlLndoaWNoID09PSBFTlRFUl9LRVkpIHsK
KyAgICB0aGlzLmNsb3NlKCk7CisgICAgfQorICAgIH0sCisKKyAgICAvLyBSZW1vdmUgdGhlIGl0
ZW0sIGRlc3Ryb3kgdGhlIG1vZGVsIGZyb20gKmxvY2FsU3RvcmFnZSogYW5kIGRlbGV0ZSBpdHMg
dmlldy4KKyAgICBjbGVhcjogZnVuY3Rpb24gKCkgeworICAgIHRoaXMubW9kZWwuZGVzdHJveSgp
OworICAgIH0KKyAgICB9KTsKK30pKGpRdWVyeSk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvYm93ZXIuanNvbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvYm93ZXIuanNvbgkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMv
Tm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9ib3dlci5qc29uCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEgQEAK
K3sKKyAgIm5hbWUiOiAidG9kb212Yy1lbWJlcmpzIiwKKyAgInZlcnNpb24iOiAiMC4wLjAiLAor
ICAiZGVwZW5kZW5jaWVzIjogeworICAgICJ0b2RvbXZjLWNvbW1vbiI6ICJ+MC4xLjQiLAorICAg
ICJqcXVlcnkiOiAifjEuOS4xIiwKKyAgICAiaGFuZGxlYmFycyI6ICJ+MS4wLjAtcmMuMyIsCisg
ICAgImVtYmVyIjogIn4xLjAuMC1yYy4xIiwKKyAgICAiZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0
ZXIiOiAibGF0ZXN0IgorICB9Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvaW5kZXguaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvaW5kZXguaHRtbAkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxl
dGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9pbmRleC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODAgQEAKKzwhZG9jdHlw
ZSBodG1sPgorPGh0bWwgbGFuZz0iZW4iIGRhdGEtZnJhbWV3b3JrPSJlbWJlcmpzIj4KKyAgICA8
aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0i
WC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KKyAgICA8dGl0bGU+ZW1iZXIuanMg
4oCiIFRvZG9NVkM8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYm93
ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcyI+CisgICAgPC9oZWFkPgorICAg
IDxib2R5PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEtdGVtcGxh
dGUtbmFtZT0idG9kb3MiPgorICAgIDxzZWN0aW9uIGlkPSJ0b2RvYXBwIj4KKyAgICA8aGVhZGVy
IGlkPSJoZWFkZXIiPgorICAgIDxoMT50b2RvczwvaDE+CisgICAge3t2aWV3IEVtYmVyLlRleHRG
aWVsZCBpZD0ibmV3LXRvZG8iIHBsYWNlaG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/Igor
ICAgICB2YWx1ZUJpbmRpbmc9Im5ld1RpdGxlIiBhY3Rpb249ImNyZWF0ZVRvZG8ifX0KKyAgICA8
L2hlYWRlcj4KKyAgICB7eyNpZiBsZW5ndGh9fQorICAgIDxzZWN0aW9uIGlkPSJtYWluIj4KKyAg
ICA8dWwgaWQ9InRvZG8tbGlzdCI+CisgICAge3sjZWFjaCBmaWx0ZXJlZFRvZG9zIGl0ZW1Db250
cm9sbGVyPSJ0b2RvIn19CisgICAgPGxpIHt7YmluZEF0dHIgY2xhc3M9ImlzQ29tcGxldGVkOmNv
bXBsZXRlZCBpc0VkaXRpbmc6ZWRpdGluZyJ9fT4KKyAgICB7eyNpZiBpc0VkaXRpbmd9fQorICAg
IHt7dmlldyBUb2Rvcy5FZGl0VG9kb1ZpZXcgdG9kb0JpbmRpbmc9InRoaXMifX0KKyAgICB7e2Vs
c2V9fQorICAgIHt7dmlldyBFbWJlci5DaGVja2JveCBjaGVja2VkQmluZGluZz0iaXNDb21wbGV0
ZWQiIGNsYXNzPSJ0b2dnbGUifX0KKyAgICA8bGFiZWwge3thY3Rpb24gImVkaXRUb2RvIiBvbj0i
ZG91YmxlQ2xpY2sifX0+e3t0aXRsZX19PC9sYWJlbD4KKyAgICA8YnV0dG9uIHt7YWN0aW9uICJy
ZW1vdmVUb2RvIn19IGNsYXNzPSJkZXN0cm95Ij48L2J1dHRvbj4KKyAgICB7ey9pZn19CisgICAg
PC9saT4KKyAgICB7ey9lYWNofX0KKyAgICA8L3VsPgorICAgIHt7dmlldyBFbWJlci5DaGVja2Jv
eCBpZD0idG9nZ2xlLWFsbCIgY2hlY2tlZEJpbmRpbmc9ImFsbEFyZURvbmUifX0KKyAgICA8L3Nl
Y3Rpb24+CisgICAgPGZvb3RlciBpZD0iZm9vdGVyIj4KKyAgICA8c3BhbiBpZD0idG9kby1jb3Vu
dCI+e3t7cmVtYWluaW5nRm9ybWF0dGVkfX19PC9zcGFuPgorICAgIDx1bCBpZD0iZmlsdGVycyI+
CisgICAgPGxpPgorICAgIHt7I2xpbmtUbyB0b2Rvcy5pbmRleCBhY3RpdmVDbGFzcz0ic2VsZWN0
ZWQifX1BbGx7ey9saW5rVG99fQorICAgIDwvbGk+CisgICAgPGxpPgorICAgIHt7I2xpbmtUbyB0
b2Rvcy5hY3RpdmUgYWN0aXZlQ2xhc3M9InNlbGVjdGVkIn19QWN0aXZle3svbGlua1RvfX0KKyAg
ICA8L2xpPgorICAgIDxsaT4KKyAgICB7eyNsaW5rVG8gdG9kb3MuY29tcGxldGVkIGFjdGl2ZUNs
YXNzPSJzZWxlY3RlZCJ9fUNvbXBsZXRlZHt7L2xpbmtUb319CisgICAgPC9saT4KKyAgICA8L3Vs
PgorICAgIHt7I2lmIGhhc0NvbXBsZXRlZH19CisgICAgPGJ1dHRvbiBpZD0iY2xlYXItY29tcGxl
dGVkIiB7e2FjdGlvbiAiY2xlYXJDb21wbGV0ZWQifX0ge3tiaW5kQXR0ciBjbGFzcz0iYnV0dG9u
Q2xhc3M6aGlkZGVuIn19PgorICAgIENsZWFyIGNvbXBsZXRlZCAoe3tjb21wbGV0ZWR9fSkKKyAg
ICA8L2J1dHRvbj4KKyAgICB7ey9pZn19CisgICAgPC9mb290ZXI+CisgICAge3svaWZ9fQorICAg
IDwvc2VjdGlvbj4KKyAgICA8Zm9vdGVyIGlkPSJpbmZvIj4KKyAgICA8cD5Eb3VibGUtY2xpY2sg
dG8gZWRpdCBhIHRvZG88L3A+CisgICAgPHA+CisgICAgQ3JlYXRlZCBieQorICAgIDxhIGhyZWY9
Imh0dHA6Ly9naXRodWIuY29tL3RvbWRhbGUiPlRvbSBEYWxlPC9hPiwKKyAgICA8YSBocmVmPSJo
dHRwOi8vZ2l0aHViLmNvbS9hZGR5b3NtYW5pIj5BZGR5IE9zbWFuaTwvYT4KKyAgICA8L3A+Cisg
ICAgPHA+UGFydCBvZiA8YSBocmVmPSJodHRwOi8vdG9kb212Yy5jb20iPlRvZG9NVkM8L2E+PC9w
PgorICAgIDwvZm9vdGVyPgorICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJib3dlcl9j
b21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQg
c3JjPSJib3dlcl9jb21wb25lbnRzL2pxdWVyeS9qcXVlcnkuanMiPjwvc2NyaXB0PgorICAgIDxz
Y3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMi
Pjwvc2NyaXB0PgorICAgIDwhLS0gVE9ETzogY2hhbmdlIG91dCB3aXRoIGEgY29tcG9uZW50IHdo
ZW4gYSBidWlsdCBvbmUgaXMgYXZhaWxhYmxlIG9uIEJvd2VyIC0tPgorICAgIDxzY3JpcHQgc3Jj
PSJqcy9saWJzL2VtYmVyLWRhdGEuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJib3dl
cl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFw
dGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0ianMvYXBwLmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0ianMvcm91dGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNy
Yz0ianMvbW9kZWxzL3RvZG8uanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJqcy9tb2Rl
bHMvc3RvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJqcy9jb250cm9sbGVycy90
b2Rvc19jb250cm9sbGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0ianMvY29udHJv
bGxlcnMvdG9kb19jb250cm9sbGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0ianMv
dmlld3MvZWRpdF90b2RvX3ZpZXcuanMiPjwvc2NyaXB0PgorICAgIDwvYm9keT4KKzwvaHRtbD4K
SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JlYWRtZS5tZAkocmV2aXNpb24g
MCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzMSBAQAorIyBFbWJlci5qcyBUb2RvTVZDIEV4YW1wbGUKKworPiBB
IGZyYW1ld29yayBmb3IgY3JlYXRpbmcgYW1iaXRpb3VzIHdlYiBhcHBsaWNhdGlvbnMuCisKKz4g
X1tFbWJlci5qcyAtIGVtYmVyanMuY29tXShodHRwOi8vZW1iZXJqcy5jb20pXworCisKKyMjIExl
YXJuaW5nIEVtYmVyLmpzCisKK1RoZSBbRW1iZXIuanMgd2Vic2l0ZV0oaHR0cDovL2VtYmVyanMu
Y29tKSBpcyBhIGdyZWF0IHJlc291cmNlIGZvciBnZXR0aW5nIHN0YXJ0ZWQuCisKK0hlcmUgYXJl
IHNvbWUgbGlua3MgeW91IG1heSBmaW5kIGhlbHBmdWw6CisKKyogW0d1aWRlc10oaHR0cDovL2Vt
YmVyanMuY29tL2d1aWRlcykKKyogW0FQSSBSZWZlcmVuY2VdKGh0dHA6Ly9lbWJlcmpzLmNvbS9h
cGkpCisqIFtTY3JlZW5jYXN0IC0gQnVpbGRpbmcgYW4gQXBwIHdpdGggRW1iZXIuanNdKGh0dHBz
Oi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9R2E5OWhNaTd3ZlkpCisqIFtBcHBsaWNhdGlvbnMg
YnVpbHQgd2l0aCBFbWJlci5qc10oaHR0cDovL2VtYmVyanMuY29tL2VtYmVyLXVzZXJzKQorKiBb
QmxvZ10oaHR0cDovL2VtYmVyanMuY29tL2Jsb2cpCisKK0FydGljbGVzIGFuZCBndWlkZXMgZnJv
bSB0aGUgY29tbXVuaXR5OgorCisqIFtHZXR0aW5nIEludG8gRW1iZXIuanNdKGh0dHA6Ly9uZXQu
dHV0c3BsdXMuY29tL3R1dG9yaWFscy9qYXZhc2NyaXB0LWFqYXgvZ2V0dGluZy1pbnRvLWVtYmVy
LWpzKQorKiBbRW1iZXJXYXRjaF0oaHR0cDovL2VtYmVyd2F0Y2guY29tKQorCitHZXQgaGVscCBm
cm9tIG90aGVyIEVtYmVyLmpzIHVzZXJzOgorCisqIFtFbWJlci5qcyBvbiBTdGFja092ZXJmbG93
XShodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zL3RhZ2dlZC9lbWJlci5qcykKKyog
W0VtYmVyLmpzIG9uIFR3aXR0ZXJdKGh0dHA6Ly90d2l0dGVyLmNvbS9lbWJlcmpzKQorKiBbRW1i
ZXIuanMgb24gR29vZ2xlICtdKGh0dHBzOi8vcGx1cy5nb29nbGUuY29tL2NvbW11bml0aWVzLzEw
NjM4NzA0OTc5MDM4NzQ3MTIwNSkKKworX0lmIHlvdSBoYXZlIG90aGVyIGhlbHBmdWwgbGlua3Mg
dG8gc2hhcmUsIG9yIGZpbmQgYW55IG9mIHRoZSBsaW5rcyBhYm92ZSBubyBsb25nZXIgd29yaywg
cGxlYXNlIFtsZXQgdXMga25vd10oaHR0cHM6Ly9naXRodWIuY29tL3Rhc3RlanMvdG9kb212Yy9p
c3N1ZXMpLl8KSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0Lmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNE
T01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Rlc3QuaHRtbAko
cmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0Lmh0bWwJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4K
KzxoZWFkPgorPHRpdGxlPk5hY3UgRE9NIEJlbmNoIC0gTm90IEFub3RoZXIgQ29tcGxldGVseSBV
bnJlYWxpc3RpYyBET00gQmVuY2htYXJrPC90aXRsZT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9iZW5j
aG1hcmsuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4KKworQmVuY2htYXJrUnVubmVyLnN1aXRlKHsK
KyAgICB0aXRsZTogJ1NpbXBsZUVtYmVySlMnLAorICAgIHVybDogJ2luZGV4Lmh0bWwnLAorICAg
IHByZXBhcmU6IGZ1bmN0aW9uIChjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsKKyAg
ICBjb250ZW50V2luZG93LlRvZG9zLlN0b3JlID0gY29udGVudFdpbmRvdy5EUy5TdG9yZS5leHRl
bmQoeworICAgIHJldmlzaW9uOiAxMiwKKyAgICBhZGFwdGVyOiAnVG9kb3MuTFNBZGFwdGVyJywK
KyAgICBjb21taXQ6IGZ1bmN0aW9uICgpIHsgfQorICAgIH0pOworCisgICAgdmFyIHByb21pc2Ug
PSBuZXcgU2ltcGxlUHJvbWlzZTsKKworICAgIGZ1bmN0aW9uIHJlc29sdmVJZlJlYWR5KCkgewor
ICAgIGlmIChjb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25ldy10b2RvJykpCisgICAg
cmV0dXJuIHByb21pc2UucmVzb2x2ZSgpOworICAgIHNldFRpbWVvdXQocmVzb2x2ZUlmUmVhZHks
IDEwKTsKKyAgICB9CisgICAgcmVzb2x2ZUlmUmVhZHkoKTsKKworICAgIHJldHVybiBwcm9taXNl
OworICAgIH0sCisgICAgdGVzdFN0ZXBzOiBmdW5jdGlvbiAoY29udGVudFdpbmRvdywgY29udGVu
dERvY3VtZW50KSB7CisgICAgY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdG9k
bycpLmZvY3VzKCk7CisgICAgdmFyIHZpZXdzID0gY29udGVudFdpbmRvdy5FbWJlci5WaWV3LnZp
ZXdzOworICAgIHZhciBlbWJlclJ1biA9IGNvbnRlbnRXaW5kb3cuRW1iZXIucnVuOworICAgIHZh
ciBudW1iZXJPZkl0ZW1zVG9BZGQgPSAxMDA7CisgICAgcmV0dXJuIFsKKyAgICBbJ0FkZGluZycg
KyBudW1iZXJPZkl0ZW1zVG9BZGQgKyAnSXRlbXMnLCBmdW5jdGlvbiAoKSB7CisgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBudW1iZXJPZkl0ZW1zVG9BZGQ7IGkrKykgeworICAgIGVtYmVyUnVuKGZ1
bmN0aW9uICgpIHsgdmlld3NbIm5ldy10b2RvIl0uc2V0KCd2YWx1ZScsICdTb21ldGhpbmcgdG8g
ZG8nKTsgfSk7CisgICAgZW1iZXJSdW4oZnVuY3Rpb24gKCkgeyB2aWV3c1sibmV3LXRvZG8iXS5p
bnNlcnROZXdsaW5lKGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpKTsgfSk7CisgICAgfQor
ICAgIH1dLAorICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKCkgeworICAgIHZh
ciBjaGVja2JveGVzID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbWJlci1j
aGVja2JveCcpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tib3hlcy5sZW5ndGg7IGkr
KykgeworICAgIHZhciB2aWV3ID0gdmlld3NbY2hlY2tib3hlc1tpXS5pZF07CisgICAgZW1iZXJS
dW4oZnVuY3Rpb24gKCkgeyB2aWV3LnNldCgnY2hlY2tlZCcsIHRydWUpOyB9KTsKKyAgICB9Cisg
ICAgfV0sCisgICAgWydEZWxldGluZ0l0ZW1zJywgZnVuY3Rpb24gKCkgeworICAgIHZhciBkZWxl
dGVCdXR0b25zID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7
CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGVCdXR0b25zLmxlbmd0aDsgaSsrKQorICAg
IGVtYmVyUnVuKGZ1bmN0aW9uICgpIHsgZGVsZXRlQnV0dG9uc1tpXS5jbGljaygpOyB9KTsKKyAg
ICB9XSwKKyAgICBdOworICAgIH0KK30pOworCis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5Pgor
PC9ib2R5PgorPC9odG1sPgpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5y
ZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jv
d2VyX2NvbXBvbmVudHMvZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIvbG9jYWxzdG9yYWdlX2Fk
YXB0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5y
ZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jv
d2VyX2NvbXBvbmVudHMvZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIvbG9jYWxzdG9yYWdlX2Fk
YXB0ZXIuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlV
bnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3JhZ2Vf
YWRhcHRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIxNSBAQAorRFMuTFNTZXJpYWxp
emVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKKworICBhZGRCZWxvbmdzVG86IGZ1bmN0
aW9uKGRhdGEsIHJlY29yZCwga2V5LCBhc3NvY2lhdGlvbikgeworICAgIGRhdGFba2V5XSA9IHJl
Y29yZC5nZXQoa2V5ICsgJy5pZCcpOworICB9LAorCisgIGFkZEhhc01hbnk6IGZ1bmN0aW9uKGRh
dGEsIHJlY29yZCwga2V5LCBhc3NvY2lhdGlvbikgeworICAgIGRhdGFba2V5XSA9IHJlY29yZC5n
ZXQoa2V5KS5tYXAoZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICByZXR1cm4gcmVjb3JkLmdldCgn
aWQnKTsKKyAgICB9KTsKKyAgfSwKKworICAvLyBleHRyYWN0IGV4cGVjdHMgYSByb290IGtleSwg
d2UgZG9uJ3Qgd2FudCB0byBzYXZlIGFsbCB0aGVzZSBrZXlzIHRvCisgIC8vIGxvY2FsU3RvcmFn
ZSBzbyB3ZSBnZW5lcmF0ZSB0aGUgcm9vdCBrZXlzIGhlcmUKKyAgZXh0cmFjdDogZnVuY3Rpb24o
bG9hZGVyLCBqc29uLCB0eXBlLCByZWNvcmQpIHsKKyAgICB0aGlzLl9zdXBlcihsb2FkZXIsIHRo
aXMucm9vdEpTT04oanNvbiwgdHlwZSksIHR5cGUsIHJlY29yZCk7CisgIH0sCisKKyAgZXh0cmFj
dE1hbnk6IGZ1bmN0aW9uKGxvYWRlciwganNvbiwgdHlwZSwgcmVjb3JkcykgeworICAgIHRoaXMu
X3N1cGVyKGxvYWRlciwgdGhpcy5yb290SlNPTihqc29uLCB0eXBlLCAncGx1cmFsaXplJyksIHR5
cGUsIHJlY29yZHMpOworICB9LAorCisgIHJvb3RKU09OOiBmdW5jdGlvbihqc29uLCB0eXBlLCBw
bHVyYWxpemUpIHsKKyAgICB2YXIgcm9vdCA9IHRoaXMucm9vdEZvclR5cGUodHlwZSk7CisgICAg
aWYgKHBsdXJhbGl6ZSA9PSAncGx1cmFsaXplJykgeyByb290ID0gdGhpcy5wbHVyYWxpemUocm9v
dCk7IH0KKyAgICB2YXIgcm9vdGVkSlNPTiA9IHt9OworICAgIHJvb3RlZEpTT05bcm9vdF0gPSBq
c29uOworICAgIHJldHVybiByb290ZWRKU09OOworICB9CisKK30pOworCitEUy5MU0FkYXB0ZXIg
PSBEUy5BZGFwdGVyLmV4dGVuZChFbWJlci5FdmVudGVkLCB7CisKKyAgaW5pdDogZnVuY3Rpb24o
KSB7CisgICAgdGhpcy5fbG9hZERhdGEoKTsKKyAgfSwKKworICBnZW5lcmF0ZUlkRm9yUmVjb3Jk
OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzMikuc2xp
Y2UoMikuc3Vic3RyKDAsNSk7CisgIH0sCisKKyAgc2VyaWFsaXplcjogRFMuTFNTZXJpYWxpemVy
LmNyZWF0ZSgpLAorCisgIGZpbmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgeworICAgIHZh
ciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOworICAgIHRoaXMuX2Fz
eW5jKGZ1bmN0aW9uKCl7CisgICAgICB2YXIgY29weSA9IEVtYmVyLmNvcHkobmFtZXNwYWNlLnJl
Y29yZHNbaWRdKTsKKyAgICAgIHRoaXMuZGlkRmluZFJlY29yZChzdG9yZSwgdHlwZSwgY29weSwg
aWQpOworICAgIH0pOworICB9LAorCisgIGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwg
aWRzKSB7CisgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7
CisgICAgdGhpcy5fYXN5bmMoZnVuY3Rpb24oKXsKKyAgICAgIHZhciByZXN1bHRzID0gW107Cisg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgeworICAgICAgICByZXN1
bHRzLnB1c2goRW1iZXIuY29weShuYW1lc3BhY2UucmVjb3Jkc1tpZHNbaV1dKSk7CisgICAgICB9
CisgICAgICB0aGlzLmRpZEZpbmRNYW55KHN0b3JlLCB0eXBlLCByZXN1bHRzKTsKKyAgICB9KTsK
KyAgfSwKKworICAvLyBTdXBwb3J0cyBxdWVyaWVzIHRoYXQgbG9vayBsaWtlIHRoaXM6CisgIC8v
CisgIC8vICAgeworICAvLyAgICAgPHByb3BlcnR5IHRvIHF1ZXJ5PjogPHZhbHVlIG9yIHJlZ2V4
IChmb3Igc3RyaW5ncykgdG8gbWF0Y2g+LAorICAvLyAgICAgLi4uCisgIC8vICAgfQorICAvLwor
ICAvLyBFdmVyeSBwcm9wZXJ0eSBhZGRlZCB0byB0aGUgcXVlcnkgaXMgYW4gIkFORCIgcXVlcnks
IG5vdCAiT1IiCisgIC8vCisgIC8vIEV4YW1wbGU6CisgIC8vCisgIC8vICBtYXRjaCByZWNvcmRz
IHdpdGggImNvbXBsZXRlOiB0cnVlIiBhbmQgdGhlIG5hbWUgImZvbyIgb3IgImJhciIKKyAgLy8K
KyAgLy8gICAgeyBjb21wbGV0ZTogdHJ1ZSwgbmFtZTogL2Zvb3xiYXIvIH0KKyAgZmluZFF1ZXJ5
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcXVlcnksIHJlY29yZEFycmF5KSB7CisgICAgdmFyIG5h
bWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7CisgICAgdGhpcy5fYXN5bmMo
ZnVuY3Rpb24oKSB7CisgICAgICB2YXIgcmVzdWx0cyA9IHRoaXMucXVlcnkobmFtZXNwYWNlLnJl
Y29yZHMsIHF1ZXJ5KTsKKyAgICAgIHRoaXMuZGlkRmluZFF1ZXJ5KHN0b3JlLCB0eXBlLCByZXN1
bHRzLCByZWNvcmRBcnJheSk7CisgICAgfSk7CisgIH0sCisKKyAgcXVlcnk6IGZ1bmN0aW9uKHJl
Y29yZHMsIHF1ZXJ5KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB2YXIgaWQsIHJlY29y
ZCwgcHJvcGVydHksIHRlc3QsIHB1c2g7CisgICAgZm9yIChpZCBpbiByZWNvcmRzKSB7CisgICAg
ICByZWNvcmQgPSByZWNvcmRzW2lkXTsKKyAgICAgIGZvciAocHJvcGVydHkgaW4gcXVlcnkpIHsK
KyAgICAgICAgdGVzdCA9IHF1ZXJ5W3Byb3BlcnR5XTsKKyAgICAgICAgcHVzaCA9IGZhbHNlOwor
ICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRlc3QpID09ICdbb2Jq
ZWN0IFJlZ0V4cF0nKSB7CisgICAgICAgICAgcHVzaCA9IHRlc3QudGVzdChyZWNvcmRbcHJvcGVy
dHldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwdXNoID0gcmVjb3JkW3Byb3BlcnR5
XSA9PT0gdGVzdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHB1c2gpIHsKKyAgICAg
ICAgcmVzdWx0cy5wdXNoKHJlY29yZCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1
bHRzOworICB9LAorCisgIGZpbmRBbGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlKSB7CisgICAgdmFy
IG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7CisgICAgdGhpcy5fYXN5
bmMoZnVuY3Rpb24oKSB7CisgICAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgICAgZm9yICh2YXIg
aWQgaW4gbmFtZXNwYWNlLnJlY29yZHMpIHsKKyAgICAgICAgcmVzdWx0cy5wdXNoKEVtYmVyLmNv
cHkobmFtZXNwYWNlLnJlY29yZHNbaWRdKSk7CisgICAgICB9CisgICAgICB0aGlzLmRpZEZpbmRB
bGwoc3RvcmUsIHR5cGUsIHJlc3VsdHMpOworICAgIH0pOworICB9LAorCisgIGNyZWF0ZVJlY29y
ZHM6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmRzKSB7CisgICAgdmFyIG5hbWVzcGFjZSA9
IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7CisgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0
aW9uKHJlY29yZCkgeworICAgICAgdGhpcy5fYWRkUmVjb3JkVG9OYW1lc3BhY2UobmFtZXNwYWNl
LCByZWNvcmQpOworICAgIH0sIHRoaXMpOworICAgIHRoaXMuX2FzeW5jKGZ1bmN0aW9uKCkgewor
ICAgICAgdGhpcy5fZGlkU2F2ZVJlY29yZHMoc3RvcmUsIHR5cGUsIHJlY29yZHMpOworICAgIH0p
OworICB9LAorCisgIHVwZGF0ZVJlY29yZHM6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmRz
KSB7CisgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7Cisg
ICAgdGhpcy5fYXN5bmMoZnVuY3Rpb24oKSB7CisgICAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rp
b24ocmVjb3JkKSB7CisgICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lkJyk7CisgICAgICAg
IG5hbWVzcGFjZS5yZWNvcmRzW2lkXSA9IHJlY29yZC5zZXJpYWxpemUoe2luY2x1ZGVJZDp0cnVl
fSk7CisgICAgICB9LCB0aGlzKTsKKyAgICAgIHRoaXMuX2RpZFNhdmVSZWNvcmRzKHN0b3JlLCB0
eXBlLCByZWNvcmRzKTsKKyAgICB9KTsKKyAgfSwKKworICBkZWxldGVSZWNvcmRzOiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgcmVjb3JkcykgeworICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1l
c3BhY2VGb3JUeXBlKHR5cGUpOworICAgIHRoaXMuX2FzeW5jKGZ1bmN0aW9uKCkgeworICAgICAg
cmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgICB2YXIgaWQgPSByZWNv
cmQuZ2V0KCdpZCcpOworICAgICAgICBkZWxldGUgbmFtZXNwYWNlLnJlY29yZHNbaWRdOworICAg
ICAgfSk7CisgICAgICB0aGlzLl9kaWRTYXZlUmVjb3JkcyhzdG9yZSwgdHlwZSwgcmVjb3Jkcyk7
CisgICAgfSk7CisKKyAgfSwKKworICBkaXJ0eVJlY29yZHNGb3JIYXNNYW55Q2hhbmdlOiBmdW5j
dGlvbihkaXJ0eVNldCwgcGFyZW50LCByZWxhdGlvbnNoaXApIHsKKyAgICBkaXJ0eVNldC5hZGQo
cGFyZW50KTsKKyAgfSwKKworICBkaXJ0eVJlY29yZHNGb3JCZWxvbmdzVG9DaGFuZ2U6IGZ1bmN0
aW9uKGRpcnR5U2V0LCBjaGlsZCwgcmVsYXRpb25zaGlwKSB7CisgICAgZGlydHlTZXQuYWRkKGNo
aWxkKTsKKyAgfSwKKworICAvLyBwcml2YXRlCisKKyAgX2dldE5hbWVzcGFjZTogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlIHx8ICdEUy5MU0FkYXB0ZXInOworICB9LAor
CisgIF9sb2FkRGF0YTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHN0b3JhZ2UgPSBsb2NhbFN0b3Jh
Z2UuZ2V0SXRlbSh0aGlzLl9nZXROYW1lc3BhY2UoKSk7CisgICAgdGhpcy5fZGF0YSA9IHN0b3Jh
Z2UgPyBKU09OLnBhcnNlKHN0b3JhZ2UpIDoge307CisgIH0sCisKKyAgX2RpZFNhdmVSZWNvcmRz
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcykgeworICAgIHZhciBzdWNjZXNzID0gdGhp
cy5fc2F2ZURhdGEoKTsKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgc3RvcmUuZGlkU2F2ZVJl
Y29yZHMocmVjb3Jkcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlY29yZHMuZm9yRWFjaChmdW5j
dGlvbihyZWNvcmQpIHsKKyAgICAgICAgc3RvcmUucmVjb3JkV2FzRXJyb3IocmVjb3JkKTsKKyAg
ICAgIH0pOworICAgICAgdGhpcy50cmlnZ2VyKCdRVU9UQV9FWENFRURFRF9FUlInLCByZWNvcmRz
KTsKKyAgICB9CisgIH0sCisKKyAgX3NhdmVEYXRhOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgewor
ICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5fZ2V0TmFtZXNwYWNlKCksIEpTT04uc3Ry
aW5naWZ5KHRoaXMuX2RhdGEpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2goZXJy
b3IpIHsKKyAgICAgIGlmIChlcnJvci5uYW1lID09ICdRVU9UQV9FWENFRURFRF9FUlInKSB7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBF
cnJvcihlcnJvcik7CisgICAgICB9CisgICAgfQorICB9LAorCisgIF9uYW1lc3BhY2VGb3JUeXBl
OiBmdW5jdGlvbih0eXBlKSB7CisgICAgdmFyIG5hbWVzcGFjZSA9IHR5cGUudXJsIHx8IHR5cGUu
dG9TdHJpbmcoKTsKKyAgICByZXR1cm4gdGhpcy5fZGF0YVtuYW1lc3BhY2VdIHx8ICgKKyAgICAg
IHRoaXMuX2RhdGFbbmFtZXNwYWNlXSA9IHtyZWNvcmRzOiB7fX0KKyAgICApOworICB9LAorCisg
IF9hZGRSZWNvcmRUb05hbWVzcGFjZTogZnVuY3Rpb24obmFtZXNwYWNlLCByZWNvcmQpIHsKKyAg
ICB2YXIgZGF0YSA9IHJlY29yZC5zZXJpYWxpemUoe2luY2x1ZGVJZDogdHJ1ZX0pOworICAgIG5h
bWVzcGFjZS5yZWNvcmRzW2RhdGEuaWRdID0gZGF0YTsKKyAgfSwKKworICBfYXN5bmM6IGZ1bmN0
aW9uKGNhbGxiYWNrKSB7CisgICAgdmFyIF90aGlzID0gdGhpczsKKyAgICBzZXRUaW1lb3V0KGZ1
bmN0aW9uKCl7CisgICAgICBFbWJlci5ydW4oX3RoaXMsIGNhbGxiYWNrKTsKKyAgICB9LCAxKTsK
KyAgfQorCit9KTsKKwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFs
aXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
X2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0
cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMJKHJldmlzaW9u
IDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9l
bWJlci9lbWJlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI2ODM5IEBACisvLyBWZXJz
aW9uOiB2MS4wLjAtcmMuMQorLy8gTGFzdCBjb21taXQ6IDhiMDYxYjQgKDIwMTMtMDItMTUgMTI6
MTA6MjIgLTA4MDApCisKKworKGZ1bmN0aW9uKCkgeworLypnbG9iYWwgX19mYWlsX18qLworCisv
KioKK0VtYmVyIERlYnVnCisKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItZGVidWcK
KyovCisKKy8qKgorQGNsYXNzIEVtYmVyCisqLworCitpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVv
ZiBFbWJlcikgeworICBFbWJlciA9IHt9OworCisgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9m
IHdpbmRvdykgeworICAgIHdpbmRvdy5FbSA9IHdpbmRvdy5FbWJlciA9IEVtID0gRW1iZXI7Cisg
IH0KK30KKworRW1iZXIuRU5WID0gJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFTlYgPyB7fSA6IEVO
VjsKKworaWYgKCEoJ01BTkRBVE9SWV9TRVRURVInIGluIEVtYmVyLkVOVikpIHsKKyAgRW1iZXIu
RU5WLk1BTkRBVE9SWV9TRVRURVIgPSB0cnVlOyAvLyBkZWZhdWx0IHRvIHRydWUgZm9yIGRlYnVn
IGRpc3QKK30KKworLyoqCisgIERlZmluZSBhbiBhc3NlcnRpb24gdGhhdCB3aWxsIHRocm93IGFu
IGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdAorICBtZXQuIEVtYmVyIGJ1aWxkIHRv
b2xzIHdpbGwgcmVtb3ZlIGFueSBjYWxscyB0byBgRW1iZXIuYXNzZXJ0KClgIHdoZW4KKyAgZG9p
bmcgYSBwcm9kdWN0aW9uIGJ1aWxkLiBFeGFtcGxlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgLy8g
VGVzdCBmb3IgdHJ1dGhpbmVzcworICBFbWJlci5hc3NlcnQoJ011c3QgcGFzcyBhIHZhbGlkIG9i
amVjdCcsIG9iaik7CisgIC8vIEZhaWwgdW5jb25kaXRpb25hbGx5CisgIEVtYmVyLmFzc2VydCgn
VGhpcyBjb2RlIHBhdGggc2hvdWxkIG5ldmVyIGJlIHJ1bicpCisgIGBgYAorCisgIEBtZXRob2Qg
YXNzZXJ0CisgIEBwYXJhbSB7U3RyaW5nfSBkZXNjIEEgZGVzY3JpcHRpb24gb2YgdGhlIGFzc2Vy
dGlvbi4gVGhpcyB3aWxsIGJlY29tZQorICAgIHRoZSB0ZXh0IG9mIHRoZSBFcnJvciB0aHJvd24g
aWYgdGhlIGFzc2VydGlvbiBmYWlscy4KKyAgQHBhcmFtIHtCb29sZWFufSB0ZXN0IE11c3QgYmUg
dHJ1dGh5IGZvciB0aGUgYXNzZXJ0aW9uIHRvIHBhc3MuIElmCisgICAgZmFsc3ksIGFuIGV4Y2Vw
dGlvbiB3aWxsIGJlIHRocm93bi4KKyovCitFbWJlci5hc3NlcnQgPSBmdW5jdGlvbihkZXNjLCB0
ZXN0KSB7CisgIGlmICghdGVzdCkgdGhyb3cgbmV3IEVycm9yKCJhc3NlcnRpb24gZmFpbGVkOiAi
K2Rlc2MpOworfTsKKworCisvKioKKyAgRGlzcGxheSBhIHdhcm5pbmcgd2l0aCB0aGUgcHJvdmlk
ZWQgbWVzc2FnZS4gRW1iZXIgYnVpbGQgdG9vbHMgd2lsbAorICByZW1vdmUgYW55IGNhbGxzIHRv
IGBFbWJlci53YXJuKClgIHdoZW4gZG9pbmcgYSBwcm9kdWN0aW9uIGJ1aWxkLgorCisgIEBtZXRo
b2Qgd2FybgorICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIHdhcm5pbmcgdG8gZGlzcGxheS4K
KyAgQHBhcmFtIHtCb29sZWFufSB0ZXN0IEFuIG9wdGlvbmFsIGJvb2xlYW4uIElmIGZhbHN5LCB0
aGUgd2FybmluZworICAgIHdpbGwgYmUgZGlzcGxheWVkLgorKi8KK0VtYmVyLndhcm4gPSBmdW5j
dGlvbihtZXNzYWdlLCB0ZXN0KSB7CisgIGlmICghdGVzdCkgeworICAgIEVtYmVyLkxvZ2dlci53
YXJuKCJXQVJOSU5HOiAiK21lc3NhZ2UpOworICAgIGlmICgndHJhY2UnIGluIEVtYmVyLkxvZ2dl
cikgRW1iZXIuTG9nZ2VyLnRyYWNlKCk7CisgIH0KK307CisKKy8qKgorICBEaXNwbGF5IGEgZGVi
dWcgbm90aWNlLiBFbWJlciBidWlsZCB0b29scyB3aWxsIHJlbW92ZSBhbnkgY2FsbHMgdG8KKyAg
YEVtYmVyLmRlYnVnKClgIHdoZW4gZG9pbmcgYSBwcm9kdWN0aW9uIGJ1aWxkLgorCisgIGBgYGph
dmFzY3JpcHQKKyAgRW1iZXIuZGVidWcoIkknbSBhIGRlYnVnIG5vdGljZSEiKTsKKyAgYGBgCisK
KyAgQG1ldGhvZCBkZWJ1ZworICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlYnVnIG1lc3Nh
Z2UgdG8gZGlzcGxheS4KKyovCitFbWJlci5kZWJ1ZyA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAg
RW1iZXIuTG9nZ2VyLmRlYnVnKCJERUJVRzogIittZXNzYWdlKTsKK307CisKKy8qKgorICBEaXNw
bGF5IGEgZGVwcmVjYXRpb24gd2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBh
IHN0YWNrIHRyYWNlCisgIChDaHJvbWUgYW5kIEZpcmVmb3ggb25seSkuIEVtYmVyIGJ1aWxkIHRv
b2xzIHdpbGwgcmVtb3ZlIGFueSBjYWxscyB0bworICBgRW1iZXIuZGVwcmVjYXRlKClgIHdoZW4g
ZG9pbmcgYSBwcm9kdWN0aW9uIGJ1aWxkLgorCisgIEBtZXRob2QgZGVwcmVjYXRlCisgIEBwYXJh
bSB7U3RyaW5nfSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2YgdGhlIGRlcHJlY2F0aW9uLgorICBA
cGFyYW0ge0Jvb2xlYW59IHRlc3QgQW4gb3B0aW9uYWwgYm9vbGVhbi4gSWYgZmFsc3ksIHRoZSBk
ZXByZWNhdGlvbgorICAgIHdpbGwgYmUgZGlzcGxheWVkLgorKi8KK0VtYmVyLmRlcHJlY2F0ZSA9
IGZ1bmN0aW9uKG1lc3NhZ2UsIHRlc3QpIHsKKyAgaWYgKEVtYmVyICYmIEVtYmVyLlRFU1RJTkdf
REVQUkVDQVRJT04pIHsgcmV0dXJuOyB9CisKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEp
IHsgdGVzdCA9IGZhbHNlOyB9CisgIGlmICh0ZXN0KSB7IHJldHVybjsgfQorCisgIGlmIChFbWJl
ciAmJiBFbWJlci5FTlYuUkFJU0VfT05fREVQUkVDQVRJT04pIHsgdGhyb3cgbmV3IEVycm9yKG1l
c3NhZ2UpOyB9CisKKyAgdmFyIGVycm9yOworCisgIC8vIFdoZW4gdXNpbmcgbmV3IEVycm9yLCB3
ZSBjYW4ndCBkbyB0aGUgYXJndW1lbnRzIGNoZWNrIGZvciBDaHJvbWUuIEFsdGVybmF0aXZlcyBh
cmUgd2VsY29tZQorICB0cnkgeyBfX2ZhaWxfXy5mYWlsKCk7IH0gY2F0Y2ggKGUpIHsgZXJyb3Ig
PSBlOyB9CisKKyAgaWYgKEVtYmVyLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OICYmIGVy
cm9yLnN0YWNrKSB7CisgICAgdmFyIHN0YWNrLCBzdGFja1N0ciA9ICcnOworICAgIGlmIChlcnJv
clsnYXJndW1lbnRzJ10pIHsKKyAgICAgIC8vIENocm9tZQorICAgICAgc3RhY2sgPSBlcnJvci5z
dGFjay5yZXBsYWNlKC9eXHMrYXRccysvZ20sICcnKS4KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmVwbGFjZSgvXihbXlwoXSs/KShbXG4kXSkvZ20sICd7YW5vbnltb3VzfSgkMSkkMicpLgor
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XHMq
XCgoW15cKV0rKVwpL2dtLCAne2Fub255bW91c30oJDEpJykuc3BsaXQoJ1xuJyk7CisgICAgICBz
dGFjay5zaGlmdCgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGaXJlZm94CisgICAgICBzdGFj
ayA9IGVycm9yLnN0YWNrLnJlcGxhY2UoLyg/OlxuQDowKT9ccyskL20sICcnKS4KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVwbGFjZSgvXlwoL2dtLCAne2Fub255bW91c30oJykuc3BsaXQo
J1xuJyk7CisgICAgfQorCisgICAgc3RhY2tTdHIgPSAiXG4gICAgIiArIHN0YWNrLnNsaWNlKDIp
LmpvaW4oIlxuICAgICIpOworICAgIG1lc3NhZ2UgPSBtZXNzYWdlICsgc3RhY2tTdHI7CisgIH0K
KworICBFbWJlci5Mb2dnZXIud2FybigiREVQUkVDQVRJT046ICIrbWVzc2FnZSk7Cit9OworCisK
KworLyoqCisgIERpc3BsYXkgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVk
IG1lc3NhZ2UgYW5kIGEgc3RhY2sgdHJhY2UKKyAgKENocm9tZSBhbmQgRmlyZWZveCBvbmx5KSB3
aGVuIHRoZSB3cmFwcGVkIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgRW1iZXIgYnVpbGQgdG9vbHMg
d2lsbCBub3QgcmVtb3ZlIGNhbGxzIHRvIGBFbWJlci5kZXByZWNhdGVGdW5jKClgLCB0aG91Z2gK
KyAgbm8gd2FybmluZ3Mgd2lsbCBiZSBzaG93biBpbiBwcm9kdWN0aW9uLgorCisgIEBtZXRob2Qg
ZGVwcmVjYXRlRnVuYworICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9m
IHRoZSBkZXByZWNhdGlvbi4KKyAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24g
dG8gYmUgZGVwcmVjYXRlZC4KKyovCitFbWJlci5kZXByZWNhdGVGdW5jID0gZnVuY3Rpb24obWVz
c2FnZSwgZnVuYykgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgRW1iZXIuZGVwcmVjYXRl
KG1lc3NhZ2UpOworICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH07
Cit9OworCit9KSgpOworCisvLyBWZXJzaW9uOiB2MS4wLjAtcmMuMQorLy8gTGFzdCBjb21taXQ6
IDhiMDYxYjQgKDIwMTMtMDItMTUgMTI6MTA6MjIgLTA4MDApCisKKworKGZ1bmN0aW9uKCkgewor
dmFyIGRlZmluZSwgcmVxdWlyZU1vZHVsZTsKKworKGZ1bmN0aW9uKCkgeworICB2YXIgcmVnaXN0
cnkgPSB7fSwgc2VlbiA9IHt9OworCisgIGRlZmluZSA9IGZ1bmN0aW9uKG5hbWUsIGRlcHMsIGNh
bGxiYWNrKSB7CisgICAgcmVnaXN0cnlbbmFtZV0gPSB7IGRlcHM6IGRlcHMsIGNhbGxiYWNrOiBj
YWxsYmFjayB9OworICB9OworCisgIHJlcXVpcmVNb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7Cisg
ICAgaWYgKHNlZW5bbmFtZV0pIHsgcmV0dXJuIHNlZW5bbmFtZV07IH0KKyAgICBzZWVuW25hbWVd
ID0ge307CisKKyAgICB2YXIgbW9kID0gcmVnaXN0cnlbbmFtZV0sCisgICAgICAgIGRlcHMgPSBt
b2QuZGVwcywKKyAgICAgICAgY2FsbGJhY2sgPSBtb2QuY2FsbGJhY2ssCisgICAgICAgIHJlaWZp
ZWQgPSBbXSwKKyAgICAgICAgZXhwb3J0czsKKworICAgIGZvciAodmFyIGk9MCwgbD1kZXBzLmxl
bmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIGlmIChkZXBzW2ldID09PSAnZXhwb3J0cycpIHsKKyAg
ICAgICAgcmVpZmllZC5wdXNoKGV4cG9ydHMgPSB7fSk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICByZWlmaWVkLnB1c2gocmVxdWlyZU1vZHVsZShkZXBzW2ldKSk7CisgICAgICB9CisgICAgfQor
CisgICAgdmFyIHZhbHVlID0gY2FsbGJhY2suYXBwbHkodGhpcywgcmVpZmllZCk7CisgICAgcmV0
dXJuIHNlZW5bbmFtZV0gPSBleHBvcnRzIHx8IHZhbHVlOworICB9OworfSkoKTsKKyhmdW5jdGlv
bigpIHsKKy8qZ2xvYmFscyBFbTp0cnVlIEVOViAqLworCisvKioKK0Btb2R1bGUgZW1iZXIKK0Bz
dWJtb2R1bGUgZW1iZXItbWV0YWwKKyovCisKKy8qKgorICBBbGwgRW1iZXIgbWV0aG9kcyBhbmQg
ZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiB0aGlzIG5hbWVzcGFjZS4gWW91CisgIGdl
bmVyYWxseSBzaG91bGQgbm90IGFkZCBuZXcgcHJvcGVydGllcyB0byB0aGlzIG5hbWVzcGFjZSBh
cyBpdCBtYXkgYmUKKyAgb3ZlcndyaXR0ZW4gYnkgZnV0dXJlIHZlcnNpb25zIG9mIEVtYmVyLgor
CisgIFlvdSBjYW4gYWxzbyB1c2UgdGhlIHNob3J0aGFuZCBgRW1gIGluc3RlYWQgb2YgYEVtYmVy
YC4KKworICBFbWJlci1SdW50aW1lIGlzIGEgZnJhbWV3b3JrIHRoYXQgcHJvdmlkZXMgY29yZSBm
dW5jdGlvbnMgZm9yIEVtYmVyIGluY2x1ZGluZworICBjcm9zcy1wbGF0Zm9ybSBmdW5jdGlvbnMs
IHN1cHBvcnQgZm9yIHByb3BlcnR5IG9ic2VydmluZyBhbmQgb2JqZWN0cy4gSXRzCisgIGZvY3Vz
IGlzIG9uIHNtYWxsIHNpemUgYW5kIHBlcmZvcm1hbmNlLiBZb3UgY2FuIHVzZSB0aGlzIGluIHBs
YWNlIG9mIG9yCisgIGFsb25nLXNpZGUgb3RoZXIgY3Jvc3MtcGxhdGZvcm0gbGlicmFyaWVzIHN1
Y2ggYXMgalF1ZXJ5LgorCisgIFRoZSBjb3JlIFJ1bnRpbWUgZnJhbWV3b3JrIGlzIGJhc2VkIG9u
IHRoZSBqUXVlcnkgQVBJIHdpdGggYSBudW1iZXIgb2YKKyAgcGVyZm9ybWFuY2Ugb3B0aW1pemF0
aW9ucy4KKworICBAY2xhc3MgRW1iZXIKKyAgQHN0YXRpYworICBAdmVyc2lvbiAxLjAuMC1yYy4x
CisqLworCitpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFbWJlcikgeworICAvLyBDcmVhdGUg
Y29yZSBvYmplY3QuIE1ha2UgaXQgYWN0IGxpa2UgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTmFtZXNw
YWNlIHNvIHRoYXQKKyAgLy8gb2JqZWN0cyBhc3NpZ25lZCB0byBpdCBhcmUgZ2l2ZW4gYSBzYW5l
IHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgRW1iZXIgPSB7fTsKK30KKworLy8gRGVmYXVsdCBp
bXBvcnRzLCBleHBvcnRzIGFuZCBsb29rdXAgdG8gdGhlIGdsb2JhbCBvYmplY3Q7Cit2YXIgaW1w
b3J0cyA9IEVtYmVyLmltcG9ydHMgPSBFbWJlci5pbXBvcnRzIHx8IHRoaXM7Cit2YXIgZXhwb3J0
cyA9IEVtYmVyLmV4cG9ydHMgPSBFbWJlci5leHBvcnRzIHx8IHRoaXM7Cit2YXIgbG9va3VwICA9
IEVtYmVyLmxvb2t1cCAgPSBFbWJlci5sb29rdXAgIHx8IHRoaXM7CisKKy8vIGFsaWFzZXMgbmVl
ZGVkIHRvIGtlZXAgbWluaWZpZXJzIGZyb20gcmVtb3ZpbmcgdGhlIGdsb2JhbCBjb250ZXh0Citl
eHBvcnRzLkVtID0gZXhwb3J0cy5FbWJlciA9IEVtID0gRW1iZXI7CisKKy8vIE1ha2Ugc3VyZSB0
aGVzZSBhcmUgc2V0IHdoZXRoZXIgRW1iZXIgd2FzIGFscmVhZHkgZGVmaW5lZCBvciBub3QKKwor
RW1iZXIuaXNOYW1lc3BhY2UgPSB0cnVlOworCitFbWJlci50b1N0cmluZyA9IGZ1bmN0aW9uKCkg
eyByZXR1cm4gIkVtYmVyIjsgfTsKKworCisvKioKKyAgQHByb3BlcnR5IFZFUlNJT04KKyAgQHR5
cGUgU3RyaW5nCisgIEBkZWZhdWx0ICcxLjAuMC1yYy4xJworICBAZmluYWwKKyovCitFbWJlci5W
RVJTSU9OID0gJzEuMC4wLXJjLjEnOworCisvKioKKyAgU3RhbmRhcmQgZW52aXJvbm1lbnRhbCB2
YXJpYWJsZXMuIFlvdSBjYW4gZGVmaW5lIHRoZXNlIGluIGEgZ2xvYmFsIGBFTlZgCisgIHZhcmlh
YmxlIGJlZm9yZSBsb2FkaW5nIEVtYmVyIHRvIGNvbnRyb2wgdmFyaW91cyBjb25maWd1cmF0aW9u
CisgIHNldHRpbmdzLgorCisgIEBwcm9wZXJ0eSBFTlYKKyAgQHR5cGUgSGFzaAorKi8KK0VtYmVy
LkVOViA9IEVtYmVyLkVOViB8fCAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFTlYgPyB7fSA6IEVO
Vik7CisKK0VtYmVyLmNvbmZpZyA9IEVtYmVyLmNvbmZpZyB8fCB7fTsKKworLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gQk9P
VFNUUkFQCisvLworCisvKioKKyAgRGV0ZXJtaW5lcyB3aGV0aGVyIEVtYmVyIHNob3VsZCBlbmhh
bmNlcyBzb21lIGJ1aWx0LWluIG9iamVjdCBwcm90b3R5cGVzIHRvCisgIHByb3ZpZGUgYSBtb3Jl
IGZyaWVuZGx5IEFQSS4gSWYgZW5hYmxlZCwgYSBmZXcgbWV0aG9kcyB3aWxsIGJlIGFkZGVkIHRv
CisgIGBGdW5jdGlvbmAsIGBTdHJpbmdgLCBhbmQgYEFycmF5YC4gYE9iamVjdC5wcm90b3R5cGVg
IHdpbGwgbm90IGJlIGVuaGFuY2VkLAorICB3aGljaCBpcyB0aGUgb25lIHRoYXQgY2F1c2VzIG1v
c3QgdHJvdWJsZSBmb3IgcGVvcGxlLgorCisgIEluIGdlbmVyYWwgd2UgcmVjb21tZW5kIGxlYXZp
bmcgdGhpcyBvcHRpb24gc2V0IHRvIHRydWUgc2luY2UgaXQgcmFyZWx5CisgIGNvbmZsaWN0cyB3
aXRoIG90aGVyIGNvZGUuIElmIHlvdSBuZWVkIHRvIHR1cm4gaXQgb2ZmIGhvd2V2ZXIsIHlvdSBj
YW4KKyAgZGVmaW5lIGFuIGBFTlYuRVhURU5EX1BST1RPVFlQRVNgIGNvbmZpZyB0byBkaXNhYmxl
IGl0LgorCisgIEBwcm9wZXJ0eSBFWFRFTkRfUFJPVE9UWVBFUworICBAdHlwZSBCb29sZWFuCisg
IEBkZWZhdWx0IHRydWUKKyovCitFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9IEVtYmVyLkVOVi5F
WFRFTkRfUFJPVE9UWVBFUzsKKworaWYgKHR5cGVvZiBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9
PT0gJ3VuZGVmaW5lZCcpIHsKKyAgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPSB0cnVlOworfQor
CisvKioKKyAgRGV0ZXJtaW5lcyB3aGV0aGVyIEVtYmVyIGxvZ3MgYSBmdWxsIHN0YWNrIHRyYWNl
IGR1cmluZyBkZXByZWNhdGlvbiB3YXJuaW5ncworCisgIEBwcm9wZXJ0eSBMT0dfU1RBQ0tUUkFD
RV9PTl9ERVBSRUNBVElPTgorICBAdHlwZSBCb29sZWFuCisgIEBkZWZhdWx0IHRydWUKKyovCitF
bWJlci5MT0dfU1RBQ0tUUkFDRV9PTl9ERVBSRUNBVElPTiA9IChFbWJlci5FTlYuTE9HX1NUQUNL
VFJBQ0VfT05fREVQUkVDQVRJT04gIT09IGZhbHNlKTsKKworLyoqCisgIERldGVybWluZXMgd2hl
dGhlciBFbWJlciBzaG91bGQgYWRkIEVDTUFTY3JpcHQgNSBzaGltcyB0byBvbGRlciBicm93c2Vy
cy4KKworICBAcHJvcGVydHkgU0hJTV9FUzUKKyAgQHR5cGUgQm9vbGVhbgorICBAZGVmYXVsdCBF
bWJlci5FWFRFTkRfUFJPVE9UWVBFUworKi8KK0VtYmVyLlNISU1fRVM1ID0gKEVtYmVyLkVOVi5T
SElNX0VTNSA9PT0gZmFsc2UpID8gZmFsc2UgOiBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUzsKKwor
LyoqCisgIEVtcHR5IGZ1bmN0aW9uLiBVc2VmdWwgZm9yIHNvbWUgb3BlcmF0aW9ucy4KKworICBA
bWV0aG9kIEsKKyAgQHByaXZhdGUKKyAgQHJldHVybiB7T2JqZWN0fQorKi8KK0VtYmVyLksgPSBm
dW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH07CisKKworLy8gU3R1YiBvdXQgdGhlIG1ldGhvZHMg
ZGVmaW5lZCBieSB0aGUgZW1iZXItZGVidWcgcGFja2FnZSBpbiBjYXNlIGl0J3Mgbm90IGxvYWRl
ZAorCitpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFbWJlci5hc3NlcnQpIHsgRW1iZXIuYXNz
ZXJ0ID0gRW1iZXIuSzsgfQoraWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIud2Fybikg
eyBFbWJlci53YXJuID0gRW1iZXIuSzsgfQoraWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1i
ZXIuZGVidWcpIHsgRW1iZXIuZGVidWcgPSBFbWJlci5LOyB9CitpZiAoJ3VuZGVmaW5lZCcgPT09
IHR5cGVvZiBFbWJlci5kZXByZWNhdGUpIHsgRW1iZXIuZGVwcmVjYXRlID0gRW1iZXIuSzsgfQor
aWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuZGVwcmVjYXRlRnVuYykgeworICBFbWJl
ci5kZXByZWNhdGVGdW5jID0gZnVuY3Rpb24oXywgZnVuYykgeyByZXR1cm4gZnVuYzsgfTsKK30K
KworLyoqCisgIFByZXZpb3VzbHkgd2UgdXNlZCBgRW1iZXIuJC51dWlkYCwgaG93ZXZlciBgJC51
dWlkYCBoYXMgYmVlbiByZW1vdmVkIGZyb20KKyAgalF1ZXJ5IG1hc3Rlci4gV2UnbGwganVzdCBi
b290c3RyYXAgb3VyIG93biB1dWlkIG5vdy4KKworICBAcHJvcGVydHkgdXVpZAorICBAdHlwZSBO
dW1iZXIKKyAgQHByaXZhdGUKKyovCitFbWJlci51dWlkID0gMDsKKworLy8gLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gTE9HR0VS
CisvLworCitmdW5jdGlvbiBjb25zb2xlTWV0aG9kKG5hbWUpIHsKKyAgaWYgKGltcG9ydHMuY29u
c29sZSAmJiBpbXBvcnRzLmNvbnNvbGVbbmFtZV0pIHsKKyAgICAvLyBPbGRlciBJRSBkb2Vzbid0
IHN1cHBvcnQgYXBwbHksIGJ1dCBDaHJvbWUgbmVlZHMgaXQKKyAgICBpZiAoaW1wb3J0cy5jb25z
b2xlW25hbWVdLmFwcGx5KSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgIGlt
cG9ydHMuY29uc29sZVtuYW1lXS5hcHBseShpbXBvcnRzLmNvbnNvbGUsIGFyZ3VtZW50cyk7Cisg
ICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAg
IHZhciBtZXNzYWdlID0gQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsICcsICcp
OworICAgICAgICBpbXBvcnRzLmNvbnNvbGVbbmFtZV0obWVzc2FnZSk7CisgICAgICB9OworICAg
IH0KKyAgfQorfQorCisvKioKKyAgSW5zaWRlIEVtYmVyLU1ldGFsLCBzaW1wbHkgdXNlcyB0aGUg
bWV0aG9kcyBmcm9tIGBpbXBvcnRzLmNvbnNvbGVgLgorICBPdmVycmlkZSB0aGlzIHRvIHByb3Zp
ZGUgbW9yZSByb2J1c3QgbG9nZ2luZyBmdW5jdGlvbmFsaXR5LgorCisgIEBjbGFzcyBMb2dnZXIK
KyAgQG5hbWVzcGFjZSBFbWJlcgorKi8KK0VtYmVyLkxvZ2dlciA9IHsKKyAgbG9nOiAgIGNvbnNv
bGVNZXRob2QoJ2xvZycpICAgfHwgRW1iZXIuSywKKyAgd2FybjogIGNvbnNvbGVNZXRob2QoJ3dh
cm4nKSAgfHwgRW1iZXIuSywKKyAgZXJyb3I6IGNvbnNvbGVNZXRob2QoJ2Vycm9yJykgfHwgRW1i
ZXIuSywKKyAgaW5mbzogIGNvbnNvbGVNZXRob2QoJ2luZm8nKSAgfHwgRW1iZXIuSywKKyAgZGVi
dWc6IGNvbnNvbGVNZXRob2QoJ2RlYnVnJykgfHwgY29uc29sZU1ldGhvZCgnaW5mbycpIHx8IEVt
YmVyLksKK307CisKKworLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgorLy8gRVJST1IgSEFORExJTkcKKy8vCisKKy8qKgorICBBIGZ1
bmN0aW9uIG1heSBiZSBhc3NpZ25lZCB0byBgRW1iZXIub25lcnJvcmAgdG8gYmUgY2FsbGVkIHdo
ZW4gRW1iZXIKKyAgaW50ZXJuYWxzIGVuY291bnRlciBhbiBlcnJvci4gVGhpcyBpcyB1c2VmdWwg
Zm9yIHNwZWNpYWxpemVkIGVycm9yIGhhbmRsaW5nCisgIGFuZCByZXBvcnRpbmcgY29kZS4KKwor
ICBAZXZlbnQgb25lcnJvcgorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7RXhjZXB0aW9ufSBlcnJv
ciB0aGUgZXJyb3Igb2JqZWN0CisqLworRW1iZXIub25lcnJvciA9IG51bGw7CisKKy8qKgorICBA
cHJpdmF0ZQorCisgIFdyYXAgY29kZSBibG9jayBpbiBhIHRyeS9jYXRjaCBpZiB7eyNjcm9zc0xp
bmsgIkVtYmVyL29uZXJyb3IifX17ey9jcm9zc0xpbmt9fSBpcyBzZXQuCisKKyAgQG1ldGhvZCBo
YW5kbGVFcnJvcnMKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgIEBw
YXJhbSBbY29udGV4dF0KKyovCitFbWJlci5oYW5kbGVFcnJvcnMgPSBmdW5jdGlvbihmdW5jLCBj
b250ZXh0KSB7CisgIC8vIFVuZm9ydHVuYXRlbHkgaW4gc29tZSBicm93c2VycyB3ZSBsb3NlIHRo
ZSBiYWNrdHJhY2UgaWYgd2UgcmV0aHJvdyB0aGUgZXhpc3RpbmcgZXJyb3IsCisgIC8vIHNvIGlu
IHRoZSBldmVudCB0aGF0IHdlIGRvbid0IGhhdmUgYW4gYG9uZXJyb3JgIGhhbmRsZXIgd2UgZG9u
J3Qgd3JhcCBpbiBhIHRyeS9jYXRjaAorICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIEVtYmVy
Lm9uZXJyb3IpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCB8
fCB0aGlzKTsKKyAgICB9IGNhdGNoIChlcnJvcikgeworICAgICAgRW1iZXIub25lcnJvcihlcnJv
cik7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQgfHwg
dGhpcyk7CisgIH0KK307CisKK0VtYmVyLm1lcmdlID0gZnVuY3Rpb24ob3JpZ2luYWwsIHVwZGF0
ZXMpIHsKKyAgZm9yICh2YXIgcHJvcCBpbiB1cGRhdGVzKSB7CisgICAgaWYgKCF1cGRhdGVzLmhh
c093blByb3BlcnR5KHByb3ApKSB7IGNvbnRpbnVlOyB9CisgICAgb3JpZ2luYWxbcHJvcF0gPSB1
cGRhdGVzW3Byb3BdOworICB9Cit9OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLypn
bG9iYWxzIE5vZGUgKi8KKy8qKgorQG1vZHVsZSBlbWJlci1tZXRhbAorKi8KKworLyoqCisgIFBs
YXRmb3JtIHNwZWNpZmljIG1ldGhvZHMgYW5kIGZlYXR1cmUgZGV0ZWN0b3JzIG5lZWRlZCBieSB0
aGUgZnJhbWV3b3JrLgorCisgIEBjbGFzcyBwbGF0Zm9ybQorICBAbmFtZXNwYWNlIEVtYmVyCisg
IEBzdGF0aWMKKyovCit2YXIgcGxhdGZvcm0gPSBFbWJlci5wbGF0Zm9ybSA9IHt9OworCisKKy8q
KgorICBJZGVudGljYWwgdG8gYE9iamVjdC5jcmVhdGUoKWAuIEltcGxlbWVudHMgaWYgbm90IGF2
YWlsYWJsZSBuYXRpdmVseS4KKworICBAbWV0aG9kIGNyZWF0ZQorICBAZm9yIEVtYmVyCisqLwor
RW1iZXIuY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKKworLy8gU1RVQl9PQkpFQ1RfQ1JFQVRFIGFs
bG93cyB1cyB0byBvdmVycmlkZSBvdGhlciBsaWJyYXJpZXMgdGhhdCBzdHViCisvLyBPYmplY3Qu
Y3JlYXRlIGRpZmZlcmVudCB0aGFuIHdlIHdvdWxkIHByZWZlcgoraWYgKCFFbWJlci5jcmVhdGUg
fHwgRW1iZXIuRU5WLlNUVUJfT0JKRUNUX0NSRUFURSkgeworICB2YXIgSyA9IGZ1bmN0aW9uKCkg
e307CisKKyAgRW1iZXIuY3JlYXRlID0gZnVuY3Rpb24ob2JqLCBwcm9wcykgeworICAgIEsucHJv
dG90eXBlID0gb2JqOworICAgIG9iaiA9IG5ldyBLKCk7CisgICAgaWYgKHByb3BzKSB7CisgICAg
ICBLLnByb3RvdHlwZSA9IG9iajsKKyAgICAgIGZvciAodmFyIHByb3AgaW4gcHJvcHMpIHsKKyAg
ICAgICAgSy5wcm90b3R5cGVbcHJvcF0gPSBwcm9wc1twcm9wXS52YWx1ZTsKKyAgICAgIH0KKyAg
ICAgIG9iaiA9IG5ldyBLKCk7CisgICAgfQorICAgIEsucHJvdG90eXBlID0gbnVsbDsKKworICAg
IHJldHVybiBvYmo7CisgIH07CisKKyAgRW1iZXIuY3JlYXRlLmlzU2ltdWxhdGVkID0gdHJ1ZTsK
K30KKwordmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwordmFyIGNh
blJlZGVmaW5lUHJvcGVydGllcywgY2FuRGVmaW5lUHJvcGVydHlPbkRPTTsKKworLy8gQ2F0Y2gg
SUU4IHdoZXJlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBleGlzdHMgYnV0IG9ubHkgd29ya3Mgb24g
RE9NIGVsZW1lbnRzCitpZiAoZGVmaW5lUHJvcGVydHkpIHsKKyAgdHJ5IHsKKyAgICBkZWZpbmVQ
cm9wZXJ0eSh7fSwgJ2EnLHtnZXQ6ZnVuY3Rpb24oKXt9fSk7CisgIH0gY2F0Y2ggKGUpIHsKKyAg
ICBkZWZpbmVQcm9wZXJ0eSA9IG51bGw7CisgIH0KK30KKworaWYgKGRlZmluZVByb3BlcnR5KSB7
CisgIC8vIERldGVjdHMgYSBidWcgaW4gQW5kcm9pZCA8My4yIHdoZXJlIHlvdSBjYW5ub3QgcmVk
ZWZpbmUgYSBwcm9wZXJ0eSB1c2luZworICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkgb25jZSBh
Y2Nlc3NvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0LgorICBjYW5SZWRlZmluZVByb3BlcnRpZXMg
PSAoZnVuY3Rpb24oKSB7CisgICAgdmFyIG9iaiA9IHt9OworCisgICAgZGVmaW5lUHJvcGVydHko
b2JqLCAnYScsIHsKKyAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgIGVudW1lcmFibGU6
IHRydWUsCisgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyB9LAorICAgICAgc2V0OiBmdW5jdGlvbigp
IHsgfQorICAgIH0pOworCisgICAgZGVmaW5lUHJvcGVydHkob2JqLCAnYScsIHsKKyAgICAgIGNv
bmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgIGVudW1lcmFibGU6IHRydWUsCisgICAgICB3cml0YWJs
ZTogdHJ1ZSwKKyAgICAgIHZhbHVlOiB0cnVlCisgICAgfSk7CisKKyAgICByZXR1cm4gb2JqLmEg
PT09IHRydWU7CisgIH0pKCk7CisKKyAgLy8gVGhpcyBpcyBmb3IgU2FmYXJpIDUuMCwgd2hpY2gg
c3VwcG9ydHMgT2JqZWN0LmRlZmluZVByb3BlcnR5LCBidXQgbm90CisgIC8vIG9uIERPTSBub2Rl
cy4KKyAgY2FuRGVmaW5lUHJvcGVydHlPbkRPTSA9IChmdW5jdGlvbigpeworICAgIHRyeSB7Cisg
ICAgICBkZWZpbmVQcm9wZXJ0eShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2RlZmlu
ZVByb3BlcnR5T25ET00nLCB7fSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoKGUp
IHsgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9KSgpOworCisgIGlmICghY2FuUmVkZWZpbmVQ
cm9wZXJ0aWVzKSB7CisgICAgZGVmaW5lUHJvcGVydHkgPSBudWxsOworICB9IGVsc2UgaWYgKCFj
YW5EZWZpbmVQcm9wZXJ0eU9uRE9NKSB7CisgICAgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihv
YmosIGtleU5hbWUsIGRlc2MpeworICAgICAgdmFyIGlzTm9kZTsKKworICAgICAgaWYgKHR5cGVv
ZiBOb2RlID09PSAib2JqZWN0IikgeworICAgICAgICBpc05vZGUgPSBvYmogaW5zdGFuY2VvZiBO
b2RlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXNOb2RlID0gdHlwZW9mIG9iaiA9PT0gIm9i
amVjdCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSA9PT0gIm51bWJlciIgJiYgdHlwZW9mIG9iai5u
b2RlTmFtZSA9PT0gInN0cmluZyI7CisgICAgICB9CisKKyAgICAgIGlmIChpc05vZGUpIHsKKyAg
ICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGhhdmUgYSB3YXJuaW5nIGhlcmU/CisgICAgICAgIHJl
dHVybiAob2JqW2tleU5hbWVdID0gZGVzYy52YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgZGVzYyk7CisgICAg
ICB9CisgICAgfTsKKyAgfQorfQorCisvKioKK0BjbGFzcyBwbGF0Zm9ybQorQG5hbWVzcGFjZSBF
bWJlcgorKi8KKworLyoqCisgIElkZW50aWNhbCB0byBgT2JqZWN0LmRlZmluZVByb3BlcnR5KClg
LiBJbXBsZW1lbnRzIGFzIG11Y2ggZnVuY3Rpb25hbGl0eQorICBhcyBwb3NzaWJsZSBpZiBub3Qg
YXZhaWxhYmxlIG5hdGl2ZWx5LgorCisgIEBtZXRob2QgZGVmaW5lUHJvcGVydHkKKyAgQHBhcmFt
IHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIG1vZGlmeQorICBAcGFyYW0ge1N0cmluZ30ga2V5
TmFtZSBwcm9wZXJ0eSBuYW1lIHRvIG1vZGlmeQorICBAcGFyYW0ge09iamVjdH0gZGVzYyBkZXNj
cmlwdG9yIGhhc2gKKyAgQHJldHVybiB7dm9pZH0KKyovCitwbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0
eSA9IGRlZmluZVByb3BlcnR5OworCisvKioKKyAgU2V0IHRvIHRydWUgaWYgdGhlIHBsYXRmb3Jt
IHN1cHBvcnRzIG5hdGl2ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgorCisgIEBwcm9wZXJ0eSBoYXNQ
cm9wZXJ0eUFjY2Vzc29ycworICBAZmluYWwKKyovCitwbGF0Zm9ybS5oYXNQcm9wZXJ0eUFjY2Vz
c29ycyA9IHRydWU7CisKK2lmICghcGxhdGZvcm0uZGVmaW5lUHJvcGVydHkpIHsKKyAgcGxhdGZv
cm0uaGFzUHJvcGVydHlBY2Nlc3NvcnMgPSBmYWxzZTsKKworICBwbGF0Zm9ybS5kZWZpbmVQcm9w
ZXJ0eSA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSwgZGVzYykgeworICAgIGlmICghZGVzYy5nZXQp
IHsgb2JqW2tleU5hbWVdID0gZGVzYy52YWx1ZTsgfQorICB9OworCisgIHBsYXRmb3JtLmRlZmlu
ZVByb3BlcnR5LmlzU2ltdWxhdGVkID0gdHJ1ZTsKK30KKworaWYgKEVtYmVyLkVOVi5NQU5EQVRP
UllfU0VUVEVSICYmICFwbGF0Zm9ybS5oYXNQcm9wZXJ0eUFjY2Vzc29ycykgeworICBFbWJlci5F
TlYuTUFOREFUT1JZX1NFVFRFUiA9IGZhbHNlOworfQorCit9KSgpOworCisKKworKGZ1bmN0aW9u
KCkgeworLyoqCitAbW9kdWxlIGVtYmVyLW1ldGFsCisqLworCisKK3ZhciBvX2RlZmluZVByb3Bl
cnR5ID0gRW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHksCisgICAgb19jcmVhdGUgPSBFbWJl
ci5jcmVhdGUsCisgICAgLy8gVXNlZCBmb3IgZ3VpZCBnZW5lcmF0aW9uLi4uCisgICAgR1VJRF9L
RVkgPSAnX19lbWJlcicrICgrIG5ldyBEYXRlKCkpLAorICAgIHV1aWQgICAgICAgICA9IDAsCisg
ICAgbnVtYmVyQ2FjaGUgID0gW10sCisgICAgc3RyaW5nQ2FjaGUgID0ge307CisKK3ZhciBNQU5E
QVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVI7CisKKy8qKgorICBAcHJp
dmF0ZQorCisgIEEgdW5pcXVlIGtleSB1c2VkIHRvIGFzc2lnbiBndWlkcyBhbmQgb3RoZXIgcHJp
dmF0ZSBtZXRhZGF0YSB0byBvYmplY3RzLgorICBJZiB5b3UgaW5zcGVjdCBhbiBvYmplY3QgaW4g
eW91ciBicm93c2VyIGRlYnVnZ2VyIHlvdSB3aWxsIG9mdGVuIHNlZSB0aGVzZS4KKyAgVGhleSBj
YW4gYmUgc2FmZWx5IGlnbm9yZWQuCisKKyAgT24gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LCB0
aGVzZSBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB3aXRoIGVudW1lcmF0aW9uCisgIGRpc2FibGVkIHNv
IHRoZXkgd29uJ3Qgc2hvdyB1cCB3aGVuIHlvdSBpdGVyYXRlIG92ZXIgeW91ciBwcm9wZXJ0aWVz
LgorCisgIEBwcm9wZXJ0eSBHVUlEX0tFWQorICBAZm9yIEVtYmVyCisgIEB0eXBlIFN0cmluZwor
ICBAZmluYWwKKyovCitFbWJlci5HVUlEX0tFWSA9IEdVSURfS0VZOworCit2YXIgR1VJRF9ERVND
ID0geworICB3cml0YWJsZTogICAgZmFsc2UsCisgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgIGVu
dW1lcmFibGU6ICBmYWxzZSwKKyAgdmFsdWU6IG51bGwKK307CisKKy8qKgorICBAcHJpdmF0ZQor
CisgIEdlbmVyYXRlcyBhIG5ldyBndWlkLCBvcHRpb25hbGx5IHNhdmluZyB0aGUgZ3VpZCB0byB0
aGUgb2JqZWN0IHRoYXQgeW91CisgIHBhc3MgaW4uIFlvdSB3aWxsIHJhcmVseSBuZWVkIHRvIHVz
ZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCB5b3Ugc2hvdWxkCisgIGNhbGwgYEVtYmVyLmd1aWRGb3Io
b2JqKWAsIHdoaWNoIHJldHVybiBhbiBleGlzdGluZyBndWlkIGlmIGF2YWlsYWJsZS4KKworICBA
bWV0aG9kIGdlbmVyYXRlR3VpZAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBbb2Jq
XSBPYmplY3QgdGhlIGd1aWQgd2lsbCBiZSB1c2VkIGZvci4gSWYgcGFzc2VkIGluLCB0aGUgZ3Vp
ZCB3aWxsCisgICAgYmUgc2F2ZWQgb24gdGhlIG9iamVjdCBhbmQgcmV1c2VkIHdoZW5ldmVyIHlv
dSBwYXNzIHRoZSBzYW1lIG9iamVjdAorICAgIGFnYWluLgorCisgICAgSWYgbm8gb2JqZWN0IGlz
IHBhc3NlZCwganVzdCBnZW5lcmF0ZSBhIG5ldyBndWlkLgorICBAcGFyYW0ge1N0cmluZ30gW3By
ZWZpeF0gUHJlZml4IHRvIHBsYWNlIGluIGZyb250IG9mIHRoZSBndWlkLiBVc2VmdWwgd2hlbiB5
b3Ugd2FudCB0bworICAgIHNlcGFyYXRlIHRoZSBndWlkIGludG8gc2VwYXJhdGUgbmFtZXNwYWNl
cy4KKyAgQHJldHVybiB7U3RyaW5nfSB0aGUgZ3VpZAorKi8KK0VtYmVyLmdlbmVyYXRlR3VpZCA9
IGZ1bmN0aW9uIGdlbmVyYXRlR3VpZChvYmosIHByZWZpeCkgeworICBpZiAoIXByZWZpeCkgcHJl
Zml4ID0gJ2VtYmVyJzsKKyAgdmFyIHJldCA9IChwcmVmaXggKyAodXVpZCsrKSk7CisgIGlmIChv
YmopIHsKKyAgICBHVUlEX0RFU0MudmFsdWUgPSByZXQ7CisgICAgb19kZWZpbmVQcm9wZXJ0eShv
YmosIEdVSURfS0VZLCBHVUlEX0RFU0MpOworICB9CisgIHJldHVybiByZXQgOworfTsKKworLyoq
CisgIEBwcml2YXRlCisKKyAgUmV0dXJucyBhIHVuaXF1ZSBpZCBmb3IgdGhlIG9iamVjdC4gSWYg
dGhlIG9iamVjdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGd1aWQsCisgIG9uZSB3aWxsIGJlIGFzc2ln
bmVkIHRvIGl0LiBZb3UgY2FuIGNhbGwgdGhpcyBvbiBhbnkgb2JqZWN0LAorICBgRW1iZXIuT2Jq
ZWN0YC1iYXNlZCBvciBub3QsIGJ1dCBiZSBhd2FyZSB0aGF0IGl0IHdpbGwgYWRkIGEgYF9ndWlk
YAorICBwcm9wZXJ0eS4KKworICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgbWV0aG9kIG9uIERPTSBF
bGVtZW50IG9iamVjdHMuCisKKyAgQG1ldGhvZCBndWlkRm9yCisgIEBmb3IgRW1iZXIKKyAgQHBh
cmFtIG9iaiB7T2JqZWN0fSBhbnkgb2JqZWN0LCBzdHJpbmcsIG51bWJlciwgRWxlbWVudCwgb3Ig
cHJpbWl0aXZlCisgIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaXF1ZSBndWlkIGZvciB0aGlzIGlu
c3RhbmNlLgorKi8KK0VtYmVyLmd1aWRGb3IgPSBmdW5jdGlvbiBndWlkRm9yKG9iaikgeworCisg
IC8vIHNwZWNpYWwgY2FzZXMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBhZGQgYSBrZXkgdG8gb2Jq
ZWN0CisgIGlmIChvYmogPT09IHVuZGVmaW5lZCkgcmV0dXJuICIodW5kZWZpbmVkKSI7CisgIGlm
IChvYmogPT09IG51bGwpIHJldHVybiAiKG51bGwpIjsKKworICB2YXIgY2FjaGUsIHJldDsKKyAg
dmFyIHR5cGUgPSB0eXBlb2Ygb2JqOworCisgIC8vIERvbid0IGFsbG93IHByb3RvdHlwZSBjaGFu
Z2VzIHRvIFN0cmluZyBldGMuIHRvIGNoYW5nZSB0aGUgZ3VpZEZvcgorICBzd2l0Y2godHlwZSkg
eworICAgIGNhc2UgJ251bWJlcic6CisgICAgICByZXQgPSBudW1iZXJDYWNoZVtvYmpdOworICAg
ICAgaWYgKCFyZXQpIHJldCA9IG51bWJlckNhY2hlW29ial0gPSAnbnUnK29iajsKKyAgICAgIHJl
dHVybiByZXQ7CisKKyAgICBjYXNlICdzdHJpbmcnOgorICAgICAgcmV0ID0gc3RyaW5nQ2FjaGVb
b2JqXTsKKyAgICAgIGlmICghcmV0KSByZXQgPSBzdHJpbmdDYWNoZVtvYmpdID0gJ3N0JysodXVp
ZCsrKTsKKyAgICAgIHJldHVybiByZXQ7CisKKyAgICBjYXNlICdib29sZWFuJzoKKyAgICAgIHJl
dHVybiBvYmogPyAnKHRydWUpJyA6ICcoZmFsc2UpJzsKKworICAgIGRlZmF1bHQ6CisgICAgICBp
ZiAob2JqW0dVSURfS0VZXSkgcmV0dXJuIG9ialtHVUlEX0tFWV07CisgICAgICBpZiAob2JqID09
PSBPYmplY3QpIHJldHVybiAnKE9iamVjdCknOworICAgICAgaWYgKG9iaiA9PT0gQXJyYXkpICBy
ZXR1cm4gJyhBcnJheSknOworICAgICAgcmV0ID0gJ2VtYmVyJysodXVpZCsrKTsKKyAgICAgIEdV
SURfREVTQy52YWx1ZSA9IHJldDsKKyAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tF
WSwgR1VJRF9ERVNDKTsKKyAgICAgIHJldHVybiByZXQ7CisgIH0KK307CisKKy8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIE1F
VEEKKy8vCisKK3ZhciBNRVRBX0RFU0MgPSB7CisgIHdyaXRhYmxlOiAgICB0cnVlLAorICBjb25m
aWd1cmFibGU6IGZhbHNlLAorICBlbnVtZXJhYmxlOiAgZmFsc2UsCisgIHZhbHVlOiBudWxsCit9
OworCit2YXIgTUVUQV9LRVkgPSBFbWJlci5HVUlEX0tFWSsnX21ldGEnOworCisvKioKKyAgVGhl
IGtleSB1c2VkIHRvIHN0b3JlIG1ldGEgaW5mb3JtYXRpb24gb24gb2JqZWN0IGZvciBwcm9wZXJ0
eSBvYnNlcnZpbmcuCisKKyAgQHByb3BlcnR5IE1FVEFfS0VZCisgIEBmb3IgRW1iZXIKKyAgQHBy
aXZhdGUKKyAgQGZpbmFsCisgIEB0eXBlIFN0cmluZworKi8KK0VtYmVyLk1FVEFfS0VZID0gTUVU
QV9LRVk7CisKKy8vIFBsYWNlaG9sZGVyIGZvciBub24td3JpdGFibGUgbWV0YXMuCit2YXIgRU1Q
VFlfTUVUQSA9IHsKKyAgZGVzY3M6IHt9LAorICB3YXRjaGluZzoge30KK307CisKK2lmIChNQU5E
QVRPUllfU0VUVEVSKSB7IEVNUFRZX01FVEEudmFsdWVzID0ge307IH0KKworRW1iZXIuRU1QVFlf
TUVUQSA9IEVNUFRZX01FVEE7CisKK2lmIChPYmplY3QuZnJlZXplKSBPYmplY3QuZnJlZXplKEVN
UFRZX01FVEEpOworCit2YXIgaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRlZCA9IEVtYmVyLnBsYXRm
b3JtLmRlZmluZVByb3BlcnR5LmlzU2ltdWxhdGVkOworCitmdW5jdGlvbiBNZXRhKG9iaikgewor
ICB0aGlzLmRlc2NzID0ge307CisgIHRoaXMud2F0Y2hpbmcgPSB7fTsKKyAgdGhpcy5jYWNoZSA9
IHt9OworICB0aGlzLnNvdXJjZSA9IG9iajsKK30KKworaWYgKGlzRGVmaW5lUHJvcGVydHlTaW11
bGF0ZWQpIHsKKyAgLy8gb24gcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBlbnVtZXJhYmxl
IGZhbHNlCisgIC8vIG1ha2UgbWV0YSBmYWlsIGpRdWVyeS5pc1BsYWluT2JqZWN0KCkgdG8gaGlk
ZSBmcm9tCisgIC8vIGpRdWVyeS5leHRlbmQoKSBieSBoYXZpbmcgYSBwcm9wZXJ0eSB0aGF0IGZh
aWxzCisgIC8vIGhhc093blByb3BlcnR5IGNoZWNrLgorICBNZXRhLnByb3RvdHlwZS5fX3ByZXZl
bnRQbGFpbk9iamVjdF9fID0gdHJ1ZTsKKworICAvLyBXaXRob3V0IG5vbi1lbnVtZXJhYmxlIHBy
b3BlcnRpZXMsIG1ldGEgb2JqZWN0cyB3aWxsIGJlIG91dHB1dCBpbiBKU09OCisgIC8vIHVubGVz
cyBleHBsaWNpdGx5IHN1cHByZXNzZWQKKyAgTWV0YS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rp
b24gKCkgeyB9OworfQorCisvKioKKyAgUmV0cmlldmVzIHRoZSBtZXRhIGhhc2ggZm9yIGFuIG9i
amVjdC4gSWYgYHdyaXRhYmxlYCBpcyB0cnVlIGVuc3VyZXMgdGhlCisgIGhhc2ggaXMgd3JpdGFi
bGUgZm9yIHRoaXMgb2JqZWN0IGFzIHdlbGwuCisKKyAgVGhlIG1ldGEgb2JqZWN0IGNvbnRhaW5z
IGluZm9ybWF0aW9uIGFib3V0IGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzIGFzCisgIHdl
bGwgYXMgYW55IHdhdGNoZWQgcHJvcGVydGllcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24uIFlvdSBn
ZW5lcmFsbHkgd2lsbAorICBub3QgYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gZGlyZWN0bHkgYnV0
IGluc3RlYWQgd29yayB3aXRoIGhpZ2hlciBsZXZlbAorICBtZXRob2RzIHRoYXQgbWFuaXB1bGF0
ZSB0aGlzIGhhc2ggaW5kaXJlY3RseS4KKworICBAbWV0aG9kIG1ldGEKKyAgQGZvciBFbWJlcgor
ICBAcHJpdmF0ZQorCisgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZXRyaWV2
ZSBtZXRhIGZvcgorICBAcGFyYW0ge0Jvb2xlYW59IFt3cml0YWJsZT10cnVlXSBQYXNzIGBmYWxz
ZWAgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gbW9kaWZ5CisgICAgdGhlIG1ldGEgaGFzaCwgYWxs
b3dpbmcgdGhlIG1ldGhvZCB0byBhdm9pZCBtYWtpbmcgYW4gdW5uZWNlc3NhcnkgY29weS4KKyAg
QHJldHVybiB7SGFzaH0KKyovCitFbWJlci5tZXRhID0gZnVuY3Rpb24gbWV0YShvYmosIHdyaXRh
YmxlKSB7CisKKyAgdmFyIHJldCA9IG9ialtNRVRBX0tFWV07CisgIGlmICh3cml0YWJsZT09PWZh
bHNlKSByZXR1cm4gcmV0IHx8IEVNUFRZX01FVEE7CisKKyAgaWYgKCFyZXQpIHsKKyAgICBpZiAo
IWlzRGVmaW5lUHJvcGVydHlTaW11bGF0ZWQpIG9fZGVmaW5lUHJvcGVydHkob2JqLCBNRVRBX0tF
WSwgTUVUQV9ERVNDKTsKKworICAgIHJldCA9IG5ldyBNZXRhKG9iaik7CisKKyAgICBpZiAoTUFO
REFUT1JZX1NFVFRFUikgeyByZXQudmFsdWVzID0ge307IH0KKworICAgIG9ialtNRVRBX0tFWV0g
PSByZXQ7CisKKyAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHRyeSB0byBj
cmVhdGUgY29uc3RydWN0b3IgbGlrZSBkZXNjCisgICAgcmV0LmRlc2NzLmNvbnN0cnVjdG9yID0g
bnVsbDsKKworICB9IGVsc2UgaWYgKHJldC5zb3VyY2UgIT09IG9iaikgeworICAgIGlmICghaXNE
ZWZpbmVQcm9wZXJ0eVNpbXVsYXRlZCkgb19kZWZpbmVQcm9wZXJ0eShvYmosIE1FVEFfS0VZLCBN
RVRBX0RFU0MpOworCisgICAgcmV0ID0gb19jcmVhdGUocmV0KTsKKyAgICByZXQuZGVzY3MgICAg
PSBvX2NyZWF0ZShyZXQuZGVzY3MpOworICAgIHJldC53YXRjaGluZyA9IG9fY3JlYXRlKHJldC53
YXRjaGluZyk7CisgICAgcmV0LmNhY2hlICAgID0ge307CisgICAgcmV0LnNvdXJjZSAgID0gb2Jq
OworCisgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsgcmV0LnZhbHVlcyA9IG9fY3JlYXRlKHJl
dC52YWx1ZXMpOyB9CisKKyAgICBvYmpbTUVUQV9LRVldID0gcmV0OworICB9CisgIHJldHVybiBy
ZXQ7Cit9OworCitFbWJlci5nZXRNZXRhID0gZnVuY3Rpb24gZ2V0TWV0YShvYmosIHByb3BlcnR5
KSB7CisgIHZhciBtZXRhID0gRW1iZXIubWV0YShvYmosIGZhbHNlKTsKKyAgcmV0dXJuIG1ldGFb
cHJvcGVydHldOworfTsKKworRW1iZXIuc2V0TWV0YSA9IGZ1bmN0aW9uIHNldE1ldGEob2JqLCBw
cm9wZXJ0eSwgdmFsdWUpIHsKKyAgdmFyIG1ldGEgPSBFbWJlci5tZXRhKG9iaiwgdHJ1ZSk7Cisg
IG1ldGFbcHJvcGVydHldID0gdmFsdWU7CisgIHJldHVybiB2YWx1ZTsKK307CisKKy8qKgorICBA
cHJpdmF0ZQorCisgIEluIG9yZGVyIHRvIHN0b3JlIGRlZmF1bHRzIGZvciBhIGNsYXNzLCBhIHBy
b3RvdHlwZSBtYXkgbmVlZCB0byBjcmVhdGUKKyAgYSBkZWZhdWx0IG1ldGEgb2JqZWN0LCB3aGlj
aCB3aWxsIGJlIGluaGVyaXRlZCBieSBhbnkgb2JqZWN0cyBpbnN0YW50aWF0ZWQKKyAgZnJvbSB0
aGUgY2xhc3MncyBjb25zdHJ1Y3Rvci4KKworICBIb3dldmVyLCB0aGUgcHJvcGVydGllcyBvZiB0
aGF0IG1ldGEgb2JqZWN0IGFyZSBvbmx5IHNoYWxsb3ctY2xvbmVkLAorICBzbyBpZiBhIHByb3Bl
cnR5IGlzIGEgaGFzaCAobGlrZSB0aGUgZXZlbnQgc3lzdGVtJ3MgYGxpc3RlbmVyc2AgaGFzaCks
CisgIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2Yg
dGhhdCBjbGFzcy4KKworICBUaGlzIG1ldGhvZCBhbGxvd3MgZXh0ZW5zaW9ucyB0byBkZWVwbHkg
Y2xvbmUgYSBzZXJpZXMgb2YgbmVzdGVkIGhhc2hlcyBvcgorICBvdGhlciBjb21wbGV4IG9iamVj
dHMuIEZvciBpbnN0YW5jZSwgdGhlIGV2ZW50IHN5c3RlbSBtaWdodCBwYXNzCisgIGBbJ2xpc3Rl
bmVycycsICdmb286Y2hhbmdlJywgJ2VtYmVyMTU3J11gIHRvIGBwcmVwYXJlTWV0YVBhdGhgLCB3
aGljaCB3aWxsCisgIHdhbGsgZG93biB0aGUga2V5cyBwcm92aWRlZC4KKworICBGb3IgZWFjaCBr
ZXksIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuIElmIGl0IGFscmVh
ZHkKKyAgZXhpc3RzIGFuZCBpdCB3YXMgaW5oZXJpdGVkIGZyb20gaXRzIGNvbnN0cnVjdG9yLCB0
aGUgY29uc3RydWN0b3IncworICBrZXkgaXMgY2xvbmVkLgorCisgIFlvdSBjYW4gYWxzbyBwYXNz
IGZhbHNlIGZvciBgd3JpdGFibGVgLCB3aGljaCB3aWxsIHNpbXBseSByZXR1cm4KKyAgdW5kZWZp
bmVkIGlmIGBwcmVwYXJlTWV0YVBhdGhgIGRpc2NvdmVycyBhbnkgcGFydCBvZiB0aGUgcGF0aCB0
aGF0CisgIHNoYXJlZCBvciB1bmRlZmluZWQuCisKKyAgQG1ldGhvZCBtZXRhUGF0aAorICBAZm9y
IEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB3aG9zZSBtZXRhIHdlIGFy
ZSBleGFtaW5pbmcKKyAgQHBhcmFtIHtBcnJheX0gcGF0aCBBbiBhcnJheSBvZiBrZXlzIHRvIHdh
bGsgZG93bgorICBAcGFyYW0ge0Jvb2xlYW59IHdyaXRhYmxlIHdoZXRoZXIgb3Igbm90IHRvIGNy
ZWF0ZSBhIG5ldyBtZXRhCisgICAgKG9yIG1ldGEgcHJvcGVydHkpIGlmIG9uZSBkb2VzIG5vdCBh
bHJlYWR5IGV4aXN0IG9yIGlmIGl0J3MKKyAgICBzaGFyZWQgd2l0aCBpdHMgY29uc3RydWN0b3IK
KyovCitFbWJlci5tZXRhUGF0aCA9IGZ1bmN0aW9uIG1ldGFQYXRoKG9iaiwgcGF0aCwgd3JpdGFi
bGUpIHsKKyAgdmFyIG1ldGEgPSBFbWJlci5tZXRhKG9iaiwgd3JpdGFibGUpLCBrZXlOYW1lLCB2
YWx1ZTsKKworICBmb3IgKHZhciBpPTAsIGw9cGF0aC5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAg
a2V5TmFtZSA9IHBhdGhbaV07CisgICAgdmFsdWUgPSBtZXRhW2tleU5hbWVdOworCisgICAgaWYg
KCF2YWx1ZSkgeworICAgICAgaWYgKCF3cml0YWJsZSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9Cisg
ICAgICB2YWx1ZSA9IG1ldGFba2V5TmFtZV0gPSB7IF9fZW1iZXJfc291cmNlX186IG9iaiB9Owor
ICAgIH0gZWxzZSBpZiAodmFsdWUuX19lbWJlcl9zb3VyY2VfXyAhPT0gb2JqKSB7CisgICAgICBp
ZiAoIXdyaXRhYmxlKSB7IHJldHVybiB1bmRlZmluZWQ7IH0KKyAgICAgIHZhbHVlID0gbWV0YVtr
ZXlOYW1lXSA9IG9fY3JlYXRlKHZhbHVlKTsKKyAgICAgIHZhbHVlLl9fZW1iZXJfc291cmNlX18g
PSBvYmo7CisgICAgfQorCisgICAgbWV0YSA9IHZhbHVlOworICB9CisKKyAgcmV0dXJuIHZhbHVl
OworfTsKKworLyoqCisgIEBwcml2YXRlCisKKyAgV3JhcHMgdGhlIHBhc3NlZCBmdW5jdGlvbiBz
byB0aGF0IGB0aGlzLl9zdXBlcmAgd2lsbCBwb2ludCB0byB0aGUgc3VwZXJGdW5jCisgIHdoZW4g
dGhlIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoaXMgaXMgdGhlIHByaW1pdGl2ZSB3ZSB1c2UgdG8g
aW1wbGVtZW50CisgIGNhbGxzIHRvIHN1cGVyLgorCisgIEBtZXRob2Qgd3JhcAorICBAZm9yIEVt
YmVyCisgIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhbGwKKyAgQHBh
cmFtIHtGdW5jdGlvbn0gc3VwZXJGdW5jIFRoZSBzdXBlciBmdW5jdGlvbi4KKyAgQHJldHVybiB7
RnVuY3Rpb259IHdyYXBwZWQgZnVuY3Rpb24uCisqLworRW1iZXIud3JhcCA9IGZ1bmN0aW9uKGZ1
bmMsIHN1cGVyRnVuYykgeworICBmdW5jdGlvbiBLKCkge30KKworICBmdW5jdGlvbiBzdXBlcldy
YXBwZXIoKSB7CisgICAgdmFyIHJldCwgc3VwID0gdGhpcy5fc3VwZXI7CisgICAgdGhpcy5fc3Vw
ZXIgPSBzdXBlckZ1bmMgfHwgSzsKKyAgICByZXQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7CisgICAgdGhpcy5fc3VwZXIgPSBzdXA7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHN1
cGVyV3JhcHBlci53cmFwcGVkRnVuY3Rpb24gPSBmdW5jOworICBzdXBlcldyYXBwZXIuX19lbWJl
cl9vYnNlcnZlc19fID0gZnVuYy5fX2VtYmVyX29ic2VydmVzX187CisgIHN1cGVyV3JhcHBlci5f
X2VtYmVyX29ic2VydmVzQmVmb3JlX18gPSBmdW5jLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXzsK
KworICByZXR1cm4gc3VwZXJXcmFwcGVyOworfTsKKworLyoqCisgIFJldHVybnMgdHJ1ZSBpZiB0
aGUgcGFzc2VkIG9iamVjdCBpcyBhbiBhcnJheSBvciBBcnJheS1saWtlLgorCisgIEVtYmVyIEFy
cmF5IFByb3RvY29sOgorCisgICAgLSB0aGUgb2JqZWN0IGhhcyBhbiBvYmplY3RBdCBwcm9wZXJ0
eQorICAgIC0gdGhlIG9iamVjdCBpcyBhIG5hdGl2ZSBBcnJheQorICAgIC0gdGhlIG9iamVjdCBp
cyBhbiBPYmplY3QsIGFuZCBoYXMgYSBsZW5ndGggcHJvcGVydHkKKworICBVbmxpa2UgYEVtYmVy
LnR5cGVPZmAgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGV2ZW4gaWYgdGhlIHBhc3NlZCBvYmpl
Y3QgaXMKKyAgbm90IGZvcm1hbGx5IGFycmF5IGJ1dCBhcHBlYXJzIHRvIGJlIGFycmF5LWxpa2Ug
KGkuZS4gaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgKQorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1i
ZXIuaXNBcnJheSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gZmFsc2UKKyAgRW1iZXIuaXNBcnJheShbXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gdHJ1ZQorICBFbWJlci5pc0FycmF5KCBFbWJlci5BcnJheVByb3h5
LmNyZWF0ZSh7IGNvbnRlbnQ6IFtdIH0pICk7ICAvLyB0cnVlCisgIGBgYAorCisgIEBtZXRob2Qg
aXNBcnJheQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0
byB0ZXN0CisgIEByZXR1cm4ge0Jvb2xlYW59CisqLworRW1iZXIuaXNBcnJheSA9IGZ1bmN0aW9u
KG9iaikgeworICBpZiAoIW9iaiB8fCBvYmouc2V0SW50ZXJ2YWwpIHsgcmV0dXJuIGZhbHNlOyB9
CisgIGlmIChBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkob2JqKSkgeyByZXR1cm4gdHJ1
ZTsgfQorICBpZiAoRW1iZXIuQXJyYXkgJiYgRW1iZXIuQXJyYXkuZGV0ZWN0KG9iaikpIHsgcmV0
dXJuIHRydWU7IH0KKyAgaWYgKChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpICYmICdvYmplY3Qn
PT09dHlwZW9mIG9iaikgeyByZXR1cm4gdHJ1ZTsgfQorICByZXR1cm4gZmFsc2U7Cit9OworCisv
KioKKyAgRm9yY2VzIHRoZSBwYXNzZWQgb2JqZWN0IHRvIGJlIHBhcnQgb2YgYW4gYXJyYXkuIElm
IHRoZSBvYmplY3QgaXMgYWxyZWFkeQorICBhbiBhcnJheSBvciBhcnJheS1saWtlLCByZXR1cm5z
IHRoZSBvYmplY3QuIE90aGVyd2lzZSBhZGRzIHRoZSBvYmplY3QgdG8KKyAgYW4gYXJyYXkuIElm
IG9iaiBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCisK
KyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5tYWtlQXJyYXkoKTsgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBbXQorICBFbWJlci5tYWtlQXJyYXkobnVsbCk7ICAgICAgICAgICAgICAgICAg
ICAgICAvLyBbXQorICBFbWJlci5tYWtlQXJyYXkodW5kZWZpbmVkKTsgICAgICAgICAgICAgICAg
ICAvLyBbXQorICBFbWJlci5tYWtlQXJyYXkoJ2xpbmRzYXknKTsgICAgICAgICAgICAgICAgICAv
LyBbJ2xpbmRzYXknXQorICBFbWJlci5tYWtlQXJyYXkoWzEsMiw0Ml0pOyAgICAgICAgICAgICAg
ICAgICAvLyBbMSwyLDQyXQorCisgIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5j
cmVhdGUoeyBjb250ZW50OiBbXSB9KTsKKyAgRW1iZXIubWFrZUFycmF5KGNvbnRyb2xsZXIpID09
PSBjb250cm9sbGVyOyAgLy8gdHJ1ZQorICBgYGAKKworICBAbWV0aG9kIG1ha2VBcnJheQorICBA
Zm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdAorICBAcmV0dXJuIHtB
cnJheX0KKyovCitFbWJlci5tYWtlQXJyYXkgPSBmdW5jdGlvbihvYmopIHsKKyAgaWYgKG9iaiA9
PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH0KKyAgcmV0dXJuIEVt
YmVyLmlzQXJyYXkob2JqKSA/IG9iaiA6IFtvYmpdOworfTsKKworZnVuY3Rpb24gY2FuSW52b2tl
KG9iaiwgbWV0aG9kTmFtZSkgeworICByZXR1cm4gISEob2JqICYmIHR5cGVvZiBvYmpbbWV0aG9k
TmFtZV0gPT09ICdmdW5jdGlvbicpOworfQorCisvKioKKyAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUg
YG1ldGhvZE5hbWVgIGV4aXN0cyBvbiB0aGUgYG9iamAuCisKKyAgQG1ldGhvZCBjYW5JbnZva2UK
KyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sg
Zm9yIHRoZSBtZXRob2QKKyAgQHBhcmFtIHtTdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBu
YW1lIHRvIGNoZWNrIGZvcgorKi8KK0VtYmVyLmNhbkludm9rZSA9IGNhbkludm9rZTsKKworLyoq
CisgIENoZWNrcyB0byBzZWUgaWYgdGhlIGBtZXRob2ROYW1lYCBleGlzdHMgb24gdGhlIGBvYmpg
LAorICBhbmQgaWYgaXQgZG9lcywgaW52b2tlcyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgcGFzc2Vk
LgorCisgIEBtZXRob2QgdHJ5SW52b2tlCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtPYmplY3R9
IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUgbWV0aG9kCisgIEBwYXJhbSB7U3RyaW5n
fSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBjaGVjayBmb3IKKyAgQHBhcmFtIHtBcnJh
eX0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kCisgIEByZXR1cm4g
e2FueXRoaW5nfSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBpbnZva2VkIG1ldGhvZCBvciB1bmRl
ZmluZWQgaWYgaXQgY2Fubm90IGJlIGludm9rZWQKKyovCitFbWJlci50cnlJbnZva2UgPSBmdW5j
dGlvbihvYmosIG1ldGhvZE5hbWUsIGFyZ3MpIHsKKyAgaWYgKGNhbkludm9rZShvYmosIG1ldGhv
ZE5hbWUpKSB7CisgICAgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3MgfHwg
W10pOworICB9Cit9OworCisvLyBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci5qcy9w
dWxsLzE2MTcKK3ZhciBuZWVkc0ZpbmFsbHlGaXggPSAoZnVuY3Rpb24oKSB7CisgIHZhciBjb3Vu
dCA9IDA7CisgIHRyeXsKKyAgICB0cnkgeyB9CisgICAgZmluYWxseSB7CisgICAgICBjb3VudCsr
OworICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWVkc0ZpbmFsbHlGaXhUZXN0Jyk7CisgICAgfQor
ICB9IGNhdGNoIChlKSB7fQorCisgIHJldHVybiBjb3VudCAhPT0gMTsKK30pKCk7CisKKy8qKgor
ICBQcm92aWRlcyB0cnkgeyB9IGZpbmFsbHkgeyB9IGZ1bmN0aW9uYWxpdHksIHdoaWxlIHdvcmtp
bmcKKyAgYXJvdW5kIFNhZmFyaSdzIGRvdWJsZSBmaW5hbGx5IGJ1Zy4KKworICBAbWV0aG9kIHRy
eUZpbmFsbHkKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdGlvbiBUaGUg
ZnVuY3Rpb24gdG8gcnVuIHRoZSB0cnkgY2FsbGJhY2sKKyAgQHBhcmFtIHtGdW5jdGlvbn0gZnVu
Y3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgZmluYWxseSBjYWxsYmFjaworICBAcGFyYW0g
W2JpbmRpbmddCisgIEByZXR1cm4ge2FueXRoaW5nfSBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB0
aGF0IG9mIHRoZSBmaW5hbGl6ZXIsCisgIHVubGVzcyB0aGF0IHZhbHVlaXMgdW5kZWZpbmVkLCBp
biB3aGljaCBjYXNlIGl0IGlzIHRoZSByZXR1cm4gdmFsdWUKKyAgb2YgdGhlIHRyeWFibGUKKyov
CisKK2lmIChuZWVkc0ZpbmFsbHlGaXgpIHsKKyAgRW1iZXIudHJ5RmluYWxseSA9IGZ1bmN0aW9u
KHRyeWFibGUsIGZpbmFsaXplciwgYmluZGluZykgeworICAgIHZhciByZXN1bHQsIGZpbmFsUmVz
dWx0LCBmaW5hbEVycm9yOworCisgICAgYmluZGluZyA9IGJpbmRpbmcgfHwgdGhpczsKKworICAg
IHRyeSB7CisgICAgICByZXN1bHQgPSB0cnlhYmxlLmNhbGwoYmluZGluZyk7CisgICAgfSBmaW5h
bGx5IHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwo
YmluZGluZyk7CisgICAgICB9IGNhdGNoIChlKXsKKyAgICAgICAgZmluYWxFcnJvciA9IGU7Cisg
ICAgICB9CisgICAgfQorCisgICAgaWYgKGZpbmFsRXJyb3IpIHsgdGhyb3cgZmluYWxFcnJvcjsg
fQorCisgICAgcmV0dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZpbmVkKSA/IHJlc3VsdCA6IGZp
bmFsUmVzdWx0OworICB9OworfSBlbHNlIHsKKyAgRW1iZXIudHJ5RmluYWxseSA9IGZ1bmN0aW9u
KHRyeWFibGUsIGZpbmFsaXplciwgYmluZGluZykgeworICAgIHZhciByZXN1bHQsIGZpbmFsUmVz
dWx0OworCisgICAgYmluZGluZyA9IGJpbmRpbmcgfHwgdGhpczsKKworICAgIHRyeSB7CisgICAg
ICByZXN1bHQgPSB0cnlhYmxlLmNhbGwoYmluZGluZyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAg
IGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7CisgICAgfQorCisgICAgcmV0
dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZpbmVkKSA/IHJlc3VsdCA6IGZpbmFsUmVzdWx0Owor
ICB9OworfQorCisvKioKKyAgUHJvdmlkZXMgdHJ5IHsgfSBjYXRjaCBmaW5hbGx5IHsgfSBmdW5j
dGlvbmFsaXR5LCB3aGlsZSB3b3JraW5nCisgIGFyb3VuZCBTYWZhcmkncyBkb3VibGUgZmluYWxs
eSBidWcuCisKKyAgQG1ldGhvZCB0cnlDYXRjaEZpbmFsbHkKKyAgQGZvciBFbWJlcgorICBAcGFy
YW0ge0Z1bmN0aW9ufSBmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gcnVuIHRoZSB0cnkgY2FsbGJh
Y2sKKyAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUg
Y2F0Y2hhYmxlIGNhbGxiYWNrCisgIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uIFRoZSBmdW5j
dGlvbiB0byBydW4gdGhlIGZpbmFsbHkgY2FsbGJhY2sKKyAgQHBhcmFtIFtiaW5kaW5nXQorICBA
cmV0dXJuIHthbnl0aGluZ30gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGhhdCBvZiB0aGUgZmlu
YWxpemVyLAorICB1bmxlc3MgdGhhdCB2YWx1ZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2Ug
aXQgaXMgdGhlIHJldHVybiB2YWx1ZQorICBvZiB0aGUgdHJ5YWJsZS4KKyovCitpZiAobmVlZHNG
aW5hbGx5Rml4KSB7CisgIEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUs
IGNhdGNoYWJsZSwgZmluYWxpemVyLCBiaW5kaW5nKSB7CisgICAgdmFyIHJlc3VsdCwgZmluYWxS
ZXN1bHQsIGZpbmFsRXJyb3IsIGZpbmFsUmV0dXJuOworCisgICAgYmluZGluZyA9IGJpbmRpbmcg
fHwgdGhpczsKKworICAgIHRyeSB7CisgICAgICByZXN1bHQgPSB0cnlhYmxlLmNhbGwoYmluZGlu
Zyk7CisgICAgfSBjYXRjaChlcnJvcikgeworICAgICAgcmVzdWx0ID0gY2F0Y2hhYmxlLmNhbGwo
YmluZGluZywgZXJyb3IpOworICAgIH0gZmluYWxseSB7CisgICAgICB0cnkgeworICAgICAgICBm
aW5hbFJlc3VsdCA9IGZpbmFsaXplci5jYWxsKGJpbmRpbmcpOworICAgICAgfSBjYXRjaCAoZSl7
CisgICAgICAgIGZpbmFsRXJyb3IgPSBlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmaW5h
bEVycm9yKSB7IHRocm93IGZpbmFsRXJyb3I7IH0KKworICAgIHJldHVybiAoZmluYWxSZXN1bHQg
PT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJlc3VsdDsKKyAgfTsKK30gZWxzZSB7Cisg
IEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmlu
YWxpemVyLCBiaW5kaW5nKSB7CisgICAgdmFyIHJlc3VsdCwgZmluYWxSZXN1bHQ7CisKKyAgICBi
aW5kaW5nID0gYmluZGluZyB8fCB0aGlzOworCisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdCA9IHRy
eWFibGUuY2FsbChiaW5kaW5nKTsKKyAgICB9IGNhdGNoKGVycm9yKSB7CisgICAgICByZXN1bHQg
PSBjYXRjaGFibGUuY2FsbChiaW5kaW5nLCBlcnJvcik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAg
IGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7CisgICAgfQorCisgICAgcmV0
dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZpbmVkKSA/IHJlc3VsdCA6IGZpbmFsUmVzdWx0Owor
ICB9OworfQorCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLy8gRW1iZXIudHJ5Q2F0Y2hG
aW5hbGx5CisKKy8qKgorICBUaGUgcHVycG9zZSBvZiB0aGUgRW1iZXIgSW5zdHJ1bWVudGF0aW9u
IG1vZHVsZSBpcworICB0byBwcm92aWRlIGVmZmljaWVudCwgZ2VuZXJhbC1wdXJwb3NlIGluc3Ry
dW1lbnRhdGlvbgorICBmb3IgRW1iZXIuCisKKyAgU3Vic2NyaWJlIHRvIGEgbGlzdGVuZXIgYnkg
dXNpbmcgYEVtYmVyLnN1YnNjcmliZWA6CisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5zdWJz
Y3JpYmUoInJlbmRlciIsIHsKKyAgICBiZWZvcmU6IGZ1bmN0aW9uKG5hbWUsIHRpbWVzdGFtcCwg
cGF5bG9hZCkgeworCisgICAgfSwKKworICAgIGFmdGVyOiBmdW5jdGlvbihuYW1lLCB0aW1lc3Rh
bXAsIHBheWxvYWQpIHsKKworICAgIH0KKyAgfSk7CisgIGBgYAorCisgIElmIHlvdSByZXR1cm4g
YSB2YWx1ZSBmcm9tIHRoZSBgYmVmb3JlYCBjYWxsYmFjaywgdGhhdCBzYW1lCisgIHZhbHVlIHdp
bGwgYmUgcGFzc2VkIGFzIGEgZm91cnRoIHBhcmFtZXRlciB0byB0aGUgYGFmdGVyYAorICBjYWxs
YmFjay4KKworICBJbnN0cnVtZW50IGEgYmxvY2sgb2YgY29kZSBieSB1c2luZyBgRW1iZXIuaW5z
dHJ1bWVudGA6CisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5pbnN0cnVtZW50KCJyZW5kZXIu
aGFuZGxlYmFycyIsIHBheWxvYWQsIGZ1bmN0aW9uKCkgeworICAgIC8vIHJlbmRlcmluZyBsb2dp
YworICB9LCBiaW5kaW5nKTsKKyAgYGBgCisKKyAgRXZlbnQgbmFtZXMgcGFzc2VkIHRvIGBFbWJl
ci5pbnN0cnVtZW50YCBhcmUgbmFtZXNwYWNlZAorICBieSBwZXJpb2RzLCBmcm9tIG1vcmUgZ2Vu
ZXJhbCB0byBtb3JlIHNwZWNpZmljLiBTdWJzY3JpYmVycworICBjYW4gbGlzdGVuIGZvciBldmVu
dHMgYnkgd2hhdGV2ZXIgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhleQorICBhcmUgaW50ZXJlc3Rl
ZCBpbi4KKworICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGV2ZW50IGlzIGByZW5kZXIuaGFu
ZGxlYmFyc2AsCisgIGFuZCB0aGUgc3Vic2NyaWJlciBsaXN0ZW5lZCBmb3IgYWxsIGV2ZW50cyBi
ZWdpbm5pbmcgd2l0aAorICBgcmVuZGVyYC4gSXQgd291bGQgcmVjZWl2ZSBjYWxsYmFja3MgZm9y
IGV2ZW50cyBuYW1lZAorICBgcmVuZGVyYCwgYHJlbmRlci5oYW5kbGViYXJzYCwgYHJlbmRlci5j
b250YWluZXJgLCBvcgorICBldmVuIGByZW5kZXIuaGFuZGxlYmFycy5sYXlvdXRgLgorCisgIEBj
bGFzcyBJbnN0cnVtZW50YXRpb24KKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAc3RhdGljCisqLwor
RW1iZXIuSW5zdHJ1bWVudGF0aW9uID0ge307CisKK3ZhciBzdWJzY3JpYmVycyA9IFtdLCBjYWNo
ZSA9IHt9OworCit2YXIgcG9wdWxhdGVMaXN0ZW5lcnMgPSBmdW5jdGlvbihuYW1lKSB7CisgIHZh
ciBsaXN0ZW5lcnMgPSBbXSwgc3Vic2NyaWJlcjsKKworICBmb3IgKHZhciBpPTAsIGw9c3Vic2Ny
aWJlcnMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIHN1YnNjcmliZXIgPSBzdWJzY3JpYmVyc1tp
XTsKKyAgICBpZiAoc3Vic2NyaWJlci5yZWdleC50ZXN0KG5hbWUpKSB7CisgICAgICBsaXN0ZW5l
cnMucHVzaChzdWJzY3JpYmVyLm9iamVjdCk7CisgICAgfQorICB9CisKKyAgY2FjaGVbbmFtZV0g
PSBsaXN0ZW5lcnM7CisgIHJldHVybiBsaXN0ZW5lcnM7Cit9OworCit2YXIgdGltZSA9IChmdW5j
dGlvbigpIHsKKyAgICB2YXIgcGVyZiA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93ID8g
d2luZG93LnBlcmZvcm1hbmNlIHx8IHt9IDoge307CisgICAgdmFyIGZuID0gcGVyZi5ub3cgfHwg
cGVyZi5tb3pOb3cgfHwgcGVyZi53ZWJraXROb3cgfHwgcGVyZi5tc05vdyB8fCBwZXJmLm9Ob3c7
CisgICAgLy8gZm4uYmluZCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhbGwgdGhlIGJyb3dzZXJzIHRo
YXQgc3VwcG9ydCB0aGUgYWR2YW5jZWQgd2luZG93LnBlcmZvcm1hbmNlLi4uIDstKQorICAgIHJl
dHVybiBmbiA/IGZuLmJpbmQocGVyZikgOiBmdW5jdGlvbigpIHsgcmV0dXJuICtuZXcgRGF0ZSgp
OyB9OworfSkoKTsKKworCitFbWJlci5JbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudCA9IGZ1bmN0
aW9uKG5hbWUsIHBheWxvYWQsIGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgIHZhciBsaXN0ZW5lcnMg
PSBjYWNoZVtuYW1lXSwgdGltZU5hbWUsIHJldDsKKworICBpZiAoRW1iZXIuU1RSVUNUVVJFRF9Q
Uk9GSUxFKSB7CisgICAgdGltZU5hbWUgPSBuYW1lICsgIjogIiArIHBheWxvYWQub2JqZWN0Owor
ICAgIGNvbnNvbGUudGltZSh0aW1lTmFtZSk7CisgIH0KKworICBpZiAoIWxpc3RlbmVycykgewor
ICAgIGxpc3RlbmVycyA9IHBvcHVsYXRlTGlzdGVuZXJzKG5hbWUpOworICB9CisKKyAgaWYgKGxp
c3RlbmVycy5sZW5ndGggPT09IDApIHsKKyAgICByZXQgPSBjYWxsYmFjay5jYWxsKGJpbmRpbmcp
OworICAgIGlmIChFbWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsgY29uc29sZS50aW1lRW5kKHRp
bWVOYW1lKTsgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICB2YXIgYmVmb3JlVmFsdWVzID0g
W10sIGxpc3RlbmVyLCBpLCBsOworCisgIGZ1bmN0aW9uIHRyeWFibGUoKXsKKyAgICBmb3IgKGk9
MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgbGlzdGVuZXIgPSBsaXN0
ZW5lcnNbaV07CisgICAgICBiZWZvcmVWYWx1ZXNbaV0gPSBsaXN0ZW5lci5iZWZvcmUobmFtZSwg
dGltZSgpLCBwYXlsb2FkKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FsbGJhY2suY2FsbChiaW5k
aW5nKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNhdGNoYWJsZShlKXsKKyAgICBwYXlsb2FkID0gcGF5
bG9hZCB8fCB7fTsKKyAgICBwYXlsb2FkLmV4Y2VwdGlvbiA9IGU7CisgIH0KKworICBmdW5jdGlv
biBmaW5hbGl6ZXIoKSB7CisgICAgZm9yIChpPTAsIGw9bGlzdGVuZXJzLmxlbmd0aDsgaTxsOyBp
KyspIHsKKyAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOworICAgICAgbGlzdGVuZXIuYWZ0
ZXIobmFtZSwgdGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1ZXNbaV0pOworICAgIH0KKworICAg
IGlmIChFbWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsKKyAgICAgIGNvbnNvbGUudGltZUVuZCh0
aW1lTmFtZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEVtYmVyLnRyeUNhdGNoRmluYWxseSh0
cnlhYmxlLCBjYXRjaGFibGUsIGZpbmFsaXplcik7Cit9OworCitFbWJlci5JbnN0cnVtZW50YXRp
b24uc3Vic2NyaWJlID0gZnVuY3Rpb24ocGF0dGVybiwgb2JqZWN0KSB7CisgIHZhciBwYXRocyA9
IHBhdHRlcm4uc3BsaXQoIi4iKSwgcGF0aCwgcmVnZXggPSBbXTsKKworICBmb3IgKHZhciBpPTAs
IGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIHBhdGggPSBwYXRoc1tpXTsKKyAgICBp
ZiAocGF0aCA9PT0gIioiKSB7CisgICAgICByZWdleC5wdXNoKCJbXlxcLl0qIik7CisgICAgfSBl
bHNlIHsKKyAgICAgIHJlZ2V4LnB1c2gocGF0aCk7CisgICAgfQorICB9CisKKyAgcmVnZXggPSBy
ZWdleC5qb2luKCJcXC4iKTsKKyAgcmVnZXggPSByZWdleCArICIoXFwuLiopPyI7CisKKyAgdmFy
IHN1YnNjcmliZXIgPSB7CisgICAgcGF0dGVybjogcGF0dGVybiwKKyAgICByZWdleDogbmV3IFJl
Z0V4cCgiXiIgKyByZWdleCArICIkIiksCisgICAgb2JqZWN0OiBvYmplY3QKKyAgfTsKKworICBz
dWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpOworICBjYWNoZSA9IHt9OworCisgIHJldHVybiBz
dWJzY3JpYmVyOworfTsKKworRW1iZXIuSW5zdHJ1bWVudGF0aW9uLnVuc3Vic2NyaWJlID0gZnVu
Y3Rpb24oc3Vic2NyaWJlcikgeworICB2YXIgaW5kZXg7CisKKyAgZm9yICh2YXIgaT0wLCBsPXN1
YnNjcmliZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICBpZiAoc3Vic2NyaWJlcnNbaV0gPT09
IHN1YnNjcmliZXIpIHsKKyAgICAgIGluZGV4ID0gaTsKKyAgICB9CisgIH0KKworICBzdWJzY3Jp
YmVycy5zcGxpY2UoaW5kZXgsIDEpOworICBjYWNoZSA9IHt9OworfTsKKworRW1iZXIuSW5zdHJ1
bWVudGF0aW9uLnJlc2V0ID0gZnVuY3Rpb24oKSB7CisgIHN1YnNjcmliZXJzID0gW107CisgIGNh
Y2hlID0ge307Cit9OworCitFbWJlci5pbnN0cnVtZW50ID0gRW1iZXIuSW5zdHJ1bWVudGF0aW9u
Lmluc3RydW1lbnQ7CitFbWJlci5zdWJzY3JpYmUgPSBFbWJlci5JbnN0cnVtZW50YXRpb24uc3Vi
c2NyaWJlOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIHV0aWxzID0gRW1iZXIu
RW51bWVyYWJsZVV0aWxzID0geworICBtYXA6IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2ssIHRoaXNB
cmcpIHsKKyAgICByZXR1cm4gb2JqLm1hcCA/IG9iai5tYXAuY2FsbChvYmosIGNhbGxiYWNrLCB0
aGlzQXJnKSA6IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChvYmosIGNhbGxiYWNrLCB0aGlzQXJn
KTsKKyAgfSwKKworICBmb3JFYWNoOiBmdW5jdGlvbihvYmosIGNhbGxiYWNrLCB0aGlzQXJnKSB7
CisgICAgcmV0dXJuIG9iai5mb3JFYWNoID8gb2JqLmZvckVhY2guY2FsbChvYmosIGNhbGxiYWNr
LCB0aGlzQXJnKSA6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob2JqLCBjYWxsYmFjaywg
dGhpc0FyZyk7CisgIH0sCisKKyAgaW5kZXhPZjogZnVuY3Rpb24ob2JqLCBlbGVtZW50LCBpbmRl
eCkgeworICAgIHJldHVybiBvYmouaW5kZXhPZiA/IG9iai5pbmRleE9mLmNhbGwob2JqLCBlbGVt
ZW50LCBpbmRleCkgOiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG9iaiwgZWxlbWVudCwg
aW5kZXgpOworICB9LAorCisgIGluZGV4ZXNPZjogZnVuY3Rpb24ob2JqLCBlbGVtZW50cykgewor
ICAgIHJldHVybiBlbGVtZW50cyA9PT0gdW5kZWZpbmVkID8gW10gOiB1dGlscy5tYXAoZWxlbWVu
dHMsIGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgIHJldHVybiB1dGlscy5pbmRleE9mKG9iaiwgaXRl
bSk7CisgICAgfSk7CisgIH0sCisKKyAgYWRkT2JqZWN0OiBmdW5jdGlvbihhcnJheSwgaXRlbSkg
eworICAgIHZhciBpbmRleCA9IHV0aWxzLmluZGV4T2YoYXJyYXksIGl0ZW0pOworICAgIGlmIChp
bmRleCA9PT0gLTEpIHsgYXJyYXkucHVzaChpdGVtKTsgfQorICB9LAorCisgIHJlbW92ZU9iamVj
dDogZnVuY3Rpb24oYXJyYXksIGl0ZW0pIHsKKyAgICB2YXIgaW5kZXggPSB1dGlscy5pbmRleE9m
KGFycmF5LCBpdGVtKTsKKyAgICBpZiAoaW5kZXggIT09IC0xKSB7IGFycmF5LnNwbGljZShpbmRl
eCwgMSk7IH0KKyAgfSwKKworICByZXBsYWNlOiBmdW5jdGlvbihhcnJheSwgaWR4LCBhbXQsIG9i
amVjdHMpIHsKKyAgICBpZiAoYXJyYXkucmVwbGFjZSkgeworICAgICAgcmV0dXJuIGFycmF5LnJl
cGxhY2UoaWR4LCBhbXQsIG9iamVjdHMpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgYXJncyA9
IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW2lkeCwgYW10XSwgb2JqZWN0cyk7CisgICAg
ICByZXR1cm4gYXJyYXkuc3BsaWNlLmFwcGx5KGFycmF5LCBhcmdzKTsKKyAgICB9CisgIH0sCisK
KyAgaW50ZXJzZWN0aW9uOiBmdW5jdGlvbihhcnJheTEsIGFycmF5MikgeworICAgIHZhciBpbnRl
cnNlY3Rpb24gPSBbXTsKKworICAgIGFycmF5MS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICAgIGlmIChhcnJheTIuaW5kZXhPZihlbGVtZW50KSA+PSAwKSB7CisgICAgICAgIGludGVy
c2VjdGlvbi5wdXNoKGVsZW1lbnQpOworICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIGlu
dGVyc2VjdGlvbjsKKyAgfQorfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qanNo
aW50IG5ld2NhcDpmYWxzZSovCisvKioKK0Btb2R1bGUgZW1iZXItbWV0YWwKKyovCisKKy8vIE5P
VEU6IFRoZXJlIGlzIGEgYnVnIGluIGpzaGludCB0aGF0IGRvZXNuJ3QgcmVjb2duaXplIGBPYmpl
Y3QoKWAgd2l0aG91dCBgbmV3YAorLy8gYXMgYmVpbmcgb2sgdW5sZXNzIGJvdGggYG5ld2NhcDpm
YWxzZWAgYW5kIG5vdCBgdXNlIHN0cmljdGAuCisvLyBodHRwczovL2dpdGh1Yi5jb20vanNoaW50
L2pzaGludC9pc3N1ZXMvMzkyCisKKy8vIFRlc3RpbmcgdGhpcyBpcyBub3QgaWRlYWwsIGJ1dCB3
ZSB3YW50IHRvIHVzZSBuYXRpdmUgZnVuY3Rpb25zCisvLyBpZiBhdmFpbGFibGUsIGJ1dCBub3Qg
dG8gdXNlIHZlcnNpb25zIGNyZWF0ZWQgYnkgbGlicmFyaWVzIGxpa2UgUHJvdG90eXBlCit2YXIg
aXNOYXRpdmVGdW5jID0gZnVuY3Rpb24oZnVuYykgeworICAvLyBUaGlzIHNob3VsZCBwcm9iYWJs
eSB3b3JrIGluIGFsbCBicm93c2VycyBsaWtlbHkgdG8gaGF2ZSBFUzUgYXJyYXkgbWV0aG9kcwor
ICByZXR1cm4gZnVuYyAmJiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jKS5p
bmRleE9mKCdbbmF0aXZlIGNvZGVdJykgPiAtMTsKK307CisKKy8vIEZyb206IGh0dHBzOi8vZGV2
ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3Rz
L2FycmF5L21hcAordmFyIGFycmF5TWFwID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5t
YXApID8gQXJyYXkucHJvdG90eXBlLm1hcCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsK
KyAgLy8idXNlIHN0cmljdCI7CisKKyAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBu
dWxsKSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOworICB9CisKKyAgdmFyIHQgPSBPYmpl
Y3QodGhpcyk7CisgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKKyAgaWYgKHR5cGVvZiBmdW4g
IT09ICJmdW5jdGlvbiIpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgIH0KKworICB2
YXIgcmVzID0gbmV3IEFycmF5KGxlbik7CisgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKKyAg
Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGlmIChpIGluIHQpIHsKKyAgICAg
IHJlc1tpXSA9IGZ1bi5jYWxsKHRoaXNwLCB0W2ldLCBpLCB0KTsKKyAgICB9CisgIH0KKworICBy
ZXR1cm4gcmVzOworfTsKKworLy8gRnJvbTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcv
ZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvZm9yZWFjaAordmFy
IGFycmF5Rm9yRWFjaCA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgPyBB
cnJheS5wcm90b3R5cGUuZm9yRWFjaCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsKKyAg
Ly8idXNlIHN0cmljdCI7CisKKyAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxs
KSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOworICB9CisKKyAgdmFyIHQgPSBPYmplY3Qo
dGhpcyk7CisgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKKyAgaWYgKHR5cGVvZiBmdW4gIT09
ICJmdW5jdGlvbiIpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgIH0KKworICB2YXIg
dGhpc3AgPSBhcmd1bWVudHNbMV07CisgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK
KyAgICBpZiAoaSBpbiB0KSB7CisgICAgICBmdW4uY2FsbCh0aGlzcCwgdFtpXSwgaSwgdCk7Cisg
ICAgfQorICB9Cit9OworCit2YXIgYXJyYXlJbmRleE9mID0gaXNOYXRpdmVGdW5jKEFycmF5LnBy
b3RvdHlwZS5pbmRleE9mKSA/IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIDogZnVuY3Rpb24gKG9i
aiwgZnJvbUluZGV4KSB7CisgIGlmIChmcm9tSW5kZXggPT09IG51bGwgfHwgZnJvbUluZGV4ID09
PSB1bmRlZmluZWQpIHsgZnJvbUluZGV4ID0gMDsgfQorICBlbHNlIGlmIChmcm9tSW5kZXggPCAw
KSB7IGZyb21JbmRleCA9IE1hdGgubWF4KDAsIHRoaXMubGVuZ3RoICsgZnJvbUluZGV4KTsgfQor
ICBmb3IgKHZhciBpID0gZnJvbUluZGV4LCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKyspIHsK
KyAgICBpZiAodGhpc1tpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9CisgIH0KKyAgcmV0dXJuIC0x
OworfTsKKworRW1iZXIuQXJyYXlQb2x5ZmlsbHMgPSB7CisgIG1hcDogYXJyYXlNYXAsCisgIGZv
ckVhY2g6IGFycmF5Rm9yRWFjaCwKKyAgaW5kZXhPZjogYXJyYXlJbmRleE9mCit9OworCitpZiAo
RW1iZXIuU0hJTV9FUzUpIHsKKyAgaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CisgICAgQXJy
YXkucHJvdG90eXBlLm1hcCA9IGFycmF5TWFwOworICB9CisKKyAgaWYgKCFBcnJheS5wcm90b3R5
cGUuZm9yRWFjaCkgeworICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gYXJyYXlGb3JFYWNo
OworICB9CisKKyAgaWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgeworICAgIEFycmF5LnBy
b3RvdHlwZS5pbmRleE9mID0gYXJyYXlJbmRleE9mOworICB9Cit9CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXItbWV0YWwKKyovCisKKy8qCisgIEphdmFT
Y3JpcHQgKGJlZm9yZSBFUzYpIGRvZXMgbm90IGhhdmUgYSBNYXAgaW1wbGVtZW50YXRpb24uIE9i
amVjdHMsCisgIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGFzIGRpY3Rpb25hcmllcywgbWF5IG9ubHkg
aGF2ZSBTdHJpbmdzIGFzIGtleXMuCisKKyAgQmVjYXVzZSBFbWJlciBoYXMgYSB3YXkgdG8gZ2V0
IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGV2ZXJ5IG9iamVjdAorICB2aWEgYEVtYmVyLmd1aWRG
b3JgLCB3ZSBjYW4gaW1wbGVtZW50IGEgcGVyZm9ybWFudCBNYXAgd2l0aCBhcmJpdHJhcnkKKyAg
a2V5cy4gQmVjYXVzZSBpdCBpcyBjb21tb25seSB1c2VkIGluIGxvdy1sZXZlbCBib29ra2VlcGlu
ZywgTWFwIGlzCisgIGltcGxlbWVudGVkIGFzIGEgcHVyZSBKYXZhU2NyaXB0IG9iamVjdCBmb3Ig
cGVyZm9ybWFuY2UuCisKKyAgVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjdXJyZW50
IGl0ZXJhdGlvbiBvZiB0aGUgRVM2IHByb3Bvc2FsIGZvcgorICBtYXBzIChodHRwOi8vd2lraS5l
Y21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OnNpbXBsZV9tYXBzX2FuZF9zZXRzKSwK
KyAgd2l0aCB0d28gZXhjZXB0aW9ucy4gRmlyc3QsIGJlY2F1c2Ugd2UgbmVlZCBvdXIgaW1wbGVt
ZW50YXRpb24gdG8gYmUgcGxlYXNhbnQKKyAgb24gb2xkZXIgYnJvd3NlcnMsIHdlIGRvIG5vdCB1
c2UgdGhlIGBkZWxldGVgIG5hbWUgKHVzaW5nIGByZW1vdmVgIGluc3RlYWQpLgorICBTZWNvbmQs
IGFzIHdlIGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4tVk0gaXRlcmF0aW9uLCB3ZSBpbXBs
ZW1lbnQgYQorICBmb3JFYWNoIG1ldGhvZCBmb3IgaXRlcmF0aW9uLgorCisgIE1hcCBpcyBtb2Nr
ZWQgb3V0IHRvIGxvb2sgbGlrZSBhbiBFbWJlciBvYmplY3QsIHNvIHlvdSBjYW4gZG8KKyAgYEVt
YmVyLk1hcC5jcmVhdGUoKWAgZm9yIHN5bW1ldHJ5IHdpdGggb3RoZXIgRW1iZXIgY2xhc3Nlcy4K
KyovCit2YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCisgICAgaW5kZXhPZiA9IEVtYmVyLkFy
cmF5UG9seWZpbGxzLmluZGV4T2Y7CisKK3ZhciBjb3B5ID0gZnVuY3Rpb24ob2JqKSB7CisgIHZh
ciBvdXRwdXQgPSB7fTsKKworICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgIGlmIChvYmou
aGFzT3duUHJvcGVydHkocHJvcCkpIHsgb3V0cHV0W3Byb3BdID0gb2JqW3Byb3BdOyB9CisgIH0K
KworICByZXR1cm4gb3V0cHV0OworfTsKKwordmFyIGNvcHlNYXAgPSBmdW5jdGlvbihvcmlnaW5h
bCwgbmV3T2JqZWN0KSB7CisgIHZhciBrZXlzID0gb3JpZ2luYWwua2V5cy5jb3B5KCksCisgICAg
ICB2YWx1ZXMgPSBjb3B5KG9yaWdpbmFsLnZhbHVlcyk7CisKKyAgbmV3T2JqZWN0LmtleXMgPSBr
ZXlzOworICBuZXdPYmplY3QudmFsdWVzID0gdmFsdWVzOworCisgIHJldHVybiBuZXdPYmplY3Q7
Cit9OworCisvKioKKyAgVGhpcyBjbGFzcyBpcyB1c2VkIGludGVybmFsbHkgYnkgRW1iZXIgYW5k
IEVtYmVyIERhdGEuCisgIFBsZWFzZSBkbyBub3QgdXNlIGl0IGF0IHRoaXMgdGltZS4gV2UgcGxh
biB0byBjbGVhbiBpdCB1cAorICBhbmQgYWRkIG1hbnkgdGVzdHMgc29vbi4KKworICBAY2xhc3Mg
T3JkZXJlZFNldAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBjb25zdHJ1Y3RvcgorICBAcHJpdmF0
ZQorKi8KK3ZhciBPcmRlcmVkU2V0ID0gRW1iZXIuT3JkZXJlZFNldCA9IGZ1bmN0aW9uKCkgewor
ICB0aGlzLmNsZWFyKCk7Cit9OworCisvKioKKyAgQG1ldGhvZCBjcmVhdGUKKyAgQHN0YXRpYwor
ICBAcmV0dXJuIHtFbWJlci5PcmRlcmVkU2V0fQorKi8KK09yZGVyZWRTZXQuY3JlYXRlID0gZnVu
Y3Rpb24oKSB7CisgIHJldHVybiBuZXcgT3JkZXJlZFNldCgpOworfTsKKworCitPcmRlcmVkU2V0
LnByb3RvdHlwZSA9IHsKKyAgLyoqCisgICAgQG1ldGhvZCBjbGVhcgorICAqLworICBjbGVhcjog
ZnVuY3Rpb24oKSB7CisgICAgdGhpcy5wcmVzZW5jZVNldCA9IHt9OworICAgIHRoaXMubGlzdCA9
IFtdOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgYWRkCisgICAgQHBhcmFtIG9iagorICAq
LworICBhZGQ6IGZ1bmN0aW9uKG9iaikgeworICAgIHZhciBndWlkID0gZ3VpZEZvcihvYmopLAor
ICAgICAgICBwcmVzZW5jZVNldCA9IHRoaXMucHJlc2VuY2VTZXQsCisgICAgICAgIGxpc3QgPSB0
aGlzLmxpc3Q7CisKKyAgICBpZiAoZ3VpZCBpbiBwcmVzZW5jZVNldCkgeyByZXR1cm47IH0KKwor
ICAgIHByZXNlbmNlU2V0W2d1aWRdID0gdHJ1ZTsKKyAgICBsaXN0LnB1c2gob2JqKTsKKyAgfSwK
KworICAvKioKKyAgICBAbWV0aG9kIHJlbW92ZQorICAgIEBwYXJhbSBvYmoKKyAgKi8KKyAgcmVt
b3ZlOiBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKKyAgICAg
ICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNlbmNlU2V0LAorICAgICAgICBsaXN0ID0gdGhpcy5s
aXN0OworCisgICAgZGVsZXRlIHByZXNlbmNlU2V0W2d1aWRdOworCisgICAgdmFyIGluZGV4ID0g
aW5kZXhPZi5jYWxsKGxpc3QsIG9iaik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgIGxp
c3Quc3BsaWNlKGluZGV4LCAxKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBp
c0VtcHR5CisgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgKi8KKyAgaXNFbXB0eTogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMubGlzdC5sZW5ndGggPT09IDA7CisgIH0sCisKKyAgLyoqCisg
ICAgQG1ldGhvZCBoYXMKKyAgICBAcGFyYW0gb2JqCisgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAg
Ki8KKyAgaGFzOiBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwK
KyAgICAgICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNlbmNlU2V0OworCisgICAgcmV0dXJuIGd1
aWQgaW4gcHJlc2VuY2VTZXQ7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBmb3JFYWNoCisg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb24KKyAgICBAcGFyYW0gdGFyZ2V0CisgICovCisg
IGZvckVhY2g6IGZ1bmN0aW9uKGZuLCBzZWxmKSB7CisgICAgLy8gYWxsb3cgbXV0YXRpb24gZHVy
aW5nIGl0ZXJhdGlvbgorICAgIHZhciBsaXN0ID0gdGhpcy5saXN0LnNsaWNlKCk7CisKKyAgICBm
b3IgKHZhciBpID0gMCwgaiA9IGxpc3QubGVuZ3RoOyBpIDwgajsgaSsrKSB7CisgICAgICBmbi5j
YWxsKHNlbGYsIGxpc3RbaV0pOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIHRv
QXJyYXkKKyAgICBAcmV0dXJuIHtBcnJheX0KKyAgKi8KKyAgdG9BcnJheTogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIHRoaXMubGlzdC5zbGljZSgpOworICB9LAorCisgIC8qKgorICAgIEBtZXRo
b2QgY29weQorICAgIEByZXR1cm4ge0VtYmVyLk9yZGVyZWRTZXR9CisgICovCisgIGNvcHk6IGZ1
bmN0aW9uKCkgeworICAgIHZhciBzZXQgPSBuZXcgT3JkZXJlZFNldCgpOworCisgICAgc2V0LnBy
ZXNlbmNlU2V0ID0gY29weSh0aGlzLnByZXNlbmNlU2V0KTsKKyAgICBzZXQubGlzdCA9IHRoaXMu
bGlzdC5zbGljZSgpOworCisgICAgcmV0dXJuIHNldDsKKyAgfQorfTsKKworLyoqCisgIEEgTWFw
IHN0b3JlcyB2YWx1ZXMgaW5kZXhlZCBieSBrZXlzLiBVbmxpa2UgSmF2YVNjcmlwdCdzCisgIGRl
ZmF1bHQgT2JqZWN0cywgdGhlIGtleXMgb2YgYSBNYXAgY2FuIGJlIGFueSBKYXZhU2NyaXB0Cisg
IG9iamVjdC4KKworICBJbnRlcm5hbGx5LCBhIE1hcCBoYXMgdHdvIGRhdGEgc3RydWN0dXJlczoK
KworICAxLiBga2V5c2A6IGFuIE9yZGVyZWRTZXQgb2YgYWxsIG9mIHRoZSBleGlzdGluZyBrZXlz
CisgIDIuIGB2YWx1ZXNgOiBhIEphdmFTY3JpcHQgT2JqZWN0IGluZGV4ZWQgYnkgdGhlIGBFbWJl
ci5ndWlkRm9yKGtleSlgCisKKyAgV2hlbiBhIGtleS92YWx1ZSBwYWlyIGlzIGFkZGVkIGZvciB0
aGUgZmlyc3QgdGltZSwgd2UKKyAgYWRkIHRoZSBrZXkgdG8gdGhlIGBrZXlzYCBPcmRlcmVkU2V0
LCBhbmQgY3JlYXRlIG9yCisgIHJlcGxhY2UgYW4gZW50cnkgaW4gYHZhbHVlc2AuIFdoZW4gYW4g
ZW50cnkgaXMgZGVsZXRlZCwKKyAgd2UgZGVsZXRlIGl0cyBlbnRyeSBpbiBga2V5c2AgYW5kIGB2
YWx1ZXNgLgorCisgIEBjbGFzcyBNYXAKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAcHJpdmF0ZQor
ICBAY29uc3RydWN0b3IKKyovCit2YXIgTWFwID0gRW1iZXIuTWFwID0gZnVuY3Rpb24oKSB7Cisg
IHRoaXMua2V5cyA9IEVtYmVyLk9yZGVyZWRTZXQuY3JlYXRlKCk7CisgIHRoaXMudmFsdWVzID0g
e307Cit9OworCisvKioKKyAgQG1ldGhvZCBjcmVhdGUKKyAgQHN0YXRpYworKi8KK01hcC5jcmVh
dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIG5ldyBNYXAoKTsKK307CisKK01hcC5wcm90b3R5
cGUgPSB7CisgIC8qKgorICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBn
aXZlbiBrZXkuCisKKyAgICBAbWV0aG9kIGdldAorICAgIEBwYXJhbSB7YW55dGhpbmd9IGtleQor
ICAgIEByZXR1cm4ge2FueXRoaW5nfSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXks
IG9yIGB1bmRlZmluZWRgCisgICovCisgIGdldDogZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIHZh
bHVlcyA9IHRoaXMudmFsdWVzLAorICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOworCisgICAg
cmV0dXJuIHZhbHVlc1tndWlkXTsKKyAgfSwKKworICAvKioKKyAgICBBZGRzIGEgdmFsdWUgdG8g
dGhlIG1hcC4gSWYgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBoYXMgYWxyZWFkeSBiZWVuCisg
ICAgcHJvdmlkZWQsIHRoZSBuZXcgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSBvbGQgdmFsdWUuCisK
KyAgICBAbWV0aG9kIHNldAorICAgIEBwYXJhbSB7YW55dGhpbmd9IGtleQorICAgIEBwYXJhbSB7
YW55dGhpbmd9IHZhbHVlCisgICovCisgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAg
IHZhciBrZXlzID0gdGhpcy5rZXlzLAorICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKKyAg
ICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKKworICAgIGtleXMuYWRkKGtleSk7CisgICAgdmFs
dWVzW2d1aWRdID0gdmFsdWU7CisgIH0sCisKKyAgLyoqCisgICAgUmVtb3ZlcyBhIHZhbHVlIGZy
b20gdGhlIG1hcCBmb3IgYW4gYXNzb2NpYXRlZCBrZXkuCisKKyAgICBAbWV0aG9kIHJlbW92ZQor
ICAgIEBwYXJhbSB7YW55dGhpbmd9IGtleQorICAgIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYg
YW4gaXRlbSB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICovCisgIHJlbW92ZTogZnVu
Y3Rpb24oa2V5KSB7CisgICAgLy8gZG9uJ3QgdXNlIEVTNiAiZGVsZXRlIiBiZWNhdXNlIGl0IHdp
bGwgYmUgYW5ub3lpbmcKKyAgICAvLyB0byB1c2UgaW4gYnJvd3NlcnMgdGhhdCBhcmUgbm90IEVT
NiBmcmllbmRseTsKKyAgICB2YXIga2V5cyA9IHRoaXMua2V5cywKKyAgICAgICAgdmFsdWVzID0g
dGhpcy52YWx1ZXMsCisgICAgICAgIGd1aWQgPSBndWlkRm9yKGtleSksCisgICAgICAgIHZhbHVl
OworCisgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgeworICAgICAga2V5cy5y
ZW1vdmUoa2V5KTsKKyAgICAgIHZhbHVlID0gdmFsdWVzW2d1aWRdOworICAgICAgZGVsZXRlIHZh
bHVlc1tndWlkXTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIENoZWNrIHdoZXRoZXIgYSBrZXkg
aXMgcHJlc2VudC4KKworICAgIEBtZXRob2QgaGFzCisgICAgQHBhcmFtIHthbnl0aGluZ30ga2V5
CisgICAgQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSB3YXMgcHJlc2VudCwgZmFs
c2Ugb3RoZXJ3aXNlCisgICovCisgIGhhczogZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIHZhbHVl
cyA9IHRoaXMudmFsdWVzLAorICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOworCisgICAgcmV0
dXJuIHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShndWlkKTsKKyAgfSwKKworICAvKioKKyAgICBJdGVy
YXRlIG92ZXIgYWxsIHRoZSBrZXlzIGFuZCB2YWx1ZXMuIENhbGxzIHRoZSBmdW5jdGlvbiBvbmNl
CisgICAgZm9yIGVhY2gga2V5LCBwYXNzaW5nIGluIHRoZSBrZXkgYW5kIHZhbHVlLCBpbiB0aGF0
IG9yZGVyLgorCisgICAgVGhlIGtleXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgaXRlcmF0ZWQgb3Zl
ciBpbiBpbnNlcnRpb24gb3JkZXIuCisKKyAgICBAbWV0aG9kIGZvckVhY2gKKyAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjaworICAgIEBwYXJhbSB7YW55dGhpbmd9IHNlbGYgaWYgcGFzc2Vk
LCB0aGUgYHRoaXNgIHZhbHVlIGluc2lkZSB0aGUKKyAgICAgIGNhbGxiYWNrLiBCeSBkZWZhdWx0
LCBgdGhpc2AgaXMgdGhlIG1hcC4KKyAgKi8KKyAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2ss
IHNlbGYpIHsKKyAgICB2YXIga2V5cyA9IHRoaXMua2V5cywKKyAgICAgICAgdmFsdWVzID0gdGhp
cy52YWx1ZXM7CisKKyAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CisgICAgICB2YXIg
Z3VpZCA9IGd1aWRGb3Ioa2V5KTsKKyAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZiwga2V5LCB2YWx1
ZXNbZ3VpZF0pOworICAgIH0pOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgY29weQorICAg
IEByZXR1cm4ge0VtYmVyLk1hcH0KKyAgKi8KKyAgY29weTogZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuIGNvcHlNYXAodGhpcywgbmV3IE1hcCgpKTsKKyAgfQorfTsKKworLyoqCisgIEBjbGFzcyBN
YXBXaXRoRGVmYXVsdAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk1hcAor
ICBAcHJpdmF0ZQorICBAY29uc3RydWN0b3IKKyAgQHBhcmFtIFtvcHRpb25zXQorICAgIEBwYXJh
bSB7YW55dGhpbmd9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV0KKyovCit2YXIgTWFwV2l0aERlZmF1
bHQgPSBFbWJlci5NYXBXaXRoRGVmYXVsdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgTWFwLmNh
bGwodGhpcyk7CisgIHRoaXMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7Cit9
OworCisvKioKKyAgQG1ldGhvZCBjcmVhdGUKKyAgQHN0YXRpYworICBAcGFyYW0gW29wdGlvbnNd
CisgICAgQHBhcmFtIHthbnl0aGluZ30gW29wdGlvbnMuZGVmYXVsdFZhbHVlXQorICBAcmV0dXJu
IHtFbWJlci5NYXBXaXRoRGVmYXVsdHxFbWJlci5NYXB9IElmIG9wdGlvbnMgYXJlIHBhc3NlZCwg
cmV0dXJucyAKKyAgICBgRW1iZXIuTWFwV2l0aERlZmF1bHRgIG90aGVyd2lzZSByZXR1cm5zIGBF
bWJlci5NYXBgCisqLworTWFwV2l0aERlZmF1bHQuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykg
eworICBpZiAob3B0aW9ucykgeworICAgIHJldHVybiBuZXcgTWFwV2l0aERlZmF1bHQob3B0aW9u
cyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBNYXAoKTsKKyAgfQorfTsKKworTWFwV2l0
aERlZmF1bHQucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKE1hcC5wcm90b3R5cGUpOworCisvKioK
KyAgUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS4KKworICBA
bWV0aG9kIGdldAorICBAcGFyYW0ge2FueXRoaW5nfSBrZXkKKyAgQHJldHVybiB7YW55dGhpbmd9
IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgb3IgdGhlIGRlZmF1bHQgdmFsdWUK
KyovCitNYXBXaXRoRGVmYXVsdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7CisgIHZh
ciBoYXNWYWx1ZSA9IHRoaXMuaGFzKGtleSk7CisKKyAgaWYgKGhhc1ZhbHVlKSB7CisgICAgcmV0
dXJuIE1hcC5wcm90b3R5cGUuZ2V0LmNhbGwodGhpcywga2V5KTsKKyAgfSBlbHNlIHsKKyAgICB2
YXIgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUoa2V5KTsKKyAgICB0aGlzLnNldChr
ZXksIGRlZmF1bHRWYWx1ZSk7CisgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgfQorfTsKKwor
LyoqCisgIEBtZXRob2QgY29weQorICBAcmV0dXJuIHtFbWJlci5NYXBXaXRoRGVmYXVsdH0KKyov
CitNYXBXaXRoRGVmYXVsdC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4g
Y29weU1hcCh0aGlzLCBuZXcgTWFwV2l0aERlZmF1bHQoeworICAgIGRlZmF1bHRWYWx1ZTogdGhp
cy5kZWZhdWx0VmFsdWUKKyAgfSkpOworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsK
Ky8qKgorQG1vZHVsZSBlbWJlci1tZXRhbAorKi8KKwordmFyIE1FVEFfS0VZID0gRW1iZXIuTUVU
QV9LRVksIGdldCwgc2V0OworCit2YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5E
QVRPUllfU0VUVEVSOworCit2YXIgSVNfR0xPQkFMID0gL14oW0EtWiRdfChbMC05XVtBLVokXSkp
LzsKK3ZhciBJU19HTE9CQUxfUEFUSCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS4qW1wuXCpd
LzsKK3ZhciBIQVNfVEhJUyAgPSAvXnRoaXNbXC5cKl0vOwordmFyIEZJUlNUX0tFWSA9IC9eKFte
XC5cKl0rKS87CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4KKy8vIEdFVCBBTkQgU0VUCisvLworLy8gSWYgd2UgYXJlIG9uIGEg
cGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIGdldCB1c2UgdGhvc2UuCisv
LyBPdGhlcndpc2Ugc2ltdWxhdGUgYWNjZXNzb3JzIGJ5IGxvb2tpbmcgdXAgdGhlIHByb3BlcnR5
IGRpcmVjdGx5IG9uIHRoZQorLy8gb2JqZWN0LgorCisvKioKKyAgR2V0cyB0aGUgdmFsdWUgb2Yg
YSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QuIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCwKKyAg
dGhlIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZC4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBkZWZp
bmVkIGJ1dCB0aGUKKyAgb2JqZWN0IGltcGxlbWVudHMgdGhlIGB1bmtub3duUHJvcGVydHlgIG1l
dGhvZCB0aGVuIHRoYXQgd2lsbCBiZSBpbnZva2VkLgorCisgIElmIHlvdSBwbGFuIHRvIHJ1biBv
biBJRTggYW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2UgdGhpcworICBtZXRo
b2QgYW55dGltZSB5b3Ugd2FudCB0byByZXRyaWV2ZSBhIHByb3BlcnR5IG9uIGFuIG9iamVjdCB0
aGF0IHlvdSBkb24ndAorICBrbm93IGZvciBzdXJlIGlzIHByaXZhdGUuIChQcm9wZXJ0aWVzIGJl
Z2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUgJ18nIAorICBhcmUgY29uc2lkZXJlZCBwcml2YXRl
LikKKworICBPbiBhbGwgbmV3ZXIgYnJvd3NlcnMsIHlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMg
bWV0aG9kIHRvIHJldHJpZXZlCisgIHByb3BlcnRpZXMgaWYgdGhlIHByb3BlcnR5IG1pZ2h0IG5v
dCBiZSBkZWZpbmVkIG9uIHRoZSBvYmplY3QgYW5kIHlvdSB3YW50CisgIHRvIHJlc3BlY3QgdGhl
IGB1bmtub3duUHJvcGVydHlgIGhhbmRsZXIuIE90aGVyd2lzZSB5b3UgY2FuIGlnbm9yZSB0aGlz
CisgIG1ldGhvZC4KKworICBOb3RlIHRoYXQgaWYgdGhlIG9iamVjdCBpdHNlbGYgaXMgYHVuZGVm
aW5lZGAsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cKKyAgYW4gZXJyb3IuCisKKyAgQG1ldGhvZCBn
ZXQKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0
cmlldmUgZnJvbS4KKyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0
byByZXRyaWV2ZQorICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciBgbnVs
bGAuCisqLworZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iaiwga2V5TmFtZSkgeworICAvLyBIZWxwZXJz
IHRoYXQgb3BlcmF0ZSB3aXRoICd0aGlzJyB3aXRoaW4gYW4gI2VhY2gKKyAgaWYgKGtleU5hbWUg
PT09ICcnKSB7CisgICAgcmV0dXJuIG9iajsKKyAgfQorCisgIGlmICgha2V5TmFtZSAmJiAnc3Ry
aW5nJz09PXR5cGVvZiBvYmopIHsKKyAgICBrZXlOYW1lID0gb2JqOworICAgIG9iaiA9IG51bGw7
CisgIH0KKworICBpZiAoIW9iaiB8fCBrZXlOYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsKKyAg
ICBFbWJlci5hc3NlcnQoIkNhbm5vdCBjYWxsIGdldCB3aXRoICciKyBrZXlOYW1lICsiJyBvbiBh
biB1bmRlZmluZWQgb2JqZWN0LiIsIG9iaiAhPT0gdW5kZWZpbmVkKTsKKyAgICByZXR1cm4gZ2V0
UGF0aChvYmosIGtleU5hbWUpOworICB9CisKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgbmVlZCB0byBw
cm92aWRlIGFuIG9iamVjdCBhbmQga2V5IHRvIGBnZXRgLiIsICEhb2JqICYmIGtleU5hbWUpOwor
CisgIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXSwgZGVzYyA9IG1ldGEgJiYgbWV0YS5kZXNjc1tr
ZXlOYW1lXSwgcmV0OworICBpZiAoZGVzYykgeworICAgIHJldHVybiBkZXNjLmdldChvYmosIGtl
eU5hbWUpOworICB9IGVsc2UgeworICAgIGlmIChNQU5EQVRPUllfU0VUVEVSICYmIG1ldGEgJiYg
bWV0YS53YXRjaGluZ1trZXlOYW1lXSA+IDApIHsKKyAgICAgIHJldCA9IG1ldGEudmFsdWVzW2tl
eU5hbWVdOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBvYmpba2V5TmFtZV07CisgICAgfQor
CisgICAgaWYgKHJldCA9PT0gdW5kZWZpbmVkICYmCisgICAgICAgICdvYmplY3QnID09PSB0eXBl
b2Ygb2JqICYmICEoa2V5TmFtZSBpbiBvYmopICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmou
dW5rbm93blByb3BlcnR5KSB7CisgICAgICByZXR1cm4gb2JqLnVua25vd25Qcm9wZXJ0eShrZXlO
YW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICB9Cit9OworCisvKioKKyAgU2V0cyB0
aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QsIHJlc3BlY3RpbmcgY29tcHV0ZWQg
cHJvcGVydGllcworICBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyBhbmQgb3RoZXIgbGlzdGVuZXJz
IG9mIHRoZSBjaGFuZ2UuIElmIHRoZQorICBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBidXQgdGhl
IG9iamVjdCBpbXBsZW1lbnRzIHRoZSBgdW5rbm93blByb3BlcnR5YAorICBtZXRob2QgdGhlbiB0
aGF0IHdpbGwgYmUgaW52b2tlZCBhcyB3ZWxsLgorCisgIElmIHlvdSBwbGFuIHRvIHJ1biBvbiBJ
RTggYW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2UgdGhpcworICBtZXRob2Qg
YW55dGltZSB5b3Ugd2FudCB0byBzZXQgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QgdGhhdCB5b3Ug
ZG9uJ3QKKyAga25vdyBmb3Igc3VyZSBpcyBwcml2YXRlLiAoUHJvcGVydGllcyBiZWdpbm5pbmcg
d2l0aCBhbiB1bmRlcnNjb3JlICdfJyAKKyAgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4pCisKKyAg
T24gYWxsIG5ld2VyIGJyb3dzZXJzLCB5b3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZCB0
byBzZXQKKyAgcHJvcGVydGllcyBpZiB0aGUgcHJvcGVydHkgbWlnaHQgbm90IGJlIGRlZmluZWQg
b24gdGhlIG9iamVjdCBhbmQgeW91IHdhbnQKKyAgdG8gcmVzcGVjdCB0aGUgYHVua25vd25Qcm9w
ZXJ0eWAgaGFuZGxlci4gT3RoZXJ3aXNlIHlvdSBjYW4gaWdub3JlIHRoaXMKKyAgbWV0aG9kLgor
CisgIEBtZXRob2Qgc2V0CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUg
b2JqZWN0IHRvIG1vZGlmeS4KKyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5
IGtleSB0byBzZXQKKyAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKKyAg
QHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIHZhbHVlLgorKi8KK3NldCA9IGZ1bmN0aW9uIHNl
dChvYmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFudCkgeworICBpZiAodHlwZW9mIG9iaiA9PT0g
J3N0cmluZycpIHsKKyAgICBFbWJlci5hc3NlcnQoIlBhdGggJyIgKyBvYmogKyAiJyBtdXN0IGJl
IGdsb2JhbCBpZiBubyBvYmogaXMgZ2l2ZW4uIiwgSVNfR0xPQkFMLnRlc3Qob2JqKSk7CisgICAg
dmFsdWUgPSBrZXlOYW1lOworICAgIGtleU5hbWUgPSBvYmo7CisgICAgb2JqID0gbnVsbDsKKyAg
fQorCisgIGlmICghb2JqIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAtMSkgeworICAgIHJl
dHVybiBzZXRQYXRoKG9iaiwga2V5TmFtZSwgdmFsdWUsIHRvbGVyYW50KTsKKyAgfQorCisgIEVt
YmVyLmFzc2VydCgiWW91IG5lZWQgdG8gcHJvdmlkZSBhbiBvYmplY3QgYW5kIGtleSB0byBgc2V0
YC4iLCAhIW9iaiAmJiBrZXlOYW1lICE9PSB1bmRlZmluZWQpOworICBFbWJlci5hc3NlcnQoJ2Nh
bGxpbmcgc2V0IG9uIGRlc3Ryb3llZCBvYmplY3QnLCAhb2JqLmlzRGVzdHJveWVkKTsKKworICB2
YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sIGRlc2MgPSBtZXRhICYmIG1ldGEuZGVzY3Nba2V5TmFt
ZV0sCisgICAgICBpc1Vua25vd24sIGN1cnJlbnRWYWx1ZTsKKyAgaWYgKGRlc2MpIHsKKyAgICBk
ZXNjLnNldChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBpc1Vua25vd24g
PSAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iaiAmJiAhKGtleU5hbWUgaW4gb2JqKTsKKworICAgIC8v
IHNldFVua25vd25Qcm9wZXJ0eSBpcyBjYWxsZWQgaWYgYG9iamAgaXMgYW4gb2JqZWN0LAorICAg
IC8vIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBhbmQgdGhlCisgICAgLy8g
YHNldFVua25vd25Qcm9wZXJ0eWAgbWV0aG9kIGV4aXN0cyBvbiB0aGUgb2JqZWN0CisgICAgaWYg
KGlzVW5rbm93biAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLnNldFVua25vd25Qcm9wZXJ0
eSkgeworICAgICAgb2JqLnNldFVua25vd25Qcm9wZXJ0eShrZXlOYW1lLCB2YWx1ZSk7CisgICAg
fSBlbHNlIGlmIChtZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5TmFtZV0gPiAwKSB7CisgICAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUikgeworICAgICAgICBjdXJyZW50VmFsdWUgPSBtZXRhLnZhbHVl
c1trZXlOYW1lXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJlbnRWYWx1ZSA9IG9ialtr
ZXlOYW1lXTsKKyAgICAgIH0KKyAgICAgIC8vIG9ubHkgdHJpZ2dlciBhIGNoYW5nZSBpZiB0aGUg
dmFsdWUgaGFzIGNoYW5nZWQKKyAgICAgIGlmICh2YWx1ZSAhPT0gY3VycmVudFZhbHVlKSB7Cisg
ICAgICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZShvYmosIGtleU5hbWUpOworICAgICAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUikgeworICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHVu
ZGVmaW5lZCAmJiAhKGtleU5hbWUgaW4gb2JqKSkgeworICAgICAgICAgICAgRW1iZXIuZGVmaW5l
UHJvcGVydHkob2JqLCBrZXlOYW1lLCBudWxsLCB2YWx1ZSk7IC8vIHNldHVwIG1hbmRhdG9yeSBz
ZXR0ZXIKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0YS52YWx1ZXNba2V5TmFt
ZV0gPSB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2Jq
W2tleU5hbWVdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgRW1iZXIucHJvcGVydHlEaWRD
aGFuZ2Uob2JqLCBrZXlOYW1lKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb2JqW2tl
eU5hbWVdID0gdmFsdWU7CisgICAgfQorICB9CisgIHJldHVybiB2YWx1ZTsKK307CisKKy8vIEN1
cnJlbnRseSB1c2VkIG9ubHkgYnkgRW1iZXIgRGF0YSB0ZXN0cworaWYgKEVtYmVyLmNvbmZpZy5v
dmVycmlkZUFjY2Vzc29ycykgeworICBFbWJlci5nZXQgPSBnZXQ7CisgIEVtYmVyLnNldCA9IHNl
dDsKKyAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCk7CisgIGdldCA9IEVtYmVyLmdl
dDsKKyAgc2V0ID0gRW1iZXIuc2V0OworfQorCitmdW5jdGlvbiBmaXJzdEtleShwYXRoKSB7Cisg
IHJldHVybiBwYXRoLm1hdGNoKEZJUlNUX0tFWSlbMF07Cit9CisKKy8vIGFzc3VtZXMgcGF0aCBp
cyBhbHJlYWR5IG5vcm1hbGl6ZWQKK2Z1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlKHRhcmdldCwgcGF0
aCkgeworICB2YXIgaGFzVGhpcyAgPSBIQVNfVEhJUy50ZXN0KHBhdGgpLAorICAgICAgaXNHbG9i
YWwgPSAhaGFzVGhpcyAmJiBJU19HTE9CQUxfUEFUSC50ZXN0KHBhdGgpLAorICAgICAga2V5Owor
CisgIGlmICghdGFyZ2V0IHx8IGlzR2xvYmFsKSB0YXJnZXQgPSBFbWJlci5sb29rdXA7CisgIGlm
IChoYXNUaGlzKSBwYXRoID0gcGF0aC5zbGljZSg1KTsKKworICBpZiAodGFyZ2V0ID09PSBFbWJl
ci5sb29rdXApIHsKKyAgICBrZXkgPSBmaXJzdEtleShwYXRoKTsKKyAgICB0YXJnZXQgPSBnZXQo
dGFyZ2V0LCBrZXkpOworICAgIHBhdGggICA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKKyAg
fQorCisgIC8vIG11c3QgcmV0dXJuIHNvbWUga2luZCBvZiBwYXRoIHRvIGJlIHZhbGlkIGVsc2Ug
b3RoZXIgdGhpbmdzIHdpbGwgYnJlYWsuCisgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aD09PTAp
IHRocm93IG5ldyBFcnJvcignSW52YWxpZCBQYXRoJyk7CisKKyAgcmV0dXJuIFsgdGFyZ2V0LCBw
YXRoIF07Cit9CisKK2Z1bmN0aW9uIGdldFBhdGgocm9vdCwgcGF0aCkgeworICB2YXIgaGFzVGhp
cywgcGFydHMsIHR1cGxlLCBpZHgsIGxlbjsKKworICAvLyBJZiB0aGVyZSBpcyBubyByb290IGFu
ZCBwYXRoIGlzIGEga2V5IG5hbWUsIHJldHVybiB0aGF0CisgIC8vIHByb3BlcnR5IGZyb20gdGhl
IGdsb2JhbCBvYmplY3QuCisgIC8vIEUuZy4gZ2V0KCdFbWJlcicpIC0+IEVtYmVyCisgIGlmIChy
b290ID09PSBudWxsICYmIHBhdGguaW5kZXhPZignLicpID09PSAtMSkgeyByZXR1cm4gZ2V0KEVt
YmVyLmxvb2t1cCwgcGF0aCk7IH0KKworICAvLyBkZXRlY3QgY29tcGxpY2F0ZWQgcGF0aHMgYW5k
IG5vcm1hbGl6ZSB0aGVtCisgIGhhc1RoaXMgID0gSEFTX1RISVMudGVzdChwYXRoKTsKKworICBp
ZiAoIXJvb3QgfHwgaGFzVGhpcykgeworICAgIHR1cGxlID0gbm9ybWFsaXplVHVwbGUocm9vdCwg
cGF0aCk7CisgICAgcm9vdCA9IHR1cGxlWzBdOworICAgIHBhdGggPSB0dXBsZVsxXTsKKyAgICB0
dXBsZS5sZW5ndGggPSAwOworICB9CisKKyAgcGFydHMgPSBwYXRoLnNwbGl0KCIuIik7CisgIGxl
biA9IHBhcnRzLmxlbmd0aDsKKyAgZm9yIChpZHg9MDsgcm9vdCAmJiBpZHg8bGVuOyBpZHgrKykg
eworICAgIHJvb3QgPSBnZXQocm9vdCwgcGFydHNbaWR4XSwgdHJ1ZSk7CisgICAgaWYgKHJvb3Qg
JiYgcm9vdC5pc0Rlc3Ryb3llZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9CisgIH0KKyAgcmV0dXJu
IHJvb3Q7Cit9CisKK2Z1bmN0aW9uIHNldFBhdGgocm9vdCwgcGF0aCwgdmFsdWUsIHRvbGVyYW50
KSB7CisgIHZhciBrZXlOYW1lOworCisgIC8vIGdldCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRo
CisgIGtleU5hbWUgPSBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4T2YoJy4nKSArIDEpOworCisg
IC8vIGdldCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGFydAorICBwYXRoICAgID0gcGF0aC5zbGlj
ZSgwLCBwYXRoLmxlbmd0aC0oa2V5TmFtZS5sZW5ndGgrMSkpOworCisgIC8vIHVubGVzcyB0aGUg
cGF0aCBpcyB0aGlzLCBsb29rIHVwIHRoZSBmaXJzdCBwYXJ0IHRvCisgIC8vIGdldCB0aGUgcm9v
dAorICBpZiAocGF0aCAhPT0gJ3RoaXMnKSB7CisgICAgcm9vdCA9IGdldFBhdGgocm9vdCwgcGF0
aCk7CisgIH0KKworICBpZiAoIWtleU5hbWUgfHwga2V5TmFtZS5sZW5ndGggPT09IDApIHsKKyAg
ICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBwYXNzZWQgYW4gZW1wdHkgcGF0aCcpOworICB9CisKKyAg
aWYgKCFyb290KSB7CisgICAgaWYgKHRvbGVyYW50KSB7IHJldHVybjsgfQorICAgIGVsc2UgeyB0
aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBpbiBwYXRoICcrcGF0aCsnIGNvdWxkIG5vdCBiZSBmb3Vu
ZCBvciB3YXMgZGVzdHJveWVkLicpOyB9CisgIH0KKworICByZXR1cm4gc2V0KHJvb3QsIGtleU5h
bWUsIHZhbHVlKTsKK30KKworLyoqCisgIEBwcml2YXRlCisKKyAgTm9ybWFsaXplcyBhIHRhcmdl
dC9wYXRoIHBhaXIgdG8gcmVmbGVjdCB0aGF0IGFjdHVhbCB0YXJnZXQvcGF0aCB0aGF0IHNob3Vs
ZAorICBiZSBvYnNlcnZlZCwgZXRjLiBUaGlzIHRha2VzIGludG8gYWNjb3VudCBwYXNzaW5nIGlu
IGdsb2JhbCBwcm9wZXJ0eQorICBwYXRocyAoaS5lLiBhIHBhdGggYmVnaW5uaW5nIHdpdGggYSBj
YXB0aWFsIGxldHRlciBub3QgZGVmaW5lZCBvbiB0aGUKKyAgdGFyZ2V0KSBhbmQgKiBzZXBhcmF0
b3JzLgorCisgIEBtZXRob2Qgbm9ybWFsaXplVHVwbGUKKyAgQGZvciBFbWJlcgorICBAcGFyYW0g
e09iamVjdH0gdGFyZ2V0IFRoZSBjdXJyZW50IHRhcmdldC4gTWF5IGJlIGBudWxsYC4KKyAgQHBh
cmFtIHtTdHJpbmd9IHBhdGggQSBwYXRoIG9uIHRoZSB0YXJnZXQgb3IgYSBnbG9iYWwgcHJvcGVy
dHkgcGF0aC4KKyAgQHJldHVybiB7QXJyYXl9IGEgdGVtcG9yYXJ5IGFycmF5IHdpdGggdGhlIG5v
cm1hbGl6ZWQgdGFyZ2V0L3BhdGggcGFpci4KKyovCitFbWJlci5ub3JtYWxpemVUdXBsZSA9IGZ1
bmN0aW9uKHRhcmdldCwgcGF0aCkgeworICByZXR1cm4gbm9ybWFsaXplVHVwbGUodGFyZ2V0LCBw
YXRoKTsKK307CisKK0VtYmVyLmdldFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24ocm9vdCwga2V5LCBk
ZWZhdWx0VmFsdWUpIHsKKyAgdmFyIHZhbHVlID0gZ2V0KHJvb3QsIGtleSk7CisKKyAgaWYgKHZh
bHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGRlZmF1bHRWYWx1ZTsgfQorICByZXR1cm4gdmFs
dWU7Cit9OworCisKK0VtYmVyLmdldCA9IGdldDsKK0VtYmVyLmdldFBhdGggPSBFbWJlci5kZXBy
ZWNhdGVGdW5jKCdnZXRQYXRoIGlzIGRlcHJlY2F0ZWQgc2luY2UgZ2V0IG5vdyBzdXBwb3J0cyBw
YXRocycsIEVtYmVyLmdldCk7CisKK0VtYmVyLnNldCA9IHNldDsKK0VtYmVyLnNldFBhdGggPSBF
bWJlci5kZXByZWNhdGVGdW5jKCdzZXRQYXRoIGlzIGRlcHJlY2F0ZWQgc2luY2Ugc2V0IG5vdyBz
dXBwb3J0cyBwYXRocycsIEVtYmVyLnNldCk7CisKKy8qKgorICBFcnJvci10b2xlcmFudCBmb3Jt
IG9mIGBFbWJlci5zZXRgLiBXaWxsIG5vdCBibG93IHVwIGlmIGFueSBwYXJ0IG9mIHRoZQorICBj
aGFpbiBpcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBvciBkZXN0cm95ZWQuCisKKyAgVGhpcyBpcyBw
cmltYXJpbHkgdXNlZCB3aGVuIHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1heSB0cnkgdG8gdXBk
YXRlIGFmdGVyCisgIGFuIG9iamVjdCBoYXMgYmVlbiBkZXN0cm95ZWQuCisKKyAgQG1ldGhvZCB0
cnlTZXQKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8g
bW9kaWZ5LgorICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkga2V5IHRvIHNl
dAorICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAorKi8KK0VtYmVyLnRy
eVNldCA9IGZ1bmN0aW9uKHJvb3QsIHBhdGgsIHZhbHVlKSB7CisgIHJldHVybiBzZXQocm9vdCwg
cGF0aCwgdmFsdWUsIHRydWUpOworfTsKK0VtYmVyLnRyeVNldFBhdGggPSBFbWJlci5kZXByZWNh
dGVGdW5jKCd0cnlTZXRQYXRoIGhhcyBiZWVuIHJlbmFtZWQgdG8gdHJ5U2V0JywgRW1iZXIudHJ5
U2V0KTsKKworLyoqCisgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcGF0aCBpcyBnbG9i
YWwgKGUuZy4sIGBNeUFwcC5mb29Db250cm9sbGVyLmJhcmApCisgIGluc3RlYWQgb2YgbG9jYWwg
KGBmb28uYmFyLmJhemApLgorCisgIEBtZXRob2QgaXNHbG9iYWxQYXRoCisgIEBmb3IgRW1iZXIK
KyAgQHByaXZhdGUKKyAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKKyAgQHJldHVybiBCb29sZWFuCisq
LworRW1iZXIuaXNHbG9iYWxQYXRoID0gZnVuY3Rpb24ocGF0aCkgeworICByZXR1cm4gSVNfR0xP
QkFMLnRlc3QocGF0aCk7Cit9OworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioK
K0Btb2R1bGUgZW1iZXItbWV0YWwKKyovCisKK3ZhciBHVUlEX0tFWSA9IEVtYmVyLkdVSURfS0VZ
LAorICAgIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCisgICAgRU1QVFlfTUVUQSA9IEVtYmVy
LkVNUFRZX01FVEEsCisgICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCisgICAgb19jcmVhdGUgPSBF
bWJlci5jcmVhdGUsCisgICAgb2JqZWN0RGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5k
ZWZpbmVQcm9wZXJ0eTsKKwordmFyIE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFU
T1JZX1NFVFRFUjsKKworLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgorLy8gREVTQ1JJUFRPUgorLy8KKworLyoqCisgIE9iamVjdHMg
b2YgdGhpcyB0eXBlIGNhbiBpbXBsZW1lbnQgYW4gaW50ZXJmYWNlIHRvIHJlc3BvbmRzIHJlcXVl
c3RzIHRvCisgIGdldCBhbmQgc2V0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYW5kbGVz
IHNpbXBsZSBwcm9wZXJ0aWVzLgorCisgIFlvdSBnZW5lcmFsbHkgd29uJ3QgbmVlZCB0byBjcmVh
dGUgb3Igc3ViY2xhc3MgdGhpcyBkaXJlY3RseS4KKworICBAY2xhc3MgRGVzY3JpcHRvcgorICBA
bmFtZXNwYWNlIEVtYmVyCisgIEBwcml2YXRlCisgIEBjb25zdHJ1Y3RvcgorKi8KK3ZhciBEZXNj
cmlwdG9yID0gRW1iZXIuRGVzY3JpcHRvciA9IGZ1bmN0aW9uKCkge307CisKKy8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIERF
RklOSU5HIFBST1BFUlRJRVMgQVBJCisvLworCit2YXIgTUFOREFUT1JZX1NFVFRFUl9GVU5DVElP
TiA9IEVtYmVyLk1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04gPSBmdW5jdGlvbih2YWx1ZSkgewor
ICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBFbWJlci5zZXQoKSB0byBhY2Nlc3MgdGhpcyBw
cm9wZXJ0eSAob2YgIiArIHRoaXMgKyAiKSIsIGZhbHNlKTsKK307CisKK3ZhciBERUZBVUxUX0dF
VFRFUl9GVU5DVElPTiA9IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OID0gZnVuY3Rpb24o
bmFtZSkgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgdmFyIG1ldGEgPSB0aGlzW01FVEFf
S0VZXTsKKyAgICByZXR1cm4gbWV0YSAmJiBtZXRhLnZhbHVlc1tuYW1lXTsKKyAgfTsKK307CisK
Ky8qKgorICBAcHJpdmF0ZQorCisgIE5PVEU6IFRoaXMgaXMgYSBsb3ctbGV2ZWwgbWV0aG9kIHVz
ZWQgYnkgb3RoZXIgcGFydHMgb2YgdGhlIEFQSS4gWW91IGFsbW9zdAorICBuZXZlciB3YW50IHRv
IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQgeW91IHNob3VsZCB1c2UKKyAgYEVt
YmVyLm1peGluKClgIHRvIGRlZmluZSBuZXcgcHJvcGVydGllcy4KKworICBEZWZpbmVzIGEgcHJv
cGVydHkgb24gYW4gb2JqZWN0LiBUaGlzIG1ldGhvZCB3b3JrcyBtdWNoIGxpa2UgdGhlIEVTNQor
ICBgT2JqZWN0LmRlZmluZVByb3BlcnR5KClgIG1ldGhvZCBleGNlcHQgdGhhdCBpdCBjYW4gYWxz
byBhY2NlcHQgY29tcHV0ZWQKKyAgcHJvcGVydGllcyBhbmQgb3RoZXIgc3BlY2lhbCBkZXNjcmlw
dG9ycy4KKworICBOb3JtYWxseSB0aGlzIG1ldGhvZCB0YWtlcyBvbmx5IHRocmVlIHBhcmFtZXRl
cnMuIEhvd2V2ZXIgaWYgeW91IHBhc3MgYW4KKyAgaW5zdGFuY2Ugb2YgYEVtYmVyLkRlc2NyaXB0
b3JgIGFzIHRoZSB0aGlyZCBwYXJhbSB0aGVuIHlvdSBjYW4gcGFzcyBhbgorICBvcHRpb25hbCB2
YWx1ZSBhcyB0aGUgZm91cnRoIHBhcmFtZXRlci4gVGhpcyBpcyBvZnRlbiBtb3JlIGVmZmljaWVu
dCB0aGFuCisgIGNyZWF0aW5nIG5ldyBkZXNjcmlwdG9yIGhhc2hlcyBmb3IgZWFjaCBwcm9wZXJ0
eS4KKworICAjIyBFeGFtcGxlcworCisgIGBgYGphdmFzY3JpcHQKKyAgLy8gRVM1IGNvbXBhdGli
bGUgbW9kZQorICBFbWJlci5kZWZpbmVQcm9wZXJ0eShjb250YWN0LCAnZmlyc3ROYW1lJywgewor
ICAgIHdyaXRhYmxlOiB0cnVlLAorICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAgZW51bWVy
YWJsZTogdHJ1ZSwKKyAgICB2YWx1ZTogJ0NoYXJsZXMnCisgIH0pOworCisgIC8vIGRlZmluZSBh
IHNpbXBsZSBwcm9wZXJ0eQorICBFbWJlci5kZWZpbmVQcm9wZXJ0eShjb250YWN0LCAnbGFzdE5h
bWUnLCB1bmRlZmluZWQsICdKb2xsZXknKTsKKworICAvLyBkZWZpbmUgYSBjb21wdXRlZCBwcm9w
ZXJ0eQorICBFbWJlci5kZWZpbmVQcm9wZXJ0eShjb250YWN0LCAnZnVsbE5hbWUnLCBFbWJlci5j
b21wdXRlZChmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5maXJzdE5hbWUrJyAnK3RoaXMu
bGFzdE5hbWU7CisgIH0pLnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKSk7CisgIGBg
YAorCisgIEBtZXRob2QgZGVmaW5lUHJvcGVydHkKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09i
amVjdH0gb2JqIHRoZSBvYmplY3QgdG8gZGVmaW5lIHRoaXMgcHJvcGVydHkgb24uIFRoaXMgbWF5
IGJlIGEgcHJvdG90eXBlLgorICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSB0aGUgbmFtZSBvZiB0
aGUgcHJvcGVydHkKKyAgQHBhcmFtIHtFbWJlci5EZXNjcmlwdG9yfSBbZGVzY10gYW4gaW5zdGFu
Y2Ugb2YgYEVtYmVyLkRlc2NyaXB0b3JgICh0eXBpY2FsbHkgYQorICAgIGNvbXB1dGVkIHByb3Bl
cnR5KSBvciBhbiBFUzUgZGVzY3JpcHRvci4KKyAgICBZb3UgbXVzdCBwcm92aWRlIHRoaXMgb3Ig
YGRhdGFgIGJ1dCBub3QgYm90aC4KKyAgQHBhcmFtIHthbnl0aGluZ30gW2RhdGFdIHNvbWV0aGlu
ZyBvdGhlciB0aGFuIGEgZGVzY3JpcHRvciwgdGhhdCB3aWxsCisgICAgYmVjb21lIHRoZSBleHBs
aWNpdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgorKi8KK0VtYmVyLmRlZmluZVByb3BlcnR5ID0g
ZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBkZXNjLCBkYXRhLCBtZXRhKSB7CisgIHZhciBkZXNjcywg
ZXhpc3RpbmdEZXNjLCB3YXRjaGluZywgdmFsdWU7CisKKyAgaWYgKCFtZXRhKSBtZXRhID0gbWV0
YUZvcihvYmopOworICBkZXNjcyA9IG1ldGEuZGVzY3M7CisgIGV4aXN0aW5nRGVzYyA9IG1ldGEu
ZGVzY3Nba2V5TmFtZV07CisgIHdhdGNoaW5nID0gbWV0YS53YXRjaGluZ1trZXlOYW1lXSA+IDA7
CisKKyAgaWYgKGV4aXN0aW5nRGVzYyBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3IpIHsKKyAg
ICBleGlzdGluZ0Rlc2MudGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKKyAgfQorCisgIGlmIChkZXNj
IGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikgeworICAgIHZhbHVlID0gZGVzYzsKKworICAg
IGRlc2NzW2tleU5hbWVdID0gZGVzYzsKKyAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiB3YXRj
aGluZykgeworICAgICAgb2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7CisgICAg
ICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAg
ICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgIHZhbHVlOiB1bmRlZmluZWQgLy8gbWFrZSBlbnVt
ZXJhYmxlCisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgb2JqW2tleU5hbWVdID0gdW5k
ZWZpbmVkOyAvLyBtYWtlIGVudW1lcmFibGUKKyAgICB9CisgICAgZGVzYy5zZXR1cChvYmosIGtl
eU5hbWUpOworICB9IGVsc2UgeworICAgIGRlc2NzW2tleU5hbWVdID0gdW5kZWZpbmVkOyAvLyBz
aGFkb3cgZGVzY3JpcHRvciBpbiBwcm90bworICAgIGlmIChkZXNjID09IG51bGwpIHsKKyAgICAg
IHZhbHVlID0gZGF0YTsKKworICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIgJiYgd2F0Y2hpbmcp
IHsKKyAgICAgICAgbWV0YS52YWx1ZXNba2V5TmFtZV0gPSBkYXRhOworICAgICAgICBvYmplY3RE
ZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKKyAgICAgICAgICBjb25maWd1cmFibGU6IHRy
dWUsCisgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgICBzZXQ6IE1BTkRBVE9S
WV9TRVRURVJfRlVOQ1RJT04sCisgICAgICAgICAgZ2V0OiBERUZBVUxUX0dFVFRFUl9GVU5DVElP
TihrZXlOYW1lKQorICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9ialtrZXlO
YW1lXSA9IGRhdGE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbHVlID0gZGVzYzsK
KworICAgICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIEVTNQorICAgICAgb2JqZWN0RGVmaW5lUHJv
cGVydHkob2JqLCBrZXlOYW1lLCBkZXNjKTsKKyAgICB9CisgIH0KKworICAvLyBpZiBrZXkgaXMg
YmVpbmcgd2F0Y2hlZCwgb3ZlcnJpZGUgY2hhaW5zIHRoYXQKKyAgLy8gd2VyZSBpbml0aWFsaXpl
ZCB3aXRoIHRoZSBwcm90b3R5cGUKKyAgaWYgKHdhdGNoaW5nKSB7IEVtYmVyLm92ZXJyaWRlQ2hh
aW5zKG9iaiwga2V5TmFtZSwgbWV0YSk7IH0KKworICAvLyBUaGUgYHZhbHVlYCBwYXNzZWQgdG8g
dGhlIGBkaWREZWZpbmVQcm9wZXJ0eWAgaG9vayBpcworICAvLyBlaXRoZXIgdGhlIGRlc2NyaXB0
b3Igb3IgZGF0YSwgd2hpY2hldmVyIHdhcyBwYXNzZWQuCisgIGlmIChvYmouZGlkRGVmaW5lUHJv
cGVydHkpIHsgb2JqLmRpZERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgdmFsdWUpOyB9CisK
KyAgcmV0dXJuIHRoaXM7Cit9OworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvLyBF
bWJlci50cnlGaW5hbGx5CisvKioKK0Btb2R1bGUgZW1iZXItbWV0YWwKKyovCisKK3ZhciBBRlRF
Ul9PQlNFUlZFUlMgPSAnOmNoYW5nZSc7Cit2YXIgQkVGT1JFX09CU0VSVkVSUyA9ICc6YmVmb3Jl
JzsKKwordmFyIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yOworCit2YXIgZGVmZXJyZWQgPSAwOwor
CisvKgorICB0aGlzLm9ic2VydmVyU2V0ID0geworICAgIFtzZW5kZXJHdWlkXTogeyAvLyB2YXJp
YWJsZSBuYW1lOiBga2V5U2V0YAorICAgICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKKyAgICB9Cisg
IH0sCisgIHRoaXMub2JzZXJ2ZXJzID0gWworICAgIHsKKyAgICAgIHNlbmRlcjogb2JqLAorICAg
ICAga2V5TmFtZToga2V5TmFtZSwKKyAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAorICAgICAg
bGlzdGVuZXJzOiBbCisgICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgb25jZUZsYWcsIHN1c3BlbmRl
ZEZsYWddCisgICAgICBdCisgICAgfSwKKyAgICAuLi4KKyAgXQorKi8KK2Z1bmN0aW9uIE9ic2Vy
dmVyU2V0KCkgeworICB0aGlzLmNsZWFyKCk7Cit9CisKK09ic2VydmVyU2V0LnByb3RvdHlwZS5h
ZGQgPSBmdW5jdGlvbihzZW5kZXIsIGtleU5hbWUsIGV2ZW50TmFtZSkgeworICB2YXIgb2JzZXJ2
ZXJTZXQgPSB0aGlzLm9ic2VydmVyU2V0LAorICAgICAgb2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZl
cnMsCisgICAgICBzZW5kZXJHdWlkID0gRW1iZXIuZ3VpZEZvcihzZW5kZXIpLAorICAgICAga2V5
U2V0ID0gb2JzZXJ2ZXJTZXRbc2VuZGVyR3VpZF0sCisgICAgICBpbmRleDsKKworICBpZiAoIWtl
eVNldCkgeworICAgIG9ic2VydmVyU2V0W3NlbmRlckd1aWRdID0ga2V5U2V0ID0ge307CisgIH0K
KyAgaW5kZXggPSBrZXlTZXRba2V5TmFtZV07CisgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7
CisgICAgaW5kZXggPSBvYnNlcnZlcnMucHVzaCh7CisgICAgICBzZW5kZXI6IHNlbmRlciwKKyAg
ICAgIGtleU5hbWU6IGtleU5hbWUsCisgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKKyAgICAg
IGxpc3RlbmVyczogW10KKyAgICB9KSAtIDE7CisgICAga2V5U2V0W2tleU5hbWVdID0gaW5kZXg7
CisgIH0KKyAgcmV0dXJuIG9ic2VydmVyc1tpbmRleF0ubGlzdGVuZXJzOworfTsKKworT2JzZXJ2
ZXJTZXQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHZhciBvYnNlcnZlcnMgPSB0
aGlzLm9ic2VydmVycywgaSwgbGVuLCBvYnNlcnZlciwgc2VuZGVyOworICB0aGlzLmNsZWFyKCk7
CisgIGZvciAoaT0wLCBsZW49b2JzZXJ2ZXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CisgICAg
b2JzZXJ2ZXIgPSBvYnNlcnZlcnNbaV07CisgICAgc2VuZGVyID0gb2JzZXJ2ZXIuc2VuZGVyOwor
ICAgIGlmIChzZW5kZXIuaXNEZXN0cm95aW5nIHx8IHNlbmRlci5pc0Rlc3Ryb3llZCkgeyBjb250
aW51ZTsgfQorICAgIEVtYmVyLnNlbmRFdmVudChzZW5kZXIsIG9ic2VydmVyLmV2ZW50TmFtZSwg
W3NlbmRlciwgb2JzZXJ2ZXIua2V5TmFtZV0sIG9ic2VydmVyLmxpc3RlbmVycyk7CisgIH0KK307
CisKK09ic2VydmVyU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkgeworICB0aGlzLm9i
c2VydmVyU2V0ID0ge307CisgIHRoaXMub2JzZXJ2ZXJzID0gW107Cit9OworCit2YXIgYmVmb3Jl
T2JzZXJ2ZXJTZXQgPSBuZXcgT2JzZXJ2ZXJTZXQoKSwgb2JzZXJ2ZXJTZXQgPSBuZXcgT2JzZXJ2
ZXJTZXQoKTsKKworLyoqCisgIEBtZXRob2QgYmVnaW5Qcm9wZXJ0eUNoYW5nZXMKKyAgQGNoYWlu
YWJsZQorKi8KK0VtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gZnVuY3Rpb24oKSB7CisgIGRl
ZmVycmVkKys7Cit9OworCisvKioKKyAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKKyovCitF
bWJlci5lbmRQcm9wZXJ0eUNoYW5nZXMgPSBmdW5jdGlvbigpIHsKKyAgZGVmZXJyZWQtLTsKKyAg
aWYgKGRlZmVycmVkPD0wKSB7CisgICAgYmVmb3JlT2JzZXJ2ZXJTZXQuY2xlYXIoKTsKKyAgICBv
YnNlcnZlclNldC5mbHVzaCgpOworICB9Cit9OworCisvKioKKyAgTWFrZSBhIHNlcmllcyBvZiBw
cm9wZXJ0eSBjaGFuZ2VzIHRvZ2V0aGVyIGluIGFuCisgIGV4Y2VwdGlvbi1zYWZlIHdheS4KKwor
ICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLmNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24oKSB7Cisg
ICAgb2JqMS5zZXQoJ2ZvbycsIG1heUJsb3dVcFdoZW5TZXQpOworICAgIG9iajIuc2V0KCdiYXIn
LCBiYXopOworICB9KTsKKyAgYGBgCisKKyAgQG1ldGhvZCBjaGFuZ2VQcm9wZXJ0aWVzCisgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgIEBwYXJhbSBbYmluZGluZ10KKyovCitFbWJlci5j
aGFuZ2VQcm9wZXJ0aWVzID0gZnVuY3Rpb24oY2IsIGJpbmRpbmcpeworICBFbWJlci5iZWdpblBy
b3BlcnR5Q2hhbmdlcygpOworICBFbWJlci50cnlGaW5hbGx5KGNiLCBFbWJlci5lbmRQcm9wZXJ0
eUNoYW5nZXMsIGJpbmRpbmcpOworfTsKKworLyoqCisgIFNldCBhIGxpc3Qgb2YgcHJvcGVydGll
cyBvbiBhbiBvYmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNldCBpbnNpZGUKKyAgYSBzaW5n
bGUgYGJlZ2luUHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gs
IHNvCisgIG9ic2VydmVycyB3aWxsIGJlIGJ1ZmZlcmVkLgorCisgIEBtZXRob2Qgc2V0UHJvcGVy
dGllcworICBAcGFyYW0gdGFyZ2V0CisgIEBwYXJhbSB7SGFzaH0gcHJvcGVydGllcworICBAcmV0
dXJuIHRhcmdldAorKi8KK0VtYmVyLnNldFByb3BlcnRpZXMgPSBmdW5jdGlvbihzZWxmLCBoYXNo
KSB7CisgIEVtYmVyLmNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24oKXsKKyAgICBmb3IodmFyIHBy
b3AgaW4gaGFzaCkgeworICAgICAgaWYgKGhhc2guaGFzT3duUHJvcGVydHkocHJvcCkpIEVtYmVy
LnNldChzZWxmLCBwcm9wLCBoYXNoW3Byb3BdKTsKKyAgICB9CisgIH0pOworICByZXR1cm4gc2Vs
ZjsKK307CisKKworZnVuY3Rpb24gY2hhbmdlRXZlbnQoa2V5TmFtZSkgeworICByZXR1cm4ga2V5
TmFtZStBRlRFUl9PQlNFUlZFUlM7Cit9CisKK2Z1bmN0aW9uIGJlZm9yZUV2ZW50KGtleU5hbWUp
IHsKKyAgcmV0dXJuIGtleU5hbWUrQkVGT1JFX09CU0VSVkVSUzsKK30KKworLyoqCisgIEBtZXRo
b2QgYWRkT2JzZXJ2ZXIKKyAgQHBhcmFtIG9iagorICBAcGFyYW0ge1N0cmluZ30gcGF0aAorICBA
cGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QKKyAgQHBhcmFtIHtGdW5jdGlv
bnxTdHJpbmd9IFttZXRob2RdCisqLworRW1iZXIuYWRkT2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmos
IHBhdGgsIHRhcmdldCwgbWV0aG9kKSB7CisgIEVtYmVyLmFkZExpc3RlbmVyKG9iaiwgY2hhbmdl
RXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kKTsKKyAgRW1iZXIud2F0Y2gob2JqLCBwYXRoKTsK
KyAgcmV0dXJuIHRoaXM7Cit9OworCitFbWJlci5vYnNlcnZlcnNGb3IgPSBmdW5jdGlvbihvYmos
IHBhdGgpIHsKKyAgcmV0dXJuIEVtYmVyLmxpc3RlbmVyc0ZvcihvYmosIGNoYW5nZUV2ZW50KHBh
dGgpKTsKK307CisKKy8qKgorICBAbWV0aG9kIHJlbW92ZU9ic2VydmVyCisgIEBwYXJhbSBvYmoK
KyAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKKyAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdl
dE9yTWV0aG9kCisgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQorKi8KK0VtYmVy
LnJlbW92ZU9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB0YXJnZXQsIG1ldGhvZCkgewor
ICBFbWJlci51bndhdGNoKG9iaiwgcGF0aCk7CisgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKG9iaiwg
Y2hhbmdlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kKTsKKyAgcmV0dXJuIHRoaXM7Cit9Owor
CisvKioKKyAgQG1ldGhvZCBhZGRCZWZvcmVPYnNlcnZlcgorICBAcGFyYW0gb2JqCisgIEBwYXJh
bSB7U3RyaW5nfSBwYXRoCisgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhv
ZAorICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KKyovCitFbWJlci5hZGRCZWZv
cmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgRW1i
ZXIuYWRkTGlzdGVuZXIob2JqLCBiZWZvcmVFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QpOwor
ICBFbWJlci53YXRjaChvYmosIHBhdGgpOworICByZXR1cm4gdGhpczsKK307CisKKy8vIFN1c3Bl
bmQgb2JzZXJ2ZXIgZHVyaW5nIGNhbGxiYWNrLgorLy8KKy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUg
dXNlZCBieSB0aGUgdGFyZ2V0IG9mIHRoZSBvYnNlcnZlcgorLy8gd2hpbGUgaXQgaXMgc2V0dGlu
ZyB0aGUgb2JzZXJ2ZWQgcGF0aC4KK0VtYmVyLl9zdXNwZW5kQmVmb3JlT2JzZXJ2ZXIgPSBmdW5j
dGlvbihvYmosIHBhdGgsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgeworICByZXR1cm4gRW1i
ZXIuX3N1c3BlbmRMaXN0ZW5lcihvYmosIGJlZm9yZUV2ZW50KHBhdGgpLCB0YXJnZXQsIG1ldGhv
ZCwgY2FsbGJhY2spOworfTsKKworRW1iZXIuX3N1c3BlbmRPYnNlcnZlciA9IGZ1bmN0aW9uKG9i
aiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgIHJldHVybiBFbWJlci5fc3Vz
cGVuZExpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kLCBjYWxs
YmFjayk7Cit9OworCit2YXIgbWFwID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwOworCitFbWJl
ci5fc3VzcGVuZEJlZm9yZU9ic2VydmVycyA9IGZ1bmN0aW9uKG9iaiwgcGF0aHMsIHRhcmdldCwg
bWV0aG9kLCBjYWxsYmFjaykgeworICB2YXIgZXZlbnRzID0gbWFwLmNhbGwocGF0aHMsIGJlZm9y
ZUV2ZW50KTsKKyAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlzdGVuZXJzKG9iaiwgZXZlbnRzLCB0
YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOworfTsKKworRW1iZXIuX3N1c3BlbmRPYnNlcnZlcnMg
PSBmdW5jdGlvbihvYmosIHBhdGhzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKKyAgdmFy
IGV2ZW50cyA9IG1hcC5jYWxsKHBhdGhzLCBjaGFuZ2VFdmVudCk7CisgIHJldHVybiBFbWJlci5f
c3VzcGVuZExpc3RlbmVycyhvYmosIGV2ZW50cywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsK
K307CisKK0VtYmVyLmJlZm9yZU9ic2VydmVyc0ZvciA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkgewor
ICByZXR1cm4gRW1iZXIubGlzdGVuZXJzRm9yKG9iaiwgYmVmb3JlRXZlbnQocGF0aCkpOworfTsK
KworLyoqCisgIEBtZXRob2QgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIKKyAgQHBhcmFtIG9iagorICBA
cGFyYW0ge1N0cmluZ30gcGF0aAorICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JN
ZXRob2QKKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFttZXRob2RdCisqLworRW1iZXIucmVt
b3ZlQmVmb3JlT2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmosIHBhdGgsIHRhcmdldCwgbWV0aG9kKSB7
CisgIEVtYmVyLnVud2F0Y2gob2JqLCBwYXRoKTsKKyAgRW1iZXIucmVtb3ZlTGlzdGVuZXIob2Jq
LCBiZWZvcmVFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QpOworICByZXR1cm4gdGhpczsKK307
CisKK0VtYmVyLm5vdGlmeUJlZm9yZU9ic2VydmVycyA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkg
eworICBpZiAob2JqLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KKworICB2YXIgZXZlbnROYW1l
ID0gYmVmb3JlRXZlbnQoa2V5TmFtZSksIGxpc3RlbmVycywgbGlzdGVuZXJzRGlmZjsKKyAgaWYg
KGRlZmVycmVkKSB7CisgICAgbGlzdGVuZXJzID0gYmVmb3JlT2JzZXJ2ZXJTZXQuYWRkKG9iaiwg
a2V5TmFtZSwgZXZlbnROYW1lKTsKKyAgICBsaXN0ZW5lcnNEaWZmID0gRW1iZXIubGlzdGVuZXJz
RGlmZihvYmosIGV2ZW50TmFtZSwgbGlzdGVuZXJzKTsKKyAgICBFbWJlci5zZW5kRXZlbnQob2Jq
LCBldmVudE5hbWUsIFtvYmosIGtleU5hbWVdLCBsaXN0ZW5lcnNEaWZmKTsKKyAgfSBlbHNlIHsK
KyAgICBFbWJlci5zZW5kRXZlbnQob2JqLCBldmVudE5hbWUsIFtvYmosIGtleU5hbWVdKTsKKyAg
fQorfTsKKworRW1iZXIubm90aWZ5T2JzZXJ2ZXJzID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7
CisgIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQorCisgIHZhciBldmVudE5hbWUg
PSBjaGFuZ2VFdmVudChrZXlOYW1lKSwgbGlzdGVuZXJzOworICBpZiAoZGVmZXJyZWQpIHsKKyAg
ICBsaXN0ZW5lcnMgPSBvYnNlcnZlclNldC5hZGQob2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOwor
ICAgIEVtYmVyLmxpc3RlbmVyc1VuaW9uKG9iaiwgZXZlbnROYW1lLCBsaXN0ZW5lcnMpOworICB9
IGVsc2UgeworICAgIEVtYmVyLnNlbmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFt
ZV0pOworICB9Cit9OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxl
IGVtYmVyLW1ldGFsCisqLworCit2YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsIC8vIHV0aWxz
LmpzCisgICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsIC8vIHV0aWxzLmpzCisgICAgZ2V0ID0gRW1i
ZXIuZ2V0LCAvLyBhY2Nlc3NvcnMuanMKKyAgICBzZXQgPSBFbWJlci5zZXQsIC8vIGFjY2Vzc29y
cy5qcworICAgIG5vcm1hbGl6ZVR1cGxlID0gRW1iZXIubm9ybWFsaXplVHVwbGUsIC8vIGFjY2Vz
c29ycy5qcworICAgIEdVSURfS0VZID0gRW1iZXIuR1VJRF9LRVksIC8vIHV0aWxzLmpzCisgICAg
TUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwgLy8gdXRpbHMuanMKKyAgICAvLyBjaXJjdWxhciBy
ZWZlcmVuY2Ugb2JzZXJ2ZXIgZGVwZW5kcyBvbiBFbWJlci53YXRjaAorICAgIC8vIHdlIHNob3Vs
ZCBtb3ZlIGNoYW5nZSBldmVudHMgdG8gdGhpcyBmaWxlIG9yIGl0cyBvd24gcHJvcGVydHlfZXZl
bnRzLmpzCisgICAgbm90aWZ5T2JzZXJ2ZXJzID0gRW1iZXIubm90aWZ5T2JzZXJ2ZXJzLCAvLyBv
YnNlcnZlci5qcworICAgIGZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLCAv
LyBhcnJheS5qcworICAgIEZJUlNUX0tFWSA9IC9eKFteXC5cKl0rKS8sCisgICAgSVNfUEFUSCA9
IC9bXC5cKl0vOworCit2YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5EQVRPUllf
U0VUVEVSLAorb19kZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5
OworCitmdW5jdGlvbiBmaXJzdEtleShwYXRoKSB7CisgIHJldHVybiBwYXRoLm1hdGNoKEZJUlNU
X0tFWSlbMF07Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHBhdGggaXMganVz
dCBhIGtleU5hbWUKK2Z1bmN0aW9uIGlzS2V5TmFtZShwYXRoKSB7CisgIHJldHVybiBwYXRoPT09
JyonIHx8ICFJU19QQVRILnRlc3QocGF0aCk7Cit9CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIERFUEVOREVOVCBLRVlT
CisvLworCitmdW5jdGlvbiBpdGVyRGVwcyhtZXRob2QsIG9iaiwgZGVwS2V5LCBzZWVuLCBtZXRh
KSB7CisKKyAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaik7CisgIGlmICghc2VlbltndWlkXSkgc2Vl
bltndWlkXSA9IHt9OworICBpZiAoc2VlbltndWlkXVtkZXBLZXldKSByZXR1cm47CisgIHNlZW5b
Z3VpZF1bZGVwS2V5XSA9IHRydWU7CisKKyAgdmFyIGRlcHMgPSBtZXRhLmRlcHM7CisgIGRlcHMg
PSBkZXBzICYmIGRlcHNbZGVwS2V5XTsKKyAgaWYgKGRlcHMpIHsKKyAgICBmb3IodmFyIGtleSBp
biBkZXBzKSB7CisgICAgICB2YXIgZGVzYyA9IG1ldGEuZGVzY3Nba2V5XTsKKyAgICAgIGlmIChk
ZXNjICYmIGRlc2MuX3N1c3BlbmRlZCA9PT0gb2JqKSBjb250aW51ZTsKKyAgICAgIG1ldGhvZChv
YmosIGtleSk7CisgICAgfQorICB9Cit9CisKKwordmFyIFdJTExfU0VFTiwgRElEX1NFRU47CisK
Ky8vIGNhbGxlZCB3aGVuZXZlciBhIHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZSB0byBjbGVh
ciB0aGUgY2FjaGUgb2YgYW55IGRlcGVuZGVudCBrZXlzIChhbmQgbm90aWZ5IHRob3NlIHByb3Bl
cnRpZXMgb2YgY2hhbmdlcywgZXRjLi4uKQorZnVuY3Rpb24gZGVwZW5kZW50S2V5c1dpbGxDaGFu
Z2Uob2JqLCBkZXBLZXksIG1ldGEpIHsKKyAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJu
OyB9CisKKyAgdmFyIHNlZW4gPSBXSUxMX1NFRU4sIHRvcCA9ICFzZWVuOworICBpZiAodG9wKSB7
IHNlZW4gPSBXSUxMX1NFRU4gPSB7fTsgfQorICBpdGVyRGVwcyhwcm9wZXJ0eVdpbGxDaGFuZ2Us
IG9iaiwgZGVwS2V5LCBzZWVuLCBtZXRhKTsKKyAgaWYgKHRvcCkgeyBXSUxMX1NFRU4gPSBudWxs
OyB9Cit9CisKKy8vIGNhbGxlZCB3aGVuZXZlciBhIHByb3BlcnR5IGhhcyBqdXN0IGNoYW5nZWQg
dG8gdXBkYXRlIGRlcGVuZGVudCBrZXlzCitmdW5jdGlvbiBkZXBlbmRlbnRLZXlzRGlkQ2hhbmdl
KG9iaiwgZGVwS2V5LCBtZXRhKSB7CisgIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsg
fQorCisgIHZhciBzZWVuID0gRElEX1NFRU4sIHRvcCA9ICFzZWVuOworICBpZiAodG9wKSB7IHNl
ZW4gPSBESURfU0VFTiA9IHt9OyB9CisgIGl0ZXJEZXBzKHByb3BlcnR5RGlkQ2hhbmdlLCBvYmos
IGRlcEtleSwgc2VlbiwgbWV0YSk7CisgIGlmICh0b3ApIHsgRElEX1NFRU4gPSBudWxsOyB9Cit9
CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KKy8vIENIQUlOCisvLworCitmdW5jdGlvbiBhZGRDaGFpbldhdGNoZXIob2JqLCBr
ZXlOYW1lLCBub2RlKSB7CisgIGlmICghb2JqIHx8ICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaikp
IHsgcmV0dXJuOyB9IC8vIG5vdGhpbmcgdG8gZG8KKworICB2YXIgbSA9IG1ldGFGb3Iob2JqKSwg
bm9kZXMgPSBtLmNoYWluV2F0Y2hlcnM7CisKKyAgaWYgKCFtLmhhc093blByb3BlcnR5KCdjaGFp
bldhdGNoZXJzJykpIHsKKyAgICBub2RlcyA9IG0uY2hhaW5XYXRjaGVycyA9IHt9OworICB9CisK
KyAgaWYgKCFub2Rlc1trZXlOYW1lXSkgeyBub2Rlc1trZXlOYW1lXSA9IFtdOyB9CisgIG5vZGVz
W2tleU5hbWVdLnB1c2gobm9kZSk7CisgIEVtYmVyLndhdGNoKG9iaiwga2V5TmFtZSk7Cit9CisK
K2Z1bmN0aW9uIHJlbW92ZUNoYWluV2F0Y2hlcihvYmosIGtleU5hbWUsIG5vZGUpIHsKKyAgaWYg
KCFvYmogfHwgJ29iamVjdCcgIT09IHR5cGVvZiBvYmopIHsgcmV0dXJuOyB9IC8vIG5vdGhpbmcg
dG8gZG8KKworICB2YXIgbSA9IG1ldGFGb3Iob2JqLCBmYWxzZSk7CisgIGlmICghbS5oYXNPd25Q
cm9wZXJ0eSgnY2hhaW5XYXRjaGVycycpKSB7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRvCisK
KyAgdmFyIG5vZGVzID0gbS5jaGFpbldhdGNoZXJzOworCisgIGlmIChub2Rlc1trZXlOYW1lXSkg
eworICAgIG5vZGVzID0gbm9kZXNba2V5TmFtZV07CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBu
b2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZSkg
eyBub2Rlcy5zcGxpY2UoaSwgMSk7IH0KKyAgICB9CisgIH0KKyAgRW1iZXIudW53YXRjaChvYmos
IGtleU5hbWUpOworfQorCit2YXIgcGVuZGluZ1F1ZXVlID0gW107CisKKy8vIGF0dGVtcHRzIHRv
IGFkZCB0aGUgcGVuZGluZ1F1ZXVlIGNoYWlucyBhZ2Fpbi4gSWYgc29tZSBvZiB0aGVtIGVuZCB1
cAorLy8gYmFjayBpbiB0aGUgcXVldWUgYW5kIHJlc2NoZWR1bGUgaXMgdHJ1ZSwgc2NoZWR1bGVz
IGEgdGltZW91dCB0byB0cnkKKy8vIGFnYWluLgorZnVuY3Rpb24gZmx1c2hQZW5kaW5nQ2hhaW5z
KCkgeworICBpZiAocGVuZGluZ1F1ZXVlLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH0gLy8gbm90
aGluZyB0byBkbworCisgIHZhciBxdWV1ZSA9IHBlbmRpbmdRdWV1ZTsKKyAgcGVuZGluZ1F1ZXVl
ID0gW107CisKKyAgZm9yRWFjaC5jYWxsKHF1ZXVlLCBmdW5jdGlvbihxKSB7IHFbMF0uYWRkKHFb
MV0pOyB9KTsKKworICBFbWJlci53YXJuKCdXYXRjaGluZyBhbiB1bmRlZmluZWQgZ2xvYmFsLCBF
bWJlciBleHBlY3RzIHdhdGNoZWQgZ2xvYmFscyB0byBiZSBzZXR1cCBieSB0aGUgdGltZSB0aGUg
cnVuIGxvb3AgaXMgZmx1c2hlZCwgY2hlY2sgZm9yIHR5cG9zJywgcGVuZGluZ1F1ZXVlLmxlbmd0
aCA9PT0gMCk7Cit9CisKK2Z1bmN0aW9uIGlzUHJvdG8ocHZhbHVlKSB7CisgIHJldHVybiBtZXRh
Rm9yKHB2YWx1ZSwgZmFsc2UpLnByb3RvID09PSBwdmFsdWU7Cit9CisKKy8vIEEgQ2hhaW5Ob2Rl
IHdhdGNoZXMgYSBzaW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUgYSBzdGFy
dGluZworLy8gdmFsdWUgZm9yIHRoZSBrZXkgdGhlbiB0aGUgbm9kZSB3b24ndCBhY3R1YWxseSB3
YXRjaCBpdC4gRm9yIGEgcm9vdCBub2RlCisvLyBwYXNzIG51bGwgZm9yIHBhcmVudCBhbmQga2V5
IGFuZCBvYmplY3QgZm9yIHZhbHVlLgordmFyIENoYWluTm9kZSA9IGZ1bmN0aW9uKHBhcmVudCwg
a2V5LCB2YWx1ZSkgeworICB2YXIgb2JqOworICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CisgIHRo
aXMuX2tleSAgICA9IGtleTsKKworICAvLyBfd2F0Y2hpbmcgaXMgdHJ1ZSB3aGVuIGNhbGxpbmcg
Z2V0KHRoaXMuX3BhcmVudCwgdGhpcy5fa2V5KSB3aWxsCisgIC8vIHJldHVybiB0aGUgdmFsdWUg
b2YgdGhpcyBub2RlLgorICAvLworICAvLyBJdCBpcyBmYWxzZSBmb3IgdGhlIHJvb3Qgb2YgYSBj
aGFpbiAoYmVjYXVzZSB3ZSBoYXZlIG5vIHBhcmVudCkKKyAgLy8gYW5kIGZvciBnbG9iYWwgcGF0
aHMgKGJlY2F1c2UgdGhlIHBhcmVudCBub2RlIGlzIHRoZSBvYmplY3Qgd2l0aAorICAvLyB0aGUg
b2JzZXJ2ZXIgb24gaXQpCisgIHRoaXMuX3dhdGNoaW5nID0gdmFsdWU9PT11bmRlZmluZWQ7CisK
KyAgdGhpcy5fdmFsdWUgID0gdmFsdWU7CisgIHRoaXMuX3BhdGhzID0ge307CisgIGlmICh0aGlz
Ll93YXRjaGluZykgeworICAgIHRoaXMuX29iamVjdCA9IHBhcmVudC52YWx1ZSgpOworICAgIGlm
ICh0aGlzLl9vYmplY3QpIHsgYWRkQ2hhaW5XYXRjaGVyKHRoaXMuX29iamVjdCwgdGhpcy5fa2V5
LCB0aGlzKTsgfQorICB9CisKKyAgLy8gU3BlY2lhbC1jYXNlOiB0aGUgRWFjaFByb3h5IHJlbGll
cyBvbiBpbW1lZGlhdGUgZXZhbHVhdGlvbiB0bworICAvLyBlc3RhYmxpc2ggaXRzIG9ic2VydmVy
cy4KKyAgLy8KKyAgLy8gVE9ETzogUmVwbGFjZSB0aGlzIHdpdGggYW4gZWZmaWNpZW50IGNhbGxi
YWNrIHRoYXQgdGhlIEVhY2hQcm94eQorICAvLyBjYW4gaW1wbGVtZW50LgorICBpZiAodGhpcy5f
cGFyZW50ICYmIHRoaXMuX3BhcmVudC5fa2V5ID09PSAnQGVhY2gnKSB7CisgICAgdGhpcy52YWx1
ZSgpOworICB9Cit9OworCit2YXIgQ2hhaW5Ob2RlUHJvdG90eXBlID0gQ2hhaW5Ob2RlLnByb3Rv
dHlwZTsKKworQ2hhaW5Ob2RlUHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oKSB7CisgIGlmICh0
aGlzLl92YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dhdGNoaW5nKSB7CisgICAgdmFyIG9i
aiA9IHRoaXMuX3BhcmVudC52YWx1ZSgpOworICAgIHRoaXMuX3ZhbHVlID0gKG9iaiAmJiAhaXNQ
cm90byhvYmopKSA/IGdldChvYmosIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7CisgIH0KKyAgcmV0
dXJuIHRoaXMuX3ZhbHVlOworfTsKKworQ2hhaW5Ob2RlUHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5j
dGlvbigpIHsKKyAgaWYgKHRoaXMuX3dhdGNoaW5nKSB7CisgICAgdmFyIG9iaiA9IHRoaXMuX29i
amVjdDsKKyAgICBpZiAob2JqKSB7IHJlbW92ZUNoYWluV2F0Y2hlcihvYmosIHRoaXMuX2tleSwg
dGhpcyk7IH0KKyAgICB0aGlzLl93YXRjaGluZyA9IGZhbHNlOyAvLyBzbyBmdXR1cmUgY2FsbHMg
ZG8gbm90aGluZworICB9Cit9OworCisvLyBjb3BpZXMgYSB0b3AgbGV2ZWwgb2JqZWN0IG9ubHkK
K0NoYWluTm9kZVByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciByZXQgPSBu
ZXcgQ2hhaW5Ob2RlKG51bGwsIG51bGwsIG9iaiksCisgICAgICBwYXRocyA9IHRoaXMuX3BhdGhz
LCBwYXRoOworICBmb3IgKHBhdGggaW4gcGF0aHMpIHsKKyAgICBpZiAocGF0aHNbcGF0aF0gPD0g
MCkgeyBjb250aW51ZTsgfSAvLyB0aGlzIGNoZWNrIHdpbGwgYWxzbyBjYXRjaCBub24tbnVtYmVy
IHZhbHMuCisgICAgcmV0LmFkZChwYXRoKTsKKyAgfQorICByZXR1cm4gcmV0OworfTsKKworLy8g
Y2FsbGVkIG9uIHRoZSByb290IG5vZGUgb2YgYSBjaGFpbiB0byBzZXR1cCB3YXRjaGVycyBvbiB0
aGUgc3BlY2lmaWVkCisvLyBwYXRoLgorQ2hhaW5Ob2RlUHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9u
KHBhdGgpIHsKKyAgdmFyIG9iaiwgdHVwbGUsIGtleSwgc3JjLCBwYXRoczsKKworICBwYXRocyA9
IHRoaXMuX3BhdGhzOworICBwYXRoc1twYXRoXSA9IChwYXRoc1twYXRoXSB8fCAwKSArIDE7CisK
KyAgb2JqID0gdGhpcy52YWx1ZSgpOworICB0dXBsZSA9IG5vcm1hbGl6ZVR1cGxlKG9iaiwgcGF0
aCk7CisKKyAgLy8gdGhlIHBhdGggd2FzIGEgbG9jYWwgcGF0aAorICBpZiAodHVwbGVbMF0gJiYg
dHVwbGVbMF0gPT09IG9iaikgeworICAgIHBhdGggPSB0dXBsZVsxXTsKKyAgICBrZXkgID0gZmly
c3RLZXkocGF0aCk7CisgICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKKworICAv
LyBnbG9iYWwgcGF0aCwgYnV0IG9iamVjdCBkb2VzIG5vdCBleGlzdCB5ZXQuCisgIC8vIHB1dCBp
bnRvIGEgcXVldWUgYW5kIHRyeSB0byBjb25uZWN0IGxhdGVyLgorICB9IGVsc2UgaWYgKCF0dXBs
ZVswXSkgeworICAgIHBlbmRpbmdRdWV1ZS5wdXNoKFt0aGlzLCBwYXRoXSk7CisgICAgdHVwbGUu
bGVuZ3RoID0gMDsKKyAgICByZXR1cm47CisKKyAgLy8gZ2xvYmFsIHBhdGgsIGFuZCBvYmplY3Qg
YWxyZWFkeSBleGlzdHMKKyAgfSBlbHNlIHsKKyAgICBzcmMgID0gdHVwbGVbMF07CisgICAga2V5
ICA9IHBhdGguc2xpY2UoMCwgMC0odHVwbGVbMV0ubGVuZ3RoKzEpKTsKKyAgICBwYXRoID0gdHVw
bGVbMV07CisgIH0KKworICB0dXBsZS5sZW5ndGggPSAwOworICB0aGlzLmNoYWluKGtleSwgcGF0
aCwgc3JjKTsKK307CisKKy8vIGNhbGxlZCBvbiB0aGUgcm9vdCBub2RlIG9mIGEgY2hhaW4gdG8g
dGVhcmRvd24gd2F0Y2hlciBvbiB0aGUgc3BlY2lmaWVkCisvLyBwYXRoCitDaGFpbk5vZGVQcm90
b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24ocGF0aCkgeworICB2YXIgb2JqLCB0dXBsZSwga2V5LCBz
cmMsIHBhdGhzOworCisgIHBhdGhzID0gdGhpcy5fcGF0aHM7CisgIGlmIChwYXRoc1twYXRoXSA+
IDApIHsgcGF0aHNbcGF0aF0tLTsgfQorCisgIG9iaiA9IHRoaXMudmFsdWUoKTsKKyAgdHVwbGUg
PSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgpOworICBpZiAodHVwbGVbMF0gPT09IG9iaikgewor
ICAgIHBhdGggPSB0dXBsZVsxXTsKKyAgICBrZXkgID0gZmlyc3RLZXkocGF0aCk7CisgICAgcGF0
aCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKKyAgfSBlbHNlIHsKKyAgICBzcmMgID0gdHVw
bGVbMF07CisgICAga2V5ICA9IHBhdGguc2xpY2UoMCwgMC0odHVwbGVbMV0ubGVuZ3RoKzEpKTsK
KyAgICBwYXRoID0gdHVwbGVbMV07CisgIH0KKworICB0dXBsZS5sZW5ndGggPSAwOworICB0aGlz
LnVuY2hhaW4oa2V5LCBwYXRoKTsKK307CisKK0NoYWluTm9kZVByb3RvdHlwZS5jb3VudCA9IDA7
CisKK0NoYWluTm9kZVByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKGtleSwgcGF0aCwgc3JjKSB7
CisgIHZhciBjaGFpbnMgPSB0aGlzLl9jaGFpbnMsIG5vZGU7CisgIGlmICghY2hhaW5zKSB7IGNo
YWlucyA9IHRoaXMuX2NoYWlucyA9IHt9OyB9CisKKyAgbm9kZSA9IGNoYWluc1trZXldOworICBp
ZiAoIW5vZGUpIHsgbm9kZSA9IGNoYWluc1trZXldID0gbmV3IENoYWluTm9kZSh0aGlzLCBrZXks
IHNyYyk7IH0KKyAgbm9kZS5jb3VudCsrOyAvLyBjb3VudCBjaGFpbnMuLi4KKworICAvLyBjaGFp
biByZXN0IG9mIHBhdGggaWYgdGhlcmUgaXMgb25lCisgIGlmIChwYXRoICYmIHBhdGgubGVuZ3Ro
PjApIHsKKyAgICBrZXkgPSBmaXJzdEtleShwYXRoKTsKKyAgICBwYXRoID0gcGF0aC5zbGljZShr
ZXkubGVuZ3RoKzEpOworICAgIG5vZGUuY2hhaW4oa2V5LCBwYXRoKTsgLy8gTk9URTogbm8gc3Jj
IG1lYW5zIGl0IHdpbGwgb2JzZXJ2ZSBjaGFuZ2VzLi4uCisgIH0KK307CisKK0NoYWluTm9kZVBy
b3RvdHlwZS51bmNoYWluID0gZnVuY3Rpb24oa2V5LCBwYXRoKSB7CisgIHZhciBjaGFpbnMgPSB0
aGlzLl9jaGFpbnMsIG5vZGUgPSBjaGFpbnNba2V5XTsKKworICAvLyB1bmNoYWluIHJlc3Qgb2Yg
cGF0aCBmaXJzdC4uLgorICBpZiAocGF0aCAmJiBwYXRoLmxlbmd0aD4xKSB7CisgICAga2V5ICA9
IGZpcnN0S2V5KHBhdGgpOworICAgIHBhdGggPSBwYXRoLnNsaWNlKGtleS5sZW5ndGgrMSk7Cisg
ICAgbm9kZS51bmNoYWluKGtleSwgcGF0aCk7CisgIH0KKworICAvLyBkZWxldGUgbm9kZSBpZiBu
ZWVkZWQuCisgIG5vZGUuY291bnQtLTsKKyAgaWYgKG5vZGUuY291bnQ8PTApIHsKKyAgICBkZWxl
dGUgY2hhaW5zW25vZGUuX2tleV07CisgICAgbm9kZS5kZXN0cm95KCk7CisgIH0KKworfTsKKwor
Q2hhaW5Ob2RlUHJvdG90eXBlLndpbGxDaGFuZ2UgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGNoYWlu
cyA9IHRoaXMuX2NoYWluczsKKyAgaWYgKGNoYWlucykgeworICAgIGZvcih2YXIga2V5IGluIGNo
YWlucykgeworICAgICAgaWYgKCFjaGFpbnMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51
ZTsgfQorICAgICAgY2hhaW5zW2tleV0ud2lsbENoYW5nZSgpOworICAgIH0KKyAgfQorCisgIGlm
ICh0aGlzLl9wYXJlbnQpIHsgdGhpcy5fcGFyZW50LmNoYWluV2lsbENoYW5nZSh0aGlzLCB0aGlz
Ll9rZXksIDEpOyB9Cit9OworCitDaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5XaWxsQ2hhbmdlID0g
ZnVuY3Rpb24oY2hhaW4sIHBhdGgsIGRlcHRoKSB7CisgIGlmICh0aGlzLl9rZXkpIHsgcGF0aCA9
IHRoaXMuX2tleSArICcuJyArIHBhdGg7IH0KKworICBpZiAodGhpcy5fcGFyZW50KSB7CisgICAg
dGhpcy5fcGFyZW50LmNoYWluV2lsbENoYW5nZSh0aGlzLCBwYXRoLCBkZXB0aCsxKTsKKyAgfSBl
bHNlIHsKKyAgICBpZiAoZGVwdGggPiAxKSB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LnZhbHVlKCksIHBhdGgpOyB9CisgICAgcGF0aCA9ICd0aGlzLicgKyBwYXRoOworICAgIGlmICh0
aGlzLl9wYXRoc1twYXRoXSA+IDApIHsgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMudmFs
dWUoKSwgcGF0aCk7IH0KKyAgfQorfTsKKworQ2hhaW5Ob2RlUHJvdG90eXBlLmNoYWluRGlkQ2hh
bmdlID0gZnVuY3Rpb24oY2hhaW4sIHBhdGgsIGRlcHRoKSB7CisgIGlmICh0aGlzLl9rZXkpIHsg
cGF0aCA9IHRoaXMuX2tleSArICcuJyArIHBhdGg7IH0KKyAgaWYgKHRoaXMuX3BhcmVudCkgewor
ICAgIHRoaXMuX3BhcmVudC5jaGFpbkRpZENoYW5nZSh0aGlzLCBwYXRoLCBkZXB0aCsxKTsKKyAg
fSBlbHNlIHsKKyAgICBpZiAoZGVwdGggPiAxKSB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRo
aXMudmFsdWUoKSwgcGF0aCk7IH0KKyAgICBwYXRoID0gJ3RoaXMuJyArIHBhdGg7CisgICAgaWYg
KHRoaXMuX3BhdGhzW3BhdGhdID4gMCkgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLnZh
bHVlKCksIHBhdGgpOyB9CisgIH0KK307CisKK0NoYWluTm9kZVByb3RvdHlwZS5kaWRDaGFuZ2Ug
PSBmdW5jdGlvbihzdXBwcmVzc0V2ZW50KSB7CisgIC8vIGludmFsaWRhdGUgbXkgb3duIHZhbHVl
IGZpcnN0LgorICBpZiAodGhpcy5fd2F0Y2hpbmcpIHsKKyAgICB2YXIgb2JqID0gdGhpcy5fcGFy
ZW50LnZhbHVlKCk7CisgICAgaWYgKG9iaiAhPT0gdGhpcy5fb2JqZWN0KSB7CisgICAgICByZW1v
dmVDaGFpbldhdGNoZXIodGhpcy5fb2JqZWN0LCB0aGlzLl9rZXksIHRoaXMpOworICAgICAgdGhp
cy5fb2JqZWN0ID0gb2JqOworICAgICAgYWRkQ2hhaW5XYXRjaGVyKG9iaiwgdGhpcy5fa2V5LCB0
aGlzKTsKKyAgICB9CisgICAgdGhpcy5fdmFsdWUgID0gdW5kZWZpbmVkOworCisgICAgLy8gU3Bl
Y2lhbC1jYXNlOiB0aGUgRWFjaFByb3h5IHJlbGllcyBvbiBpbW1lZGlhdGUgZXZhbHVhdGlvbiB0
bworICAgIC8vIGVzdGFibGlzaCBpdHMgb2JzZXJ2ZXJzLgorICAgIGlmICh0aGlzLl9wYXJlbnQg
JiYgdGhpcy5fcGFyZW50Ll9rZXkgPT09ICdAZWFjaCcpCisgICAgICB0aGlzLnZhbHVlKCk7Cisg
IH0KKworICAvLyB0aGVuIG5vdGlmeSBjaGFpbnMuLi4KKyAgdmFyIGNoYWlucyA9IHRoaXMuX2No
YWluczsKKyAgaWYgKGNoYWlucykgeworICAgIGZvcih2YXIga2V5IGluIGNoYWlucykgeworICAg
ICAgaWYgKCFjaGFpbnMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQorICAgICAg
Y2hhaW5zW2tleV0uZGlkQ2hhbmdlKHN1cHByZXNzRXZlbnQpOworICAgIH0KKyAgfQorCisgIGlm
IChzdXBwcmVzc0V2ZW50KSB7IHJldHVybjsgfQorCisgIC8vIGFuZCBmaW5hbGx5IHRlbGwgcGFy
ZW50IGFib3V0IG15IHBhdGggY2hhbmdpbmcuLi4KKyAgaWYgKHRoaXMuX3BhcmVudCkgeyB0aGlz
Ll9wYXJlbnQuY2hhaW5EaWRDaGFuZ2UodGhpcywgdGhpcy5fa2V5LCAxKTsgfQorfTsKKworLy8g
Z2V0IHRoZSBjaGFpbnMgZm9yIHRoZSBjdXJyZW50IG9iamVjdC4gSWYgdGhlIGN1cnJlbnQgb2Jq
ZWN0IGhhcworLy8gY2hhaW5zIGluaGVyaXRlZCBmcm9tIHRoZSBwcm90byB0aGV5IHdpbGwgYmUg
Y2xvbmVkIGFuZCByZWNvbmZpZ3VyZWQgZm9yCisvLyB0aGUgY3VycmVudCBvYmplY3QuCitmdW5j
dGlvbiBjaGFpbnNGb3Iob2JqKSB7CisgIHZhciBtID0gbWV0YUZvcihvYmopLCByZXQgPSBtLmNo
YWluczsKKyAgaWYgKCFyZXQpIHsKKyAgICByZXQgPSBtLmNoYWlucyA9IG5ldyBDaGFpbk5vZGUo
bnVsbCwgbnVsbCwgb2JqKTsKKyAgfSBlbHNlIGlmIChyZXQudmFsdWUoKSAhPT0gb2JqKSB7Cisg
ICAgcmV0ID0gbS5jaGFpbnMgPSByZXQuY29weShvYmopOworICB9CisgIHJldHVybiByZXQ7Cit9
CisKK0VtYmVyLm92ZXJyaWRlQ2hhaW5zID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBtKSB7Cisg
IGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUsIG0sIHRydWUpOworfTsKKworZnVuY3Rpb24g
Y2hhaW5zV2lsbENoYW5nZShvYmosIGtleU5hbWUsIG0sIGFyZykgeworICBpZiAoIW0uaGFzT3du
UHJvcGVydHkoJ2NoYWluV2F0Y2hlcnMnKSkgeyByZXR1cm47IH0gLy8gbm90aGluZyB0byBkbwor
CisgIHZhciBub2RlcyA9IG0uY2hhaW5XYXRjaGVyczsKKworICBub2RlcyA9IG5vZGVzW2tleU5h
bWVdOworICBpZiAoIW5vZGVzKSB7IHJldHVybjsgfQorCisgIGZvcih2YXIgaSA9IDAsIGwgPSBu
b2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICBub2Rlc1tpXS53aWxsQ2hhbmdlKGFyZyk7
CisgIH0KK30KKworZnVuY3Rpb24gY2hhaW5zRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSwgYXJn
KSB7CisgIGlmICghbS5oYXNPd25Qcm9wZXJ0eSgnY2hhaW5XYXRjaGVycycpKSB7IHJldHVybjsg
fSAvLyBub3RoaW5nIHRvIGRvCisKKyAgdmFyIG5vZGVzID0gbS5jaGFpbldhdGNoZXJzOworCisg
IG5vZGVzID0gbm9kZXNba2V5TmFtZV07CisgIGlmICghbm9kZXMpIHsgcmV0dXJuOyB9CisKKyAg
Ly8gbG9vcGluZyBpbiByZXZlcnNlIGJlY2F1c2UgdGhlIGNoYWluV2F0Y2hlcnMgYXJyYXkgY2Fu
IGJlIG1vZGlmaWVkIGluc2lkZSBkaWRDaGFuZ2UKKyAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0
aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgbm9kZXNbaV0uZGlkQ2hhbmdlKGFyZyk7CisgIH0K
K30KKworLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgorLy8gV0FUQ0gKKy8vCisKKy8qKgorICBAcHJpdmF0ZQorCisgIFN0YXJ0cyB3
YXRjaGluZyBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gV2hlbmV2ZXIgdGhlIHByb3BlcnR5IGNo
YW5nZXMsCisgIGludm9rZXMgYEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBFbWJlci5w
cm9wZXJ0eURpZENoYW5nZWAuIFRoaXMgaXMgdGhlCisgIHByaW1pdGl2ZSB1c2VkIGJ5IG9ic2Vy
dmVycyBhbmQgZGVwZW5kZW50IGtleXM7IHVzdWFsbHkgeW91IHdpbGwgbmV2ZXIgY2FsbAorICB0
aGlzIG1ldGhvZCBkaXJlY3RseSBidXQgaW5zdGVhZCB1c2UgaGlnaGVyIGxldmVsIG1ldGhvZHMg
bGlrZQorICBgRW1iZXIuYWRkT2JzZXJ2ZXIoKWAKKworICBAbWV0aG9kIHdhdGNoCisgIEBmb3Ig
RW1iZXIKKyAgQHBhcmFtIG9iagorICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZQorKi8KK0VtYmVy
LndhdGNoID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7CisgIC8vIGNhbid0IHdhdGNoIGxlbmd0
aCBvbiBBcnJheSAtIGl0IGlzIHNwZWNpYWwuLi4KKyAgaWYgKGtleU5hbWUgPT09ICdsZW5ndGgn
ICYmIEVtYmVyLnR5cGVPZihvYmopID09PSAnYXJyYXknKSB7IHJldHVybiB0aGlzOyB9CisKKyAg
dmFyIG0gPSBtZXRhRm9yKG9iaiksIHdhdGNoaW5nID0gbS53YXRjaGluZywgZGVzYzsKKworICAv
LyBhY3RpdmF0ZSB3YXRjaGluZyBmaXJzdCB0aW1lCisgIGlmICghd2F0Y2hpbmdba2V5TmFtZV0p
IHsKKyAgICB3YXRjaGluZ1trZXlOYW1lXSA9IDE7CisgICAgaWYgKGlzS2V5TmFtZShrZXlOYW1l
KSkgeworICAgICAgZGVzYyA9IG0uZGVzY3Nba2V5TmFtZV07CisgICAgICBpZiAoZGVzYyAmJiBk
ZXNjLndpbGxXYXRjaCkgeyBkZXNjLndpbGxXYXRjaChvYmosIGtleU5hbWUpOyB9CisKKyAgICAg
IGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLndpbGxXYXRjaFByb3BlcnR5KSB7CisgICAg
ICAgIG9iai53aWxsV2F0Y2hQcm9wZXJ0eShrZXlOYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYg
KE1BTkRBVE9SWV9TRVRURVIgJiYga2V5TmFtZSBpbiBvYmopIHsKKyAgICAgICAgbS52YWx1ZXNb
a2V5TmFtZV0gPSBvYmpba2V5TmFtZV07CisgICAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBr
ZXlOYW1lLCB7CisgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgICAgICAgIGVudW1l
cmFibGU6IHRydWUsCisgICAgICAgICAgc2V0OiBFbWJlci5NQU5EQVRPUllfU0VUVEVSX0ZVTkNU
SU9OLAorICAgICAgICAgIGdldDogRW1iZXIuREVGQVVMVF9HRVRURVJfRlVOQ1RJT04oa2V5TmFt
ZSkKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYWluc0Zvcihv
YmopLmFkZChrZXlOYW1lKTsKKyAgICB9CisKKyAgfSAgZWxzZSB7CisgICAgd2F0Y2hpbmdba2V5
TmFtZV0gPSAod2F0Y2hpbmdba2V5TmFtZV0gfHwgMCkgKyAxOworICB9CisgIHJldHVybiB0aGlz
OworfTsKKworRW1iZXIuaXNXYXRjaGluZyA9IGZ1bmN0aW9uIGlzV2F0Y2hpbmcob2JqLCBrZXkp
IHsKKyAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldOworICByZXR1cm4gKG1ldGEgJiYgbWV0YS53
YXRjaGluZ1trZXldKSA+IDA7Cit9OworCitFbWJlci53YXRjaC5mbHVzaFBlbmRpbmcgPSBmbHVz
aFBlbmRpbmdDaGFpbnM7CisKK0VtYmVyLnVud2F0Y2ggPSBmdW5jdGlvbihvYmosIGtleU5hbWUp
IHsKKyAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0gaXQgaXMgc3BlY2lhbC4uLgor
ICBpZiAoa2V5TmFtZSA9PT0gJ2xlbmd0aCcgJiYgRW1iZXIudHlwZU9mKG9iaikgPT09ICdhcnJh
eScpIHsgcmV0dXJuIHRoaXM7IH0KKworICB2YXIgbSA9IG1ldGFGb3Iob2JqKSwgd2F0Y2hpbmcg
PSBtLndhdGNoaW5nLCBkZXNjOworCisgIGlmICh3YXRjaGluZ1trZXlOYW1lXSA9PT0gMSkgewor
ICAgIHdhdGNoaW5nW2tleU5hbWVdID0gMDsKKworICAgIGlmIChpc0tleU5hbWUoa2V5TmFtZSkp
IHsKKyAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVdOworICAgICAgaWYgKGRlc2MgJiYgZGVz
Yy5kaWRVbndhdGNoKSB7IGRlc2MuZGlkVW53YXRjaChvYmosIGtleU5hbWUpOyB9CisKKyAgICAg
IGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRpZFVud2F0Y2hQcm9wZXJ0eSkgeworICAg
ICAgICBvYmouZGlkVW53YXRjaFByb3BlcnR5KGtleU5hbWUpOworICAgICAgfQorCisgICAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUiAmJiBrZXlOYW1lIGluIG9iaikgeworICAgICAgICBvX2RlZmlu
ZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeworICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwK
KyAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLAor
ICAgICAgICAgIHZhbHVlOiBtLnZhbHVlc1trZXlOYW1lXQorICAgICAgICB9KTsKKyAgICAgICAg
ZGVsZXRlIG0udmFsdWVzW2tleU5hbWVdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBj
aGFpbnNGb3Iob2JqKS5yZW1vdmUoa2V5TmFtZSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAod2F0
Y2hpbmdba2V5TmFtZV0+MSkgeworICAgIHdhdGNoaW5nW2tleU5hbWVdLS07CisgIH0KKworICBy
ZXR1cm4gdGhpczsKK307CisKKy8qKgorICBAcHJpdmF0ZQorCisgIENhbGwgb24gYW4gb2JqZWN0
IHdoZW4geW91IGZpcnN0IGJlZ2V0IGl0IGZyb20gYW5vdGhlciBvYmplY3QuIFRoaXMgd2lsbAor
ICBzZXR1cCBhbnkgY2hhaW5lZCB3YXRjaGVycyBvbiB0aGUgb2JqZWN0IGluc3RhbmNlIGFzIG5l
ZWRlZC4gVGhpcyBtZXRob2QgaXMKKyAgc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLgorCisg
IEBtZXRob2QgcmV3YXRjaAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSBvYmoKKyovCitFbWJlci5y
ZXdhdGNoID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciBtID0gbWV0YUZvcihvYmosIGZhbHNlKSwg
Y2hhaW5zID0gbS5jaGFpbnM7CisKKyAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgaGFzIGl0cyBv
d24gZ3VpZC4KKyAgaWYgKEdVSURfS0VZIGluIG9iaiAmJiAhb2JqLmhhc093blByb3BlcnR5KEdV
SURfS0VZKSkgeworICAgIEVtYmVyLmdlbmVyYXRlR3VpZChvYmosICdlbWJlcicpOworICB9CisK
KyAgLy8gbWFrZSBzdXJlIGFueSBjaGFpbmVkIHdhdGNoZXJzIHVwZGF0ZS4KKyAgaWYgKGNoYWlu
cyAmJiBjaGFpbnMudmFsdWUoKSAhPT0gb2JqKSB7CisgICAgbS5jaGFpbnMgPSBjaGFpbnMuY29w
eShvYmopOworICB9CisKKyAgcmV0dXJuIHRoaXM7Cit9OworCitFbWJlci5maW5pc2hDaGFpbnMg
PSBmdW5jdGlvbihvYmopIHsKKyAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMg
PSBtLmNoYWluczsKKyAgaWYgKGNoYWlucykgeworICAgIGlmIChjaGFpbnMudmFsdWUoKSAhPT0g
b2JqKSB7CisgICAgICBtLmNoYWlucyA9IGNoYWlucyA9IGNoYWlucy5jb3B5KG9iaik7CisgICAg
fQorICAgIGNoYWlucy5kaWRDaGFuZ2UodHJ1ZSk7CisgIH0KK307CisKKy8vIC4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIFBST1BF
UlRZIENIQU5HRVMKKy8vCisKKy8qKgorICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGJl
Zm9yZSBhbiBvYmplY3QgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlLgorICBJdCB3aWxsIG5v
dGlmeSBhbnkgYmVmb3JlIG9ic2VydmVycyBhbmQgcHJlcGFyZSBjYWNoZXMgYW1vbmcgb3RoZXIg
dGhpbmdzLgorCisgIE5vcm1hbGx5IHlvdSB3aWxsIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRo
b2QgZGlyZWN0bHkgYnV0IGlmIGZvciBzb21lCisgIHJlYXNvbiB5b3UgY2FuJ3QgZGlyZWN0bHkg
d2F0Y2ggYSBwcm9wZXJ0eSB5b3UgY2FuIGludm9rZSB0aGlzIG1ldGhvZAorICBtYW51YWxseSBh
bG9uZyB3aXRoIGBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSgpYCB3aGljaCB5b3Ugc2hvdWxkIGNh
bGwganVzdAorICBhZnRlciB0aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KKworICBAbWV0aG9k
IHByb3BlcnR5V2lsbENoYW5nZQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmog
VGhlIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgY2hhbmdlCisgIEBwYXJhbSB7
U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgKG9yIHBhdGgpIHRoYXQgd2lsbCBjaGFu
Z2UuCisgIEByZXR1cm4ge3ZvaWR9CisqLworZnVuY3Rpb24gcHJvcGVydHlXaWxsQ2hhbmdlKG9i
aiwga2V5TmFtZSwgdmFsdWUpIHsKKyAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLAorICAg
ICAgd2F0Y2hpbmcgPSBtLndhdGNoaW5nW2tleU5hbWVdID4gMCB8fCBrZXlOYW1lID09PSAnbGVu
Z3RoJywKKyAgICAgIHByb3RvID0gbS5wcm90bywKKyAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5h
bWVdOworCisgIGlmICghd2F0Y2hpbmcpIHsgcmV0dXJuOyB9CisgIGlmIChwcm90byA9PT0gb2Jq
KSB7IHJldHVybjsgfQorICBpZiAoZGVzYyAmJiBkZXNjLndpbGxDaGFuZ2UpIHsgZGVzYy53aWxs
Q2hhbmdlKG9iaiwga2V5TmFtZSk7IH0KKyAgZGVwZW5kZW50S2V5c1dpbGxDaGFuZ2Uob2JqLCBr
ZXlOYW1lLCBtKTsKKyAgY2hhaW5zV2lsbENoYW5nZShvYmosIGtleU5hbWUsIG0pOworICBFbWJl
ci5ub3RpZnlCZWZvcmVPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKK30KKworRW1iZXIucHJvcGVy
dHlXaWxsQ2hhbmdlID0gcHJvcGVydHlXaWxsQ2hhbmdlOworCisvKioKKyAgVGhpcyBmdW5jdGlv
biBpcyBjYWxsZWQganVzdCBhZnRlciBhbiBvYmplY3QgcHJvcGVydHkgaGFzIGNoYW5nZWQuCisg
IEl0IHdpbGwgbm90aWZ5IGFueSBvYnNlcnZlcnMgYW5kIGNsZWFyIGNhY2hlcyBhbW9uZyBvdGhl
ciB0aGluZ3MuCisKKyAgTm9ybWFsbHkgeW91IHdpbGwgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1l
dGhvZCBkaXJlY3RseSBidXQgaWYgZm9yIHNvbWUKKyAgcmVhc29uIHlvdSBjYW4ndCBkaXJlY3Rs
eSB3YXRjaCBhIHByb3BlcnR5IHlvdSBjYW4gaW52b2tlIHRoaXMgbWV0aG9kCisgIG1hbnVhbGx5
IGFsb25nIHdpdGggYEVtYmVyLnByb3BlcnR5V2lsTENoYW5nZSgpYCB3aGljaCB5b3Ugc2hvdWxk
IGNhbGwganVzdAorICBiZWZvcmUgdGhlIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMuCisKKyAgQG1l
dGhvZCBwcm9wZXJ0eURpZENoYW5nZQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBv
YmogVGhlIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgY2hhbmdlCisgIEBwYXJh
bSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgKG9yIHBhdGgpIHRoYXQgd2lsbCBj
aGFuZ2UuCisgIEByZXR1cm4ge3ZvaWR9CisqLworZnVuY3Rpb24gcHJvcGVydHlEaWRDaGFuZ2Uo
b2JqLCBrZXlOYW1lKSB7CisgIHZhciBtID0gbWV0YUZvcihvYmosIGZhbHNlKSwKKyAgICAgIHdh
dGNoaW5nID0gbS53YXRjaGluZ1trZXlOYW1lXSA+IDAgfHwga2V5TmFtZSA9PT0gJ2xlbmd0aCcs
CisgICAgICBwcm90byA9IG0ucHJvdG8sCisgICAgICBkZXNjID0gbS5kZXNjc1trZXlOYW1lXTsK
KworICBpZiAocHJvdG8gPT09IG9iaikgeyByZXR1cm47IH0KKworICAvLyBzaG91bGRuJ3QgdGhp
cyBtZWFuIHRoYXQgd2UncmUgd2F0Y2hpbmcgdGhpcyBrZXk/CisgIGlmIChkZXNjICYmIGRlc2Mu
ZGlkQ2hhbmdlKSB7IGRlc2MuZGlkQ2hhbmdlKG9iaiwga2V5TmFtZSk7IH0KKyAgaWYgKCF3YXRj
aGluZyAmJiBrZXlOYW1lICE9PSAnbGVuZ3RoJykgeyByZXR1cm47IH0KKworICBkZXBlbmRlbnRL
ZXlzRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7CisgIGNoYWluc0RpZENoYW5nZShvYmosIGtl
eU5hbWUsIG0pOworICBFbWJlci5ub3RpZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKK30KKwor
RW1iZXIucHJvcGVydHlEaWRDaGFuZ2UgPSBwcm9wZXJ0eURpZENoYW5nZTsKKwordmFyIE5PREVf
U1RBQ0sgPSBbXTsKKworLyoqCisgIFRlYXJzIGRvd24gdGhlIG1ldGEgb24gYW4gb2JqZWN0IHNv
IHRoYXQgaXQgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgorICBNdWx0aXBsZSBjYWxscyB3aWxs
IGhhdmUgbm8gZWZmZWN0LgorCisgIEBtZXRob2QgZGVzdHJveQorICBAZm9yIEVtYmVyCisgIEBw
YXJhbSB7T2JqZWN0fSBvYmogIHRoZSBvYmplY3QgdG8gZGVzdHJveQorICBAcmV0dXJuIHt2b2lk
fQorKi8KK0VtYmVyLmRlc3Ryb3kgPSBmdW5jdGlvbiAob2JqKSB7CisgIHZhciBtZXRhID0gb2Jq
W01FVEFfS0VZXSwgbm9kZSwgbm9kZXMsIGtleSwgbm9kZU9iamVjdDsKKyAgaWYgKG1ldGEpIHsK
KyAgICBvYmpbTUVUQV9LRVldID0gbnVsbDsKKyAgICAvLyByZW1vdmUgY2hhaW5XYXRjaGVycyB0
byByZW1vdmUgY2lyY3VsYXIgcmVmZXJlbmNlcyB0aGF0IHdvdWxkIHByZXZlbnQgR0MKKyAgICBu
b2RlID0gbWV0YS5jaGFpbnM7CisgICAgaWYgKG5vZGUpIHsKKyAgICAgIE5PREVfU1RBQ0sucHVz
aChub2RlKTsKKyAgICAgIC8vIHByb2Nlc3MgdHJlZQorICAgICAgd2hpbGUgKE5PREVfU1RBQ0su
bGVuZ3RoID4gMCkgeworICAgICAgICBub2RlID0gTk9ERV9TVEFDSy5wb3AoKTsKKyAgICAgICAg
Ly8gcHVzaCBjaGlsZHJlbgorICAgICAgICBub2RlcyA9IG5vZGUuX2NoYWluczsKKyAgICAgICAg
aWYgKG5vZGVzKSB7CisgICAgICAgICAgZm9yIChrZXkgaW4gbm9kZXMpIHsKKyAgICAgICAgICAg
IGlmIChub2Rlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgICAgIE5PREVfU1RB
Q0sucHVzaChub2Rlc1trZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgLy8gcmVtb3ZlIGNoYWluV2F0Y2hlciBpbiBub2RlIG9iamVjdAorICAgICAg
ICBpZiAobm9kZS5fd2F0Y2hpbmcpIHsKKyAgICAgICAgICBub2RlT2JqZWN0ID0gbm9kZS5fb2Jq
ZWN0OworICAgICAgICAgIGlmIChub2RlT2JqZWN0KSB7CisgICAgICAgICAgICByZW1vdmVDaGFp
bldhdGNoZXIobm9kZU9iamVjdCwgbm9kZS5fa2V5LCBub2RlKTsKKyAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24o
KSB7CisvKioKK0Btb2R1bGUgZW1iZXItbWV0YWwKKyovCisKK0VtYmVyLndhcm4oIlRoZSBDUF9E
RUZBVUxUX0NBQ0hFQUJMRSBmbGFnIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGNvbXB1dGVkIHByb3Bl
cnRpZXMgYXJlIGFsd2F5cyBjYWNoZWQgYnkgZGVmYXVsdC4gVXNlIGB2b2xhdGlsZWAgaWYgeW91
IGRvbid0IHdhbnQgY2FjaGluZy4iLCBFbWJlci5FTlYuQ1BfREVGQVVMVF9DQUNIRUFCTEUgIT09
IGZhbHNlKTsKKworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LAorICAgIHNldCA9IEVtYmVyLnNldCwK
KyAgICBtZXRhRm9yID0gRW1iZXIubWV0YSwKKyAgICBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwK
KyAgICBhX3NsaWNlID0gW10uc2xpY2UsCisgICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCisg
ICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwKKyAgICB3YXRjaCA9IEVtYmVyLndhdGNoLAor
ICAgIHVud2F0Y2ggPSBFbWJlci51bndhdGNoOworCisvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBERVBFTkRFTlQgS0VZUwor
Ly8KKworLy8gZGF0YSBzdHJ1Y3R1cmU6CisvLyAgbWV0YS5kZXBzID0geworLy8gICAnZGVwS2V5
JzogeworLy8gICAgICdrZXlOYW1lJzogY291bnQsCisvLyAgIH0KKy8vICB9CisKKy8qCisgIFRo
aXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hcCBvZiB1bmlxdWUgZGVwZW5kZW5jaWVzIGZvciBhCisg
IGdpdmVuIG9iamVjdCBhbmQga2V5LgorKi8KK2Z1bmN0aW9uIGtleXNGb3JEZXAob2JqLCBkZXBz
TWV0YSwgZGVwS2V5KSB7CisgIHZhciBrZXlzID0gZGVwc01ldGFbZGVwS2V5XTsKKyAgaWYgKCFr
ZXlzKSB7CisgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcyB5ZXQgZm9yIGEgdGhl
IGdpdmVuIGtleQorICAgIC8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBsaXN0IG9mIGRlcGVuZGVuY2ll
cyBmb3IgdGhlIGtleQorICAgIGtleXMgPSBkZXBzTWV0YVtkZXBLZXldID0ge307CisgIH0gZWxz
ZSBpZiAoIWRlcHNNZXRhLmhhc093blByb3BlcnR5KGRlcEtleSkpIHsKKyAgICAvLyBvdGhlcndp
c2UgaWYgdGhlIGRlcGVuZGVuY3kgbGlzdCBpcyBpbmhlcml0ZWQgZnJvbQorICAgIC8vIGEgc3Vw
ZXJjbGFzcywgY2xvbmUgdGhlIGhhc2gKKyAgICBrZXlzID0gZGVwc01ldGFbZGVwS2V5XSA9IG9f
Y3JlYXRlKGtleXMpOworICB9CisgIHJldHVybiBrZXlzOworfQorCisvKiByZXR1cm4gb2JqW01F
VEFfS0VZXS5kZXBzICovCitmdW5jdGlvbiBtZXRhRm9yRGVwcyhvYmosIG1ldGEpIHsKKyAgdmFy
IGRlcHMgPSBtZXRhLmRlcHM7CisgIC8vIElmIHRoZSBjdXJyZW50IG9iamVjdCBoYXMgbm8gZGVw
ZW5kZW5jaWVzLi4uCisgIGlmICghZGVwcykgeworICAgIC8vIGluaXRpYWxpemUgdGhlIGRlcGVu
ZGVuY2llcyB3aXRoIGEgcG9pbnRlciBiYWNrIHRvCisgICAgLy8gdGhlIGN1cnJlbnQgb2JqZWN0
CisgICAgZGVwcyA9IG1ldGEuZGVwcyA9IHt9OworICB9IGVsc2UgaWYgKCFtZXRhLmhhc093blBy
b3BlcnR5KCdkZXBzJykpIHsKKyAgICAvLyBvdGhlcndpc2UgaWYgdGhlIGRlcGVuZGVuY2llcyBh
cmUgaW5oZXJpdGVkIGZyb20gdGhlCisgICAgLy8gb2JqZWN0J3Mgc3VwZXJjbGFzcywgY2xvbmUg
dGhlIGRlcHMKKyAgICBkZXBzID0gbWV0YS5kZXBzID0gb19jcmVhdGUoZGVwcyk7CisgIH0KKyAg
cmV0dXJuIGRlcHM7Cit9CisKK2Z1bmN0aW9uIGFkZERlcGVuZGVudEtleXMoZGVzYywgb2JqLCBr
ZXlOYW1lLCBtZXRhKSB7CisgIC8vIHRoZSBkZXNjcmlwdG9yIGhhcyBhIGxpc3Qgb2YgZGVwZW5k
ZW50IGtleXMsIHNvCisgIC8vIGFkZCBhbGwgb2YgaXRzIGRlcGVuZGVudCBrZXlzLgorICB2YXIg
ZGVwS2V5cyA9IGRlc2MuX2RlcGVuZGVudEtleXMsIGRlcHNNZXRhLCBpZHgsIGxlbiwgZGVwS2V5
LCBrZXlzOworICBpZiAoIWRlcEtleXMpIHJldHVybjsKKworICBkZXBzTWV0YSA9IG1ldGFGb3JE
ZXBzKG9iaiwgbWV0YSk7CisKKyAgZm9yKGlkeCA9IDAsIGxlbiA9IGRlcEtleXMubGVuZ3RoOyBp
ZHggPCBsZW47IGlkeCsrKSB7CisgICAgZGVwS2V5ID0gZGVwS2V5c1tpZHhdOworICAgIC8vIExv
b2t1cCBrZXlzIG1ldGEgZm9yIGRlcEtleQorICAgIGtleXMgPSBrZXlzRm9yRGVwKG9iaiwgZGVw
c01ldGEsIGRlcEtleSk7CisgICAgLy8gSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdGltZXMgZGVw
S2V5IGRlcGVuZHMgb24ga2V5TmFtZS4KKyAgICBrZXlzW2tleU5hbWVdID0gKGtleXNba2V5TmFt
ZV0gfHwgMCkgKyAxOworICAgIC8vIFdhdGNoIHRoZSBkZXBLZXkKKyAgICB3YXRjaChvYmosIGRl
cEtleSk7CisgIH0KK30KKworZnVuY3Rpb24gcmVtb3ZlRGVwZW5kZW50S2V5cyhkZXNjLCBvYmos
IGtleU5hbWUsIG1ldGEpIHsKKyAgLy8gdGhlIGRlc2NyaXB0b3IgaGFzIGEgbGlzdCBvZiBkZXBl
bmRlbnQga2V5cywgc28KKyAgLy8gYWRkIGFsbCBvZiBpdHMgZGVwZW5kZW50IGtleXMuCisgIHZh
ciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5cywgZGVwc01ldGEsIGlkeCwgbGVuLCBkZXBL
ZXksIGtleXM7CisgIGlmICghZGVwS2V5cykgcmV0dXJuOworCisgIGRlcHNNZXRhID0gbWV0YUZv
ckRlcHMob2JqLCBtZXRhKTsKKworICBmb3IoaWR4ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7
IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAgICBkZXBLZXkgPSBkZXBLZXlzW2lkeF07CisgICAgLy8g
TG9va3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5CisgICAga2V5cyA9IGtleXNGb3JEZXAob2JqLCBk
ZXBzTWV0YSwgZGVwS2V5KTsKKyAgICAvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiB0aW1lcyBk
ZXBLZXkgZGVwZW5kcyBvbiBrZXlOYW1lLgorICAgIGtleXNba2V5TmFtZV0gPSAoa2V5c1trZXlO
YW1lXSB8fCAwKSAtIDE7CisgICAgLy8gV2F0Y2ggdGhlIGRlcEtleQorICAgIHVud2F0Y2gob2Jq
LCBkZXBLZXkpOworICB9Cit9CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIENPTVBVVEVEIFBST1BFUlRZCisvLworCisv
KioKKyAgQGNsYXNzIENvbXB1dGVkUHJvcGVydHkKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0
ZW5kcyBFbWJlci5EZXNjcmlwdG9yCisgIEBjb25zdHJ1Y3RvcgorKi8KK2Z1bmN0aW9uIENvbXB1
dGVkUHJvcGVydHkoZnVuYywgb3B0cykgeworICB0aGlzLmZ1bmMgPSBmdW5jOworICB0aGlzLl9j
YWNoZWFibGUgPSAob3B0cyAmJiBvcHRzLmNhY2hlYWJsZSAhPT0gdW5kZWZpbmVkKSA/IG9wdHMu
Y2FjaGVhYmxlIDogdHJ1ZTsKKyAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IG9wdHMgJiYgb3B0cy5k
ZXBlbmRlbnRLZXlzOworfQorCitFbWJlci5Db21wdXRlZFByb3BlcnR5ID0gQ29tcHV0ZWRQcm9w
ZXJ0eTsKK0NvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlID0gbmV3IEVtYmVyLkRlc2NyaXB0b3Io
KTsKKwordmFyIENvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUgPSBDb21wdXRlZFByb3BlcnR5LnBy
b3RvdHlwZTsKKworLyoqCisgIENhbGwgb24gYSBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQg
aW50byBjYWNoZWFibGUgbW9kZS4gV2hlbiBpbiB0aGlzCisgIG1vZGUgdGhlIGNvbXB1dGVkIHBy
b3BlcnR5IHdpbGwgYXV0b21hdGljYWxseSBjYWNoZSB0aGUgcmV0dXJuIHZhbHVlIG9mCisgIHlv
dXIgZnVuY3Rpb24gdW50aWwgb25lIG9mIHRoZSBkZXBlbmRlbnQga2V5cyBjaGFuZ2VzLgorCisg
IGBgYGphdmFzY3JpcHQKKyAgTXlBcHAucHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7
CisgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdmaXJz
dE5hbWUnKSArICcgJyArIHRoaXMuZ2V0KCdsYXN0TmFtZScpOworCisgICAgICAvLyBBZnRlciBj
YWxjdWxhdGluZyB0aGUgdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiwgRW1iZXIgd2lsbAorICAgICAg
Ly8gcmV0dXJuIHRoYXQgdmFsdWUgd2l0aG91dCByZS1leGVjdXRpbmcgdGhpcyBmdW5jdGlvbiB1
bnRpbAorICAgICAgLy8gb25lIG9mIHRoZSBkZXBlbmRlbnQgcHJvcGVydGllcyBjaGFuZ2UuCisg
ICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKKyAgfSk7CisgIGBgYAorCisg
IFByb3BlcnRpZXMgYXJlIGNhY2hlYWJsZSBieSBkZWZhdWx0LgorCisgIEBtZXRob2QgY2FjaGVh
YmxlCisgIEBwYXJhbSB7Qm9vbGVhbn0gYUZsYWcgb3B0aW9uYWwgc2V0IHRvIGBmYWxzZWAgdG8g
ZGlzYWJsZSBjYWNoaW5nCisgIEBjaGFpbmFibGUKKyovCitDb21wdXRlZFByb3BlcnR5UHJvdG90
eXBlLmNhY2hlYWJsZSA9IGZ1bmN0aW9uKGFGbGFnKSB7CisgIHRoaXMuX2NhY2hlYWJsZSA9IGFG
bGFnICE9PSBmYWxzZTsKKyAgcmV0dXJuIHRoaXM7Cit9OworCisvKioKKyAgQ2FsbCBvbiBhIGNv
bXB1dGVkIHByb3BlcnR5IHRvIHNldCBpdCBpbnRvIG5vbi1jYWNoZWQgbW9kZS4gV2hlbiBpbiB0
aGlzCisgIG1vZGUgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkg
Y2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KKworICBgYGBqYXZhc2NyaXB0CisgIE15QXBwLm91dHNp
ZGVTZXJ2aWNlID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgdmFsdWU6IGZ1bmN0aW9uKCkg
eworICAgICAgcmV0dXJuIE91dHNpZGVTZXJ2aWNlLmdldFZhbHVlKCk7CisgICAgfS5wcm9wZXJ0
eSgpLnZvbGF0aWxlKCkKKyAgfSk7CisgIGBgYAorCisgIEBtZXRob2Qgdm9sYXRpbGUKKyAgQGNo
YWluYWJsZQorKi8KK0NvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUudm9sYXRpbGUgPSBmdW5jdGlv
bigpIHsKKyAgcmV0dXJuIHRoaXMuY2FjaGVhYmxlKGZhbHNlKTsKK307CisKKy8qKgorICBTZXRz
IHRoZSBkZXBlbmRlbnQga2V5cyBvbiB0aGlzIGNvbXB1dGVkIHByb3BlcnR5LiBQYXNzIGFueSBu
dW1iZXIgb2YKKyAgYXJndW1lbnRzIGNvbnRhaW5pbmcga2V5IHBhdGhzIHRoYXQgdGhpcyBjb21w
dXRlZCBwcm9wZXJ0eSBkZXBlbmRzIG9uLgorCisgIGBgYGphdmFzY3JpcHQKKyAgTXlBcHAucHJl
c2lkZW50ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1
dGVkKGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdmaXJzdE5hbWUnKSArICcg
JyArIHRoaXMuZ2V0KCdsYXN0TmFtZScpOworCisgICAgICAvLyBUZWxsIEVtYmVyIHRoYXQgdGhp
cyBjb21wdXRlZCBwcm9wZXJ0eSBkZXBlbmRzIG9uIGZpcnN0TmFtZQorICAgICAgLy8gYW5kIGxh
c3ROYW1lCisgICAgfSkucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCisgIH0pOwor
ICBgYGAKKworICBAbWV0aG9kIHByb3BlcnR5CisgIEBwYXJhbSB7U3RyaW5nfSBwYXRoKiB6ZXJv
IG9yIG1vcmUgcHJvcGVydHkgcGF0aHMKKyAgQGNoYWluYWJsZQorKi8KK0NvbXB1dGVkUHJvcGVy
dHlQcm90b3R5cGUucHJvcGVydHkgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGFyZ3MgPSBbXTsKKyAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAg
YXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisgIH0KKyAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IGFy
Z3M7CisgIHJldHVybiB0aGlzOworfTsKKworLyoqCisgIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkg
d2FudCB0byBhbm5vdGF0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGggYWRkaXRpb25hbAorICBt
ZXRhZGF0YSBhYm91dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZhbHVlcyB0aGV5IG9wZXJh
dGUgb24uIEZvciBleGFtcGxlLAorICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5IGNs
b3NlIG92ZXIgdmFyaWFibGVzIHRoYXQgYXJlIHRoZW4gbm8gbG9uZ2VyCisgIGF2YWlsYWJsZSBm
b3IgaW50cm9zcGVjdGlvbi4KKworICBZb3UgY2FuIHBhc3MgYSBoYXNoIG9mIHRoZXNlIHZhbHVl
cyB0byBhIGNvbXB1dGVkIHByb3BlcnR5IGxpa2UgdGhpczoKKworICBgYGAKKyAgcGVyc29uOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgcGVyc29uSWQgPSB0aGlzLmdldCgncGVyc29uSWQnKTsKKyAg
ICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7CisgIH0ucHJvcGVy
dHkoKS5tZXRhKHsgdHlwZTogQXBwLlBlcnNvbiB9KQorICBgYGAKKworICBUaGUgaGFzaCB0aGF0
IHlvdSBwYXNzIHRvIHRoZSBgbWV0YSgpYCBmdW5jdGlvbiB3aWxsIGJlIHNhdmVkIG9uIHRoZQor
ICBjb21wdXRlZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBgX21ldGFgIGtleS4gRW1i
ZXIgcnVudGltZQorICBleHBvc2VzIGEgcHVibGljIEFQSSBmb3IgcmV0cmlldmluZyB0aGVzZSB2
YWx1ZXMgZnJvbSBjbGFzc2VzLAorICB2aWEgdGhlIGBtZXRhRm9yUHJvcGVydHkoKWAgZnVuY3Rp
b24uCisKKyAgQG1ldGhvZCBtZXRhCisgIEBwYXJhbSB7SGFzaH0gbWV0YQorICBAY2hhaW5hYmxl
CisqLworCitDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLm1ldGEgPSBmdW5jdGlvbihtZXRhKSB7
CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CisgICAgcmV0dXJuIHRoaXMuX21ldGEg
fHwge307CisgIH0gZWxzZSB7CisgICAgdGhpcy5fbWV0YSA9IG1ldGE7CisgICAgcmV0dXJuIHRo
aXM7CisgIH0KK307CisKKy8qIGltcGwgZGVzY3JpcHRvciBBUEkgKi8KK0NvbXB1dGVkUHJvcGVy
dHlQcm90b3R5cGUud2lsbFdhdGNoID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7CisgIC8vIHdh
dGNoIGFscmVhZHkgY3JlYXRlcyBtZXRhIGZvciB0aGlzIGluc3RhbmNlCisgIHZhciBtZXRhID0g
b2JqW01FVEFfS0VZXTsKKyAgRW1iZXIuYXNzZXJ0KCd3YXRjaCBzaG91bGQgaGF2ZSBzZXR1cCBt
ZXRhIHRvIGJlIHdyaXRhYmxlJywgbWV0YS5zb3VyY2UgPT09IG9iaik7CisgIGlmICghKGtleU5h
bWUgaW4gbWV0YS5jYWNoZSkpIHsKKyAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5
TmFtZSwgbWV0YSk7CisgIH0KK307CisKK0NvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZGlkVW53
YXRjaCA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICB2YXIgbWV0YSA9IG9ialtNRVRBX0tF
WV07CisgIEVtYmVyLmFzc2VydCgndW53YXRjaCBzaG91bGQgaGF2ZSBzZXR1cCBtZXRhIHRvIGJl
IHdyaXRhYmxlJywgbWV0YS5zb3VyY2UgPT09IG9iaik7CisgIGlmICghKGtleU5hbWUgaW4gbWV0
YS5jYWNoZSkpIHsKKyAgICAvLyB1bndhdGNoIGFscmVhZHkgY3JlYXRlcyBtZXRhIGZvciB0aGlz
IGluc3RhbmNlCisgICAgcmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUsIG1l
dGEpOworICB9Cit9OworCisvKiBpbXBsIGRlc2NyaXB0b3IgQVBJICovCitDb21wdXRlZFByb3Bl
cnR5UHJvdG90eXBlLmRpZENoYW5nZSA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICAvLyBf
c3VzcGVuZGVkIGlzIHNldCB2aWEgYSBDUC5zZXQgdG8gZW5zdXJlIHdlIGRvbid0IGNsZWFyCisg
IC8vIHRoZSBjYWNoZWQgdmFsdWUgc2V0IGJ5IHRoZSBzZXR0ZXIKKyAgaWYgKHRoaXMuX2NhY2hl
YWJsZSAmJiB0aGlzLl9zdXNwZW5kZWQgIT09IG9iaikgeworICAgIHZhciBtZXRhID0gbWV0YUZv
cihvYmopOworICAgIGlmIChrZXlOYW1lIGluIG1ldGEuY2FjaGUpIHsKKyAgICAgIGRlbGV0ZSBt
ZXRhLmNhY2hlW2tleU5hbWVdOworICAgICAgaWYgKCFtZXRhLndhdGNoaW5nW2tleU5hbWVdKSB7
CisgICAgICAgIHJlbW92ZURlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRhKTsK
KyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8qIGltcGwgZGVzY3JpcHRvciBBUEkgKi8KK0Nv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Cisg
IHZhciByZXQsIGNhY2hlLCBtZXRhOworICBpZiAodGhpcy5fY2FjaGVhYmxlKSB7CisgICAgbWV0
YSA9IG1ldGFGb3Iob2JqKTsKKyAgICBjYWNoZSA9IG1ldGEuY2FjaGU7CisgICAgaWYgKGtleU5h
bWUgaW4gY2FjaGUpIHsgcmV0dXJuIGNhY2hlW2tleU5hbWVdOyB9CisgICAgcmV0ID0gY2FjaGVb
a2V5TmFtZV0gPSB0aGlzLmZ1bmMuY2FsbChvYmosIGtleU5hbWUpOworICAgIGlmICghbWV0YS53
YXRjaGluZ1trZXlOYW1lXSkgeworICAgICAgYWRkRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtl
eU5hbWUsIG1ldGEpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXQgPSB0aGlzLmZ1bmMuY2Fs
bChvYmosIGtleU5hbWUpOworICB9CisgIHJldHVybiByZXQ7Cit9OworCisvKiBpbXBsIGRlc2Ny
aXB0b3IgQVBJICovCitDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG9i
aiwga2V5TmFtZSwgdmFsdWUpIHsKKyAgdmFyIGNhY2hlYWJsZSA9IHRoaXMuX2NhY2hlYWJsZSwK
KyAgICAgIGZ1bmMgPSB0aGlzLmZ1bmMsCisgICAgICBtZXRhID0gbWV0YUZvcihvYmosIGNhY2hl
YWJsZSksCisgICAgICB3YXRjaGVkID0gbWV0YS53YXRjaGluZ1trZXlOYW1lXSwKKyAgICAgIG9s
ZFN1c3BlbmRlZCA9IHRoaXMuX3N1c3BlbmRlZCwKKyAgICAgIGhhZENhY2hlZFZhbHVlID0gZmFs
c2UsCisgICAgICBjYWNoZSA9IG1ldGEuY2FjaGUsCisgICAgICBjYWNoZWRWYWx1ZSwgcmV0Owor
CisgIHRoaXMuX3N1c3BlbmRlZCA9IG9iajsKKworICB0cnkgeworICAgIGlmIChjYWNoZWFibGUg
JiYgY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5TmFtZSkpIHsKKyAgICAgIGNhY2hlZFZhbHVlID0g
Y2FjaGVba2V5TmFtZV07CisgICAgICBoYWRDYWNoZWRWYWx1ZSA9IHRydWU7CisgICAgfQorCisg
ICAgLy8gQ2hlY2sgaWYgdGhlIENQIGhhcyBiZWVuIHdyYXBwZWQKKyAgICBpZiAoZnVuYy53cmFw
cGVkRnVuY3Rpb24pIHsgZnVuYyA9IGZ1bmMud3JhcHBlZEZ1bmN0aW9uOyB9CisKKyAgICAvLyBG
b3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBjb21wdXRlZCBwcm9wZXJ0aWVzCisgICAg
Ly8gdGhhdCBjaGVjayBmb3IgYXJndW1lbnRzLmxlbmd0aCA9PT0gMiB0byBkZXRlcm1pbmUgaWYK
KyAgICAvLyB0aGV5IGFyZSBiZWluZyBnZXQgb3Igc2V0LCBvbmx5IHBhc3MgdGhlIG9sZCBjYWNo
ZWQKKyAgICAvLyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgb3B0cyBpbnRvIGEgdGhp
cmQKKyAgICAvLyBhcmd1bWVudC4KKyAgICBpZiAoZnVuYy5sZW5ndGggPT09IDMpIHsKKyAgICAg
IHJldCA9IGZ1bmMuY2FsbChvYmosIGtleU5hbWUsIHZhbHVlLCBjYWNoZWRWYWx1ZSk7CisgICAg
fSBlbHNlIGlmIChmdW5jLmxlbmd0aCA9PT0gMikgeworICAgICAgcmV0ID0gZnVuYy5jYWxsKG9i
aiwga2V5TmFtZSwgdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICBFbWJlci5kZWZpbmVQcm9w
ZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIGNhY2hlZFZhbHVlKTsKKyAgICAgIEVtYmVyLnNldChv
YmosIGtleU5hbWUsIHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaGFk
Q2FjaGVkVmFsdWUgJiYgY2FjaGVkVmFsdWUgPT09IHJldCkgeyByZXR1cm47IH0KKworICAgIGlm
ICh3YXRjaGVkKSB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZShvYmosIGtleU5hbWUpOyB9CisK
KyAgICBpZiAoaGFkQ2FjaGVkVmFsdWUpIHsKKyAgICAgIGRlbGV0ZSBjYWNoZVtrZXlOYW1lXTsK
KyAgICB9CisKKyAgICBpZiAoY2FjaGVhYmxlKSB7CisgICAgICBpZiAoIXdhdGNoZWQgJiYgIWhh
ZENhY2hlZFZhbHVlKSB7CisgICAgICAgIGFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlO
YW1lLCBtZXRhKTsKKyAgICAgIH0KKyAgICAgIGNhY2hlW2tleU5hbWVdID0gcmV0OworICAgIH0K
KworICAgIGlmICh3YXRjaGVkKSB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKG9iaiwga2V5TmFt
ZSk7IH0KKyAgfSBmaW5hbGx5IHsKKyAgICB0aGlzLl9zdXNwZW5kZWQgPSBvbGRTdXNwZW5kZWQ7
CisgIH0KKyAgcmV0dXJuIHJldDsKK307CisKKy8qIGNhbGxlZCB3aGVuIHByb3BlcnR5IGlzIGRl
ZmluZWQgKi8KK0NvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuc2V0dXAgPSBmdW5jdGlvbihvYmos
IGtleU5hbWUpIHsKKyAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldOworICBpZiAobWV0YSAmJiBt
ZXRhLndhdGNoaW5nW2tleU5hbWVdKSB7CisgICAgYWRkRGVwZW5kZW50S2V5cyh0aGlzLCBvYmos
IGtleU5hbWUsIG1ldGFGb3Iob2JqKSk7CisgIH0KK307CisKKy8qIGNhbGxlZCBiZWZvcmUgcHJv
cGVydHkgaXMgb3ZlcnJpZGRlbiAqLworQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS50ZWFyZG93
biA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICB2YXIgbWV0YSA9IG1ldGFGb3Iob2JqKTsK
KworICBpZiAobWV0YS53YXRjaGluZ1trZXlOYW1lXSB8fCBrZXlOYW1lIGluIG1ldGEuY2FjaGUp
IHsKKyAgICByZW1vdmVEZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7Cisg
IH0KKworICBpZiAodGhpcy5fY2FjaGVhYmxlKSB7IGRlbGV0ZSBtZXRhLmNhY2hlW2tleU5hbWVd
OyB9CisKKyAgcmV0dXJuIG51bGw7IC8vIG5vIHZhbHVlIHRvIHJlc3RvcmUKK307CisKKworLyoq
CisgIFRoaXMgaGVscGVyIHJldHVybnMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRvciB0aGF0IHdy
YXBzIHRoZSBwYXNzZWQKKyAgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rpb24uIFlvdSBjYW4gdXNl
IHRoaXMgaGVscGVyIHRvIGRlZmluZSBwcm9wZXJ0aWVzCisgIHdpdGggbWl4aW5zIG9yIHZpYSBg
RW1iZXIuZGVmaW5lUHJvcGVydHkoKWAuCisKKyAgVGhlIGZ1bmN0aW9uIHlvdSBwYXNzIHdpbGwg
YmUgdXNlZCB0byBib3RoIGdldCBhbmQgc2V0IHByb3BlcnR5IHZhbHVlcy4KKyAgVGhlIGZ1bmN0
aW9uIHNob3VsZCBhY2NlcHQgdHdvIHBhcmFtZXRlcnMsIGtleSBhbmQgdmFsdWUuIElmIHZhbHVl
IGlzIG5vdAorICB1bmRlZmluZWQgeW91IHNob3VsZCBzZXQgdGhlIHZhbHVlIGZpcnN0LiBJbiBl
aXRoZXIgY2FzZSByZXR1cm4gdGhlCisgIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Lgor
CisgIEBtZXRob2QgY29tcHV0ZWQKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge0Z1bmN0aW9ufSBm
dW5jIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbi4KKyAgQHJldHVybiB7RW1iZXIuQ29t
cHV0ZWRQcm9wZXJ0eX0gcHJvcGVydHkgZGVzY3JpcHRvciBpbnN0YW5jZQorKi8KK0VtYmVyLmNv
bXB1dGVkID0gZnVuY3Rpb24oZnVuYykgeworICB2YXIgYXJnczsKKworICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA+IDEpIHsKKyAgICBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEp
OworICAgIGZ1bmMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF07CisgIH0KKworICB2
YXIgY3AgPSBuZXcgQ29tcHV0ZWRQcm9wZXJ0eShmdW5jKTsKKworICBpZiAoYXJncykgeworICAg
IGNwLnByb3BlcnR5LmFwcGx5KGNwLCBhcmdzKTsKKyAgfQorCisgIHJldHVybiBjcDsKK307CisK
Ky8qKgorICBSZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUgZm9yIGEgcHJvcGVydHksIGlmIG9uZSBl
eGlzdHMuCisgIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgcGVla2luZyBhdCB0aGUgdmFsdWUgb2Yg
YSBjb21wdXRlZAorICBwcm9wZXJ0eSB0aGF0IGlzIGdlbmVyYXRlZCBsYXppbHksIHdpdGhvdXQg
YWNjaWRlbnRhbGx5IGNhdXNpbmcKKyAgaXQgdG8gYmUgY3JlYXRlZC4KKworICBAbWV0aG9kIGNh
Y2hlRm9yCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtPYmplY3R9IG9iaiB0aGUgb2JqZWN0IHdo
b3NlIHByb3BlcnR5IHlvdSB3YW50IHRvIGNoZWNrCisgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhl
IG5hbWUgb2YgdGhlIHByb3BlcnR5IHdob3NlIGNhY2hlZCB2YWx1ZSB5b3Ugd2FudAorICAgIHRv
IHJldHVybgorKi8KK0VtYmVyLmNhY2hlRm9yID0gZnVuY3Rpb24gY2FjaGVGb3Iob2JqLCBrZXkp
IHsKKyAgdmFyIGNhY2hlID0gbWV0YUZvcihvYmosIGZhbHNlKS5jYWNoZTsKKworICBpZiAoY2Fj
aGUgJiYga2V5IGluIGNhY2hlKSB7CisgICAgcmV0dXJuIGNhY2hlW2tleV07CisgIH0KK307CisK
Ky8qKgorICBAbWV0aG9kIGNvbXB1dGVkLm5vdAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3Ry
aW5nfSBkZXBlbmRlbnRLZXkKKyovCitFbWJlci5jb21wdXRlZC5ub3QgPSBmdW5jdGlvbihkZXBl
bmRlbnRLZXkpIHsKKyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rp
b24oa2V5KSB7CisgICAgcmV0dXJuICFnZXQodGhpcywgZGVwZW5kZW50S2V5KTsKKyAgfSk7Cit9
OworCisvKioKKyAgQG1ldGhvZCBjb21wdXRlZC5lbXB0eQorICBAZm9yIEVtYmVyCisgIEBwYXJh
bSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyovCitFbWJlci5jb21wdXRlZC5lbXB0eSA9IGZ1bmN0
aW9uKGRlcGVuZGVudEtleSkgeworICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5
LCBmdW5jdGlvbihrZXkpIHsKKyAgICB2YXIgdmFsID0gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7
CisgICAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09
ICcnIHx8IChFbWJlci5pc0FycmF5KHZhbCkgJiYgZ2V0KHZhbCwgJ2xlbmd0aCcpID09PSAwKTsK
KyAgfSk7Cit9OworCisvKioKKyAgQG1ldGhvZCBjb21wdXRlZC5ib29sCisgIEBmb3IgRW1iZXIK
KyAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorKi8KK0VtYmVyLmNvbXB1dGVkLmJvb2wg
PSBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKKyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVu
ZGVudEtleSwgZnVuY3Rpb24oa2V5KSB7CisgICAgcmV0dXJuICEhZ2V0KHRoaXMsIGRlcGVuZGVu
dEtleSk7CisgIH0pOworfTsKKworLyoqCisgIEBtZXRob2QgY29tcHV0ZWQuYWxpYXMKKyAgQGZv
ciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisqLworRW1iZXIuY29tcHV0
ZWQuYWxpYXMgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKKyAgcmV0dXJuIEVtYmVyLmNvbXB1
dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CisgICAgaWYgKGFyZ3VtZW50
cy5sZW5ndGggPT09IDEpIHsKKyAgICAgIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KTsK
KyAgICB9IGVsc2UgeworICAgICAgc2V0KHRoaXMsIGRlcGVuZGVudEtleSwgdmFsdWUpOworICAg
ICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgfSk7Cit9OworCit9KSgpOworCisKKworKGZ1bmN0
aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyLW1ldGFsCisqLworCit2YXIgb19jcmVhdGUgPSBF
bWJlci5jcmVhdGUsCisgICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCisgICAgbWV0YVBhdGggPSBF
bWJlci5tZXRhUGF0aCwKKyAgICBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZOworCisvKgorICBU
aGUgZXZlbnQgc3lzdGVtIHVzZXMgYSBzZXJpZXMgb2YgbmVzdGVkIGhhc2hlcyB0byBzdG9yZSBs
aXN0ZW5lcnMgb24gYW4KKyAgb2JqZWN0LiBXaGVuIGEgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCwg
b3Igd2hlbiBhbiBldmVudCBhcnJpdmVzLCB0aGVzZQorICBoYXNoZXMgYXJlIGNvbnN1bHRlZCB0
byBkZXRlcm1pbmUgd2hpY2ggdGFyZ2V0IGFuZCBhY3Rpb24gcGFpciB0byBpbnZva2UuCisKKyAg
VGhlIGhhc2hlcyBhcmUgc3RvcmVkIGluIHRoZSBvYmplY3QncyBtZXRhIGhhc2gsIGFuZCBsb29r
IGxpa2UgdGhpczoKKworICAgICAgLy8gT2JqZWN0J3MgbWV0YSBoYXNoCisgICAgICB7CisgICAg
ICAgIGxpc3RlbmVyczogeyAgICAgICAvLyB2YXJpYWJsZSBuYW1lOiBgbGlzdGVuZXJTZXRgCisg
ICAgICAgICAgImZvbzpjaGFuZ2VkIjogWyAvLyB2YXJpYWJsZSBuYW1lOiBgYWN0aW9uc2AKKyAg
ICAgICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgb25jZUZsYWcsIHN1c3BlbmRlZEZsYWddCisgICAg
ICAgICAgXQorICAgICAgICB9CisgICAgICB9CisKKyovCisKK2Z1bmN0aW9uIGluZGV4T2YoYXJy
YXksIHRhcmdldCwgbWV0aG9kKSB7CisgIHZhciBpbmRleCA9IC0xOworICBmb3IgKHZhciBpID0g
MCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgIGlmICh0YXJnZXQgPT09IGFy
cmF5W2ldWzBdICYmIG1ldGhvZCA9PT0gYXJyYXlbaV1bMV0pIHsgaW5kZXggPSBpOyBicmVhazsg
fQorICB9CisgIHJldHVybiBpbmRleDsKK30KKworZnVuY3Rpb24gYWN0aW9uc0ZvcihvYmosIGV2
ZW50TmFtZSkgeworICB2YXIgbWV0YSA9IG1ldGFGb3Iob2JqLCB0cnVlKSwKKyAgICAgIGFjdGlv
bnM7CisKKyAgaWYgKCFtZXRhLmxpc3RlbmVycykgeyBtZXRhLmxpc3RlbmVycyA9IHt9OyB9CisK
KyAgaWYgKCFtZXRhLmhhc093blByb3BlcnR5KCdsaXN0ZW5lcnMnKSkgeworICAgIC8vIHNldHVw
IGluaGVyaXRlZCBjb3B5IG9mIHRoZSBsaXN0ZW5lcnMgb2JqZWN0CisgICAgbWV0YS5saXN0ZW5l
cnMgPSBvX2NyZWF0ZShtZXRhLmxpc3RlbmVycyk7CisgIH0KKworICBhY3Rpb25zID0gbWV0YS5s
aXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICAvLyBpZiB0aGVyZSBhcmUgYWN0aW9ucywgYnV0IHRo
ZSBldmVudE5hbWUgZG9lc24ndCBleGlzdCBpbiBvdXIgbGlzdGVuZXJzLCB0aGVuIGNvcHkgdGhl
bSBmcm9tIHRoZSBwcm90b3R5cGUKKyAgaWYgKGFjdGlvbnMgJiYgIW1ldGEubGlzdGVuZXJzLmhh
c093blByb3BlcnR5KGV2ZW50TmFtZSkpIHsKKyAgICBhY3Rpb25zID0gbWV0YS5saXN0ZW5lcnNb
ZXZlbnROYW1lXSA9IG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV0uc2xpY2UoKTsKKyAgfSBlbHNl
IGlmICghYWN0aW9ucykgeworICAgIGFjdGlvbnMgPSBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVd
ID0gW107CisgIH0KKworICByZXR1cm4gYWN0aW9uczsKK30KKworZnVuY3Rpb24gYWN0aW9uc1Vu
aW9uKG9iaiwgZXZlbnROYW1lLCBvdGhlckFjdGlvbnMpIHsKKyAgdmFyIG1ldGEgPSBvYmpbTUVU
QV9LRVldLAorICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0YS5s
aXN0ZW5lcnNbZXZlbnROYW1lXTsKKworICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9CisgIGZv
ciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgdmFyIHRh
cmdldCA9IGFjdGlvbnNbaV1bMF0sCisgICAgICAgIG1ldGhvZCA9IGFjdGlvbnNbaV1bMV0sCisg
ICAgICAgIG9uY2UgPSBhY3Rpb25zW2ldWzJdLAorICAgICAgICBzdXNwZW5kZWQgPSBhY3Rpb25z
W2ldWzNdLAorICAgICAgICBhY3Rpb25JbmRleCA9IGluZGV4T2Yob3RoZXJBY3Rpb25zLCB0YXJn
ZXQsIG1ldGhvZCk7CisKKyAgICBpZiAoYWN0aW9uSW5kZXggPT09IC0xKSB7CisgICAgICBvdGhl
ckFjdGlvbnMucHVzaChbdGFyZ2V0LCBtZXRob2QsIG9uY2UsIHN1c3BlbmRlZF0pOworICAgIH0K
KyAgfQorfQorCitmdW5jdGlvbiBhY3Rpb25zRGlmZihvYmosIGV2ZW50TmFtZSwgb3RoZXJBY3Rp
b25zKSB7CisgIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXSwKKyAgICAgIGFjdGlvbnMgPSBtZXRh
ICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV0sCisgICAgICBk
aWZmQWN0aW9ucyA9IFtdOworCisgIGlmICghYWN0aW9ucykgeyByZXR1cm47IH0KKyAgZm9yICh2
YXIgaSA9IGFjdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICB2YXIgdGFyZ2V0
ID0gYWN0aW9uc1tpXVswXSwKKyAgICAgICAgbWV0aG9kID0gYWN0aW9uc1tpXVsxXSwKKyAgICAg
ICAgb25jZSA9IGFjdGlvbnNbaV1bMl0sCisgICAgICAgIHN1c3BlbmRlZCA9IGFjdGlvbnNbaV1b
M10sCisgICAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihvdGhlckFjdGlvbnMsIHRhcmdldCwg
bWV0aG9kKTsKKworICAgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsgY29udGludWU7IH0KKwor
ICAgIG90aGVyQWN0aW9ucy5wdXNoKFt0YXJnZXQsIG1ldGhvZCwgb25jZSwgc3VzcGVuZGVkXSk7
CisgICAgZGlmZkFjdGlvbnMucHVzaChbdGFyZ2V0LCBtZXRob2QsIG9uY2UsIHN1c3BlbmRlZF0p
OworICB9CisKKyAgcmV0dXJuIGRpZmZBY3Rpb25zOworfQorCisvKioKKyAgQWRkIGFuIGV2ZW50
IGxpc3RlbmVyCisKKyAgQG1ldGhvZCBhZGRMaXN0ZW5lcgorICBAZm9yIEVtYmVyCisgIEBwYXJh
bSBvYmoKKyAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICBAcGFyYW0ge09iamVjdHxGdW5j
dGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KKyAgQHBh
cmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEg
ZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCisqLworZnVuY3Rpb24gYWRkTGlzdGVu
ZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBvbmNlKSB7CisgIEVtYmVyLmFzc2Vy
dCgiWW91IG11c3QgcGFzcyBhdCBsZWFzdCBhbiBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1i
ZXIuYWRkTGlzdGVuZXIiLCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7CisKKyAgaWYgKCFtZXRob2Qg
JiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgeworICAgIG1ldGhvZCA9IHRhcmdldDsK
KyAgICB0YXJnZXQgPSBudWxsOworICB9CisKKyAgdmFyIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9i
aiwgZXZlbnROYW1lKSwKKyAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihhY3Rpb25zLCB0YXJn
ZXQsIG1ldGhvZCk7CisKKyAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkgeyByZXR1cm47IH0KKwor
ICBhY3Rpb25zLnB1c2goW3RhcmdldCwgbWV0aG9kLCBvbmNlLCB1bmRlZmluZWRdKTsKKworICBp
ZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRBZGRMaXN0ZW5lcikgeworICAgIG9iai5k
aWRBZGRMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgfQorfQorCisvKioK
KyAgUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyCisKKyAgQXJndW1lbnRzIHNob3VsZCBtYXRjaCB0
aG9zZSBwYXNzZWQgdG8ge3sjY3Jvc3NMaW5rICJFbWJlci9hZGRMaXN0ZW5lciJ9fXt7L2Nyb3Nz
TGlua319CisKKyAgQG1ldGhvZCByZW1vdmVMaXN0ZW5lcgorICBAZm9yIEVtYmVyCisgIEBwYXJh
bSBvYmoKKyAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICBAcGFyYW0ge09iamVjdHxGdW5j
dGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KKyAgQHBh
cmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEg
ZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCisqLworZnVuY3Rpb24gcmVtb3ZlTGlz
dGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKSB7CisgIEVtYmVyLmFzc2VydCgi
WW91IG11c3QgcGFzcyBhdCBsZWFzdCBhbiBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIu
cmVtb3ZlTGlzdGVuZXIiLCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7CisKKyAgaWYgKCFtZXRob2Qg
JiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgeworICAgIG1ldGhvZCA9IHRhcmdldDsK
KyAgICB0YXJnZXQgPSBudWxsOworICB9CisKKyAgZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyKHRh
cmdldCwgbWV0aG9kLCBvbmNlKSB7CisgICAgdmFyIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwg
ZXZlbnROYW1lKSwKKyAgICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdl
dCwgbWV0aG9kKTsKKworICAgIC8vIGFjdGlvbiBkb2Vzbid0IGV4aXN0LCBnaXZlIHVwIHNpbGVu
dGx5CisgICAgaWYgKGFjdGlvbkluZGV4ID09PSAtMSkgeyByZXR1cm47IH0KKworICAgIGFjdGlv
bnMuc3BsaWNlKGFjdGlvbkluZGV4LCAxKTsKKworICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBl
b2Ygb2JqLmRpZFJlbW92ZUxpc3RlbmVyKSB7CisgICAgICBvYmouZGlkUmVtb3ZlTGlzdGVuZXIo
ZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCk7CisgICAgfQorICB9CisKKyAgaWYgKG1ldGhvZCkg
eworICAgIF9yZW1vdmVMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7CisgIH0gZWxzZSB7CisgICAg
dmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAorICAgICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRh
Lmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOworCisgICAgaWYgKCFhY3Rp
b25zKSB7IHJldHVybjsgfQorICAgIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDE7IGkg
Pj0gMDsgaS0tKSB7CisgICAgICBfcmVtb3ZlTGlzdGVuZXIoYWN0aW9uc1tpXVswXSwgYWN0aW9u
c1tpXVsxXSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICBAcHJpdmF0ZQorCisgIFN1c3BlbmQg
bGlzdGVuZXIgZHVyaW5nIGNhbGxiYWNrLgorCisgIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBi
eSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBsaXN0ZW5lcgorICB3aGVuIGl0IGlzIHRha2luZyBh
biBhY3Rpb24gdGhhdCB3b3VsZCBjYXVzZSB0aGUgZXZlbnQsIGUuZy4KKyAgYW4gb2JqZWN0IG1p
Z2h0IHN1c3BlbmQgaXRzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB3aGlsZSBpdCBpcworICBz
ZXR0aW5nIHRoYXQgcHJvcGVydHkuCisKKyAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXIKKyAgQGZv
ciBFbWJlcgorICBAcGFyYW0gb2JqCisgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyAgQHBh
cmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kIEEgdGFyZ2V0IG9iamVjdCBvciBh
IGZ1bmN0aW9uCisgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBmdW5jdGlvbiBv
ciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0YAorICBAcGFy
YW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworKi8KK2Z1bmN0aW9uIHN1c3BlbmRMaXN0ZW5lcihvYmos
IGV2ZW50TmFtZSwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgIGlmICghbWV0aG9kICYm
ICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICBtZXRob2QgPSB0YXJnZXQ7Cisg
ICAgdGFyZ2V0ID0gbnVsbDsKKyAgfQorCisgIHZhciBhY3Rpb25zID0gYWN0aW9uc0ZvcihvYmos
IGV2ZW50TmFtZSksCisgICAgICBhY3Rpb25JbmRleCA9IGluZGV4T2YoYWN0aW9ucywgdGFyZ2V0
LCBtZXRob2QpLAorICAgICAgYWN0aW9uOworCisgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsK
KyAgICBhY3Rpb24gPSBhY3Rpb25zW2FjdGlvbkluZGV4XS5zbGljZSgpOyAvLyBjb3B5IGl0LCBv
dGhlcndpc2Ugd2UncmUgbW9kaWZ5aW5nIGEgc2hhcmVkIG9iamVjdAorICAgIGFjdGlvblszXSA9
IHRydWU7IC8vIG1hcmsgdGhlIGFjdGlvbiBhcyBzdXNwZW5kZWQKKyAgICBhY3Rpb25zW2FjdGlv
bkluZGV4XSA9IGFjdGlvbjsgLy8gcmVwbGFjZSB0aGUgc2hhcmVkIG9iamVjdCB3aXRoIG91ciBj
b3B5CisgIH0KKworICBmdW5jdGlvbiB0cnlhYmxlKCkgICB7IHJldHVybiBjYWxsYmFjay5jYWxs
KHRhcmdldCk7IH0KKyAgZnVuY3Rpb24gZmluYWxpemVyKCkgeyBpZiAoYWN0aW9uKSB7IGFjdGlv
blszXSA9IHVuZGVmaW5lZDsgfSB9CisKKyAgcmV0dXJuIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJs
ZSwgZmluYWxpemVyKTsKK30KKworLyoqCisgIEBwcml2YXRlCisKKyAgU3VzcGVuZCBsaXN0ZW5l
ciBkdXJpbmcgY2FsbGJhY2suCisKKyAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB0
YXJnZXQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyCisgIHdoZW4gaXQgaXMgdGFraW5nIGFuIGFjdGlv
biB0aGF0IHdvdWxkIGNhdXNlIHRoZSBldmVudCwgZS5nLgorICBhbiBvYmplY3QgbWlnaHQgc3Vz
cGVuZCBpdHMgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHdoaWxlIGl0IGlzCisgIHNldHRpbmcg
dGhhdCBwcm9wZXJ0eS4KKworICBAbWV0aG9kIHN1c3BlbmRMaXN0ZW5lcgorICBAZm9yIEVtYmVy
CisgIEBwYXJhbSBvYmoKKyAgQHBhcmFtIHtBcnJheX0gZXZlbnROYW1lIEFycmF5IG9mIGV2ZW50
IG5hbWVzCisgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZCBBIHRhcmdl
dCBvYmplY3Qgb3IgYSBmdW5jdGlvbgorICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9k
IEEgZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRh
cmdldGAKKyAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyovCitmdW5jdGlvbiBzdXNwZW5k
TGlzdGVuZXJzKG9iaiwgZXZlbnROYW1lcywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7Cisg
IGlmICghbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICBtZXRo
b2QgPSB0YXJnZXQ7CisgICAgdGFyZ2V0ID0gbnVsbDsKKyAgfQorCisgIHZhciBzdXNwZW5kZWRB
Y3Rpb25zID0gW10sCisgICAgICBldmVudE5hbWUsIGFjdGlvbnMsIGFjdGlvbiwgaSwgbDsKKwor
ICBmb3IgKGk9MCwgbD1ldmVudE5hbWVzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICBldmVudE5h
bWUgPSBldmVudE5hbWVzW2ldOworICAgIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnRO
YW1lKTsKKyAgICB2YXIgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdldCwgbWV0
aG9kKTsKKworICAgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsKKyAgICAgIGFjdGlvbiA9IGFj
dGlvbnNbYWN0aW9uSW5kZXhdLnNsaWNlKCk7CisgICAgICBhY3Rpb25bM10gPSB0cnVlOworICAg
ICAgYWN0aW9uc1thY3Rpb25JbmRleF0gPSBhY3Rpb247CisgICAgICBzdXNwZW5kZWRBY3Rpb25z
LnB1c2goYWN0aW9uKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiB0cnlhYmxlKCkgeyByZXR1
cm4gY2FsbGJhY2suY2FsbCh0YXJnZXQpOyB9CisKKyAgZnVuY3Rpb24gZmluYWxpemVyKCkgewor
ICAgIGZvciAoaSA9IDAsIGwgPSBzdXNwZW5kZWRBY3Rpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykg
eworICAgICAgc3VzcGVuZGVkQWN0aW9uc1tpXVszXSA9IHVuZGVmaW5lZDsKKyAgICB9CisgIH0K
KworICByZXR1cm4gRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6ZXIpOworfQorCisv
KioKKyAgQHByaXZhdGUKKworICBSZXR1cm4gYSBsaXN0IG9mIGN1cnJlbnRseSB3YXRjaGVkIGV2
ZW50cworCisgIEBtZXRob2Qgd2F0Y2hlZEV2ZW50cworICBAZm9yIEVtYmVyCisgIEBwYXJhbSBv
YmoKKyovCitmdW5jdGlvbiB3YXRjaGVkRXZlbnRzKG9iaikgeworICB2YXIgbGlzdGVuZXJzID0g
b2JqW01FVEFfS0VZXS5saXN0ZW5lcnMsIHJldCA9IFtdOworCisgIGlmIChsaXN0ZW5lcnMpIHsK
KyAgICBmb3IodmFyIGV2ZW50TmFtZSBpbiBsaXN0ZW5lcnMpIHsKKyAgICAgIGlmIChsaXN0ZW5l
cnNbZXZlbnROYW1lXSkgeyByZXQucHVzaChldmVudE5hbWUpOyB9CisgICAgfQorICB9CisgIHJl
dHVybiByZXQ7Cit9CisKKy8qKgorICBAbWV0aG9kIHNlbmRFdmVudAorICBAZm9yIEVtYmVyCisg
IEBwYXJhbSBvYmoKKyAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICBAcGFyYW0ge0FycmF5
fSBwYXJhbXMKKyAgQHJldHVybiB0cnVlCisqLworZnVuY3Rpb24gc2VuZEV2ZW50KG9iaiwgZXZl
bnROYW1lLCBwYXJhbXMsIGFjdGlvbnMpIHsKKyAgLy8gZmlyc3QgZ2l2ZSBvYmplY3QgYSBjaGFu
Y2UgdG8gaGFuZGxlIGl0CisgIGlmIChvYmogIT09IEVtYmVyICYmICdmdW5jdGlvbicgPT09IHR5
cGVvZiBvYmouc2VuZEV2ZW50KSB7CisgICAgb2JqLnNlbmRFdmVudChldmVudE5hbWUsIHBhcmFt
cyk7CisgIH0KKworICBpZiAoIWFjdGlvbnMpIHsKKyAgICB2YXIgbWV0YSA9IG9ialtNRVRBX0tF
WV07CisgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0YS5saXN0ZW5l
cnNbZXZlbnROYW1lXTsKKyAgfQorCisgIGlmICghYWN0aW9ucykgeyByZXR1cm47IH0KKworICBm
b3IgKHZhciBpID0gYWN0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeyAvLyBsb29waW5n
IGluIHJldmVyc2UgZm9yIG9uY2UgbGlzdGVuZXJzCisgICAgaWYgKCFhY3Rpb25zW2ldIHx8IGFj
dGlvbnNbaV1bM10gPT09IHRydWUpIHsgY29udGludWU7IH0KKworICAgIHZhciB0YXJnZXQgPSBh
Y3Rpb25zW2ldWzBdLAorICAgICAgICBtZXRob2QgPSBhY3Rpb25zW2ldWzFdLAorICAgICAgICBv
bmNlID0gYWN0aW9uc1tpXVsyXTsKKworICAgIGlmIChvbmNlKSB7IHJlbW92ZUxpc3RlbmVyKG9i
aiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCk7IH0KKyAgICBpZiAoIXRhcmdldCkgeyB0YXJn
ZXQgPSBvYmo7IH0KKyAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBtZXRob2QpIHsgbWV0aG9k
ID0gdGFyZ2V0W21ldGhvZF07IH0KKyAgICBpZiAocGFyYW1zKSB7CisgICAgICBtZXRob2QuYXBw
bHkodGFyZ2V0LCBwYXJhbXMpOworICAgIH0gZWxzZSB7CisgICAgICBtZXRob2QuYXBwbHkodGFy
Z2V0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICBAcHJpdmF0ZQor
ICBAbWV0aG9kIGhhc0xpc3RlbmVycworICBAZm9yIEVtYmVyCisgIEBwYXJhbSBvYmoKKyAgQHBh
cmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorKi8KK2Z1bmN0aW9uIGhhc0xpc3RlbmVycyhvYmosIGV2
ZW50TmFtZSkgeworICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCisgICAgICBhY3Rpb25zID0g
bWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOworCisg
IHJldHVybiAhIShhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoKTsKK30KKworLyoqCisgIEBwcml2
YXRlCisgIEBtZXRob2QgbGlzdGVuZXJzRm9yCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIG9iagor
ICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lCisqLworZnVuY3Rpb24gbGlzdGVuZXJzRm9yKG9i
aiwgZXZlbnROYW1lKSB7CisgIHZhciByZXQgPSBbXTsKKyAgdmFyIG1ldGEgPSBvYmpbTUVUQV9L
RVldLAorICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0YS5saXN0
ZW5lcnNbZXZlbnROYW1lXTsKKworICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuIHJldDsgfQorCisg
IGZvciAodmFyIGkgPSAwLCBsID0gYWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICB2
YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXVswXSwKKyAgICAgICAgbWV0aG9kID0gYWN0aW9uc1tpXVsx
XTsKKyAgICByZXQucHVzaChbdGFyZ2V0LCBtZXRob2RdKTsKKyAgfQorCisgIHJldHVybiByZXQ7
Cit9CisKK0VtYmVyLmFkZExpc3RlbmVyID0gYWRkTGlzdGVuZXI7CitFbWJlci5yZW1vdmVMaXN0
ZW5lciA9IHJlbW92ZUxpc3RlbmVyOworRW1iZXIuX3N1c3BlbmRMaXN0ZW5lciA9IHN1c3BlbmRM
aXN0ZW5lcjsKK0VtYmVyLl9zdXNwZW5kTGlzdGVuZXJzID0gc3VzcGVuZExpc3RlbmVyczsKK0Vt
YmVyLnNlbmRFdmVudCA9IHNlbmRFdmVudDsKK0VtYmVyLmhhc0xpc3RlbmVycyA9IGhhc0xpc3Rl
bmVyczsKK0VtYmVyLndhdGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRzOworRW1iZXIubGlzdGVu
ZXJzRm9yID0gbGlzdGVuZXJzRm9yOworRW1iZXIubGlzdGVuZXJzRGlmZiA9IGFjdGlvbnNEaWZm
OworRW1iZXIubGlzdGVuZXJzVW5pb24gPSBhY3Rpb25zVW5pb247CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvLyBFbWJlci5Mb2dnZXIKKy8vIEVtYmVyLndhdGNoLmZsdXNoUGVuZGlu
ZworLy8gRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMsIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdl
cworLy8gRW1iZXIuZ3VpZEZvciwgRW1iZXIudHJ5RmluYWxseQorCisvKioKK0Btb2R1bGUgZW1i
ZXItbWV0YWwKKyovCisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIEhFTFBFUlMKKy8vCisKK3ZhciBzbGljZSA9IFtdLnNs
aWNlLAorICAgIGZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoOworCisvLyBp
bnZva2VzIHBhc3NlZCBwYXJhbXMgLSBub3JtYWxpemluZyBzbyB5b3UgY2FuIHBhc3MgdGFyZ2V0
L2Z1bmMsCisvLyB0YXJnZXQvc3RyaW5nIG9yIGp1c3QgZnVuYworZnVuY3Rpb24gaW52b2tlKHRh
cmdldCwgbWV0aG9kLCBhcmdzLCBpZ25vcmUpIHsKKworICBpZiAobWV0aG9kID09PSB1bmRlZmlu
ZWQpIHsKKyAgICBtZXRob2QgPSB0YXJnZXQ7CisgICAgdGFyZ2V0ID0gdW5kZWZpbmVkOworICB9
CisKKyAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgbWV0aG9kKSB7IG1ldGhvZCA9IHRhcmdldFtt
ZXRob2RdOyB9CisgIGlmIChhcmdzICYmIGlnbm9yZSA+IDApIHsKKyAgICBhcmdzID0gYXJncy5s
ZW5ndGggPiBpZ25vcmUgPyBzbGljZS5jYWxsKGFyZ3MsIGlnbm9yZSkgOiBudWxsOworICB9CisK
KyAgcmV0dXJuIEVtYmVyLmhhbmRsZUVycm9ycyhmdW5jdGlvbigpIHsKKyAgICAvLyBJRTgncyBG
dW5jdGlvbi5wcm90b3R5cGUuYXBwbHkgZG9lc24ndCBhY2NlcHQgdW5kZWZpbmVkL251bGwgYXJn
dW1lbnRzLgorICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0IHx8IHRoaXMsIGFyZ3MgfHwg
W10pOworICB9LCB0aGlzKTsKK30KKworCisvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBSVU5MT09QCisvLworCit2YXIgdGlt
ZXJNYXJrOyAvLyB1c2VkIGJ5IHRpbWVycy4uLgorCisvKioKK0VtYmVyIFJ1bkxvb3AgKFByaXZh
dGUpCisKK0BjbGFzcyBSdW5Mb29wCitAbmFtZXNwYWNlIEVtYmVyCitAcHJpdmF0ZQorQGNvbnN0
cnVjdG9yCisqLwordmFyIFJ1bkxvb3AgPSBmdW5jdGlvbihwcmV2KSB7CisgIHRoaXMuX3ByZXYg
PSBwcmV2IHx8IG51bGw7CisgIHRoaXMub25jZVRpbWVycyA9IHt9OworfTsKKworUnVuTG9vcC5w
cm90b3R5cGUgPSB7CisgIC8qKgorICAgIEBtZXRob2QgZW5kCisgICovCisgIGVuZDogZnVuY3Rp
b24oKSB7CisgICAgdGhpcy5mbHVzaCgpOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgcHJl
dgorICAqLworICBwcmV2OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5fcHJldjsKKyAg
fSwKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uCisgIC8vIERlbGF5ZWQgQWN0aW9ucworICAvLworCisgIC8qKgorICAgIEBt
ZXRob2Qgc2NoZWR1bGUKKyAgICBAcGFyYW0ge1N0cmluZ30gcXVldWVOYW1lCisgICAgQHBhcmFt
IHRhcmdldAorICAgIEBwYXJhbSBtZXRob2QKKyAgKi8KKyAgc2NoZWR1bGU6IGZ1bmN0aW9uKHF1
ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICB2YXIgcXVldWVzID0gdGhpcy5fcXVldWVz
LCBxdWV1ZTsKKyAgICBpZiAoIXF1ZXVlcykgeyBxdWV1ZXMgPSB0aGlzLl9xdWV1ZXMgPSB7fTsg
fQorICAgIHF1ZXVlID0gcXVldWVzW3F1ZXVlTmFtZV07CisgICAgaWYgKCFxdWV1ZSkgeyBxdWV1
ZSA9IHF1ZXVlc1txdWV1ZU5hbWVdID0gW107IH0KKworICAgIHZhciBhcmdzID0gYXJndW1lbnRz
Lmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMykgOiBudWxsOworICAgIHF1ZXVl
LnB1c2goeyB0YXJnZXQ6IHRhcmdldCwgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSk7Cisg
ICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBmbHVzaAorICAgIEBw
YXJhbSB7U3RyaW5nfSBxdWV1ZU5hbWUKKyAgKi8KKyAgZmx1c2g6IGZ1bmN0aW9uKHF1ZXVlTmFt
ZSkgeworICAgIHZhciBxdWV1ZU5hbWVzLCBpZHgsIGxlbiwgcXVldWUsIGxvZzsKKworICAgIGlm
ICghdGhpcy5fcXVldWVzKSB7IHJldHVybiB0aGlzOyB9IC8vIG5vdGhpbmcgdG8gZG8KKworICAg
IGZ1bmN0aW9uIGl0ZXIoaXRlbSkgeworICAgICAgaW52b2tlKGl0ZW0udGFyZ2V0LCBpdGVtLm1l
dGhvZCwgaXRlbS5hcmdzKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0cnlhYmxlKCkgeworICAg
ICAgZm9yRWFjaC5jYWxsKHF1ZXVlLCBpdGVyKTsKKyAgICB9CisKKyAgICBFbWJlci53YXRjaC5m
bHVzaFBlbmRpbmcoKTsgLy8gbWFrZSBzdXJlIGFsbCBjaGFpbmVkIHdhdGNoZXJzIGFyZSBzZXR1
cAorCisgICAgaWYgKHF1ZXVlTmFtZSkgeworICAgICAgd2hpbGUgKHRoaXMuX3F1ZXVlcyAmJiAo
cXVldWUgPSB0aGlzLl9xdWV1ZXNbcXVldWVOYW1lXSkpIHsKKyAgICAgICAgdGhpcy5fcXVldWVz
W3F1ZXVlTmFtZV0gPSBudWxsOworCisgICAgICAgIC8vIHRoZSBzeW5jIHBoYXNlIGlzIHRvIGFs
bG93IHByb3BlcnR5IGNoYW5nZXMgdG8gcHJvcGFnYXRlLiBkb24ndAorICAgICAgICAvLyBpbnZv
a2Ugb2JzZXJ2ZXJzIHVudGlsIHRoYXQgaXMgZmluaXNoZWQuCisgICAgICAgIGlmIChxdWV1ZU5h
bWUgPT09ICdzeW5jJykgeworICAgICAgICAgIGxvZyA9IEVtYmVyLkxPR19CSU5ESU5HUzsKKyAg
ICAgICAgICBpZiAobG9nKSB7IEVtYmVyLkxvZ2dlci5sb2coJ0JlZ2luOiBGbHVzaCBTeW5jIFF1
ZXVlJyk7IH0KKworICAgICAgICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKCk7CisKKyAg
ICAgICAgICBFbWJlci50cnlGaW5hbGx5KHRyeWFibGUsIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdl
cyk7CisKKyAgICAgICAgICBpZiAobG9nKSB7IEVtYmVyLkxvZ2dlci5sb2coJ0VuZDogRmx1c2gg
U3luYyBRdWV1ZScpOyB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3JFYWNoLmNh
bGwocXVldWUsIGl0ZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAg
ICAgcXVldWVOYW1lcyA9IEVtYmVyLnJ1bi5xdWV1ZXM7CisgICAgICBsZW4gPSBxdWV1ZU5hbWVz
Lmxlbmd0aDsKKyAgICAgIGlkeCA9IDA7CisKKyAgICAgIG91dGVybG9vcDoKKyAgICAgIHdoaWxl
IChpZHggPCBsZW4pIHsKKyAgICAgICAgcXVldWVOYW1lID0gcXVldWVOYW1lc1tpZHhdOworICAg
ICAgICBxdWV1ZSA9IHRoaXMuX3F1ZXVlcyAmJiB0aGlzLl9xdWV1ZXNbcXVldWVOYW1lXTsKKyAg
ICAgICAgZGVsZXRlIHRoaXMuX3F1ZXVlc1txdWV1ZU5hbWVdOworCisgICAgICAgIGlmIChxdWV1
ZSkgeworICAgICAgICAgIC8vIHRoZSBzeW5jIHBoYXNlIGlzIHRvIGFsbG93IHByb3BlcnR5IGNo
YW5nZXMgdG8gcHJvcGFnYXRlLiBkb24ndAorICAgICAgICAgIC8vIGludm9rZSBvYnNlcnZlcnMg
dW50aWwgdGhhdCBpcyBmaW5pc2hlZC4KKyAgICAgICAgICBpZiAocXVldWVOYW1lID09PSAnc3lu
YycpIHsKKyAgICAgICAgICAgIGxvZyA9IEVtYmVyLkxPR19CSU5ESU5HUzsKKyAgICAgICAgICAg
IGlmIChsb2cpIHsgRW1iZXIuTG9nZ2VyLmxvZygnQmVnaW46IEZsdXNoIFN5bmMgUXVldWUnKTsg
fQorCisgICAgICAgICAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOworCisgICAgICAg
ICAgICBFbWJlci50cnlGaW5hbGx5KHRyeWFibGUsIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcyk7
CisKKyAgICAgICAgICAgIGlmIChsb2cpIHsgRW1iZXIuTG9nZ2VyLmxvZygnRW5kOiBGbHVzaCBT
eW5jIFF1ZXVlJyk7IH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yRWFjaC5j
YWxsKHF1ZXVlLCBpdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBM
b29wIHRocm91Z2ggcHJpb3IgcXVldWVzCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGlk
eDsgaSsrKSB7CisgICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlcyAmJiB0aGlzLl9xdWV1ZXNbcXVl
dWVOYW1lc1tpXV0pIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IG92ZXIgYXQgdGhlIGZpcnN0IHF1
ZXVlIHdpdGggY29udGVudHMKKyAgICAgICAgICAgIGlkeCA9IGk7CisgICAgICAgICAgICBjb250
aW51ZSBvdXRlcmxvb3A7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWR4Kys7
CisgICAgICB9CisgICAgfQorCisgICAgdGltZXJNYXJrID0gbnVsbDsKKworICAgIHJldHVybiB0
aGlzOworICB9CisKK307CisKK0VtYmVyLlJ1bkxvb3AgPSBSdW5Mb29wOworCisvLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBF
bWJlci5ydW4gLSB0aGlzIGlzIGlkZWFsbHkgdGhlIG9ubHkgcHVibGljIEFQSSB0aGUgZGV2IHNl
ZXMKKy8vCisKKy8qKgorICBSdW5zIHRoZSBwYXNzZWQgdGFyZ2V0IGFuZCBtZXRob2QgaW5zaWRl
IG9mIGEgUnVuTG9vcCwgZW5zdXJpbmcgYW55CisgIGRlZmVycmVkIGFjdGlvbnMgaW5jbHVkaW5n
IGJpbmRpbmdzIGFuZCB2aWV3cyB1cGRhdGVzIGFyZSBmbHVzaGVkIGF0IHRoZQorICBlbmQuCisK
KyAgTm9ybWFsbHkgeW91IHNob3VsZCBub3QgbmVlZCB0byBpbnZva2UgdGhpcyBtZXRob2QgeW91
cnNlbGYuIEhvd2V2ZXIgaWYKKyAgeW91IGFyZSBpbXBsZW1lbnRpbmcgcmF3IGV2ZW50IGhhbmRs
ZXJzIHdoZW4gaW50ZXJmYWNpbmcgd2l0aCBvdGhlcgorICBsaWJyYXJpZXMgb3IgcGx1Z2lucywg
eW91IHNob3VsZCBwcm9iYWJseSB3cmFwIGFsbCBvZiB5b3VyIGNvZGUgaW5zaWRlIHRoaXMKKyAg
Y2FsbC4KKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLnJ1bihmdW5jdGlvbigpeworICAgIC8v
IGNvZGUgdG8gYmUgZXhlY3V0ZSB3aXRoaW4gYSBSdW5Mb29wIAorICB9KTsKKyAgYGBgCisKKyAg
QGNsYXNzIHJ1bgorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBzdGF0aWMKKyAgQGNvbnN0cnVjdG9y
CisgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGNhbGwKKyAg
QHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gaW52b2tlLgorICAgIE1h
eSBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmluZworICAgIHRo
ZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBhc3NlZCB0YXJnZXQuCisgIEBwYXJhbSB7
T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNz
IHRvIHRoZSBtZXRob2QuCisgIEByZXR1cm4ge09iamVjdH0gcmV0dXJuIHZhbHVlIGZyb20gaW52
b2tpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4KKyovCitFbWJlci5ydW4gPSBmdW5jdGlvbih0YXJn
ZXQsIG1ldGhvZCkgeworICB2YXIgbG9vcCwKKyAgYXJncyA9IGFyZ3VtZW50czsKKyAgcnVuLmJl
Z2luKCk7CisKKyAgZnVuY3Rpb24gdHJ5YWJsZSgpIHsKKyAgICBpZiAodGFyZ2V0IHx8IG1ldGhv
ZCkgeworICAgICAgcmV0dXJuIGludm9rZSh0YXJnZXQsIG1ldGhvZCwgYXJncywgMik7CisgICAg
fQorICB9CisKKyAgcmV0dXJuIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgcnVuLmVuZCk7Cit9
OworCit2YXIgcnVuID0gRW1iZXIucnVuOworCisKKy8qKgorICBCZWdpbnMgYSBuZXcgUnVuTG9v
cC4gQW55IGRlZmVycmVkIGFjdGlvbnMgaW52b2tlZCBhZnRlciB0aGUgYmVnaW4gd2lsbAorICBi
ZSBidWZmZXJlZCB1bnRpbCB5b3UgaW52b2tlIGEgbWF0Y2hpbmcgY2FsbCB0byBgRW1iZXIucnVu
LmVuZCgpYC4gVGhpcyBpcworICBhbiBsb3dlci1sZXZlbCB3YXkgdG8gdXNlIGEgUnVuTG9vcCBp
bnN0ZWFkIG9mIHVzaW5nIGBFbWJlci5ydW4oKWAuCisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJl
ci5ydW4uYmVnaW4oKTsKKyAgLy8gY29kZSB0byBiZSBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3Ag
CisgIEVtYmVyLnJ1bi5lbmQoKTsKKyAgYGBgCisKKyAgQG1ldGhvZCBiZWdpbgorICBAcmV0dXJu
IHt2b2lkfQorKi8KK0VtYmVyLnJ1bi5iZWdpbiA9IGZ1bmN0aW9uKCkgeworICBydW4uY3VycmVu
dFJ1bkxvb3AgPSBuZXcgUnVuTG9vcChydW4uY3VycmVudFJ1bkxvb3ApOworfTsKKworLyoqCisg
IEVuZHMgYSBSdW5Mb29wLiBUaGlzIG11c3QgYmUgY2FsbGVkIHNvbWV0aW1lIGFmdGVyIHlvdSBj
YWxsCisgIGBFbWJlci5ydW4uYmVnaW4oKWAgdG8gZmx1c2ggYW55IGRlZmVycmVkIGFjdGlvbnMu
IFRoaXMgaXMgYSBsb3dlci1sZXZlbCB3YXkKKyAgdG8gdXNlIGEgUnVuTG9vcCBpbnN0ZWFkIG9m
IHVzaW5nIGBFbWJlci5ydW4oKWAuCisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5ydW4uYmVn
aW4oKTsKKyAgLy8gY29kZSB0byBiZSBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3AgCisgIEVtYmVy
LnJ1bi5lbmQoKTsKKyAgYGBgCisKKyAgQG1ldGhvZCBlbmQKKyAgQHJldHVybiB7dm9pZH0KKyov
CitFbWJlci5ydW4uZW5kID0gZnVuY3Rpb24oKSB7CisgIEVtYmVyLmFzc2VydCgnbXVzdCBoYXZl
IGEgY3VycmVudCBydW4gbG9vcCcsIHJ1bi5jdXJyZW50UnVuTG9vcCk7CisKKyAgZnVuY3Rpb24g
dHJ5YWJsZSgpICAgeyBydW4uY3VycmVudFJ1bkxvb3AuZW5kKCk7ICB9CisgIGZ1bmN0aW9uIGZp
bmFsaXplcigpIHsgcnVuLmN1cnJlbnRSdW5Mb29wID0gcnVuLmN1cnJlbnRSdW5Mb29wLnByZXYo
KTsgfQorCisgIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsKK307CisKKy8q
KgorICBBcnJheSBvZiBuYW1lZCBxdWV1ZXMuIFRoaXMgYXJyYXkgZGV0ZXJtaW5lcyB0aGUgb3Jk
ZXIgaW4gd2hpY2ggcXVldWVzCisgIGFyZSBmbHVzaGVkIGF0IHRoZSBlbmQgb2YgdGhlIFJ1bkxv
b3AuIFlvdSBjYW4gZGVmaW5lIHlvdXIgb3duIHF1ZXVlcyBieQorICBzaW1wbHkgYWRkaW5nIHRo
ZSBxdWV1ZSBuYW1lIHRvIHRoaXMgYXJyYXkuIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5lZWQK
KyAgdG8gaW5zcGVjdCBvciBtb2RpZnkgdGhpcyBwcm9wZXJ0eS4KKworICBAcHJvcGVydHkgcXVl
dWVzCisgIEB0eXBlIEFycmF5CisgIEBkZWZhdWx0IFsnc3luYycsICdhY3Rpb25zJywgJ2Rlc3Ry
b3knLCAndGltZXJzJ10KKyovCitFbWJlci5ydW4ucXVldWVzID0gWydzeW5jJywgJ2FjdGlvbnMn
LCAnZGVzdHJveScsICd0aW1lcnMnXTsKKworLyoqCisgIEFkZHMgdGhlIHBhc3NlZCB0YXJnZXQv
bWV0aG9kIGFuZCBhbnkgb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBuYW1lZAorICBxdWV1ZSB0
byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLiBJZiB5b3UgaGF2ZSBub3Qg
YWxyZWFkeQorICBzdGFydGVkIGEgUnVuTG9vcCB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgb25l
IHdpbGwgYmUgc3RhcnRlZCBmb3IgeW91CisgIGF1dG9tYXRpY2FsbHkuCisKKyAgQXQgdGhlIGVu
ZCBvZiBhIFJ1bkxvb3AsIGFueSBtZXRob2RzIHNjaGVkdWxlZCBpbiB0aGlzIHdheSB3aWxsIGJl
IGludm9rZWQuCisgIE1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIGluIGFuIG9yZGVyIG1hdGNoaW5n
IHRoZSBuYW1lZCBxdWV1ZXMgZGVmaW5lZCBpbgorICB0aGUgYHJ1bi5xdWV1ZXNgIHByb3BlcnR5
LgorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIucnVuLnNjaGVkdWxlKCd0aW1lcnMnLCB0aGlz
LCBmdW5jdGlvbigpeworICAgIC8vIHRoaXMgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9m
IHRoZSBSdW5Mb29wLCB3aGVuIHRpbWVycyBhcmUgcnVuCisgICAgY29uc29sZS5sb2coInNjaGVk
dWxlZCBvbiB0aW1lcnMgcXVldWUiKTsKKyAgfSk7CisKKyAgRW1iZXIucnVuLnNjaGVkdWxlKCdz
eW5jJywgdGhpcywgZnVuY3Rpb24oKXsKKyAgICAvLyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgYXQg
dGhlIGVuZCBvZiB0aGUgUnVuTG9vcCwgd2hlbiBiaW5kaW5ncyBhcmUgc3luY2VkCisgICAgY29u
c29sZS5sb2coInNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlIik7CisgIH0pOworCisgIC8vIE5vdGUg
dGhlIGZ1bmN0aW9ucyB3aWxsIGJlIHJ1biBpbiBvcmRlciBiYXNlZCBvbiB0aGUgcnVuIHF1ZXVl
cyBvcmRlci4gT3V0cHV0IHdvdWxkIGJlOgorICAvLyAgIHNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVl
CisgIC8vICAgc2NoZWR1bGVkIG9uIHRpbWVycyBxdWV1ZQorICBgYGAKKworICBAbWV0aG9kIHNj
aGVkdWxlCisgIEBwYXJhbSB7U3RyaW5nfSBxdWV1ZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUgdG8g
c2NoZWR1bGUgYWdhaW5zdC4KKyAgICBEZWZhdWx0IHF1ZXVlcyBhcmUgJ3N5bmMnIGFuZCAnYWN0
aW9ucycKKyAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvYmplY3QgdG8gdXNlIGFz
IHRoZSBjb250ZXh0IHdoZW4gaW52b2tpbmcgYSBtZXRob2QuCisgIEBwYXJhbSB7U3RyaW5nfEZ1
bmN0aW9ufSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuIElmIHlvdSBwYXNzIGEgc3RyaW5n
IGl0CisgICAgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBhdCB0aGUgdGlt
ZSB0aGUgc2NoZWR1bGVkIGl0ZW0gaXMKKyAgICBpbnZva2VkIGFsbG93aW5nIHlvdSB0byBjaGFu
Z2UgdGhlIHRhcmdldCBmdW5jdGlvbi4KKyAgQHBhcmFtIHtPYmplY3R9IFthcmd1bWVudHMqXSBP
cHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBxdWV1ZWQgbWV0aG9kLgorICBA
cmV0dXJuIHt2b2lkfQorKi8KK0VtYmVyLnJ1bi5zY2hlZHVsZSA9IGZ1bmN0aW9uKHF1ZXVlLCB0
YXJnZXQsIG1ldGhvZCkgeworICB2YXIgbG9vcCA9IHJ1bi5hdXRvcnVuKCk7CisgIGxvb3Auc2No
ZWR1bGUuYXBwbHkobG9vcCwgYXJndW1lbnRzKTsKK307CisKK3ZhciBzY2hlZHVsZWRBdXRvcnVu
OworZnVuY3Rpb24gYXV0b3J1bigpIHsKKyAgc2NoZWR1bGVkQXV0b3J1biA9IG51bGw7CisgIGlm
IChydW4uY3VycmVudFJ1bkxvb3ApIHsgcnVuLmVuZCgpOyB9Cit9CisKKy8vIFVzZWQgYnkgZ2xv
YmFsIHRlc3QgdGVhcmRvd24KK0VtYmVyLnJ1bi5oYXNTY2hlZHVsZWRUaW1lcnMgPSBmdW5jdGlv
bigpIHsKKyAgcmV0dXJuICEhKHNjaGVkdWxlZEF1dG9ydW4gfHwgc2NoZWR1bGVkTGF0ZXIgfHwg
c2NoZWR1bGVkTmV4dCk7Cit9OworCisvLyBVc2VkIGJ5IGdsb2JhbCB0ZXN0IHRlYXJkb3duCitF
bWJlci5ydW4uY2FuY2VsVGltZXJzID0gZnVuY3Rpb24gKCkgeworICBpZiAoc2NoZWR1bGVkQXV0
b3J1bikgeworICAgIGNsZWFyVGltZW91dChzY2hlZHVsZWRBdXRvcnVuKTsKKyAgICBzY2hlZHVs
ZWRBdXRvcnVuID0gbnVsbDsKKyAgfQorICBpZiAoc2NoZWR1bGVkTGF0ZXIpIHsKKyAgICBjbGVh
clRpbWVvdXQoc2NoZWR1bGVkTGF0ZXIpOworICAgIHNjaGVkdWxlZExhdGVyID0gbnVsbDsKKyAg
fQorICBpZiAoc2NoZWR1bGVkTmV4dCkgeworICAgIGNsZWFyVGltZW91dChzY2hlZHVsZWROZXh0
KTsKKyAgICBzY2hlZHVsZWROZXh0ID0gbnVsbDsKKyAgfQorICB0aW1lcnMgPSB7fTsKK307CisK
Ky8qKgorICBCZWdpbnMgYSBuZXcgUnVuTG9vcCBpZiBuZWNlc3NhcnkgYW5kIHNjaGVkdWxlcyBh
IHRpbWVyIHRvIGZsdXNoIHRoZQorICBSdW5Mb29wIGF0IGEgbGF0ZXIgdGltZS4gVGhpcyBtZXRo
b2QgaXMgdXNlZCBieSBwYXJ0cyBvZiBFbWJlciB0bworICBlbnN1cmUgdGhlIFJ1bkxvb3AgYWx3
YXlzIGZpbmlzaGVzLiBZb3Ugbm9ybWFsbHkgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGlzCisgIG1l
dGhvZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UgYEVtYmVyLnJ1bigpYAorCisgIEBtZXRob2QgYXV0
b3J1bgorICBAZXhhbXBsZQorICAgIEVtYmVyLnJ1bi5hdXRvcnVuKCk7CisgIEByZXR1cm4ge0Vt
YmVyLlJ1bkxvb3B9IHRoZSBuZXcgY3VycmVudCBSdW5Mb29wCisqLworRW1iZXIucnVuLmF1dG9y
dW4gPSBmdW5jdGlvbigpIHsKKyAgaWYgKCFydW4uY3VycmVudFJ1bkxvb3ApIHsKKyAgICBFbWJl
ci5hc3NlcnQoIllvdSBoYXZlIHR1cm5lZCBvbiB0ZXN0aW5nIG1vZGUsIHdoaWNoIGRpc2FibGVk
IHRoZSBydW4tbG9vcCdzIGF1dG9ydW4uIFlvdSB3aWxsIG5lZWQgdG8gd3JhcCBhbnkgY29kZSB3
aXRoIGFzeW5jaHJvbm91cyBzaWRlLWVmZmVjdHMgaW4gYW4gRW1iZXIucnVuIiwgIUVtYmVyLnRl
c3RpbmcpOworCisgICAgcnVuLmJlZ2luKCk7CisKKyAgICBpZiAoIXNjaGVkdWxlZEF1dG9ydW4p
IHsKKyAgICAgIHNjaGVkdWxlZEF1dG9ydW4gPSBzZXRUaW1lb3V0KGF1dG9ydW4sIDEpOworICAg
IH0KKyAgfQorCisgIHJldHVybiBydW4uY3VycmVudFJ1bkxvb3A7Cit9OworCisvKioKKyAgSW1t
ZWRpYXRlbHkgZmx1c2hlcyBhbnkgZXZlbnRzIHNjaGVkdWxlZCBpbiB0aGUgJ3N5bmMnIHF1ZXVl
LiBCaW5kaW5ncworICB1c2UgdGhpcyBxdWV1ZSBzbyB0aGlzIG1ldGhvZCBpcyBhIHVzZWZ1bCB3
YXkgdG8gaW1tZWRpYXRlbHkgZm9yY2UgYWxsCisgIGJpbmRpbmdzIGluIHRoZSBhcHBsaWNhdGlv
biB0byBzeW5jLgorCisgIFlvdSBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBhbnl0aW1lIHlvdSBu
ZWVkIGFueSBjaGFuZ2VkIHN0YXRlIHRvIHByb3BhZ2F0ZQorICB0aHJvdWdob3V0IHRoZSBhcHAg
aW1tZWRpYXRlbHkgd2l0aG91dCByZXBhaW50aW5nIHRoZSBVSS4KKworICBgYGBqYXZhc2NyaXB0
CisgIEVtYmVyLnJ1bi5zeW5jKCk7CisgIGBgYAorCisgIEBtZXRob2Qgc3luYworICBAcmV0dXJu
IHt2b2lkfQorKi8KK0VtYmVyLnJ1bi5zeW5jID0gZnVuY3Rpb24oKSB7CisgIHJ1bi5hdXRvcnVu
KCk7CisgIHJ1bi5jdXJyZW50UnVuTG9vcC5mbHVzaCgnc3luYycpOworfTsKKworLy8gLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8g
VElNRVJTCisvLworCit2YXIgdGltZXJzID0ge307IC8vIGFjdGl2ZSB0aW1lcnMuLi4KKwordmFy
IHNjaGVkdWxlZExhdGVyOworZnVuY3Rpb24gaW52b2tlTGF0ZXJUaW1lcnMoKSB7CisgIHNjaGVk
dWxlZExhdGVyID0gbnVsbDsKKyAgdmFyIG5vdyA9ICgrIG5ldyBEYXRlKCkpLCBlYXJsaWVzdCA9
IC0xOworICBmb3IgKHZhciBrZXkgaW4gdGltZXJzKSB7CisgICAgaWYgKCF0aW1lcnMuaGFzT3du
UHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQorICAgIHZhciB0aW1lciA9IHRpbWVyc1trZXld
OworICAgIGlmICh0aW1lciAmJiB0aW1lci5leHBpcmVzKSB7CisgICAgICBpZiAobm93ID49IHRp
bWVyLmV4cGlyZXMpIHsKKyAgICAgICAgZGVsZXRlIHRpbWVyc1trZXldOworICAgICAgICBpbnZv
a2UodGltZXIudGFyZ2V0LCB0aW1lci5tZXRob2QsIHRpbWVyLmFyZ3MsIDIpOworICAgICAgfSBl
bHNlIHsKKyAgICAgICAgaWYgKGVhcmxpZXN0PDAgfHwgKHRpbWVyLmV4cGlyZXMgPCBlYXJsaWVz
dCkpIGVhcmxpZXN0PXRpbWVyLmV4cGlyZXM7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8g
c2NoZWR1bGUgbmV4dCB0aW1lb3V0IHRvIGZpcmUuLi4KKyAgaWYgKGVhcmxpZXN0ID4gMCkgeyBz
Y2hlZHVsZWRMYXRlciA9IHNldFRpbWVvdXQoaW52b2tlTGF0ZXJUaW1lcnMsIGVhcmxpZXN0LSgr
IG5ldyBEYXRlKCkpKTsgfQorfQorCisvKioKKyAgSW52b2tlcyB0aGUgcGFzc2VkIHRhcmdldC9t
ZXRob2QgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyBhZnRlciBhIHNwZWNpZmllZAorICBwZXJpb2Qg
aWYgdGltZS4gVGhlIGxhc3QgcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kIG11c3QgYWx3YXlzIGJl
IGEgbnVtYmVyCisgIG9mIG1pbGxpc2Vjb25kcy4KKworICBZb3Ugc2hvdWxkIHVzZSB0aGlzIG1l
dGhvZCB3aGVuZXZlciB5b3UgbmVlZCB0byBydW4gc29tZSBhY3Rpb24gYWZ0ZXIgYQorICBwZXJp
b2Qgb2YgdGltZSBpbnN0ZWFkIG9mIHVzaW5nIGBzZXRUaW1lb3V0KClgLiBUaGlzIG1ldGhvZCB3
aWxsIGVuc3VyZSB0aGF0CisgIGl0ZW1zIHRoYXQgZXhwaXJlIGR1cmluZyB0aGUgc2FtZSBzY3Jp
cHQgZXhlY3V0aW9uIGN5Y2xlIGFsbCBleGVjdXRlCisgIHRvZ2V0aGVyLCB3aGljaCBpcyBvZnRl
biBtb3JlIGVmZmljaWVudCB0aGFuIHVzaW5nIGEgcmVhbCBzZXRUaW1lb3V0LgorCisgIGBgYGph
dmFzY3JpcHQKKyAgRW1iZXIucnVuLmxhdGVyKG15Q29udGV4dCwgZnVuY3Rpb24oKXsKKyAgICAv
LyBjb2RlIGhlcmUgd2lsbCBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3AgaW4gYWJvdXQgNTAwbXMg
d2l0aCB0aGlzID09IG15Q29udGV4dAorICB9LCA1MDApOworICBgYGAKKworICBAbWV0aG9kIGxh
dGVyCisgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGludm9r
ZQorICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tl
LgorICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCisg
ICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KKyAgQHBhcmFtIHtP
YmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQu
CisgIEBwYXJhbSB7TnVtYmVyfSB3YWl0CisgICAgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3
YWl0LgorICBAcmV0dXJuIHtTdHJpbmd9IGEgc3RyaW5nIHlvdSBjYW4gdXNlIHRvIGNhbmNlbCB0
aGUgdGltZXIgaW4KKyAgICB7eyNjcm9zc0xpbmsgIkVtYmVyL3J1bi5jYW5jZWwifX17ey9jcm9z
c0xpbmt9fSBsYXRlci4KKyovCitFbWJlci5ydW4ubGF0ZXIgPSBmdW5jdGlvbih0YXJnZXQsIG1l
dGhvZCkgeworICB2YXIgYXJncywgZXhwaXJlcywgdGltZXIsIGd1aWQsIHdhaXQ7CisKKyAgLy8g
c2V0VGltZW91dCBjb21wYXRpYmlsaXR5Li4uCisgIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MiAm
JiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7CisgICAgd2FpdCAgID0gbWV0aG9kOwor
ICAgIG1ldGhvZCA9IHRhcmdldDsKKyAgICB0YXJnZXQgPSB1bmRlZmluZWQ7CisgICAgYXJncyAg
ID0gW3RhcmdldCwgbWV0aG9kXTsKKyAgfSBlbHNlIHsKKyAgICBhcmdzID0gc2xpY2UuY2FsbChh
cmd1bWVudHMpOworICAgIHdhaXQgPSBhcmdzLnBvcCgpOworICB9CisKKyAgZXhwaXJlcyA9ICgr
IG5ldyBEYXRlKCkpICsgd2FpdDsKKyAgdGltZXIgICA9IHsgdGFyZ2V0OiB0YXJnZXQsIG1ldGhv
ZDogbWV0aG9kLCBleHBpcmVzOiBleHBpcmVzLCBhcmdzOiBhcmdzIH07CisgIGd1aWQgICAgPSBF
bWJlci5ndWlkRm9yKHRpbWVyKTsKKyAgdGltZXJzW2d1aWRdID0gdGltZXI7CisgIHJ1bi5vbmNl
KHRpbWVycywgaW52b2tlTGF0ZXJUaW1lcnMpOworICByZXR1cm4gZ3VpZDsKK307CisKK2Z1bmN0
aW9uIGludm9rZU9uY2VUaW1lcihndWlkLCBvbmNlVGltZXJzKSB7CisgIGlmIChvbmNlVGltZXJz
W3RoaXMudGd1aWRdKSB7IGRlbGV0ZSBvbmNlVGltZXJzW3RoaXMudGd1aWRdW3RoaXMubWd1aWRd
OyB9CisgIGlmICh0aW1lcnNbZ3VpZF0pIHsgaW52b2tlKHRoaXMudGFyZ2V0LCB0aGlzLm1ldGhv
ZCwgdGhpcy5hcmdzKTsgfQorICBkZWxldGUgdGltZXJzW2d1aWRdOworfQorCitmdW5jdGlvbiBz
Y2hlZHVsZU9uY2UocXVldWUsIHRhcmdldCwgbWV0aG9kLCBhcmdzKSB7CisgIHZhciB0Z3VpZCA9
IEVtYmVyLmd1aWRGb3IodGFyZ2V0KSwKKyAgICBtZ3VpZCA9IEVtYmVyLmd1aWRGb3IobWV0aG9k
KSwKKyAgICBvbmNlVGltZXJzID0gcnVuLmF1dG9ydW4oKS5vbmNlVGltZXJzLAorICAgIGd1aWQg
PSBvbmNlVGltZXJzW3RndWlkXSAmJiBvbmNlVGltZXJzW3RndWlkXVttZ3VpZF0sCisgICAgdGlt
ZXI7CisKKyAgaWYgKGd1aWQgJiYgdGltZXJzW2d1aWRdKSB7CisgICAgdGltZXJzW2d1aWRdLmFy
Z3MgPSBhcmdzOyAvLyByZXBsYWNlIGFyZ3MKKyAgfSBlbHNlIHsKKyAgICB0aW1lciA9IHsKKyAg
ICAgIHRhcmdldDogdGFyZ2V0LAorICAgICAgbWV0aG9kOiBtZXRob2QsCisgICAgICBhcmdzOiAg
IGFyZ3MsCisgICAgICB0Z3VpZDogIHRndWlkLAorICAgICAgbWd1aWQ6ICBtZ3VpZAorICAgIH07
CisKKyAgICBndWlkICA9IEVtYmVyLmd1aWRGb3IodGltZXIpOworICAgIHRpbWVyc1tndWlkXSA9
IHRpbWVyOworICAgIGlmICghb25jZVRpbWVyc1t0Z3VpZF0pIHsgb25jZVRpbWVyc1t0Z3VpZF0g
PSB7fTsgfQorICAgIG9uY2VUaW1lcnNbdGd1aWRdW21ndWlkXSA9IGd1aWQ7IC8vIHNvIGl0IGlz
bid0IHNjaGVkdWxlZCBtb3JlIHRoYW4gb25jZQorCisgICAgcnVuLnNjaGVkdWxlKHF1ZXVlLCB0
aW1lciwgaW52b2tlT25jZVRpbWVyLCBndWlkLCBvbmNlVGltZXJzKTsKKyAgfQorCisgIHJldHVy
biBndWlkOworfQorCisvKioKKyAgU2NoZWR1bGVzIGFuIGl0ZW0gdG8gcnVuIG9uZSB0aW1lIGR1
cmluZyB0aGUgY3VycmVudCBSdW5Mb29wLiBDYWxsaW5nCisgIHRoaXMgbWV0aG9kIHdpdGggdGhl
IHNhbWUgdGFyZ2V0L21ldGhvZCBjb21iaW5hdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0LgorCisg
IE5vdGUgdGhhdCBhbHRob3VnaCB5b3UgY2FuIHBhc3Mgb3B0aW9uYWwgYXJndW1lbnRzIHRoZXNl
IHdpbGwgbm90IGJlCisgIGNvbnNpZGVyZWQgd2hlbiBsb29raW5nIGZvciBkdXBsaWNhdGVzLiBO
ZXcgYXJndW1lbnRzIHdpbGwgcmVwbGFjZSBwcmV2aW91cworICBjYWxscy4KKworICBgYGBqYXZh
c2NyaXB0CisgIEVtYmVyLnJ1bihmdW5jdGlvbigpeworICAgIHZhciBkb0ZvbyA9IGZ1bmN0aW9u
KCkgeyBmb28oKTsgfQorICAgIEVtYmVyLnJ1bi5vbmNlKG15Q29udGV4dCwgZG9Gb28pOworICAg
IEVtYmVyLnJ1bi5vbmNlKG15Q29udGV4dCwgZG9Gb28pOworICAgIC8vIGRvRm9vIHdpbGwgb25s
eSBiZSBleGVjdXRlZCBvbmNlIGF0IHRoZSBlbmQgb2YgdGhlIFJ1bkxvb3AKKyAgfSk7CisgIGBg
YAorCisgIEBtZXRob2Qgb25jZQorICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9m
IG1ldGhvZCB0byBpbnZva2UKKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUg
bWV0aG9kIHRvIGludm9rZS4KKyAgICBJZiB5b3UgcGFzcyBhIHN0cmluZyBpdCB3aWxsIGJlIHJl
c29sdmVkIG9uIHRoZQorICAgIHRhcmdldCBhdCB0aGUgdGltZSB0aGUgbWV0aG9kIGlzIGludm9r
ZWQuCisgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNz
IHRvIHRoZSB0aW1lb3V0LgorICBAcmV0dXJuIHtPYmplY3R9IHRpbWVyCisqLworRW1iZXIucnVu
Lm9uY2UgPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCkgeworICByZXR1cm4gc2NoZWR1bGVPbmNl
KCdhY3Rpb25zJywgdGFyZ2V0LCBtZXRob2QsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSk7Cit9
OworCitFbWJlci5ydW4uc2NoZWR1bGVPbmNlID0gZnVuY3Rpb24ocXVldWUsIHRhcmdldCwgbWV0
aG9kLCBhcmdzKSB7CisgIHJldHVybiBzY2hlZHVsZU9uY2UocXVldWUsIHRhcmdldCwgbWV0aG9k
LCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMykpOworfTsKKwordmFyIHNjaGVkdWxlZE5leHQ7Citm
dW5jdGlvbiBpbnZva2VOZXh0VGltZXJzKCkgeworICBzY2hlZHVsZWROZXh0ID0gbnVsbDsKKyAg
Zm9yKHZhciBrZXkgaW4gdGltZXJzKSB7CisgICAgaWYgKCF0aW1lcnMuaGFzT3duUHJvcGVydHko
a2V5KSkgeyBjb250aW51ZTsgfQorICAgIHZhciB0aW1lciA9IHRpbWVyc1trZXldOworICAgIGlm
ICh0aW1lci5uZXh0KSB7CisgICAgICBkZWxldGUgdGltZXJzW2tleV07CisgICAgICBpbnZva2Uo
dGltZXIudGFyZ2V0LCB0aW1lci5tZXRob2QsIHRpbWVyLmFyZ3MsIDIpOworICAgIH0KKyAgfQor
fQorCisvKioKKyAgU2NoZWR1bGVzIGFuIGl0ZW0gdG8gcnVuIGFmdGVyIGNvbnRyb2wgaGFzIGJl
ZW4gcmV0dXJuZWQgdG8gdGhlIHN5c3RlbS4KKyAgVGhpcyBpcyBvZnRlbiBlcXVpdmFsZW50IHRv
IGNhbGxpbmcgYHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7fSwgMSlgLgorCisgIGBgYGphdmFzY3Jp
cHQKKyAgRW1iZXIucnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlvbigpeworICAgIC8vIGNvZGUg
dG8gYmUgZXhlY3V0ZWQgaW4gdGhlIG5leHQgUnVuTG9vcCwgd2hpY2ggd2lsbCBiZSBzY2hlZHVs
ZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lCisgIH0pOworICBgYGAKKworICBAbWV0aG9kIG5leHQK
KyAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCisg
IEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisg
ICAgSWYgeW91IHBhc3MgYSBzdHJpbmcgaXQgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUKKyAgICB0
YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICBAcGFyYW0ge09iamVj
dH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KKyAg
QHJldHVybiB7T2JqZWN0fSB0aW1lcgorKi8KK0VtYmVyLnJ1bi5uZXh0ID0gZnVuY3Rpb24odGFy
Z2V0LCBtZXRob2QpIHsKKyAgdmFyIGd1aWQsCisgICAgICB0aW1lciA9IHsKKyAgICAgICAgdGFy
Z2V0OiB0YXJnZXQsCisgICAgICAgIG1ldGhvZDogbWV0aG9kLAorICAgICAgICBhcmdzOiBzbGlj
ZS5jYWxsKGFyZ3VtZW50cyksCisgICAgICAgIG5leHQ6IHRydWUKKyAgICAgIH07CisKKyAgZ3Vp
ZCA9IEVtYmVyLmd1aWRGb3IodGltZXIpOworICB0aW1lcnNbZ3VpZF0gPSB0aW1lcjsKKworICBp
ZiAoIXNjaGVkdWxlZE5leHQpIHsgc2NoZWR1bGVkTmV4dCA9IHNldFRpbWVvdXQoaW52b2tlTmV4
dFRpbWVycywgMSk7IH0KKyAgcmV0dXJuIGd1aWQ7Cit9OworCisvKioKKyAgQ2FuY2VscyBhIHNj
aGVkdWxlZCBpdGVtLiBNdXN0IGJlIGEgdmFsdWUgcmV0dXJuZWQgYnkgYEVtYmVyLnJ1bi5sYXRl
cigpYCwKKyAgYEVtYmVyLnJ1bi5vbmNlKClgLCBvciBgRW1iZXIucnVuLm5leHQoKWAuCisKKyAg
YGBgamF2YXNjcmlwdAorICB2YXIgcnVuTmV4dCA9IEVtYmVyLnJ1bi5uZXh0KG15Q29udGV4dCwg
ZnVuY3Rpb24oKXsKKyAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAorICB9KTsKKyAgRW1iZXIu
cnVuLmNhbmNlbChydW5OZXh0KTsKKworICB2YXIgcnVuTGF0ZXIgPSBFbWJlci5ydW4ubGF0ZXIo
bXlDb250ZXh0LCBmdW5jdGlvbigpeworICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisgIH0s
IDUwMCk7CisgIEVtYmVyLnJ1bi5jYW5jZWwocnVuTGF0ZXIpOworCisgIHZhciBydW5PbmNlID0g
RW1iZXIucnVuLm9uY2UobXlDb250ZXh0LCBmdW5jdGlvbigpeworICAgIC8vIHdpbGwgbm90IGJl
IGV4ZWN1dGVkCisgIH0pOworICBFbWJlci5ydW4uY2FuY2VsKHJ1bk9uY2UpOworICBgYGAKKwor
ICBAbWV0aG9kIGNhbmNlbAorICBAcGFyYW0ge09iamVjdH0gdGltZXIgVGltZXIgb2JqZWN0IHRv
IGNhbmNlbAorICBAcmV0dXJuIHt2b2lkfQorKi8KK0VtYmVyLnJ1bi5jYW5jZWwgPSBmdW5jdGlv
bih0aW1lcikgeworICBkZWxldGUgdGltZXJzW3RpbWVyXTsKK307CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvLyBFbWJlci5Mb2dnZXIKKy8vIGdldCwgc2V0LCB0cnlTZXQKKy8vIGd1
aWRGb3IsIGlzQXJyYXksIG1ldGEKKy8vIGFkZE9ic2VydmVyLCByZW1vdmVPYnNlcnZlcgorLy8g
RW1iZXIucnVuLnNjaGVkdWxlCisvKioKK0Btb2R1bGUgZW1iZXItbWV0YWwKKyovCisKKy8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K
Ky8vIENPTlNUQU5UUworLy8KKworLyoqCisgIERlYnVnIHBhcmFtZXRlciB5b3UgY2FuIHR1cm4g
b24uIFRoaXMgd2lsbCBsb2cgYWxsIGJpbmRpbmdzIHRoYXQgZmlyZSB0bworICB0aGUgY29uc29s
ZS4gVGhpcyBzaG91bGQgYmUgZGlzYWJsZWQgaW4gcHJvZHVjdGlvbiBjb2RlLiBOb3RlIHRoYXQg
eW91CisgIGNhbiBhbHNvIGVuYWJsZSB0aGlzIGZyb20gdGhlIGNvbnNvbGUgb3IgdGVtcG9yYXJp
bHkuCisKKyAgQHByb3BlcnR5IExPR19CSU5ESU5HUworICBAZm9yIEVtYmVyCisgIEB0eXBlIEJv
b2xlYW4KKyAgQGRlZmF1bHQgZmFsc2UKKyovCitFbWJlci5MT0dfQklORElOR1MgPSBmYWxzZSB8
fCAhIUVtYmVyLkVOVi5MT0dfQklORElOR1M7CisKK3ZhciBnZXQgICAgID0gRW1iZXIuZ2V0LAor
ICAgIHNldCAgICAgPSBFbWJlci5zZXQsCisgICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCisg
ICAgaXNHbG9iYWxQYXRoID0gRW1iZXIuaXNHbG9iYWxQYXRoOworCisKK2Z1bmN0aW9uIGdldFdp
dGhHbG9iYWxzKG9iaiwgcGF0aCkgeworICByZXR1cm4gZ2V0KGlzR2xvYmFsUGF0aChwYXRoKSA/
IEVtYmVyLmxvb2t1cCA6IG9iaiwgcGF0aCk7Cit9CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIEJJTkRJTkcKKy8vCisK
K3ZhciBCaW5kaW5nID0gZnVuY3Rpb24odG9QYXRoLCBmcm9tUGF0aCkgeworICB0aGlzLl9kaXJl
Y3Rpb24gPSAnZndkJzsKKyAgdGhpcy5fZnJvbSA9IGZyb21QYXRoOworICB0aGlzLl90byAgID0g
dG9QYXRoOworICB0aGlzLl9kaXJlY3Rpb25NYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7Cit9Owor
CisvKioKK0BjbGFzcyBCaW5kaW5nCitAbmFtZXNwYWNlIEVtYmVyCisqLworCitCaW5kaW5nLnBy
b3RvdHlwZSA9IHsKKyAgLyoqCisgICAgVGhpcyBjb3BpZXMgdGhlIEJpbmRpbmcgc28gaXQgY2Fu
IGJlIGNvbm5lY3RlZCB0byBhbm90aGVyIG9iamVjdC4KKworICAgIEBtZXRob2QgY29weQorICAg
IEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9CisgICovCisgIGNvcHk6IGZ1bmN0aW9uICgpIHsKKyAg
ICB2YXIgY29weSA9IG5ldyBCaW5kaW5nKHRoaXMuX3RvLCB0aGlzLl9mcm9tKTsKKyAgICBpZiAo
dGhpcy5fb25lV2F5KSB7IGNvcHkuX29uZVdheSA9IHRydWU7IH0KKyAgICByZXR1cm4gY29weTsK
KyAgfSwKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uCisgIC8vIENPTkZJRworICAvLworCisgIC8qKgorICAgIFRoaXMgd2ls
bCBzZXQgYGZyb21gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSXQgd2ls
bCBub3QKKyAgICBhdHRlbXB0IHRvIHJlc29sdmUgdGhpcyBwcm9wZXJ0eSBwYXRoIHRvIGFuIGFj
dHVhbCBvYmplY3QgdW50aWwgeW91CisgICAgY29ubmVjdCB0aGUgYmluZGluZy4KKworICAgIFRo
ZSBiaW5kaW5nIHdpbGwgc2VhcmNoIGZvciB0aGUgcHJvcGVydHkgcGF0aCBzdGFydGluZyBhdCB0
aGUgcm9vdCBvYmplY3QKKyAgICB5b3UgcGFzcyB3aGVuIHlvdSBgY29ubmVjdCgpYCB0aGUgYmlu
ZGluZy4gSXQgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcworICAgIGBnZXQoKWAgLSBzZWUgdGhh
dCBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICBAbWV0aG9kIGZyb20KKyAgICBA
cGFyYW0ge1N0cmluZ30gcHJvcGVydHlQYXRoIHRoZSBwcm9wZXJ0eSBwYXRoIHRvIGNvbm5lY3Qg
dG8KKyAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKKyAgKi8KKyAgZnJvbTogZnVu
Y3Rpb24ocGF0aCkgeworICAgIHRoaXMuX2Zyb20gPSBwYXRoOworICAgIHJldHVybiB0aGlzOwor
ICB9LAorCisgIC8qKgorICAgIFRoaXMgd2lsbCBzZXQgdGhlIGB0b2AgcHJvcGVydHkgcGF0aCB0
byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJdCB3aWxsIG5vdAorICAgIGF0dGVtcHQgdG8gcmVzb2x2
ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4gYWN0dWFsIG9iamVjdCB1bnRpbCB5b3UKKyAgICBj
b25uZWN0IHRoZSBiaW5kaW5nLgorCisgICAgVGhlIGJpbmRpbmcgd2lsbCBzZWFyY2ggZm9yIHRo
ZSBwcm9wZXJ0eSBwYXRoIHN0YXJ0aW5nIGF0IHRoZSByb290IG9iamVjdAorICAgIHlvdSBwYXNz
IHdoZW4geW91IGBjb25uZWN0KClgIHRoZSBiaW5kaW5nLiBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1
bGVzIGFzCisgICAgYGdldCgpYCAtIHNlZSB0aGF0IG1ldGhvZCBmb3IgbW9yZSBpbmZvcm1hdGlv
bi4KKworICAgIEBtZXRob2QgdG8KKyAgICBAcGFyYW0ge1N0cmluZ3xUdXBsZX0gcHJvcGVydHlQ
YXRoIEEgcHJvcGVydHkgcGF0aCBvciB0dXBsZQorICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9
IGB0aGlzYAorICAqLworICB0bzogZnVuY3Rpb24ocGF0aCkgeworICAgIHRoaXMuX3RvID0gcGF0
aDsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBDb25maWd1cmVzIHRoZSBi
aW5kaW5nIGFzIG9uZSB3YXkuIEEgb25lLXdheSBiaW5kaW5nIHdpbGwgcmVsYXkgY2hhbmdlcwor
ICAgIG9uIHRoZSBgZnJvbWAgc2lkZSB0byB0aGUgYHRvYCBzaWRlLCBidXQgbm90IHRoZSBvdGhl
ciB3YXkgYXJvdW5kLiBUaGlzCisgICAgbWVhbnMgdGhhdCBpZiB5b3UgY2hhbmdlIHRoZSBgdG9g
IHNpZGUgZGlyZWN0bHksIHRoZSBgZnJvbWAgc2lkZSBtYXkgaGF2ZQorICAgIGEgZGlmZmVyZW50
IHZhbHVlLgorCisgICAgQG1ldGhvZCBvbmVXYXkKKyAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5n
fSBgdGhpc2AKKyAgKi8KKyAgb25lV2F5OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9vbmVXYXkg
PSB0cnVlOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIHRvU3RyaW5nOiBmdW5jdGlvbigp
IHsKKyAgICB2YXIgb25lV2F5ID0gdGhpcy5fb25lV2F5ID8gJ1tvbmVXYXldJyA6ICcnOworICAg
IHJldHVybiAiRW1iZXIuQmluZGluZzwiICsgZ3VpZEZvcih0aGlzKSArICI+KCIgKyB0aGlzLl9m
cm9tICsgIiAtPiAiICsgdGhpcy5fdG8gKyAiKSIgKyBvbmVXYXk7CisgIH0sCisKKyAgLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
ICAvLyBDT05ORUNUIEFORCBTWU5DCisgIC8vCisKKyAgLyoqCisgICAgQXR0ZW1wdHMgdG8gY29u
bmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBhbmQgcmVs
YXkKKyAgICBjaGFuZ2VzLiBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB5
b3UgaGF2ZSBub3Qgc2V0IHRoZQorICAgIGZyb20vdG8gcHJvcGVydGllcyB5ZXQuCisKKyAgICBA
bWV0aG9kIGNvbm5lY3QKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCBm
b3IgdGhpcyBiaW5kaW5nLgorICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAorICAq
LworICBjb25uZWN0OiBmdW5jdGlvbihvYmopIHsKKyAgICBFbWJlci5hc3NlcnQoJ011c3QgcGFz
cyBhIHZhbGlkIG9iamVjdCB0byBFbWJlci5CaW5kaW5nLmNvbm5lY3QoKScsICEhb2JqKTsKKwor
ICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb20sIHRvUGF0aCA9IHRoaXMuX3RvOworICAgIEVt
YmVyLnRyeVNldChvYmosIHRvUGF0aCwgZ2V0V2l0aEdsb2JhbHMob2JqLCBmcm9tUGF0aCkpOwor
CisgICAgLy8gYWRkIGFuIG9ic2VydmVyIG9uIHRoZSBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hl
biB0aGUgYmluZGluZyBzaG91bGQgYmUgdXBkYXRlZAorICAgIEVtYmVyLmFkZE9ic2VydmVyKG9i
aiwgZnJvbVBhdGgsIHRoaXMsIHRoaXMuZnJvbURpZENoYW5nZSk7CisKKyAgICAvLyBpZiB0aGUg
YmluZGluZyBpcyBhIHR3by13YXkgYmluZGluZywgYWxzbyBzZXQgdXAgYW4gb2JzZXJ2ZXIgb24g
dGhlIHRhcmdldAorICAgIGlmICghdGhpcy5fb25lV2F5KSB7IEVtYmVyLmFkZE9ic2VydmVyKG9i
aiwgdG9QYXRoLCB0aGlzLCB0aGlzLnRvRGlkQ2hhbmdlKTsgfQorCisgICAgdGhpcy5fcmVhZHlU
b1N5bmMgPSB0cnVlOworCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgRGlz
Y29ubmVjdHMgdGhlIGJpbmRpbmcgaW5zdGFuY2UuIENoYW5nZXMgd2lsbCBubyBsb25nZXIgYmUg
cmVsYXllZC4gWW91CisgICAgd2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRo
b2QuCisKKyAgICBAbWV0aG9kIGRpc2Nvbm5lY3QKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRo
ZSByb290IG9iamVjdCB5b3UgcGFzc2VkIHdoZW4gY29ubmVjdGluZyB0aGUgYmluZGluZy4KKyAg
ICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKKyAgKi8KKyAgZGlzY29ubmVjdDogZnVu
Y3Rpb24ob2JqKSB7CisgICAgRW1iZXIuYXNzZXJ0KCdNdXN0IHBhc3MgYSB2YWxpZCBvYmplY3Qg
dG8gRW1iZXIuQmluZGluZy5kaXNjb25uZWN0KCknLCAhIW9iaik7CisKKyAgICB2YXIgdHdvV2F5
ID0gIXRoaXMuX29uZVdheTsKKworICAgIC8vIHJlbW92ZSBhbiBvYnNlcnZlciBvbiB0aGUgb2Jq
ZWN0IHNvIHdlJ3JlIG5vIGxvbmdlciBub3RpZmllZCBvZgorICAgIC8vIGNoYW5nZXMgdGhhdCBz
aG91bGQgdXBkYXRlIGJpbmRpbmdzLgorICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKG9iaiwgdGhp
cy5fZnJvbSwgdGhpcywgdGhpcy5mcm9tRGlkQ2hhbmdlKTsKKworICAgIC8vIGlmIHRoZSBiaW5k
aW5nIGlzIHR3by13YXksIHJlbW92ZSB0aGUgb2JzZXJ2ZXIgZnJvbSB0aGUgdGFyZ2V0IGFzIHdl
bGwKKyAgICBpZiAodHdvV2F5KSB7IEVtYmVyLnJlbW92ZU9ic2VydmVyKG9iaiwgdGhpcy5fdG8s
IHRoaXMsIHRoaXMudG9EaWRDaGFuZ2UpOyB9CisKKyAgICB0aGlzLl9yZWFkeVRvU3luYyA9IGZh
bHNlOyAvLyBkaXNhYmxlIHNjaGVkdWxlZCBzeW5jcy4uLgorICAgIHJldHVybiB0aGlzOworICB9
LAorCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgLy8gUFJJVkFURQorICAvLworCisgIC8qIGNhbGxlZCB3aGVuIHRoZSBm
cm9tIHNpZGUgY2hhbmdlcyAqLworICBmcm9tRGlkQ2hhbmdlOiBmdW5jdGlvbih0YXJnZXQpIHsK
KyAgICB0aGlzLl9zY2hlZHVsZVN5bmModGFyZ2V0LCAnZndkJyk7CisgIH0sCisKKyAgLyogY2Fs
bGVkIHdoZW4gdGhlIHRvIHNpZGUgY2hhbmdlcyAqLworICB0b0RpZENoYW5nZTogZnVuY3Rpb24o
dGFyZ2V0KSB7CisgICAgdGhpcy5fc2NoZWR1bGVTeW5jKHRhcmdldCwgJ2JhY2snKTsKKyAgfSwK
KworICBfc2NoZWR1bGVTeW5jOiBmdW5jdGlvbihvYmosIGRpcikgeworICAgIHZhciBkaXJlY3Rp
b25NYXAgPSB0aGlzLl9kaXJlY3Rpb25NYXA7CisgICAgdmFyIGV4aXN0aW5nRGlyID0gZGlyZWN0
aW9uTWFwLmdldChvYmopOworCisgICAgLy8gaWYgd2UgaGF2ZW4ndCBzY2hlZHVsZWQgdGhlIGJp
bmRpbmcgeWV0LCBzY2hlZHVsZSBpdAorICAgIGlmICghZXhpc3RpbmdEaXIpIHsKKyAgICAgIEVt
YmVyLnJ1bi5zY2hlZHVsZSgnc3luYycsIHRoaXMsIHRoaXMuX3N5bmMsIG9iaik7CisgICAgICBk
aXJlY3Rpb25NYXAuc2V0KG9iaiwgZGlyKTsKKyAgICB9CisKKyAgICAvLyBJZiBib3RoIGEgJ2Jh
Y2snIGFuZCAnZndkJyBzeW5jIGhhdmUgYmVlbiBzY2hlZHVsZWQgb24gdGhlIHNhbWUgb2JqZWN0
LAorICAgIC8vIGRlZmF1bHQgdG8gYSAnZndkJyBzeW5jIHNvIHRoYXQgaXQgcmVtYWlucyBkZXRl
cm1pbmlzdGljLgorICAgIGlmIChleGlzdGluZ0RpciA9PT0gJ2JhY2snICYmIGRpciA9PT0gJ2Z3
ZCcpIHsKKyAgICAgIGRpcmVjdGlvbk1hcC5zZXQob2JqLCAnZndkJyk7CisgICAgfQorICB9LAor
CisgIF9zeW5jOiBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgbG9nID0gRW1iZXIuTE9HX0JJTkRJ
TkdTOworCisgICAgLy8gZG9uJ3Qgc3luY2hyb25pemUgZGVzdHJveWVkIG9iamVjdHMgb3IgZGlz
Y29ubmVjdGVkIGJpbmRpbmdzCisgICAgaWYgKG9iai5pc0Rlc3Ryb3llZCB8fCAhdGhpcy5fcmVh
ZHlUb1N5bmMpIHsgcmV0dXJuOyB9CisKKyAgICAvLyBnZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUg
YmluZGluZyBmb3IgdGhlIG9iamVjdCB3ZSBhcmUKKyAgICAvLyBzeW5jaHJvbml6aW5nIGZyb20K
KyAgICB2YXIgZGlyZWN0aW9uTWFwID0gdGhpcy5fZGlyZWN0aW9uTWFwOworICAgIHZhciBkaXJl
Y3Rpb24gPSBkaXJlY3Rpb25NYXAuZ2V0KG9iaik7CisKKyAgICB2YXIgZnJvbVBhdGggPSB0aGlz
Ll9mcm9tLCB0b1BhdGggPSB0aGlzLl90bzsKKworICAgIGRpcmVjdGlvbk1hcC5yZW1vdmUob2Jq
KTsKKworICAgIC8vIGlmIHdlJ3JlIHN5bmNocm9uaXppbmcgZnJvbSB0aGUgcmVtb3RlIG9iamVj
dC4uLgorICAgIGlmIChkaXJlY3Rpb24gPT09ICdmd2QnKSB7CisgICAgICB2YXIgZnJvbVZhbHVl
ID0gZ2V0V2l0aEdsb2JhbHMob2JqLCB0aGlzLl9mcm9tKTsKKyAgICAgIGlmIChsb2cpIHsKKyAg
ICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwgJy0+JywgZnJvbVZh
bHVlLCBvYmopOworICAgICAgfQorICAgICAgaWYgKHRoaXMuX29uZVdheSkgeworICAgICAgICBF
bWJlci50cnlTZXQob2JqLCB0b1BhdGgsIGZyb21WYWx1ZSk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlzLCB0aGlzLnRvRGlk
Q2hhbmdlLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgRW1iZXIudHJ5U2V0KG9iaiwgdG9QYXRo
LCBmcm9tVmFsdWUpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAvLyBpZiB3ZSdyZSBzeW5j
aHJvbml6aW5nICp0byogdGhlIHJlbW90ZSBvYmplY3QKKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlv
biA9PT0gJ2JhY2snKSB7CisgICAgICB2YXIgdG9WYWx1ZSA9IGdldChvYmosIHRoaXMuX3RvKTsK
KyAgICAgIGlmIChsb2cpIHsKKyAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnICcsIHRoaXMudG9T
dHJpbmcoKSwgJzwtJywgdG9WYWx1ZSwgb2JqKTsKKyAgICAgIH0KKyAgICAgIEVtYmVyLl9zdXNw
ZW5kT2JzZXJ2ZXIob2JqLCBmcm9tUGF0aCwgdGhpcywgdGhpcy5mcm9tRGlkQ2hhbmdlLCBmdW5j
dGlvbiAoKSB7CisgICAgICAgIEVtYmVyLnRyeVNldChFbWJlci5pc0dsb2JhbFBhdGgoZnJvbVBh
dGgpID8gRW1iZXIubG9va3VwIDogb2JqLCBmcm9tUGF0aCwgdG9WYWx1ZSk7CisgICAgICB9KTsK
KyAgICB9CisgIH0KKworfTsKKworZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKHRvLCBmcm9tKSB7
CisgIGZvciAodmFyIGtleSBpbiBmcm9tKSB7CisgICAgaWYgKGZyb20uaGFzT3duUHJvcGVydHko
a2V5KSkgeworICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTsKKyAgICB9CisgIH0KK30KKworbWl4
aW5Qcm9wZXJ0aWVzKEJpbmRpbmcsIHsKKworICAvKioKKyAgICBTZWUge3sjY3Jvc3NMaW5rICJF
bWJlci5CaW5kaW5nL2Zyb20ifX17ey9jcm9zc0xpbmt9fQorCisgICAgQG1ldGhvZCBmcm9tCisg
ICAgQHN0YXRpYworICAqLworICBmcm9tOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgQyA9IHRoaXMs
IGJpbmRpbmcgPSBuZXcgQygpOworICAgIHJldHVybiBiaW5kaW5nLmZyb20uYXBwbHkoYmluZGlu
ZywgYXJndW1lbnRzKTsKKyAgfSwKKworICAvKioKKyAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJl
ci5CaW5kaW5nL3RvIn19e3svY3Jvc3NMaW5rfX0KKworICAgIEBtZXRob2QgdG8KKyAgICBAc3Rh
dGljCisgICovCisgIHRvOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgQyA9IHRoaXMsIGJpbmRpbmcg
PSBuZXcgQygpOworICAgIHJldHVybiBiaW5kaW5nLnRvLmFwcGx5KGJpbmRpbmcsIGFyZ3VtZW50
cyk7CisgIH0sCisKKyAgLyoqCisgICAgQ3JlYXRlcyBhIG5ldyBCaW5kaW5nIGluc3RhbmNlIGFu
ZCBtYWtlcyBpdCBhcHBseSBpbiBhIHNpbmdsZSBkaXJlY3Rpb24uCisgICAgQSBvbmUtd2F5IGJp
bmRpbmcgd2lsbCByZWxheSBjaGFuZ2VzIG9uIHRoZSBgZnJvbWAgc2lkZSBvYmplY3QgKHN1cHBs
aWVkCisgICAgYXMgdGhlIGBmcm9tYCBhcmd1bWVudCkgdGhlIGB0b2Agc2lkZSwgYnV0IG5vdCB0
aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAgICBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IGNoYW5nZSB0
aGUgInRvIiBzaWRlIGRpcmVjdGx5LCB0aGUgImZyb20iIHNpZGUgbWF5IGhhdmUKKyAgICBhIGRp
ZmZlcmVudCB2YWx1ZS4KKworICAgIFNlZSB7eyNjcm9zc0xpbmsgIkJpbmRpbmcvb25lV2F5In19
e3svY3Jvc3NMaW5rfX0KKworICAgIEBtZXRob2Qgb25lV2F5CisgICAgQHBhcmFtIHtTdHJpbmd9
IGZyb20gZnJvbSBwYXRoLgorICAgIEBwYXJhbSB7Qm9vbGVhbn0gW2ZsYWddIChPcHRpb25hbCkg
cGFzc2luZyBub3RoaW5nIGhlcmUgd2lsbCBtYWtlIHRoZQorICAgICAgYmluZGluZyBgb25lV2F5
YC4gWW91IGNhbiBpbnN0ZWFkIHBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGBvbmVXYXlgLCBtYWtp
bmcgdGhlCisgICAgICBiaW5kaW5nIHR3byB3YXkgYWdhaW4uCisgICovCisgIG9uZVdheTogZnVu
Y3Rpb24oZnJvbSwgZmxhZykgeworICAgIHZhciBDID0gdGhpcywgYmluZGluZyA9IG5ldyBDKG51
bGwsIGZyb20pOworICAgIHJldHVybiBiaW5kaW5nLm9uZVdheShmbGFnKTsKKyAgfQorCit9KTsK
KworLyoqCisgIEFuIGBFbWJlci5CaW5kaW5nYCBjb25uZWN0cyB0aGUgcHJvcGVydGllcyBvZiB0
d28gb2JqZWN0cyBzbyB0aGF0IHdoZW5ldmVyCisgIHRoZSB2YWx1ZSBvZiBvbmUgcHJvcGVydHkg
Y2hhbmdlcywgdGhlIG90aGVyIHByb3BlcnR5IHdpbGwgYmUgY2hhbmdlZCBhbHNvLgorCisgICMj
IEF1dG9tYXRpYyBDcmVhdGlvbiBvZiBCaW5kaW5ncyB3aXRoIGAvXipCaW5kaW5nL2AtbmFtZWQg
UHJvcGVydGllcworCisgIFlvdSBkbyBub3QgdXN1YWxseSBjcmVhdGUgQmluZGluZyBvYmplY3Rz
IGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIGRlc2NyaWJlCisgIGJpbmRpbmdzIGluIHlvdXIgY2xhc3Mg
b3Igb2JqZWN0IGRlZmluaXRpb24gdXNpbmcgYXV0b21hdGljIGJpbmRpbmcKKyAgZGV0ZWN0aW9u
LgorCisgIFByb3BlcnRpZXMgZW5kaW5nIGluIGEgYEJpbmRpbmdgIHN1ZmZpeCB3aWxsIGJlIGNv
bnZlcnRlZCB0byBgRW1iZXIuQmluZGluZ2AKKyAgaW5zdGFuY2VzLiBUaGUgdmFsdWUgb2YgdGhp
cyBwcm9wZXJ0eSBzaG91bGQgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgcGF0aAorICB0byBh
bm90aGVyIG9iamVjdCBvciBhIGN1c3RvbSBiaW5kaW5nIGluc3RhbmNlZCBjcmVhdGVkIHVzaW5n
IEJpbmRpbmcgaGVscGVycworICAoc2VlICJDdXN0b21pemluZyBZb3VyIEJpbmRpbmdzIik6CisK
KyAgYGBgCisgIHZhbHVlQmluZGluZzogIk15QXBwLnNvbWVDb250cm9sbGVyLnRpdGxlIgorICBg
YGAKKworICBUaGlzIHdpbGwgY3JlYXRlIGEgYmluZGluZyBmcm9tIGBNeUFwcC5zb21lQ29udHJv
bGxlci50aXRsZWAgdG8gdGhlIGB2YWx1ZWAKKyAgcHJvcGVydHkgb2YgeW91ciBvYmplY3QgaW5z
dGFuY2UgYXV0b21hdGljYWxseS4gTm93IHRoZSB0d28gdmFsdWVzIHdpbGwgYmUKKyAga2VwdCBp
biBzeW5jLgorCisgICMjIE9uZSBXYXkgQmluZGluZ3MKKworICBPbmUgZXNwZWNpYWxseSB1c2Vm
dWwgYmluZGluZyBjdXN0b21pemF0aW9uIHlvdSBjYW4gdXNlIGlzIHRoZSBgb25lV2F5KClgCisg
IGhlbHBlci4gVGhpcyBoZWxwZXIgdGVsbHMgRW1iZXIgdGhhdCB5b3UgYXJlIG9ubHkgaW50ZXJl
c3RlZCBpbgorICByZWNlaXZpbmcgY2hhbmdlcyBvbiB0aGUgb2JqZWN0IHlvdSBhcmUgYmluZGlu
ZyBmcm9tLiBGb3IgZXhhbXBsZSwgaWYgeW91CisgIGFyZSBiaW5kaW5nIHRvIGEgcHJlZmVyZW5j
ZSBhbmQgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgaWYgdGhlIHByZWZlcmVuY2UKKyAgaGFzIGNo
YW5nZWQsIGJ1dCB5b3VyIG9iamVjdCB3aWxsIG5vdCBiZSBjaGFuZ2luZyB0aGUgcHJlZmVyZW5j
ZSBpdHNlbGYsIHlvdQorICBjb3VsZCBkbzoKKworICBgYGAKKyAgYmlnVGl0bGVzQmluZGluZzog
RW1iZXIuQmluZGluZy5vbmVXYXkoIk15QXBwLnByZWZlcmVuY2VzQ29udHJvbGxlci5iaWdUaXRs
ZXMiKQorICBgYGAKKworICBUaGlzIHdheSBpZiB0aGUgdmFsdWUgb2YgYE15QXBwLnByZWZlcmVu
Y2VzQ29udHJvbGxlci5iaWdUaXRsZXNgIGNoYW5nZXMgdGhlCisgIGBiaWdUaXRsZXNgIHByb3Bl
cnR5IG9mIHlvdXIgb2JqZWN0IHdpbGwgY2hhbmdlIGFsc28uIEhvd2V2ZXIsIGlmIHlvdQorICBj
aGFuZ2UgdGhlIHZhbHVlIG9mIHlvdXIgYGJpZ1RpdGxlc2AgcHJvcGVydHksIGl0IHdpbGwgbm90
IHVwZGF0ZSB0aGUKKyAgYHByZWZlcmVuY2VzQ29udHJvbGxlcmAuCisKKyAgT25lIHdheSBiaW5k
aW5ncyBhcmUgYWxtb3N0IHR3aWNlIGFzIGZhc3QgdG8gc2V0dXAgYW5kIHR3aWNlIGFzIGZhc3Qg
dG8KKyAgZXhlY3V0ZSBiZWNhdXNlIHRoZSBiaW5kaW5nIG9ubHkgaGFzIHRvIHdvcnJ5IGFib3V0
IGNoYW5nZXMgdG8gb25lIHNpZGUuCisKKyAgWW91IHNob3VsZCBjb25zaWRlciB1c2luZyBvbmUg
d2F5IGJpbmRpbmdzIGFueXRpbWUgeW91IGhhdmUgYW4gb2JqZWN0IHRoYXQKKyAgbWF5IGJlIGNy
ZWF0ZWQgZnJlcXVlbnRseSBhbmQgeW91IGRvIG5vdCBpbnRlbmQgdG8gY2hhbmdlIGEgcHJvcGVy
dHk7IG9ubHkKKyAgdG8gbW9uaXRvciBpdCBmb3IgY2hhbmdlcy4gKHN1Y2ggYXMgaW4gdGhlIGV4
YW1wbGUgYWJvdmUpLgorCisgICMjIEFkZGluZyBCaW5kaW5ncyBNYW51YWxseQorCisgIEFsbCBv
ZiB0aGUgZXhhbXBsZXMgYWJvdmUgc2hvdyB5b3UgaG93IHRvIGNvbmZpZ3VyZSBhIGN1c3RvbSBi
aW5kaW5nLCBidXQgdGhlCisgIHJlc3VsdCBvZiB0aGVzZSBjdXN0b21pemF0aW9ucyB3aWxsIGJl
IGEgYmluZGluZyB0ZW1wbGF0ZSwgbm90IGEgZnVsbHkgYWN0aXZlCisgIEJpbmRpbmcgaW5zdGFu
Y2UuIFRoZSBiaW5kaW5nIHdpbGwgYWN0dWFsbHkgYmVjb21lIGFjdGl2ZSBvbmx5IHdoZW4geW91
CisgIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgdGhlIGJpbmRpbmcgYmVsb25ncyB0by4gSXQgaXMg
dXNlZnVsIGhvd2V2ZXIsIHRvCisgIHVuZGVyc3RhbmQgd2hhdCBhY3R1YWxseSBoYXBwZW5zIHdo
ZW4gdGhlIGJpbmRpbmcgaXMgYWN0aXZhdGVkLgorCisgIEZvciBhIGJpbmRpbmcgdG8gZnVuY3Rp
b24gaXQgbXVzdCBoYXZlIGF0IGxlYXN0IGEgYGZyb21gIHByb3BlcnR5IGFuZCBhIGB0b2AKKyAg
cHJvcGVydHkuIFRoZSBgZnJvbWAgcHJvcGVydHkgcGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9r
ZXkgdGhhdCB5b3Ugd2FudCB0bworICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2AgcGF0aCBwb2lu
dHMgdG8gdGhlIG9iamVjdC9rZXkgeW91IHdhbnQgdG8gYmluZCB0by4KKworICBXaGVuIHlvdSBk
ZWZpbmUgYSBjdXN0b20gYmluZGluZywgeW91IGFyZSB1c3VhbGx5IGRlc2NyaWJpbmcgdGhlIHBy
b3BlcnR5CisgIHlvdSB3YW50IHRvIGJpbmQgZnJvbSAoc3VjaCBhcyBgTXlBcHAuc29tZUNvbnRy
b2xsZXIudmFsdWVgIGluIHRoZSBleGFtcGxlcworICBhYm92ZSkuIFdoZW4geW91ciBvYmplY3Qg
aXMgY3JlYXRlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiB0aGUgdmFsdWUKKyAgeW91
IHdhbnQgdG8gYmluZCBgdG9gIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHlvdXIgYmluZGluZyBrZXku
IEluIHRoZQorICBleGFtcGxlcyBhYm92ZSwgZHVyaW5nIGluaXQsIEVtYmVyIG9iamVjdHMgd2ls
bCBlZmZlY3RpdmVseSBjYWxsCisgIHNvbWV0aGluZyBsaWtlIHRoaXMgb24geW91ciBiaW5kaW5n
OgorCisgIGBgYGphdmFzY3JpcHQKKyAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcuZnJvbSh0aGlz
LnZhbHVlQmluZGluZykudG8oInZhbHVlIik7CisgIGBgYAorCisgIFRoaXMgY3JlYXRlcyBhIG5l
dyBiaW5kaW5nIGluc3RhbmNlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSB5b3UgcHJvdmlkZSwgYW5k
CisgIHNldHMgdGhlIHRvIHBhdGggdG8gdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2YgdGhlIG5ldyBv
YmplY3QuIE5vdyB0aGF0IHRoZQorICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgd2l0aCBh
IGBmcm9tYCBhbmQgYSBgdG9gLCBpdCBzaW1wbHkgbmVlZHMgdG8gYmUKKyAgY29ubmVjdGVkIHRv
IGJlY29tZSBhY3RpdmUuIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBgY29ubmVjdCgpYCBtZXRo
b2Q6CisKKyAgYGBgamF2YXNjcmlwdAorICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7CisgIGBgYAor
CisgIE5vdGUgdGhhdCB3aGVuIHlvdSBjb25uZWN0IGEgYmluZGluZyB5b3UgcGFzcyB0aGUgb2Jq
ZWN0IHlvdSB3YW50IGl0IHRvIGJlCisgIGNvbm5lY3RlZCB0by4gVGhpcyBvYmplY3Qgd2lsbCBi
ZSB1c2VkIGFzIHRoZSByb290IGZvciBib3RoIHRoZSBmcm9tIGFuZAorICB0byBzaWRlIG9mIHRo
ZSBiaW5kaW5nIHdoZW4gaW5zcGVjdGluZyByZWxhdGl2ZSBwYXRocy4gVGhpcyBhbGxvd3MgdGhl
CisgIGJpbmRpbmcgdG8gYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYnkgc3ViY2xhc3NlZCBv
YmplY3RzIGFzIHdlbGwuCisKKyAgTm93IHRoYXQgdGhlIGJpbmRpbmcgaXMgY29ubmVjdGVkLCBp
dCB3aWxsIG9ic2VydmUgYm90aCB0aGUgZnJvbSBhbmQgdG8gc2lkZQorICBhbmQgcmVsYXkgY2hh
bmdlcy4KKworICBJZiB5b3UgZXZlciBuZWVkZWQgdG8gZG8gc28gKHlvdSBhbG1vc3QgbmV2ZXIg
d2lsbCwgYnV0IGl0IGlzIHVzZWZ1bCB0bworICB1bmRlcnN0YW5kIHRoaXMgYW55d2F5KSwgeW91
IGNvdWxkIG1hbnVhbGx5IGNyZWF0ZSBhbiBhY3RpdmUgYmluZGluZyBieQorICB1c2luZyB0aGUg
YEVtYmVyLmJpbmQoKWAgaGVscGVyIG1ldGhvZC4gKFRoaXMgaXMgdGhlIHNhbWUgbWV0aG9kIHVz
ZWQgYnkKKyAgdG8gc2V0dXAgeW91ciBiaW5kaW5ncyBvbiBvYmplY3RzKToKKworICBgYGBqYXZh
c2NyaXB0CisgIEVtYmVyLmJpbmQoTXlBcHAuYW5vdGhlck9iamVjdCwgInZhbHVlIiwgIk15QXBw
LnNvbWVDb250cm9sbGVyLnZhbHVlIik7CisgIGBgYAorCisgIEJvdGggb2YgdGhlc2UgY29kZSBm
cmFnbWVudHMgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgZG9pbmcgdGhlIG1vc3QgZnJpZW5kbHkK
KyAgZm9ybSBvZiBiaW5kaW5nIGNyZWF0aW9uIGxpa2Ugc286CisKKyAgYGBgamF2YXNjcmlwdAor
ICBNeUFwcC5hbm90aGVyT2JqZWN0ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgdmFsdWVC
aW5kaW5nOiAiTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWUiLAorCisgICAgLy8gT1RIRVIgQ09E
RSBGT1IgVEhJUyBPQkpFQ1QuLi4KKyAgfSk7CisgIGBgYAorCisgIEVtYmVyJ3MgYnVpbHQgaW4g
YmluZGluZyBjcmVhdGlvbiBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBhdXRvbWF0aWNhbGx5Cisg
IGNyZWF0ZSBiaW5kaW5ncyBmb3IgeW91LiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIGhpZ2hl
c3QtbGV2ZWwgQVBJcworICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91IHVuZGVyc3RhbmQgaG93IGl0
IHdvcmtzIHVuZGVybmVhdGguCisKKyAgQGNsYXNzIEJpbmRpbmcKKyAgQG5hbWVzcGFjZSBFbWJl
cgorICBAc2luY2UgRW1iZXIgMC45CisqLworRW1iZXIuQmluZGluZyA9IEJpbmRpbmc7CisKKwor
LyoqCisgIEdsb2JhbCBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiBKdXN0
IHBhc3MgdGhlIHJvb3Qgb2JqZWN0CisgIGFsb25nIHdpdGggYSBgdG9gIGFuZCBgZnJvbWAgcGF0
aCB0byBjcmVhdGUgYW5kIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisKKyAgQG1ldGhvZCBiaW5kCisg
IEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhl
IHRyYW5zZm9ybS4KKyAgQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSBwYXRoIHRvIHRoZSAndG8nIHNp
ZGUgb2YgdGhlIGJpbmRpbmcuCisgICAgTXVzdCBiZSByZWxhdGl2ZSB0byBvYmouCisgIEBwYXJh
bSB7U3RyaW5nfSBmcm9tIFRoZSBwYXRoIHRvIHRoZSAnZnJvbScgc2lkZSBvZiB0aGUgYmluZGlu
Zy4KKyAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iaiBvciBhIGdsb2JhbCBwYXRoLgorICBAcmV0
dXJuIHtFbWJlci5CaW5kaW5nfSBiaW5kaW5nIGluc3RhbmNlCisqLworRW1iZXIuYmluZCA9IGZ1
bmN0aW9uKG9iaiwgdG8sIGZyb20pIHsKKyAgcmV0dXJuIG5ldyBFbWJlci5CaW5kaW5nKHRvLCBm
cm9tKS5jb25uZWN0KG9iaik7Cit9OworCisvKioKKyAgQG1ldGhvZCBvbmVXYXkKKyAgQGZvciBF
bWJlcgorICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCBvZiB0aGUgdHJhbnNm
b3JtLgorICBAcGFyYW0ge1N0cmluZ30gdG8gVGhlIHBhdGggdG8gdGhlICd0bycgc2lkZSBvZiB0
aGUgYmluZGluZy4KKyAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iai4KKyAgQHBhcmFtIHtTdHJp
bmd9IGZyb20gVGhlIHBhdGggdG8gdGhlICdmcm9tJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgorICAg
IE11c3QgYmUgcmVsYXRpdmUgdG8gb2JqIG9yIGEgZ2xvYmFsIHBhdGguCisgIEByZXR1cm4ge0Vt
YmVyLkJpbmRpbmd9IGJpbmRpbmcgaW5zdGFuY2UKKyovCitFbWJlci5vbmVXYXkgPSBmdW5jdGlv
bihvYmosIHRvLCBmcm9tKSB7CisgIHJldHVybiBuZXcgRW1iZXIuQmluZGluZyh0bywgZnJvbSku
b25lV2F5KCkuY29ubmVjdChvYmopOworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsK
Ky8qKgorQG1vZHVsZSBlbWJlci1tZXRhbAorKi8KKwordmFyIE1peGluLCBSRVFVSVJFRCwgQWxp
YXMsCisgICAgYV9tYXAgPSBFbWJlci5BcnJheVBvbHlmaWxscy5tYXAsCisgICAgYV9pbmRleE9m
ID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZiwKKyAgICBhX2ZvckVhY2ggPSBFbWJlci5B
cnJheVBvbHlmaWxscy5mb3JFYWNoLAorICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKKyAgICBFTVBU
WV9NRVRBID0ge30sIC8vIGR1bW15IGZvciBub24td3JpdGFibGUgbWV0YQorICAgIG9fY3JlYXRl
ID0gRW1iZXIuY3JlYXRlLAorICAgIGRlZmluZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5lUHJvcGVy
dHksCisgICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7CisKK2Z1bmN0aW9uIG1peGluc01ldGEo
b2JqKSB7CisgIHZhciBtID0gRW1iZXIubWV0YShvYmosIHRydWUpLCByZXQgPSBtLm1peGluczsK
KyAgaWYgKCFyZXQpIHsKKyAgICByZXQgPSBtLm1peGlucyA9IHt9OworICB9IGVsc2UgaWYgKCFt
Lmhhc093blByb3BlcnR5KCdtaXhpbnMnKSkgeworICAgIHJldCA9IG0ubWl4aW5zID0gb19jcmVh
dGUocmV0KTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitmdW5jdGlvbiBpbml0TWl4aW4obWl4
aW4sIGFyZ3MpIHsKKyAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7CisgICAgbWl4aW4u
bWl4aW5zID0gYV9tYXAuY2FsbChhcmdzLCBmdW5jdGlvbih4KSB7CisgICAgICBpZiAoeCBpbnN0
YW5jZW9mIE1peGluKSB7IHJldHVybiB4OyB9CisKKyAgICAgIC8vIE5vdGU6IE1hbnVhbGx5IHNl
dHVwIGEgcHJpbWl0aXZlIG1peGluIGhlcmUuIFRoaXMgaXMgdGhlIG9ubHkKKyAgICAgIC8vIHdh
eSB0byBhY3R1YWxseSBnZXQgYSBwcmltaXRpdmUgbWl4aW4uIFRoaXMgd2F5IG5vcm1hbCBjcmVh
dGlvbgorICAgICAgLy8gb2YgbWl4aW5zIHdpbGwgZ2l2ZSB5b3UgY29tYmluZWQgbWl4aW5zLi4u
CisgICAgICB2YXIgbWl4aW4gPSBuZXcgTWl4aW4oKTsKKyAgICAgIG1peGluLnByb3BlcnRpZXMg
PSB4OworICAgICAgcmV0dXJuIG1peGluOworICAgIH0pOworICB9CisgIHJldHVybiBtaXhpbjsK
K30KKworZnVuY3Rpb24gaXNNZXRob2Qob2JqKSB7CisgIHJldHVybiAnZnVuY3Rpb24nID09PSB0
eXBlb2Ygb2JqICYmCisgICAgICAgICBvYmouaXNNZXRob2QgIT09IGZhbHNlICYmCisgICAgICAg
ICBvYmogIT09IEJvb2xlYW4gJiYgb2JqICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYg
b2JqICE9PSBBcnJheSAmJiBvYmogIT09IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7Cit9CisKK3Zh
ciBDT05USU5VRSA9IHt9OworCitmdW5jdGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0YSwg
bWl4aW4pIHsKKyAgdmFyIGd1aWQ7CisKKyAgaWYgKG1peGluIGluc3RhbmNlb2YgTWl4aW4pIHsK
KyAgICBndWlkID0gZ3VpZEZvcihtaXhpbik7CisgICAgaWYgKG1peGluc01ldGFbZ3VpZF0pIHsg
cmV0dXJuIENPTlRJTlVFOyB9CisgICAgbWl4aW5zTWV0YVtndWlkXSA9IG1peGluOworICAgIHJl
dHVybiBtaXhpbi5wcm9wZXJ0aWVzOworICB9IGVsc2UgeworICAgIHJldHVybiBtaXhpbjsgLy8g
YXBwbHkgYW5vbnltb3VzIG1peGluIHByb3BlcnRpZXMKKyAgfQorfQorCitmdW5jdGlvbiBjb25j
YXRlbmF0ZWRQcm9wZXJ0aWVzKHByb3BzLCB2YWx1ZXMsIGJhc2UpIHsKKyAgdmFyIGNvbmNhdHM7
CisKKyAgLy8gcmVzZXQgYmVmb3JlIGFkZGluZyBlYWNoIG5ldyBtaXhpbiB0byBwaWNrdXAgY29u
Y2F0cyBmcm9tIHByZXZpb3VzCisgIGNvbmNhdHMgPSB2YWx1ZXMuY29uY2F0ZW5hdGVkUHJvcGVy
dGllcyB8fCBiYXNlLmNvbmNhdGVuYXRlZFByb3BlcnRpZXM7CisgIGlmIChwcm9wcy5jb25jYXRl
bmF0ZWRQcm9wZXJ0aWVzKSB7CisgICAgY29uY2F0cyA9IGNvbmNhdHMgPyBjb25jYXRzLmNvbmNh
dChwcm9wcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKSA6IHByb3BzLmNvbmNhdGVuYXRlZFByb3Bl
cnRpZXM7CisgIH0KKworICByZXR1cm4gY29uY2F0czsKK30KKworZnVuY3Rpb24gZ2l2ZURlc2Ny
aXB0b3JTdXBlcihtZXRhLCBrZXksIHByb3BlcnR5LCB2YWx1ZXMsIGRlc2NzKSB7CisgIHZhciBz
dXBlclByb3BlcnR5OworCisgIC8vIENvbXB1dGVkIHByb3BlcnRpZXMgb3ZlcnJpZGUgbWV0aG9k
cywgYW5kIGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0KKyAgaWYgKHZhbHVlc1trZXldID09PSB1
bmRlZmluZWQpIHsKKyAgICAvLyBGaW5kIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIGluIGEgcGFy
ZW50IG1peGluCisgICAgc3VwZXJQcm9wZXJ0eSA9IGRlc2NzW2tleV07CisgIH0KKworICAvLyBJ
ZiB3ZSBkaWRuJ3QgZmluZCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBpbiBhIHBhcmVudCBtaXhp
biwgZmluZAorICAvLyBpdCBvbiB0aGUgb3JpZ2luYWwgb2JqZWN0LgorICBzdXBlclByb3BlcnR5
ID0gc3VwZXJQcm9wZXJ0eSB8fCBtZXRhLmRlc2NzW2tleV07CisKKyAgaWYgKCFzdXBlclByb3Bl
cnR5IHx8ICEoc3VwZXJQcm9wZXJ0eSBpbnN0YW5jZW9mIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkp
KSB7CisgICAgcmV0dXJuIHByb3BlcnR5OworICB9CisKKyAgLy8gU2luY2UgbXVsdGlwbGUgbWl4
aW5zIG1heSBpbmhlcml0IGZyb20gdGhlIHNhbWUgcGFyZW50LCB3ZSBuZWVkCisgIC8vIHRvIGNs
b25lIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzbyB0aGF0IG90aGVyIG1peGlucyBkbyBub3QgcmVj
ZWl2ZQorICAvLyB0aGUgd3JhcHBlZCB2ZXJzaW9uLgorICBwcm9wZXJ0eSA9IG9fY3JlYXRlKHBy
b3BlcnR5KTsKKyAgcHJvcGVydHkuZnVuYyA9IEVtYmVyLndyYXAocHJvcGVydHkuZnVuYywgc3Vw
ZXJQcm9wZXJ0eS5mdW5jKTsKKworICByZXR1cm4gcHJvcGVydHk7Cit9CisKK2Z1bmN0aW9uIGdp
dmVNZXRob2RTdXBlcihvYmosIGtleSwgbWV0aG9kLCB2YWx1ZXMsIGRlc2NzKSB7CisgIHZhciBz
dXBlck1ldGhvZDsKKworICAvLyBNZXRob2RzIG92ZXJ3cml0ZSBjb21wdXRlZCBwcm9wZXJ0aWVz
LCBhbmQgZG8gbm90IGNhbGwgc3VwZXIgdG8gdGhlbS4KKyAgaWYgKGRlc2NzW2tleV0gPT09IHVu
ZGVmaW5lZCkgeworICAgIC8vIEZpbmQgdGhlIG9yaWdpbmFsIG1ldGhvZCBpbiBhIHBhcmVudCBt
aXhpbgorICAgIHN1cGVyTWV0aG9kID0gdmFsdWVzW2tleV07CisgIH0KKworICAvLyBJZiB3ZSBk
aWRuJ3QgZmluZCB0aGUgb3JpZ2luYWwgdmFsdWUgaW4gYSBwYXJlbnQgbWl4aW4sIGZpbmQgaXQg
aW4KKyAgLy8gdGhlIG9yaWdpbmFsIG9iamVjdAorICBzdXBlck1ldGhvZCA9IHN1cGVyTWV0aG9k
IHx8IG9ialtrZXldOworCisgIC8vIE9ubHkgd3JhcCB0aGUgbmV3IG1ldGhvZCBpZiB0aGUgb3Jp
Z2luYWwgbWV0aG9kIHdhcyBhIGZ1bmN0aW9uCisgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2Yg
c3VwZXJNZXRob2QpIHsKKyAgICByZXR1cm4gbWV0aG9kOworICB9CisKKyAgcmV0dXJuIEVtYmVy
LndyYXAobWV0aG9kLCBzdXBlck1ldGhvZCk7Cit9CisKK2Z1bmN0aW9uIGFwcGx5Q29uY2F0ZW5h
dGVkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZhbHVlcykgeworICB2YXIgYmFzZVZhbHVl
ID0gdmFsdWVzW2tleV0gfHwgb2JqW2tleV07CisKKyAgaWYgKGJhc2VWYWx1ZSkgeworICAgIGlm
ICgnZnVuY3Rpb24nID09PSB0eXBlb2YgYmFzZVZhbHVlLmNvbmNhdCkgeworICAgICAgcmV0dXJu
IGJhc2VWYWx1ZS5jb25jYXQodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gRW1i
ZXIubWFrZUFycmF5KGJhc2VWYWx1ZSkuY29uY2F0KHZhbHVlKTsKKyAgICB9CisgIH0gZWxzZSB7
CisgICAgcmV0dXJuIEVtYmVyLm1ha2VBcnJheSh2YWx1ZSk7CisgIH0KK30KKworZnVuY3Rpb24g
YWRkTm9ybWFsaXplZFByb3BlcnR5KGJhc2UsIGtleSwgdmFsdWUsIG1ldGEsIGRlc2NzLCB2YWx1
ZXMsIGNvbmNhdHMpIHsKKyAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikg
eworICAgIGlmICh2YWx1ZSA9PT0gUkVRVUlSRUQgJiYgZGVzY3Nba2V5XSkgeyByZXR1cm4gQ09O
VElOVUU7IH0KKworICAgIC8vIFdyYXAgZGVzY3JpcHRvciBmdW5jdGlvbiB0byBpbXBsZW1lbnQK
KyAgICAvLyBfc3VwZXIoKSBpZiBuZWVkZWQKKyAgICBpZiAodmFsdWUuZnVuYykgeworICAgICAg
dmFsdWUgPSBnaXZlRGVzY3JpcHRvclN1cGVyKG1ldGEsIGtleSwgdmFsdWUsIHZhbHVlcywgZGVz
Y3MpOworICAgIH0KKworICAgIGRlc2NzW2tleV0gID0gdmFsdWU7CisgICAgdmFsdWVzW2tleV0g
PSB1bmRlZmluZWQ7CisgIH0gZWxzZSB7CisgICAgLy8gaW1wbCBzdXBlciBpZiBuZWVkZWQuLi4K
KyAgICBpZiAoaXNNZXRob2QodmFsdWUpKSB7CisgICAgICB2YWx1ZSA9IGdpdmVNZXRob2RTdXBl
cihiYXNlLCBrZXksIHZhbHVlLCB2YWx1ZXMsIGRlc2NzKTsKKyAgICB9IGVsc2UgaWYgKChjb25j
YXRzICYmIGFfaW5kZXhPZi5jYWxsKGNvbmNhdHMsIGtleSkgPj0gMCkgfHwga2V5ID09PSAnY29u
Y2F0ZW5hdGVkUHJvcGVydGllcycpIHsKKyAgICAgIHZhbHVlID0gYXBwbHlDb25jYXRlbmF0ZWRQ
cm9wZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgZGVzY3Nb
a2V5XSA9IHVuZGVmaW5lZDsKKyAgICB2YWx1ZXNba2V5XSA9IHZhbHVlOworICB9Cit9CisKK2Z1
bmN0aW9uIG1lcmdlTWl4aW5zKG1peGlucywgbSwgZGVzY3MsIHZhbHVlcywgYmFzZSkgeworICB2
YXIgbWl4aW4sIHByb3BzLCBrZXksIGNvbmNhdHMsIG1ldGE7CisKKyAgZnVuY3Rpb24gcmVtb3Zl
S2V5cyhrZXlOYW1lKSB7CisgICAgZGVsZXRlIGRlc2NzW2tleU5hbWVdOworICAgIGRlbGV0ZSB2
YWx1ZXNba2V5TmFtZV07CisgIH0KKworICBmb3IodmFyIGk9MCwgbD1taXhpbnMubGVuZ3RoOyBp
PGw7IGkrKykgeworICAgIG1peGluID0gbWl4aW5zW2ldOworICAgIEVtYmVyLmFzc2VydCgnRXhw
ZWN0ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5jZSwgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRv
U3RyaW5nLmNhbGwobWl4aW4pLCB0eXBlb2YgbWl4aW4gPT09ICdvYmplY3QnICYmIG1peGluICE9
PSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtaXhpbikgIT09ICdbb2Jq
ZWN0IEFycmF5XScpOworCisgICAgcHJvcHMgPSBtaXhpblByb3BlcnRpZXMobSwgbWl4aW4pOwor
ICAgIGlmIChwcm9wcyA9PT0gQ09OVElOVUUpIHsgY29udGludWU7IH0KKworICAgIGlmIChwcm9w
cykgeworICAgICAgbWV0YSA9IEVtYmVyLm1ldGEoYmFzZSk7CisgICAgICBjb25jYXRzID0gY29u
Y2F0ZW5hdGVkUHJvcGVydGllcyhwcm9wcywgdmFsdWVzLCBiYXNlKTsKKworICAgICAgZm9yIChr
ZXkgaW4gcHJvcHMpIHsKKyAgICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7
IGNvbnRpbnVlOyB9CisgICAgICAgIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHBy
b3BzW2tleV0sIG1ldGEsIGRlc2NzLCB2YWx1ZXMsIGNvbmNhdHMpOworICAgICAgfQorCisgICAg
ICAvLyBtYW51YWxseSBjb3B5IHRvU3RyaW5nKCkgYmVjYXVzZSBzb21lIEpTIGVuZ2luZXMgZG8g
bm90IGVudW1lcmF0ZSBpdAorICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd0b1N0cmlu
ZycpKSB7IGJhc2UudG9TdHJpbmcgPSBwcm9wcy50b1N0cmluZzsgfQorICAgIH0gZWxzZSBpZiAo
bWl4aW4ubWl4aW5zKSB7CisgICAgICBtZXJnZU1peGlucyhtaXhpbi5taXhpbnMsIG0sIGRlc2Nz
LCB2YWx1ZXMsIGJhc2UpOworICAgICAgaWYgKG1peGluLl93aXRob3V0KSB7IGFfZm9yRWFjaC5j
YWxsKG1peGluLl93aXRob3V0LCByZW1vdmVLZXlzKTsgfQorICAgIH0KKyAgfQorfQorCitmdW5j
dGlvbiB3cml0YWJsZVJlcShvYmopIHsKKyAgdmFyIG0gPSBFbWJlci5tZXRhKG9iaiksIHJlcSA9
IG0ucmVxdWlyZWQ7CisgIGlmICghcmVxIHx8ICFtLmhhc093blByb3BlcnR5KCdyZXF1aXJlZCcp
KSB7CisgICAgcmVxID0gbS5yZXF1aXJlZCA9IHJlcSA/IG9fY3JlYXRlKHJlcSkgOiB7fTsKKyAg
fQorICByZXR1cm4gcmVxOworfQorCit2YXIgSVNfQklORElORyA9IEVtYmVyLklTX0JJTkRJTkcg
PSAvXi4rQmluZGluZyQvOworCitmdW5jdGlvbiBkZXRlY3RCaW5kaW5nKG9iaiwga2V5LCB2YWx1
ZSwgbSkgeworICBpZiAoSVNfQklORElORy50ZXN0KGtleSkpIHsKKyAgICB2YXIgYmluZGluZ3Mg
PSBtLmJpbmRpbmdzOworICAgIGlmICghYmluZGluZ3MpIHsKKyAgICAgIGJpbmRpbmdzID0gbS5i
aW5kaW5ncyA9IHt9OworICAgIH0gZWxzZSBpZiAoIW0uaGFzT3duUHJvcGVydHkoJ2JpbmRpbmdz
JykpIHsKKyAgICAgIGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGluZ3Mp
OworICAgIH0KKyAgICBiaW5kaW5nc1trZXldID0gdmFsdWU7CisgIH0KK30KKworZnVuY3Rpb24g
Y29ubmVjdEJpbmRpbmdzKG9iaiwgbSkgeworICAvLyBUT0RPIE1peGluLmFwcGx5KGluc3RhbmNl
KSBzaG91bGQgZGlzY29ubmVjdCBiaW5kaW5nIGlmIGV4aXN0cworICB2YXIgYmluZGluZ3MgPSBt
LmJpbmRpbmdzLCBrZXksIGJpbmRpbmcsIHRvOworICBpZiAoYmluZGluZ3MpIHsKKyAgICBmb3Ig
KGtleSBpbiBiaW5kaW5ncykgeworICAgICAgYmluZGluZyA9IGJpbmRpbmdzW2tleV07CisgICAg
ICBpZiAoYmluZGluZykgeworICAgICAgICB0byA9IGtleS5zbGljZSgwLCAtNyk7IC8vIHN0cmlw
IEJpbmRpbmcgb2ZmIGVuZAorICAgICAgICBpZiAoYmluZGluZyBpbnN0YW5jZW9mIEVtYmVyLkJp
bmRpbmcpIHsKKyAgICAgICAgICBiaW5kaW5nID0gYmluZGluZy5jb3B5KCk7IC8vIGNvcHkgcHJv
dG90eXBlcycgaW5zdGFuY2UKKyAgICAgICAgICBiaW5kaW5nLnRvKHRvKTsKKyAgICAgICAgfSBl
bHNlIHsgLy8gYmluZGluZyBpcyBzdHJpbmcgcGF0aAorICAgICAgICAgIGJpbmRpbmcgPSBuZXcg
RW1iZXIuQmluZGluZyh0bywgYmluZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgYmluZGluZy5j
b25uZWN0KG9iaik7CisgICAgICAgIG9ialtrZXldID0gYmluZGluZzsKKyAgICAgIH0KKyAgICB9
CisgICAgLy8gbWFyayBhcyBhcHBsaWVkCisgICAgbS5iaW5kaW5ncyA9IHt9OworICB9Cit9CisK
K2Z1bmN0aW9uIGZpbmlzaFBhcnRpYWwob2JqLCBtKSB7CisgIGNvbm5lY3RCaW5kaW5ncyhvYmos
IG0gfHwgRW1iZXIubWV0YShvYmopKTsKKyAgcmV0dXJuIG9iajsKK30KKworZnVuY3Rpb24gZm9s
bG93QWxpYXMob2JqLCBkZXNjLCBtLCBkZXNjcywgdmFsdWVzKSB7CisgIHZhciBhbHRLZXkgPSBk
ZXNjLm1ldGhvZE5hbWUsIHZhbHVlOworICBpZiAoZGVzY3NbYWx0S2V5XSB8fCB2YWx1ZXNbYWx0
S2V5XSkgeworICAgIHZhbHVlID0gdmFsdWVzW2FsdEtleV07CisgICAgZGVzYyAgPSBkZXNjc1th
bHRLZXldOworICB9IGVsc2UgaWYgKG0uZGVzY3NbYWx0S2V5XSkgeworICAgIGRlc2MgID0gbS5k
ZXNjc1thbHRLZXldOworICAgIHZhbHVlID0gdW5kZWZpbmVkOworICB9IGVsc2UgeworICAgIGRl
c2MgPSB1bmRlZmluZWQ7CisgICAgdmFsdWUgPSBvYmpbYWx0S2V5XTsKKyAgfQorCisgIHJldHVy
biB7IGRlc2M6IGRlc2MsIHZhbHVlOiB2YWx1ZSB9OworfQorCitmdW5jdGlvbiB1cGRhdGVPYnNl
cnZlcnMob2JqLCBrZXksIG9ic2VydmVyLCBvYnNlcnZlcktleSwgbWV0aG9kKSB7CisgIGlmICgn
ZnVuY3Rpb24nICE9PSB0eXBlb2Ygb2JzZXJ2ZXIpIHsgcmV0dXJuOyB9CisKKyAgdmFyIHBhdGhz
ID0gb2JzZXJ2ZXJbb2JzZXJ2ZXJLZXldOworCisgIGlmIChwYXRocykgeworICAgIGZvciAodmFy
IGk9MCwgbD1wYXRocy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICBFbWJlclttZXRob2RdKG9i
aiwgcGF0aHNbaV0sIG51bGwsIGtleSk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIHJlcGxh
Y2VPYnNlcnZlcnMob2JqLCBrZXksIG9ic2VydmVyKSB7CisgIHZhciBwcmV2T2JzZXJ2ZXIgPSBv
Ympba2V5XTsKKworICB1cGRhdGVPYnNlcnZlcnMob2JqLCBrZXksIHByZXZPYnNlcnZlciwgJ19f
ZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXycsICdyZW1vdmVCZWZvcmVPYnNlcnZlcicpOworICB1cGRh
dGVPYnNlcnZlcnMob2JqLCBrZXksIHByZXZPYnNlcnZlciwgJ19fZW1iZXJfb2JzZXJ2ZXNfXycs
ICdyZW1vdmVPYnNlcnZlcicpOworCisgIHVwZGF0ZU9ic2VydmVycyhvYmosIGtleSwgb2JzZXJ2
ZXIsICdfX2VtYmVyX29ic2VydmVzQmVmb3JlX18nLCAnYWRkQmVmb3JlT2JzZXJ2ZXInKTsKKyAg
dXBkYXRlT2JzZXJ2ZXJzKG9iaiwga2V5LCBvYnNlcnZlciwgJ19fZW1iZXJfb2JzZXJ2ZXNfXycs
ICdhZGRPYnNlcnZlcicpOworfQorCitmdW5jdGlvbiBhcHBseU1peGluKG9iaiwgbWl4aW5zLCBw
YXJ0aWFsKSB7CisgIHZhciBkZXNjcyA9IHt9LCB2YWx1ZXMgPSB7fSwgbSA9IEVtYmVyLm1ldGEo
b2JqKSwKKyAgICAgIGtleSwgdmFsdWUsIGRlc2M7CisKKyAgLy8gR28gdGhyb3VnaCBhbGwgbWl4
aW5zIGFuZCBoYXNoZXMgcGFzc2VkIGluLCBhbmQ6CisgIC8vCisgIC8vICogSGFuZGxlIGNvbmNh
dGVuYXRlZCBwcm9wZXJ0aWVzCisgIC8vICogU2V0IHVwIF9zdXBlciB3cmFwcGluZyBpZiBuZWNl
c3NhcnkKKyAgLy8gKiBTZXQgdXAgY29tcHV0ZWQgcHJvcGVydHkgZGVzY3JpcHRvcnMKKyAgLy8g
KiBDb3B5aW5nIGB0b1N0cmluZ2AgaW4gYnJva2VuIGJyb3dzZXJzCisgIG1lcmdlTWl4aW5zKG1p
eGlucywgbWl4aW5zTWV0YShvYmopLCBkZXNjcywgdmFsdWVzLCBvYmopOworCisgIGZvcihrZXkg
aW4gdmFsdWVzKSB7CisgICAgaWYgKGtleSA9PT0gJ2NvbnRydWN0b3InIHx8ICF2YWx1ZXMuaGFz
T3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQorCisgICAgZGVzYyA9IGRlc2NzW2tleV07
CisgICAgdmFsdWUgPSB2YWx1ZXNba2V5XTsKKworICAgIGlmIChkZXNjID09PSBSRVFVSVJFRCkg
eyBjb250aW51ZTsgfQorCisgICAgd2hpbGUgKGRlc2MgJiYgZGVzYyBpbnN0YW5jZW9mIEFsaWFz
KSB7CisgICAgICB2YXIgZm9sbG93ZWQgPSBmb2xsb3dBbGlhcyhvYmosIGRlc2MsIG0sIGRlc2Nz
LCB2YWx1ZXMpOworICAgICAgZGVzYyA9IGZvbGxvd2VkLmRlc2M7CisgICAgICB2YWx1ZSA9IGZv
bGxvd2VkLnZhbHVlOworICAgIH0KKworICAgIGlmIChkZXNjID09PSB1bmRlZmluZWQgJiYgdmFs
dWUgPT09IHVuZGVmaW5lZCkgeyBjb250aW51ZTsgfQorCisgICAgcmVwbGFjZU9ic2VydmVycyhv
YmosIGtleSwgdmFsdWUpOworICAgIGRldGVjdEJpbmRpbmcob2JqLCBrZXksIHZhbHVlLCBtKTsK
KyAgICBkZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgZGVzYywgdmFsdWUsIG0pOworICB9CisKKyAg
aWYgKCFwYXJ0aWFsKSB7IC8vIGRvbid0IGFwcGx5IHRvIHByb3RvdHlwZQorICAgIGZpbmlzaFBh
cnRpYWwob2JqLCBtKTsKKyAgfQorCisgIHJldHVybiBvYmo7Cit9CisKKy8qKgorICBAbWV0aG9k
IG1peGluCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIG9iagorICBAcGFyYW0gbWl4aW5zKgorICBA
cmV0dXJuIG9iagorKi8KK0VtYmVyLm1peGluID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciBhcmdz
ID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgIGFwcGx5TWl4aW4ob2JqLCBhcmdzLCBm
YWxzZSk7CisgIHJldHVybiBvYmo7Cit9OworCisvKioKKyAgVGhlIGBFbWJlci5NaXhpbmAgY2xh
c3MgYWxsb3dzIHlvdSB0byBjcmVhdGUgbWl4aW5zLCB3aG9zZSBwcm9wZXJ0aWVzIGNhbiBiZQor
ICBhZGRlZCB0byBvdGhlciBjbGFzc2VzLiBGb3IgaW5zdGFuY2UsCisKKyAgYGBgamF2YXNjcmlw
dAorICBBcHAuRWRpdGFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgIGVkaXQ6IGZ1bmN0
aW9uKCkgeworICAgICAgY29uc29sZS5sb2coJ3N0YXJ0aW5nIHRvIGVkaXQnKTsKKyAgICAgIHRo
aXMuc2V0KCdpc0VkaXRpbmcnLCB0cnVlKTsKKyAgICB9LAorICAgIGlzRWRpdGluZzogZmFsc2UK
KyAgfSk7CisKKyAgLy8gTWl4IG1peGlucyBpbnRvIGNsYXNzZXMgYnkgcGFzc2luZyB0aGVtIGFz
IHRoZSBmaXJzdCBhcmd1bWVudHMgdG8KKyAgLy8gLmV4dGVuZCBvciAuY3JlYXRlLgorICBBcHAu
Q29tbWVudFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZChBcHAuRWRpdGFibGUsIHsKKyAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCd7eyNpZiBpc0VkaXRpbmd9fS4uLnt7ZWxz
ZX19Li4ue3svaWZ9fScpCisgIH0pOworCisgIGNvbW1lbnRWaWV3ID0gQXBwLkNvbW1lbnRWaWV3
LmNyZWF0ZSgpOworICBjb21tZW50Vmlldy5lZGl0KCk7IC8vIG91dHB1dHMgJ3N0YXJ0aW5nIHRv
IGVkaXQnCisgIGBgYAorCisgIE5vdGUgdGhhdCBNaXhpbnMgYXJlIGNyZWF0ZWQgd2l0aCBgRW1i
ZXIuTWl4aW4uY3JlYXRlYCwgbm90CisgIGBFbWJlci5NaXhpbi5leHRlbmRgLgorCisgIEBjbGFz
cyBNaXhpbgorICBAbmFtZXNwYWNlIEVtYmVyCisqLworRW1iZXIuTWl4aW4gPSBmdW5jdGlvbigp
IHsgcmV0dXJuIGluaXRNaXhpbih0aGlzLCBhcmd1bWVudHMpOyB9OworCitNaXhpbiA9IEVtYmVy
Lk1peGluOworCitNaXhpbi5fYXBwbHkgPSBhcHBseU1peGluOworCitNaXhpbi5hcHBseVBhcnRp
YWwgPSBmdW5jdGlvbihvYmopIHsKKyAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRz
LCAxKTsKKyAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBhcmdzLCB0cnVlKTsKK307CisKK01peGlu
LmZpbmlzaFBhcnRpYWwgPSBmaW5pc2hQYXJ0aWFsOworCitFbWJlci5hbnlVbnByb2Nlc3NlZE1p
eGlucyA9IGZhbHNlOworCisvKioKKyAgQG1ldGhvZCBjcmVhdGUKKyAgQHN0YXRpYworICBAcGFy
YW0gYXJndW1lbnRzKgorKi8KK01peGluLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgeworICBFbWJlci5h
bnlVbnByb2Nlc3NlZE1peGlucyA9IHRydWU7CisgIHZhciBNID0gdGhpczsKKyAgcmV0dXJuIGlu
aXRNaXhpbihuZXcgTSgpLCBhcmd1bWVudHMpOworfTsKKwordmFyIE1peGluUHJvdG90eXBlID0g
TWl4aW4ucHJvdG90eXBlOworCisvKioKKyAgQG1ldGhvZCByZW9wZW4KKyAgQHBhcmFtIGFyZ3Vt
ZW50cyoKKyovCitNaXhpblByb3RvdHlwZS5yZW9wZW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIG1p
eGluLCB0bXA7CisKKyAgaWYgKHRoaXMucHJvcGVydGllcykgeworICAgIG1peGluID0gTWl4aW4u
Y3JlYXRlKCk7CisgICAgbWl4aW4ucHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKKyAgICBk
ZWxldGUgdGhpcy5wcm9wZXJ0aWVzOworICAgIHRoaXMubWl4aW5zID0gW21peGluXTsKKyAgfSBl
bHNlIGlmICghdGhpcy5taXhpbnMpIHsKKyAgICB0aGlzLm1peGlucyA9IFtdOworICB9CisKKyAg
dmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1peGlucyA9IHRoaXMubWl4aW5zLCBpZHg7CisK
KyAgZm9yKGlkeD0wOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgbWl4aW4gPSBhcmd1bWVudHNb
aWR4XTsKKyAgICBFbWJlci5hc3NlcnQoJ0V4cGVjdGVkIGhhc2ggb3IgTWl4aW4gaW5zdGFuY2Us
IGdvdCAnICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1peGluKSwgdHlwZW9mIG1p
eGluID09PSAnb2JqZWN0JyAmJiBtaXhpbiAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRv
U3RyaW5nLmNhbGwobWl4aW4pICE9PSAnW29iamVjdCBBcnJheV0nKTsKKworICAgIGlmIChtaXhp
biBpbnN0YW5jZW9mIE1peGluKSB7CisgICAgICBtaXhpbnMucHVzaChtaXhpbik7CisgICAgfSBl
bHNlIHsKKyAgICAgIHRtcCA9IE1peGluLmNyZWF0ZSgpOworICAgICAgdG1wLnByb3BlcnRpZXMg
PSBtaXhpbjsKKyAgICAgIG1peGlucy5wdXNoKHRtcCk7CisgICAgfQorICB9CisKKyAgcmV0dXJu
IHRoaXM7Cit9OworCisvKioKKyAgQG1ldGhvZCBhcHBseQorICBAcGFyYW0gb2JqCisgIEByZXR1
cm4gYXBwbGllZCBvYmplY3QKKyovCitNaXhpblByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uKG9i
aikgeworICByZXR1cm4gYXBwbHlNaXhpbihvYmosIFt0aGlzXSwgZmFsc2UpOworfTsKKworTWl4
aW5Qcm90b3R5cGUuYXBwbHlQYXJ0aWFsID0gZnVuY3Rpb24ob2JqKSB7CisgIHJldHVybiBhcHBs
eU1peGluKG9iaiwgW3RoaXNdLCB0cnVlKTsKK307CisKK2Z1bmN0aW9uIF9kZXRlY3QoY3VyTWl4
aW4sIHRhcmdldE1peGluLCBzZWVuKSB7CisgIHZhciBndWlkID0gZ3VpZEZvcihjdXJNaXhpbik7
CisKKyAgaWYgKHNlZW5bZ3VpZF0pIHsgcmV0dXJuIGZhbHNlOyB9CisgIHNlZW5bZ3VpZF0gPSB0
cnVlOworCisgIGlmIChjdXJNaXhpbiA9PT0gdGFyZ2V0TWl4aW4pIHsgcmV0dXJuIHRydWU7IH0K
KyAgdmFyIG1peGlucyA9IGN1ck1peGluLm1peGlucywgbG9jID0gbWl4aW5zID8gbWl4aW5zLmxl
bmd0aCA6IDA7CisgIHdoaWxlICgtLWxvYyA+PSAwKSB7CisgICAgaWYgKF9kZXRlY3QobWl4aW5z
W2xvY10sIHRhcmdldE1peGluLCBzZWVuKSkgeyByZXR1cm4gdHJ1ZTsgfQorICB9CisgIHJldHVy
biBmYWxzZTsKK30KKworLyoqCisgIEBtZXRob2QgZGV0ZWN0CisgIEBwYXJhbSBvYmoKKyAgQHJl
dHVybiB7Qm9vbGVhbn0KKyovCitNaXhpblByb3RvdHlwZS5kZXRlY3QgPSBmdW5jdGlvbihvYmop
IHsKKyAgaWYgKCFvYmopIHsgcmV0dXJuIGZhbHNlOyB9CisgIGlmIChvYmogaW5zdGFuY2VvZiBN
aXhpbikgeyByZXR1cm4gX2RldGVjdChvYmosIHRoaXMsIHt9KTsgfQorICB2YXIgbWl4aW5zID0g
RW1iZXIubWV0YShvYmosIGZhbHNlKS5taXhpbnM7CisgIGlmIChtaXhpbnMpIHsKKyAgICByZXR1
cm4gISFtaXhpbnNbZ3VpZEZvcih0aGlzKV07CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfTsKKwor
TWl4aW5Qcm90b3R5cGUud2l0aG91dCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcmV0ID0gbmV3IE1p
eGluKHRoaXMpOworICByZXQuX3dpdGhvdXQgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAg
cmV0dXJuIHJldDsKK307CisKK2Z1bmN0aW9uIF9rZXlzKHJldCwgbWl4aW4sIHNlZW4pIHsKKyAg
aWYgKHNlZW5bZ3VpZEZvcihtaXhpbildKSB7IHJldHVybjsgfQorICBzZWVuW2d1aWRGb3IobWl4
aW4pXSA9IHRydWU7CisKKyAgaWYgKG1peGluLnByb3BlcnRpZXMpIHsKKyAgICB2YXIgcHJvcHMg
PSBtaXhpbi5wcm9wZXJ0aWVzOworICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgeworICAgICAg
aWYgKHByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHsgcmV0W2tleV0gPSB0cnVlOyB9CisgICAg
fQorICB9IGVsc2UgaWYgKG1peGluLm1peGlucykgeworICAgIGFfZm9yRWFjaC5jYWxsKG1peGlu
Lm1peGlucywgZnVuY3Rpb24oeCkgeyBfa2V5cyhyZXQsIHgsIHNlZW4pOyB9KTsKKyAgfQorfQor
CitNaXhpblByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7CisgIHZhciBrZXlzID0ge30sIHNl
ZW4gPSB7fSwgcmV0ID0gW107CisgIF9rZXlzKGtleXMsIHRoaXMsIHNlZW4pOworICBmb3IodmFy
IGtleSBpbiBrZXlzKSB7CisgICAgaWYgKGtleXMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyByZXQu
cHVzaChrZXkpOyB9CisgIH0KKyAgcmV0dXJuIHJldDsKK307CisKKy8vIHJldHVybnMgdGhlIG1p
eGlucyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdAorLy8gVE9ETzog
TWFrZSBFbWJlci5taXhpbgorTWl4aW4ubWl4aW5zID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciBt
aXhpbnMgPSBFbWJlci5tZXRhKG9iaiwgZmFsc2UpLm1peGlucywgcmV0ID0gW107CisKKyAgaWYg
KCFtaXhpbnMpIHsgcmV0dXJuIHJldDsgfQorCisgIGZvciAodmFyIGtleSBpbiBtaXhpbnMpIHsK
KyAgICB2YXIgbWl4aW4gPSBtaXhpbnNba2V5XTsKKworICAgIC8vIHNraXAgcHJpbWl0aXZlIG1p
eGlucyBzaW5jZSB0aGVzZSBhcmUgYWx3YXlzIGFub255bW91cworICAgIGlmICghbWl4aW4ucHJv
cGVydGllcykgeyByZXQucHVzaChtaXhpbik7IH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9Owor
CitSRVFVSVJFRCA9IG5ldyBFbWJlci5EZXNjcmlwdG9yKCk7CitSRVFVSVJFRC50b1N0cmluZyA9
IGZ1bmN0aW9uKCkgeyByZXR1cm4gJyhSZXF1aXJlZCBQcm9wZXJ0eSknOyB9OworCisvKioKKyAg
RGVub3RlcyBhIHJlcXVpcmVkIHByb3BlcnR5IGZvciBhIG1peGluCisKKyAgQG1ldGhvZCByZXF1
aXJlZAorICBAZm9yIEVtYmVyCisqLworRW1iZXIucmVxdWlyZWQgPSBmdW5jdGlvbigpIHsKKyAg
cmV0dXJuIFJFUVVJUkVEOworfTsKKworQWxpYXMgPSBmdW5jdGlvbihtZXRob2ROYW1lKSB7Cisg
IHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Cit9OworQWxpYXMucHJvdG90eXBlID0gbmV3
IEVtYmVyLkRlc2NyaXB0b3IoKTsKKworLyoqCisgIE1ha2VzIGEgcHJvcGVydHkgb3IgbWV0aG9k
IGF2YWlsYWJsZSB2aWEgYW4gYWRkaXRpb25hbCBuYW1lLgorCisgIGBgYGphdmFzY3JpcHQKKyAg
QXBwLlBhaW50U2FtcGxlID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgY29sb3I6ICdyZWQn
LAorICAgIGNvbG91cjogRW1iZXIuYWxpYXMoJ2NvbG9yJyksCisgICAgbmFtZTogZnVuY3Rpb24o
KXsKKyAgICAgIHJldHVybiAiWmVkIjsKKyAgICB9LAorICAgIG1vbmlrZXI6IEVtYmVyLmFsaWFz
KCJuYW1lIikKKyAgfSk7CisKKyAgdmFyIHBhaW50U2FtcGxlID0gQXBwLlBhaW50U2FtcGxlLmNy
ZWF0ZSgpCisgIHBhaW50U2FtcGxlLmdldCgnY29sb3VyJyk7ICAvLyAncmVkJworICBwYWludFNh
bXBsZS5tb25pa2VyKCk7ICAgICAgLy8gJ1plZCcKKyAgYGBgCisKKyAgQG1ldGhvZCBhbGlhcwor
ICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1l
dGhvZCBvciBwcm9wZXJ0eSB0byBhbGlhcworICBAcmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQor
ICBAZGVwcmVjYXRlZCBVc2UgYEVtYmVyLmFsaWFzTWV0aG9kYCBvciBgRW1iZXIuY29tcHV0ZWQu
YWxpYXNgIGluc3RlYWQKKyovCitFbWJlci5hbGlhcyA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsK
KyAgcmV0dXJuIG5ldyBBbGlhcyhtZXRob2ROYW1lKTsKK307CisKK0VtYmVyLmRlcHJlY2F0ZUZ1
bmMoIkVtYmVyLmFsaWFzIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgRW1iZXIuYWxpYXNNZXRo
b2Qgb3IgRW1iZXIuY29tcHV0ZWQuYWxpYXMgaW5zdGVhZC4iLCBFbWJlci5hbGlhcyk7CisKKy8q
KgorICBNYWtlcyBhIG1ldGhvZCBhdmFpbGFibGUgdmlhIGFuIGFkZGl0aW9uYWwgbmFtZS4KKwor
ICBgYGBqYXZhc2NyaXB0CisgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAg
ICBuYW1lOiBmdW5jdGlvbigpeworICAgICAgcmV0dXJuICdUb21odWRhIEthdHpkYWxlJzsKKyAg
ICB9LAorICAgIG1vbmlrZXI6IEVtYmVyLmFsaWFzTWV0aG9kKCduYW1lJykKKyAgfSk7CisKKyAg
dmFyIGdvb2RHdXkgPSBBcHAuUGVyc29uLmNyZWF0ZSgpCisgIGBgYAorCisgIEBtZXRob2QgYWxp
YXNNZXRob2QKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBuYW1l
IG9mIHRoZSBtZXRob2QgdG8gYWxpYXMKKyAgQHJldHVybiB7RW1iZXIuRGVzY3JpcHRvcn0KKyov
CitFbWJlci5hbGlhc01ldGhvZCA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKKyAgcmV0dXJuIG5l
dyBBbGlhcyhtZXRob2ROYW1lKTsKK307CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIE9CU0VSVkVSIEhFTFBFUgorLy8K
KworLyoqCisgIEBtZXRob2Qgb2JzZXJ2ZXIKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge0Z1bmN0
aW9ufSBmdW5jCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWVzKgorICBAcmV0dXJuIGZ1
bmMKKyovCitFbWJlci5vYnNlcnZlciA9IGZ1bmN0aW9uKGZ1bmMpIHsKKyAgdmFyIHBhdGhzID0g
YV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgIGZ1bmMuX19lbWJlcl9vYnNlcnZlc19fID0g
cGF0aHM7CisgIHJldHVybiBmdW5jOworfTsKKworLy8gSWYgb2JzZXJ2ZXJzIGV2ZXIgYmVjb21l
IGFzeW5jaHJvbm91cywgRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIKKy8vIG11c3QgcmVtYWluIHN5
bmNocm9ub3VzLgorLyoqCisgIEBtZXRob2QgaW1tZWRpYXRlT2JzZXJ2ZXIKKyAgQGZvciBFbWJl
cgorICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5h
bWVzKgorICBAcmV0dXJuIGZ1bmMKKyovCitFbWJlci5pbW1lZGlhdGVPYnNlcnZlciA9IGZ1bmN0
aW9uKCkgeworICBmb3IgKHZhciBpPTAsIGw9YXJndW1lbnRzLmxlbmd0aDsgaTxsOyBpKyspIHsK
KyAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldOworICAgIEVtYmVyLmFzc2VydCgiSW1tZWRpYXRl
IG9ic2VydmVycyBtdXN0IG9ic2VydmUgaW50ZXJuYWwgcHJvcGVydGllcyBvbmx5LCBub3QgcHJv
cGVydGllcyBvbiBvdGhlciBvYmplY3RzLiIsIHR5cGVvZiBhcmcgIT09ICJzdHJpbmciIHx8IGFy
Zy5pbmRleE9mKCcuJykgPT09IC0xKTsKKyAgfQorCisgIHJldHVybiBFbWJlci5vYnNlcnZlci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworLyoqCisgIEBtZXRob2QgYmVmb3JlT2JzZXJ2
ZXIKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgIEBwYXJhbSB7U3Ry
aW5nfSBwcm9wZXJ0eU5hbWVzKgorICBAcmV0dXJuIGZ1bmMKKyovCitFbWJlci5iZWZvcmVPYnNl
cnZlciA9IGZ1bmN0aW9uKGZ1bmMpIHsKKyAgdmFyIHBhdGhzID0gYV9zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSk7CisgIGZ1bmMuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fID0gcGF0aHM7CisgIHJl
dHVybiBmdW5jOworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorRW1iZXIg
TWV0YWwKKworQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAorKi8KKworfSko
KTsKKworKGZ1bmN0aW9uKCkgeworZGVmaW5lKCJyc3ZwIiwKKyAgW10sCisgIGZ1bmN0aW9uKCkg
eworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgYnJvd3Nlckdsb2JhbCA9ICh0eXBlb2Ygd2lu
ZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiB7fTsKKworICAgIHZhciBNdXRhdGlvbk9i
c2VydmVyID0gYnJvd3Nlckdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGJyb3dzZXJHbG9iYWwu
V2ViS2l0TXV0YXRpb25PYnNlcnZlcjsKKyAgICB2YXIgUlNWUCwgYXN5bmM7CisKKyAgICBpZiAo
dHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmCisgICAgICB7fS50b1N0cmluZy5jYWxs
KHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHsKKyAgICAgIGFzeW5jID0gZnVuY3Rp
b24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlv
bigpIHsKKyAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOworICAgICAgICB9KTsKKyAg
ICAgIH07CisgICAgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7CisgICAgICB2YXIgcXVl
dWUgPSBbXTsKKworICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVu
Y3Rpb24oKSB7CisgICAgICAgIHZhciB0b1Byb2Nlc3MgPSBxdWV1ZS5zbGljZSgpOworICAgICAg
ICBxdWV1ZSA9IFtdOworCisgICAgICAgIHRvUHJvY2Vzcy5mb3JFYWNoKGZ1bmN0aW9uKHR1cGxl
KSB7CisgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdHVwbGVbMF0sIGJpbmRpbmcgPSB0dXBsZVsx
XTsKKyAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOworICAgICAgICB9KTsKKyAgICAg
IH0pOworCisgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp
OworICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7
CisKKyAgICAgIC8vIENocm9tZSBNZW1vcnkgTGVhazogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTkzNjYxCisgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5s
b2FkJywgZnVuY3Rpb24oKXsKKyAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOworICAgICAg
ICBvYnNlcnZlciA9IG51bGw7CisgICAgICB9KTsKKworICAgICAgYXN5bmMgPSBmdW5jdGlvbihj
YWxsYmFjaywgYmluZGluZykgeworICAgICAgICBxdWV1ZS5wdXNoKFtjYWxsYmFjaywgYmluZGlu
Z10pOworICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJhaW5RdWV1ZScsICdkcmFpblF1
ZXVlJyk7CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICBhc3luYyA9IGZ1bmN0aW9uKGNh
bGxiYWNrLCBiaW5kaW5nKSB7CisgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKKyAgICAgICAgfSwgMSk7CisgICAgICB9Owor
ICAgIH0KKworICAgIHZhciBFdmVudCA9IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKKyAgICAg
IHRoaXMudHlwZSA9IHR5cGU7CisKKyAgICAgIGZvciAodmFyIG9wdGlvbiBpbiBvcHRpb25zKSB7
CisgICAgICAgIGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKSB7IGNvbnRpbnVl
OyB9CisKKyAgICAgICAgdGhpc1tvcHRpb25dID0gb3B0aW9uc1tvcHRpb25dOworICAgICAgfQor
ICAgIH07CisKKyAgICB2YXIgaW5kZXhPZiA9IGZ1bmN0aW9uKGNhbGxiYWNrcywgY2FsbGJhY2sp
IHsKKyAgICAgIGZvciAodmFyIGk9MCwgbD1jYWxsYmFja3MubGVuZ3RoOyBpPGw7IGkrKykgewor
ICAgICAgICBpZiAoY2FsbGJhY2tzW2ldWzBdID09PSBjYWxsYmFjaykgeyByZXR1cm4gaTsgfQor
ICAgICAgfQorCisgICAgICByZXR1cm4gLTE7CisgICAgfTsKKworICAgIHZhciBjYWxsYmFja3NG
b3IgPSBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHZhciBjYWxsYmFja3MgPSBvYmplY3QuX3By
b21pc2VDYWxsYmFja3M7CisKKyAgICAgIGlmICghY2FsbGJhY2tzKSB7CisgICAgICAgIGNhbGxi
YWNrcyA9IG9iamVjdC5fcHJvbWlzZUNhbGxiYWNrcyA9IHt9OworICAgICAgfQorCisgICAgICBy
ZXR1cm4gY2FsbGJhY2tzOworICAgIH07CisKKyAgICB2YXIgRXZlbnRUYXJnZXQgPSB7CisgICAg
ICBtaXhpbjogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgICAgIG9iamVjdC5vbiA9IHRoaXMub247
CisgICAgICAgIG9iamVjdC5vZmYgPSB0aGlzLm9mZjsKKyAgICAgICAgb2JqZWN0LnRyaWdnZXIg
PSB0aGlzLnRyaWdnZXI7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICB9LAorCisgICAg
ICBvbjogZnVuY3Rpb24oZXZlbnROYW1lcywgY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICAgICAg
dmFyIGFsbENhbGxiYWNrcyA9IGNhbGxiYWNrc0Zvcih0aGlzKSwgY2FsbGJhY2tzLCBldmVudE5h
bWU7CisgICAgICAgIGV2ZW50TmFtZXMgPSBldmVudE5hbWVzLnNwbGl0KC9ccysvKTsKKyAgICAg
ICAgYmluZGluZyA9IGJpbmRpbmcgfHwgdGhpczsKKworICAgICAgICB3aGlsZSAoZXZlbnROYW1l
ID0gZXZlbnROYW1lcy5zaGlmdCgpKSB7CisgICAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJh
Y2tzW2V2ZW50TmFtZV07CisKKyAgICAgICAgICBpZiAoIWNhbGxiYWNrcykgeworICAgICAgICAg
ICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKKyAgICAgICAgICB9
CisKKyAgICAgICAgICBpZiAoaW5kZXhPZihjYWxsYmFja3MsIGNhbGxiYWNrKSA9PT0gLTEpIHsK
KyAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKFtjYWxsYmFjaywgYmluZGluZ10pOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKworICAgICAgb2ZmOiBmdW5jdGlvbihldmVudE5h
bWVzLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgYWxsQ2FsbGJhY2tzID0gY2FsbGJhY2tzRm9y
KHRoaXMpLCBjYWxsYmFja3MsIGV2ZW50TmFtZSwgaW5kZXg7CisgICAgICAgIGV2ZW50TmFtZXMg
PSBldmVudE5hbWVzLnNwbGl0KC9ccysvKTsKKworICAgICAgICB3aGlsZSAoZXZlbnROYW1lID0g
ZXZlbnROYW1lcy5zaGlmdCgpKSB7CisgICAgICAgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAg
ICAgICAgYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgIH0KKworICAgICAgICAgIGNhbGxiYWNrcyA9IGFsbENhbGxiYWNrc1tldmVu
dE5hbWVdOworCisgICAgICAgICAgaW5kZXggPSBpbmRleE9mKGNhbGxiYWNrcywgY2FsbGJhY2sp
OworCisgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgeyBjYWxsYmFja3Muc3BsaWNlKGluZGV4
LCAxKTsgfQorICAgICAgICB9CisgICAgICB9LAorCisgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihl
dmVudE5hbWUsIG9wdGlvbnMpIHsKKyAgICAgICAgdmFyIGFsbENhbGxiYWNrcyA9IGNhbGxiYWNr
c0Zvcih0aGlzKSwKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FsbGJhY2tUdXBsZSwgY2FsbGJh
Y2ssIGJpbmRpbmcsIGV2ZW50OworCisgICAgICAgIGlmIChjYWxsYmFja3MgPSBhbGxDYWxsYmFj
a3NbZXZlbnROYW1lXSkgeworICAgICAgICAgIC8vIERvbid0IGNhY2hlIHRoZSBjYWxsYmFja3Mu
bGVuZ3RoIHNpbmNlIGl0IG1heSBncm93CisgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGNhbGxi
YWNrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2FsbGJhY2tUdXBsZSA9IGNhbGxiYWNr
c1tpXTsKKyAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tUdXBsZVswXTsKKyAgICAgICAg
ICAgIGJpbmRpbmcgPSBjYWxsYmFja1R1cGxlWzFdOworCisgICAgICAgICAgICBpZiAodHlwZW9m
IG9wdGlvbnMgIT09ICdvYmplY3QnKSB7CisgICAgICAgICAgICAgIG9wdGlvbnMgPSB7IGRldGFp
bDogb3B0aW9ucyB9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBldmVudCA9IG5ldyBF
dmVudChldmVudE5hbWUsIG9wdGlvbnMpOworICAgICAgICAgICAgY2FsbGJhY2suY2FsbChiaW5k
aW5nLCBldmVudCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfTsKKwor
ICAgIHZhciBQcm9taXNlID0gZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLm9uKCdwcm9taXNlOnJl
c29sdmVkJywgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyKCdzdWNjZXNz
JywgeyBkZXRhaWw6IGV2ZW50LmRldGFpbCB9KTsKKyAgICAgIH0sIHRoaXMpOworCisgICAgICB0
aGlzLm9uKCdwcm9taXNlOmZhaWxlZCcsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIHRoaXMu
dHJpZ2dlcignZXJyb3InLCB7IGRldGFpbDogZXZlbnQuZGV0YWlsIH0pOworICAgICAgfSwgdGhp
cyk7CisgICAgfTsKKworICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTsKKworICAgIHZhciBp
bnZva2VDYWxsYmFjayA9IGZ1bmN0aW9uKHR5cGUsIHByb21pc2UsIGNhbGxiYWNrLCBldmVudCkg
eworICAgICAgdmFyIGhhc0NhbGxiYWNrID0gdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24n
LAorICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7CisKKyAgICAgIGlm
IChoYXNDYWxsYmFjaykgeworICAgICAgICB0cnkgeworICAgICAgICAgIHZhbHVlID0gY2FsbGJh
Y2soZXZlbnQuZGV0YWlsKTsKKyAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVlOworICAgICAgICB9
IGNhdGNoKGUpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgIGVycm9yID0g
ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSBldmVudC5kZXRh
aWw7CisgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1
ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICB2YWx1ZS50
aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHZhbHVlKTsK
KyAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgICBwcm9taXNlLnJlamVjdChl
cnJvcik7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNj
ZWVkZWQpIHsKKyAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHZhbHVlKTsKKyAgICAgIH0gZWxzZSBp
ZiAoZmFpbGVkKSB7CisgICAgICAgIHByb21pc2UucmVqZWN0KGVycm9yKTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHByb21pc2VbdHlwZV0odmFsdWUpOworICAgICAgfQorICAgIH07CisKKyAg
ICBQcm9taXNlLnByb3RvdHlwZSA9IHsKKyAgICAgIHRoZW46IGZ1bmN0aW9uKGRvbmUsIGZhaWwp
IHsKKyAgICAgICAgdmFyIHRoZW5Qcm9taXNlID0gbmV3IFByb21pc2UoKTsKKworICAgICAgICBp
ZiAodGhpcy5pc1Jlc29sdmVkKSB7CisgICAgICAgICAgUlNWUC5hc3luYyhmdW5jdGlvbigpIHsK
KyAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKCdyZXNvbHZlJywgdGhlblByb21pc2UsIGRvbmUs
IHsgZGV0YWlsOiB0aGlzLnJlc29sdmVkVmFsdWUgfSk7CisgICAgICAgICAgfSwgdGhpcyk7Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5pc1JlamVjdGVkKSB7CisgICAgICAgICAgUlNW
UC5hc3luYyhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKCdyZWplY3Qn
LCB0aGVuUHJvbWlzZSwgZmFpbCwgeyBkZXRhaWw6IHRoaXMucmVqZWN0ZWRWYWx1ZSB9KTsKKyAg
ICAgICAgICB9LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMub24oJ3Byb21pc2U6
cmVzb2x2ZWQnLCBmdW5jdGlvbihldmVudCkgeworICAgICAgICAgIGludm9rZUNhbGxiYWNrKCdy
ZXNvbHZlJywgdGhlblByb21pc2UsIGRvbmUsIGV2ZW50KTsKKyAgICAgICAgfSk7CisKKyAgICAg
ICAgdGhpcy5vbigncHJvbWlzZTpmYWlsZWQnLCBmdW5jdGlvbihldmVudCkgeworICAgICAgICAg
IGludm9rZUNhbGxiYWNrKCdyZWplY3QnLCB0aGVuUHJvbWlzZSwgZmFpbCwgZXZlbnQpOworICAg
ICAgICB9KTsKKworICAgICAgICByZXR1cm4gdGhlblByb21pc2U7CisgICAgICB9LAorCisgICAg
ICByZXNvbHZlOiBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICByZXNvbHZlKHRoaXMsIHZhbHVl
KTsKKworICAgICAgICB0aGlzLnJlc29sdmUgPSBub29wOworICAgICAgICB0aGlzLnJlamVjdCA9
IG5vb3A7CisgICAgICB9LAorCisgICAgICByZWplY3Q6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAg
ICAgIHJlamVjdCh0aGlzLCB2YWx1ZSk7CisKKyAgICAgICAgdGhpcy5yZXNvbHZlID0gbm9vcDsK
KyAgICAgICAgdGhpcy5yZWplY3QgPSBub29wOworICAgICAgfQorICAgIH07CisKKyAgICBmdW5j
dGlvbiByZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7CisgICAgICBSU1ZQLmFzeW5jKGZ1bmN0aW9u
KCkgeworICAgICAgICBwcm9taXNlLnRyaWdnZXIoJ3Byb21pc2U6cmVzb2x2ZWQnLCB7IGRldGFp
bDogdmFsdWUgfSk7CisgICAgICAgIHByb21pc2UuaXNSZXNvbHZlZCA9IHRydWU7CisgICAgICAg
IHByb21pc2UucmVzb2x2ZWRWYWx1ZSA9IHZhbHVlOworICAgICAgfSk7CisgICAgfQorCisgICAg
ZnVuY3Rpb24gcmVqZWN0KHByb21pc2UsIHZhbHVlKSB7CisgICAgICBSU1ZQLmFzeW5jKGZ1bmN0
aW9uKCkgeworICAgICAgICBwcm9taXNlLnRyaWdnZXIoJ3Byb21pc2U6ZmFpbGVkJywgeyBkZXRh
aWw6IHZhbHVlIH0pOworICAgICAgICBwcm9taXNlLmlzUmVqZWN0ZWQgPSB0cnVlOworICAgICAg
ICBwcm9taXNlLnJlamVjdGVkVmFsdWUgPSB2YWx1ZTsKKyAgICAgIH0pOworICAgIH0KKworICAg
IGZ1bmN0aW9uIGFsbChwcm9taXNlcykgeworICAgIHZhciBpLCByZXN1bHRzID0gW107CisgICAg
dmFyIGFsbFByb21pc2UgPSBuZXcgUHJvbWlzZSgpOworICAgIHZhciByZW1haW5pbmcgPSBwcm9t
aXNlcy5sZW5ndGg7CisKKyAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHsKKyAgICAgICAgYWxs
UHJvbWlzZS5yZXNvbHZlKFtdKTsKKyAgICAgIH0KKworICAgIHZhciByZXNvbHZlciA9IGZ1bmN0
aW9uKGluZGV4KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmVzb2x2ZShp
bmRleCwgdmFsdWUpOworICAgIH07CisgICAgfTsKKworICAgIHZhciByZXNvbHZlID0gZnVuY3Rp
b24oaW5kZXgsIHZhbHVlKSB7CisgICAgcmVzdWx0c1tpbmRleF0gPSB2YWx1ZTsKKyAgICBpZiAo
LS1yZW1haW5pbmcgPT09IDApIHsKKyAgICBhbGxQcm9taXNlLnJlc29sdmUocmVzdWx0cyk7Cisg
ICAgfQorICAgIH07CisKKyAgICB2YXIgcmVqZWN0ID0gZnVuY3Rpb24oZXJyb3IpIHsKKyAgICBh
bGxQcm9taXNlLnJlamVjdChlcnJvcik7CisgICAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBy
ZW1haW5pbmc7IGkrKykgeworICAgIHByb21pc2VzW2ldLnRoZW4ocmVzb2x2ZXIoaSksIHJlamVj
dCk7CisgICAgfQorICAgIHJldHVybiBhbGxQcm9taXNlOworICAgIH0KKworICAgIEV2ZW50VGFy
Z2V0Lm1peGluKFByb21pc2UucHJvdG90eXBlKTsKKworICAgIFJTVlAgPSB7IGFzeW5jOiBhc3lu
YywgUHJvbWlzZTogUHJvbWlzZSwgRXZlbnQ6IEV2ZW50LCBFdmVudFRhcmdldDogRXZlbnRUYXJn
ZXQsIGFsbDogYWxsLCByYWlzZU9uVW5jYXVnaHRFeGNlcHRpb25zOiB0cnVlIH07CisgICAgcmV0
dXJuIFJTVlA7CisgIH0pOworCit9KSgpOworCisoZnVuY3Rpb24oKSB7CitkZWZpbmUoImNvbnRh
aW5lciIsCisgIFtdLAorICBmdW5jdGlvbigpIHsKKworICAgIHZhciBvYmplY3RDcmVhdGUgPSBP
YmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uKHBhcmVudCkgeworICAgICAgZnVuY3Rpb24gRigpIHt9
CisgICAgICBGLnByb3RvdHlwZSA9IHBhcmVudDsKKyAgICAgIHJldHVybiBuZXcgRigpOworICAg
IH07CisKKyAgICBmdW5jdGlvbiBJbmhlcml0aW5nRGljdChwYXJlbnQpIHsKKyAgICAgIHRoaXMu
cGFyZW50ID0gcGFyZW50OworICAgICAgdGhpcy5kaWN0ID0ge307CisgICAgfQorCisgICAgSW5o
ZXJpdGluZ0RpY3QucHJvdG90eXBlID0geworICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKKyAg
ICAgICAgdmFyIGRpY3QgPSB0aGlzLmRpY3Q7CisKKyAgICAgICAgaWYgKGRpY3QuaGFzT3duUHJv
cGVydHkoa2V5KSkgeworICAgICAgICAgIHJldHVybiBkaWN0W2tleV07CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQu
Z2V0KGtleSk7CisgICAgICAgIH0KKyAgICAgIH0sCisKKyAgICAgIHNldDogZnVuY3Rpb24oa2V5
LCB2YWx1ZSkgeworICAgICAgICB0aGlzLmRpY3Rba2V5XSA9IHZhbHVlOworICAgICAgfSwKKwor
ICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgdmFyIGRpY3QgPSB0aGlzLmRpY3Q7
CisKKyAgICAgICAgaWYgKGRpY3QuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7CisgICAg
ICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmhhcyhrZXkpOworICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgfSwKKworICAgICAgZWFjaExvY2FsOiBmdW5jdGlvbihjYWxs
YmFjaywgYmluZGluZykgeworICAgICAgICB2YXIgZGljdCA9IHRoaXMuZGljdDsKKworICAgICAg
ICBmb3IgKHZhciBwcm9wIGluIGRpY3QpIHsKKyAgICAgICAgICBpZiAoZGljdC5oYXNPd25Qcm9w
ZXJ0eShwcm9wKSkgeworICAgICAgICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBwcm9wLCBk
aWN0W3Byb3BdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisg
ICAgZnVuY3Rpb24gQ29udGFpbmVyKHBhcmVudCkgeworICAgICAgdGhpcy5wYXJlbnQgPSBwYXJl
bnQ7CisgICAgICB0aGlzLmNoaWxkcmVuID0gW107CisKKyAgICAgIHRoaXMucmVzb2x2ZXIgPSBw
YXJlbnQgJiYgcGFyZW50LnJlc29sdmVyIHx8IGZ1bmN0aW9uKCkge307CisgICAgICB0aGlzLnJl
Z2lzdHJ5ID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQucmVnaXN0cnkpOwor
ICAgICAgdGhpcy5jYWNoZSA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LmNh
Y2hlKTsKKyAgICAgIHRoaXMudHlwZUluamVjdGlvbnMgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFy
ZW50ICYmIHBhcmVudC50eXBlSW5qZWN0aW9ucyk7CisgICAgICB0aGlzLmluamVjdGlvbnMgPSB7
fTsKKyAgICAgIHRoaXMuX29wdGlvbnMgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYmIHBh
cmVudC5fb3B0aW9ucyk7CisgICAgICB0aGlzLl90eXBlT3B0aW9ucyA9IG5ldyBJbmhlcml0aW5n
RGljdChwYXJlbnQgJiYgcGFyZW50Ll90eXBlT3B0aW9ucyk7CisgICAgfQorCisgICAgQ29udGFp
bmVyLnByb3RvdHlwZSA9IHsKKyAgICAgIGNoaWxkOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFy
IGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIodGhpcyk7CisgICAgICAgIHRoaXMuY2hpbGRyZW4u
cHVzaChjb250YWluZXIpOworICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgICAgfSwKKwor
ICAgICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpIHsKKyAgICAgICAgb2JqZWN0
W2tleV0gPSB2YWx1ZTsKKyAgICAgIH0sCisKKyAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbih0eXBl
LCBuYW1lLCBmYWN0b3J5LCBvcHRpb25zKSB7CisgICAgICAgIHZhciBmdWxsTmFtZTsKKworCisg
ICAgICAgIGlmICh0eXBlLmluZGV4T2YoJzonKSAhPT0gLTEpeworICAgICAgICAgIG9wdGlvbnMg
PSBmYWN0b3J5OworICAgICAgICAgIGZhY3RvcnkgPSBuYW1lOworICAgICAgICAgIGZ1bGxOYW1l
ID0gdHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFbWJlci5kZXByZWNhdGUoJ3Jl
Z2lzdGVyKCInK3R5cGUgKyciLCAiJysgbmFtZSsnIikgaXMgbm93IGRlcHJlY2F0ZWQgaW4tZmF2
b3VyIG9mIHJlZ2lzdGVyKCInK3R5cGUrJzonK25hbWUrJyIpOycsIHRydWUpOworICAgICAgICAg
IGZ1bGxOYW1lID0gdHlwZSArICI6IiArIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICB0aGlz
LnJlZ2lzdHJ5LnNldChmdWxsTmFtZSwgZmFjdG9yeSk7CisgICAgICAgIHRoaXMuX29wdGlvbnMu
c2V0KGZ1bGxOYW1lLCBvcHRpb25zIHx8IHt9KTsKKyAgICAgIH0sCisKKyAgICAgIHJlc29sdmU6
IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyKGZ1bGxO
YW1lKSB8fCB0aGlzLnJlZ2lzdHJ5LmdldChmdWxsTmFtZSk7CisgICAgICB9LAorCisgICAgICBs
b29rdXA6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CisgICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhm
dWxsTmFtZSkpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoZnVsbE5hbWUpOwor
ICAgICAgICB9CisKKyAgICAgICAgdmFyIHZhbHVlID0gaW5zdGFudGlhdGUodGhpcywgZnVsbE5h
bWUpOworCisgICAgICAgIGlmICghdmFsdWUpIHsgcmV0dXJuOyB9CisKKyAgICAgICAgaWYgKGlz
U2luZ2xldG9uKHRoaXMsIGZ1bGxOYW1lKSkgeworICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGZ1
bGxOYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAg
ICB9LAorCisgICAgICBoYXM6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CisgICAgICAgIGlmICh0aGlz
LmNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorCisgICAgICAgIHJldHVybiAhIWZhY3RvcnlGb3IodGhpcywgZnVsbE5hbWUpOworICAgICAg
fSwKKworICAgICAgb3B0aW9uc0ZvclR5cGU6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKKyAg
ICAgICAgaWYgKHRoaXMucGFyZW50KSB7IGlsbGVnYWxDaGlsZE9wZXJhdGlvbignb3B0aW9uc0Zv
clR5cGUnKTsgfQorCisgICAgICAgIHRoaXMuX3R5cGVPcHRpb25zLnNldCh0eXBlLCBvcHRpb25z
KTsKKyAgICAgIH0sCisKKyAgICAgIG9wdGlvbnM6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsK
KyAgICAgICAgdGhpcy5vcHRpb25zRm9yVHlwZSh0eXBlLCBvcHRpb25zKTsKKyAgICAgIH0sCisK
KyAgICAgIHR5cGVJbmplY3Rpb246IGZ1bmN0aW9uKHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkg
eworICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCd0eXBl
SW5qZWN0aW9uJyk7IH0KKworICAgICAgICB2YXIgaW5qZWN0aW9ucyA9IHRoaXMudHlwZUluamVj
dGlvbnMuZ2V0KHR5cGUpOworICAgICAgICBpZiAoIWluamVjdGlvbnMpIHsKKyAgICAgICAgICBp
bmplY3Rpb25zID0gW107CisgICAgICAgICAgdGhpcy50eXBlSW5qZWN0aW9ucy5zZXQodHlwZSwg
aW5qZWN0aW9ucyk7CisgICAgICAgIH0KKyAgICAgICAgaW5qZWN0aW9ucy5wdXNoKHsgcHJvcGVy
dHk6IHByb3BlcnR5LCBmdWxsTmFtZTogZnVsbE5hbWUgfSk7CisgICAgICB9LAorCisgICAgICBp
bmplY3Rpb246IGZ1bmN0aW9uKGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSkg
eworICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdpbmpl
Y3Rpb24nKTsgfQorCisgICAgICAgIGlmIChmYWN0b3J5TmFtZS5pbmRleE9mKCc6JykgPT09IC0x
KSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZUluamVjdGlvbihmYWN0b3J5TmFtZSwgcHJv
cGVydHksIGluamVjdGlvbk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGluamVjdGlv
bnMgPSB0aGlzLmluamVjdGlvbnNbZmFjdG9yeU5hbWVdID0gdGhpcy5pbmplY3Rpb25zW2ZhY3Rv
cnlOYW1lXSB8fCBbXTsKKyAgICAgICAgaW5qZWN0aW9ucy5wdXNoKHsgcHJvcGVydHk6IHByb3Bl
cnR5LCBmdWxsTmFtZTogaW5qZWN0aW9uTmFtZSB9KTsKKyAgICAgIH0sCisKKyAgICAgIGRlc3Ry
b3k6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmlzRGVzdHJveWVkID0gdHJ1ZTsKKworICAg
ICAgICBmb3IgKHZhciBpPTAsIGw9dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGk8bDsgaSsrKSB7Cisg
ICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7CisgICAgICAgIH0KKworICAgICAg
ICB0aGlzLmNoaWxkcmVuID0gW107CisKKyAgICAgICAgZWFjaERlc3Ryb3lhYmxlKHRoaXMsIGZ1
bmN0aW9uKGl0ZW0pIHsKKyAgICAgICAgICBpdGVtLmlzRGVzdHJveWluZyA9IHRydWU7CisgICAg
ICAgIH0pOworCisgICAgICAgIGVhY2hEZXN0cm95YWJsZSh0aGlzLCBmdW5jdGlvbihpdGVtKSB7
CisgICAgICAgICAgaXRlbS5kZXN0cm95KCk7CisgICAgICAgIH0pOworCisgICAgICAgIGRlbGV0
ZSB0aGlzLnBhcmVudDsKKyAgICAgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7CisgICAgICB9
LAorCisgICAgICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgIGZvciAodmFyIGk9MCwgbD10
aGlzLmNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgICByZXNldENhY2hlKHRo
aXMuY2hpbGRyZW5baV0pOworICAgICAgICB9CisgICAgICAgIHJlc2V0Q2FjaGUodGhpcyk7Cisg
ICAgICB9CisgICAgfTsKKworICAgIGZ1bmN0aW9uIGlsbGVnYWxDaGlsZE9wZXJhdGlvbihvcGVy
YXRpb24pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihvcGVyYXRpb24gKyAiIGlzIG5vdCBjdXJy
ZW50bHkgc3VwcG9ydGVkIG9uIGNoaWxkIGNvbnRhaW5lcnMiKTsKKyAgICB9CisKKyAgICBmdW5j
dGlvbiBpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgICB2YXIgc2luZ2xl
dG9uID0gb3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdzaW5nbGV0b24nKTsKKworICAgICAg
cmV0dXJuIHNpbmdsZXRvbiAhPT0gZmFsc2U7CisgICAgfQorCisgICAgZnVuY3Rpb24gYnVpbGRJ
bmplY3Rpb25zKGNvbnRhaW5lciwgaW5qZWN0aW9ucykgeworICAgICAgdmFyIGhhc2ggPSB7fTsK
KworICAgICAgaWYgKCFpbmplY3Rpb25zKSB7IHJldHVybiBoYXNoOyB9CisKKyAgICAgIHZhciBp
bmplY3Rpb24sIGxvb2t1cDsKKworICAgICAgZm9yICh2YXIgaT0wLCBsPWluamVjdGlvbnMubGVu
Z3RoOyBpPGw7IGkrKykgeworICAgICAgICBpbmplY3Rpb24gPSBpbmplY3Rpb25zW2ldOworICAg
ICAgICBsb29rdXAgPSBjb250YWluZXIubG9va3VwKGluamVjdGlvbi5mdWxsTmFtZSk7CisgICAg
ICAgIGhhc2hbaW5qZWN0aW9uLnByb3BlcnR5XSA9IGxvb2t1cDsKKyAgICAgIH0KKworICAgICAg
cmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgZnVuY3Rpb24gb3B0aW9uKGNvbnRhaW5lciwgZnVs
bE5hbWUsIG9wdGlvbk5hbWUpIHsKKyAgICAgIHZhciBvcHRpb25zID0gY29udGFpbmVyLl9vcHRp
b25zLmdldChmdWxsTmFtZSk7CisKKyAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnNbb3B0aW9u
TmFtZV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1l
XTsKKyAgICAgIH0KKworICAgICAgdmFyIHR5cGUgPSBmdWxsTmFtZS5zcGxpdCgiOiIpWzBdOwor
ICAgICAgb3B0aW9ucyA9IGNvbnRhaW5lci5fdHlwZU9wdGlvbnMuZ2V0KHR5cGUpOworCisgICAg
ICBpZiAob3B0aW9ucykgeworICAgICAgICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXTsKKyAg
ICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmYWN0b3J5Rm9yKGNvbnRhaW5lciwgZnVsbE5h
bWUpIHsKKyAgICAgIHJldHVybiBjb250YWluZXIucmVzb2x2ZShmdWxsTmFtZSk7CisgICAgfQor
CisgICAgZnVuY3Rpb24gaW5zdGFudGlhdGUoY29udGFpbmVyLCBmdWxsTmFtZSkgeworICAgICAg
dmFyIGZhY3RvcnkgPSBmYWN0b3J5Rm9yKGNvbnRhaW5lciwgZnVsbE5hbWUpOworCisgICAgICB2
YXIgc3BsaXROYW1lID0gZnVsbE5hbWUuc3BsaXQoIjoiKSwKKyAgICAgICAgICB0eXBlID0gc3Bs
aXROYW1lWzBdLCBuYW1lID0gc3BsaXROYW1lWzFdLAorICAgICAgICAgIHZhbHVlOworCisgICAg
ICBpZiAob3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdpbnN0YW50aWF0ZScpID09PSBmYWxz
ZSkgeworICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgIH0KKworICAgICAgaWYgKGZhY3Rv
cnkpIHsKKyAgICAgICAgdmFyIGluamVjdGlvbnMgPSBbXTsKKyAgICAgICAgaW5qZWN0aW9ucyA9
IGluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci50eXBlSW5qZWN0aW9ucy5nZXQodHlwZSkgfHwg
W10pOworICAgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9ucy5jb25jYXQoY29udGFpbmVyLmlu
amVjdGlvbnNbZnVsbE5hbWVdIHx8IFtdKTsKKworICAgICAgICB2YXIgaGFzaCA9IGJ1aWxkSW5q
ZWN0aW9ucyhjb250YWluZXIsIGluamVjdGlvbnMpOworICAgICAgICBoYXNoLmNvbnRhaW5lciA9
IGNvbnRhaW5lcjsKKyAgICAgICAgaGFzaC5fZGVidWdDb250YWluZXJLZXkgPSBmdWxsTmFtZTsK
KworICAgICAgICB2YWx1ZSA9IGZhY3RvcnkuY3JlYXRlKGhhc2gpOworCisgICAgICAgIHJldHVy
biB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBlYWNoRGVzdHJveWFibGUo
Y29udGFpbmVyLCBjYWxsYmFjaykgeworICAgICAgY29udGFpbmVyLmNhY2hlLmVhY2hMb2NhbChm
dW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICAgIGlmIChvcHRpb24oY29udGFpbmVyLCBrZXks
ICdpbnN0YW50aWF0ZScpID09PSBmYWxzZSkgeyByZXR1cm47IH0KKyAgICAgICAgY2FsbGJhY2so
dmFsdWUpOworICAgICAgfSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVzZXRDYWNoZShjb250
YWluZXIpIHsKKyAgICAgIGNvbnRhaW5lci5jYWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5LCB2
YWx1ZSkgeworICAgICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwga2V5LCAnaW5zdGFudGlhdGUn
KSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9CisgICAgICAgIHZhbHVlLmRlc3Ryb3koKTsKKyAgICAg
IH0pOworICAgICAgY29udGFpbmVyLmNhY2hlLmRpY3QgPSB7fTsKKyAgICB9CisKKyAgICByZXR1
cm4gQ29udGFpbmVyOworfSk7CisKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFscyBF
TlYgKi8KKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLwor
Cit2YXIgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mOworCisvLyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBUWVBJTkcgJiBBUlJBWSBN
RVNTQUdJTkcKKy8vCisKK3ZhciBUWVBFX01BUCA9IHt9OwordmFyIHQgPSAiQm9vbGVhbiBOdW1i
ZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKTsK
K0VtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2guY2FsbCh0LCBmdW5jdGlvbihuYW1lKSB7Cisg
IFRZUEVfTUFQWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgp
OworfSk7CisKK3ZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKKy8q
KgorICBSZXR1cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUgcGFzc2VkIGl0ZW0uCisKKyAg
VXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8gZ2V0IHRoZSB0eXBl
IG9mIGFuIGl0ZW0uCisgIEl0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhY3Jvc3MgYWxs
IGJyb3dzZXJzIGFuZCBpbmNsdWRlcyBhIGJpdAorICBtb3JlIGRldGFpbC4gSGVyZSBpcyB3aGF0
IHdpbGwgYmUgcmV0dXJuZWQ6CisKKyAgICAgIHwgUmV0dXJuIFZhbHVlICB8IE1lYW5pbmcgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfC0tLS0t
LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS18CisgICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJpbmcgcHJpbWl0aXZlICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgJ251bWJlcicgICAgICB8
IE51bWJlciBwcmltaXRpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAor
ICAgICAgfCAnYm9vbGVhbicgICAgIHwgQm9vbGVhbiBwcmltaXRpdmUgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICdudWxsJyAgICAgICAgfCBOdWxsIHZhbHVl
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgJ3Vu
ZGVmaW5lZCcgICB8IFVuZGVmaW5lZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfAorICAgICAgfCAnZnVuY3Rpb24nICAgIHwgQSBmdW5jdGlvbiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICdhcnJheScgICAgICAg
fCBBbiBpbnN0YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK
KyAgICAgIHwgJ2NsYXNzJyAgICAgICB8IEEgRW1iZXIgY2xhc3MgKGNyZWF0ZWQgdXNpbmcgRW1i
ZXIuT2JqZWN0LmV4dGVuZCgpKSAgfAorICAgICAgfCAnaW5zdGFuY2UnICAgIHwgQSBFbWJlciBv
YmplY3QgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICdl
cnJvcicgICAgICAgfCBBbiBpbnN0YW5jZSBvZiB0aGUgRXJyb3Igb2JqZWN0ICAgICAgICAgICAg
ICAgICAgICAgIHwKKyAgICAgIHwgJ29iamVjdCcgICAgICB8IEEgSmF2YVNjcmlwdCBvYmplY3Qg
bm90IGluaGVyaXRpbmcgZnJvbSBFbWJlci5PYmplY3QgfAorCisgIEV4YW1wbGVzOgorCisgIGBg
YGphdmFzY3JpcHQKKyAgRW1iZXIudHlwZU9mKCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyAn
dW5kZWZpbmVkJworICBFbWJlci50eXBlT2YobnVsbCk7ICAgICAgICAgICAgICAgICAgIC8vICdu
dWxsJworICBFbWJlci50eXBlT2YodW5kZWZpbmVkKTsgICAgICAgICAgICAgIC8vICd1bmRlZmlu
ZWQnCisgIEVtYmVyLnR5cGVPZignbWljaGFlbCcpOyAgICAgICAgICAgICAgLy8gJ3N0cmluZycK
KyAgRW1iZXIudHlwZU9mKDEwMSk7ICAgICAgICAgICAgICAgICAgICAvLyAnbnVtYmVyJworICBF
bWJlci50eXBlT2YodHJ1ZSk7ICAgICAgICAgICAgICAgICAgIC8vICdib29sZWFuJworICBFbWJl
ci50eXBlT2YoRW1iZXIubWFrZUFycmF5KTsgICAgICAgIC8vICdmdW5jdGlvbicKKyAgRW1iZXIu
dHlwZU9mKFsxLDIsOTBdKTsgICAgICAgICAgICAgICAvLyAnYXJyYXknCisgIEVtYmVyLnR5cGVP
ZihFbWJlci5PYmplY3QuZXh0ZW5kKCkpOyAgLy8gJ2NsYXNzJworICBFbWJlci50eXBlT2YoRW1i
ZXIuT2JqZWN0LmNyZWF0ZSgpKTsgIC8vICdpbnN0YW5jZScKKyAgRW1iZXIudHlwZU9mKG5ldyBF
cnJvcigndGVhbW9jaWwnKSk7ICAvLyAnZXJyb3InCisKKyAgLy8gIm5vcm1hbCIgSmF2YVNjcmlw
dCBvYmplY3QKKyAgRW1iZXIudHlwZU9mKHthOiAnYid9KTsgICAgICAgICAgICAgIC8vICdvYmpl
Y3QnCisgIGBgYAorCisgIEBtZXRob2QgdHlwZU9mCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIGl0
ZW0ge09iamVjdH0gdGhlIGl0ZW0gdG8gY2hlY2sKKyAgQHJldHVybiB7U3RyaW5nfSB0aGUgdHlw
ZQorKi8KK0VtYmVyLnR5cGVPZiA9IGZ1bmN0aW9uKGl0ZW0pIHsKKyAgdmFyIHJldDsKKworICBy
ZXQgPSAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpID8gU3RyaW5nKGl0ZW0p
IDogVFlQRV9NQVBbdG9TdHJpbmcuY2FsbChpdGVtKV0gfHwgJ29iamVjdCc7CisKKyAgaWYgKHJl
dCA9PT0gJ2Z1bmN0aW9uJykgeworICAgIGlmIChFbWJlci5PYmplY3QgJiYgRW1iZXIuT2JqZWN0
LmRldGVjdChpdGVtKSkgcmV0ID0gJ2NsYXNzJzsKKyAgfSBlbHNlIGlmIChyZXQgPT09ICdvYmpl
Y3QnKSB7CisgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvcikgcmV0ID0gJ2Vycm9yJzsKKyAg
ICBlbHNlIGlmIChFbWJlci5PYmplY3QgJiYgaXRlbSBpbnN0YW5jZW9mIEVtYmVyLk9iamVjdCkg
cmV0ID0gJ2luc3RhbmNlJzsKKyAgICBlbHNlIHJldCA9ICdvYmplY3QnOworICB9CisKKyAgcmV0
dXJuIHJldDsKK307CisKKy8qKgorICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCB2YWx1ZSBp
cyBudWxsIG9yIHVuZGVmaW5lZC4gVGhpcyBhdm9pZHMgZXJyb3JzCisgIGZyb20gSlNMaW50IGNv
bXBsYWluaW5nIGFib3V0IHVzZSBvZiA9PSwgd2hpY2ggY2FuIGJlIHRlY2huaWNhbGx5CisgIGNv
bmZ1c2luZy4KKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLmlzTm9uZSgpOyAgICAgICAgICAg
ICAgLy8gdHJ1ZQorICBFbWJlci5pc05vbmUobnVsbCk7ICAgICAgICAgIC8vIHRydWUKKyAgRW1i
ZXIuaXNOb25lKHVuZGVmaW5lZCk7ICAgICAvLyB0cnVlCisgIEVtYmVyLmlzTm9uZSgnJyk7ICAg
ICAgICAgICAgLy8gZmFsc2UKKyAgRW1iZXIuaXNOb25lKFtdKTsgICAgICAgICAgICAvLyBmYWxz
ZQorICBFbWJlci5pc05vbmUoZnVuY3Rpb24oKXt9KTsgIC8vIGZhbHNlCisgIGBgYAorCisgIEBt
ZXRob2QgaXNOb25lCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0
byB0ZXN0CisgIEByZXR1cm4ge0Jvb2xlYW59CisqLworRW1iZXIuaXNOb25lID0gZnVuY3Rpb24o
b2JqKSB7CisgIHJldHVybiBvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQ7Cit9Owor
RW1iZXIubm9uZSA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLm5vbmUgaXMgZGVwcmVjYXRl
ZC4gUGxlYXNlIHVzZSBFbWJlci5pc05vbmUgaW5zdGVhZC4iLCBFbWJlci5pc05vbmUpOworCisv
KioKKyAgVmVyaWZpZXMgdGhhdCBhIHZhbHVlIGlzIGBudWxsYCBvciBhbiBlbXB0eSBzdHJpbmcs
IGVtcHR5IGFycmF5LAorICBvciBlbXB0eSBmdW5jdGlvbi4KKworICBDb25zdHJhaW5zIHRoZSBy
dWxlcyBvbiBgRW1iZXIuaXNOb25lYCBieSByZXR1cm5pbmcgZmFsc2UgZm9yIGVtcHR5CisgIHN0
cmluZyBhbmQgZW1wdHkgYXJyYXlzLgorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuaXNFbXB0
eSgpOyAgICAgICAgICAgICAgICAvLyB0cnVlCisgIEVtYmVyLmlzRW1wdHkobnVsbCk7ICAgICAg
ICAgICAgLy8gdHJ1ZQorICBFbWJlci5pc0VtcHR5KHVuZGVmaW5lZCk7ICAgICAgIC8vIHRydWUK
KyAgRW1iZXIuaXNFbXB0eSgnJyk7ICAgICAgICAgICAgICAvLyB0cnVlCisgIEVtYmVyLmlzRW1w
dHkoW10pOyAgICAgICAgICAgICAgLy8gdHJ1ZQorICBFbWJlci5pc0VtcHR5KCdBZGFtIEhhd2tp
bnMnKTsgIC8vIGZhbHNlCisgIEVtYmVyLmlzRW1wdHkoWzAsMSwyXSk7ICAgICAgICAgLy8gZmFs
c2UKKyAgYGBgCisKKyAgQG1ldGhvZCBpc0VtcHR5CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtP
YmplY3R9IG9iaiBWYWx1ZSB0byB0ZXN0CisgIEByZXR1cm4ge0Jvb2xlYW59CisqLworRW1iZXIu
aXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikgeworICByZXR1cm4gb2JqID09PSBudWxsIHx8IG9iaiA9
PT0gdW5kZWZpbmVkIHx8IChvYmoubGVuZ3RoID09PSAwICYmIHR5cGVvZiBvYmogIT09ICdmdW5j
dGlvbicpIHx8ICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBFbWJlci5nZXQob2JqLCAnbGVu
Z3RoJykgPT09IDApOworfTsKK0VtYmVyLmVtcHR5ID0gRW1iZXIuZGVwcmVjYXRlRnVuYygiRW1i
ZXIuZW1wdHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5pc0VtcHR5IGluc3RlYWQu
IiwgRW1iZXIuaXNFbXB0eSkgOworCisvKioKKyBUaGlzIHdpbGwgY29tcGFyZSB0d28gamF2YXNj
cmlwdCB2YWx1ZXMgb2YgcG9zc2libHkgZGlmZmVyZW50IHR5cGVzLgorIEl0IHdpbGwgdGVsbCB5
b3Ugd2hpY2ggb25lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIgYnkgcmV0dXJuaW5nOgorCisg
IC0gLTEgaWYgdGhlIGZpcnN0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2Vjb25kLAorICAtIDAgaWYg
Ym90aCBhcmUgZXF1YWwsCisgIC0gMSBpZiB0aGUgZmlyc3QgaXMgZ3JlYXRlciB0aGFuIHRoZSBz
ZWNvbmQuCisKKyBUaGUgb3JkZXIgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBgRW1iZXIuT1JERVJf
REVGSU5JVElPTmAsIGlmIHR5cGVzIGFyZSBkaWZmZXJlbnQuCisgSW4gY2FzZSB0aGV5IGhhdmUg
dGhlIHNhbWUgdHlwZSBhbiBhcHByb3ByaWF0ZSBjb21wYXJpc29uIGZvciB0aGlzIHR5cGUgaXMg
bWFkZS4KKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLmNvbXBhcmUoJ2hlbGxvJywgJ2hlbGxv
Jyk7ICAvLyAwCisgIEVtYmVyLmNvbXBhcmUoJ2FiYycsICdkZmcnKTsgICAgICAvLyAtMQorICBF
bWJlci5jb21wYXJlKDIsIDEpOyAgICAgICAgICAgICAgLy8gMQorICBgYGAKKworIEBtZXRob2Qg
Y29tcGFyZQorIEBmb3IgRW1iZXIKKyBAcGFyYW0ge09iamVjdH0gdiBGaXJzdCB2YWx1ZSB0byBj
b21wYXJlCisgQHBhcmFtIHtPYmplY3R9IHcgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUKKyBAcmV0
dXJuIHtOdW1iZXJ9IC0xIGlmIHYgPCB3LCAwIGlmIHYgPSB3IGFuZCAxIGlmIHYgPiB3LgorKi8K
K0VtYmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKHYsIHcpIHsKKyAgaWYgKHYgPT09IHcp
IHsgcmV0dXJuIDA7IH0KKworICB2YXIgdHlwZTEgPSBFbWJlci50eXBlT2Yodik7CisgIHZhciB0
eXBlMiA9IEVtYmVyLnR5cGVPZih3KTsKKworICB2YXIgQ29tcGFyYWJsZSA9IEVtYmVyLkNvbXBh
cmFibGU7CisgIGlmIChDb21wYXJhYmxlKSB7CisgICAgaWYgKHR5cGUxPT09J2luc3RhbmNlJyAm
JiBDb21wYXJhYmxlLmRldGVjdCh2LmNvbnN0cnVjdG9yKSkgeworICAgICAgcmV0dXJuIHYuY29u
c3RydWN0b3IuY29tcGFyZSh2LCB3KTsKKyAgICB9CisKKyAgICBpZiAodHlwZTIgPT09ICdpbnN0
YW5jZScgJiYgQ29tcGFyYWJsZS5kZXRlY3Qody5jb25zdHJ1Y3RvcikpIHsKKyAgICAgIHJldHVy
biAxLXcuY29uc3RydWN0b3IuY29tcGFyZSh3LCB2KTsKKyAgICB9CisgIH0KKworICAvLyBJZiB3
ZSBoYXZlbid0IHlldCBnZW5lcmF0ZWQgYSByZXZlcnNlLW1hcHBpbmcgb2YgRW1iZXIuT1JERVJf
REVGSU5JVElPTiwKKyAgLy8gZG8gc28gbm93LgorICB2YXIgbWFwcGluZyA9IEVtYmVyLk9SREVS
X0RFRklOSVRJT05fTUFQUElORzsKKyAgaWYgKCFtYXBwaW5nKSB7CisgICAgdmFyIG9yZGVyID0g
RW1iZXIuT1JERVJfREVGSU5JVElPTjsKKyAgICBtYXBwaW5nID0gRW1iZXIuT1JERVJfREVGSU5J
VElPTl9NQVBQSU5HID0ge307CisgICAgdmFyIGlkeCwgbGVuOworICAgIGZvciAoaWR4ID0gMCwg
bGVuID0gb3JkZXIubGVuZ3RoOyBpZHggPCBsZW47ICArK2lkeCkgeworICAgICAgbWFwcGluZ1tv
cmRlcltpZHhdXSA9IGlkeDsKKyAgICB9CisKKyAgICAvLyBXZSBubyBsb25nZXIgbmVlZCBFbWJl
ci5PUkRFUl9ERUZJTklUSU9OLgorICAgIGRlbGV0ZSBFbWJlci5PUkRFUl9ERUZJTklUSU9OOwor
ICB9CisKKyAgdmFyIHR5cGUxSW5kZXggPSBtYXBwaW5nW3R5cGUxXTsKKyAgdmFyIHR5cGUySW5k
ZXggPSBtYXBwaW5nW3R5cGUyXTsKKworICBpZiAodHlwZTFJbmRleCA8IHR5cGUySW5kZXgpIHsg
cmV0dXJuIC0xOyB9CisgIGlmICh0eXBlMUluZGV4ID4gdHlwZTJJbmRleCkgeyByZXR1cm4gMTsg
fQorCisgIC8vIHR5cGVzIGFyZSBlcXVhbCAtIHNvIHdlIGhhdmUgdG8gY2hlY2sgdmFsdWVzIG5v
dworICBzd2l0Y2ggKHR5cGUxKSB7CisgICAgY2FzZSAnYm9vbGVhbic6CisgICAgY2FzZSAnbnVt
YmVyJzoKKyAgICAgIGlmICh2IDwgdykgeyByZXR1cm4gLTE7IH0KKyAgICAgIGlmICh2ID4gdykg
eyByZXR1cm4gMTsgfQorICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlICdzdHJpbmcnOgorICAg
ICAgdmFyIGNvbXAgPSB2LmxvY2FsZUNvbXBhcmUodyk7CisgICAgICBpZiAoY29tcCA8IDApIHsg
cmV0dXJuIC0xOyB9CisgICAgICBpZiAoY29tcCA+IDApIHsgcmV0dXJuIDE7IH0KKyAgICAgIHJl
dHVybiAwOworCisgICAgY2FzZSAnYXJyYXknOgorICAgICAgdmFyIHZMZW4gPSB2Lmxlbmd0aDsK
KyAgICAgIHZhciB3TGVuID0gdy5sZW5ndGg7CisgICAgICB2YXIgbCA9IE1hdGgubWluKHZMZW4s
IHdMZW4pOworICAgICAgdmFyIHIgPSAwOworICAgICAgdmFyIGkgPSAwOworICAgICAgd2hpbGUg
KHIgPT09IDAgJiYgaSA8IGwpIHsKKyAgICAgICAgciA9IGNvbXBhcmUodltpXSx3W2ldKTsKKyAg
ICAgICAgaSsrOworICAgICAgfQorICAgICAgaWYgKHIgIT09IDApIHsgcmV0dXJuIHI7IH0KKwor
ICAgICAgLy8gYWxsIGVsZW1lbnRzIGFyZSBlcXVhbCBub3cKKyAgICAgIC8vIHNob3J0ZXIgYXJy
YXkgc2hvdWxkIGJlIG9yZGVyZWQgZmlyc3QKKyAgICAgIGlmICh2TGVuIDwgd0xlbikgeyByZXR1
cm4gLTE7IH0KKyAgICAgIGlmICh2TGVuID4gd0xlbikgeyByZXR1cm4gMTsgfQorICAgICAgLy8g
YXJyYXlzIGFyZSBlcXVhbCBub3cKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSAnaW5zdGFu
Y2UnOgorICAgICAgaWYgKEVtYmVyLkNvbXBhcmFibGUgJiYgRW1iZXIuQ29tcGFyYWJsZS5kZXRl
Y3QodikpIHsKKyAgICAgICAgcmV0dXJuIHYuY29tcGFyZSh2LCB3KTsKKyAgICAgIH0KKyAgICAg
IHJldHVybiAwOworCisgICAgY2FzZSAnZGF0ZSc6CisgICAgICB2YXIgdk51bSA9IHYuZ2V0VGlt
ZSgpOworICAgICAgdmFyIHdOdW0gPSB3LmdldFRpbWUoKTsKKyAgICAgIGlmICh2TnVtIDwgd051
bSkgeyByZXR1cm4gLTE7IH0KKyAgICAgIGlmICh2TnVtID4gd051bSkgeyByZXR1cm4gMTsgfQor
ICAgICAgcmV0dXJuIDA7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK307
CisKK2Z1bmN0aW9uIF9jb3B5KG9iaiwgZGVlcCwgc2VlbiwgY29waWVzKSB7CisgIHZhciByZXQs
IGxvYywga2V5OworCisgIC8vIHByaW1pdGl2ZSBkYXRhIHR5cGVzIGFyZSBpbW11dGFibGUsIGp1
c3QgcmV0dXJuIHRoZW0uCisgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1u
dWxsKSByZXR1cm4gb2JqOworCisgIC8vIGF2b2lkIGN5Y2xpY2FsIGxvb3BzCisgIGlmIChkZWVw
ICYmIChsb2M9aW5kZXhPZihzZWVuLCBvYmopKT49MCkgcmV0dXJuIGNvcGllc1tsb2NdOworCisg
IEVtYmVyLmFzc2VydCgnQ2Fubm90IGNsb25lIGFuIEVtYmVyLk9iamVjdCB0aGF0IGRvZXMgbm90
IGltcGxlbWVudCBFbWJlci5Db3B5YWJsZScsICEob2JqIGluc3RhbmNlb2YgRW1iZXIuT2JqZWN0
KSB8fCAoRW1iZXIuQ29weWFibGUgJiYgRW1iZXIuQ29weWFibGUuZGV0ZWN0KG9iaikpKTsKKwor
ICAvLyBJTVBPUlRBTlQ6IHRoaXMgc3BlY2lmaWMgdGVzdCB3aWxsIGRldGVjdCBhIG5hdGl2ZSBh
cnJheSBvbmx5LiBBbnkgb3RoZXIKKyAgLy8gb2JqZWN0IHdpbGwgbmVlZCB0byBpbXBsZW1lbnQg
Q29weWFibGUuCisgIGlmIChFbWJlci50eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeworICAgIHJl
dCA9IG9iai5zbGljZSgpOworICAgIGlmIChkZWVwKSB7CisgICAgICBsb2MgPSByZXQubGVuZ3Ro
OworICAgICAgd2hpbGUoLS1sb2M+PTApIHJldFtsb2NdID0gX2NvcHkocmV0W2xvY10sIGRlZXAs
IHNlZW4sIGNvcGllcyk7CisgICAgfQorICB9IGVsc2UgaWYgKEVtYmVyLkNvcHlhYmxlICYmIEVt
YmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSB7CisgICAgcmV0ID0gb2JqLmNvcHkoZGVlcCwgc2Vl
biwgY29waWVzKTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSB7fTsKKyAgICBmb3Ioa2V5IGluIG9i
aikgeworICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7CisKKyAg
ICAgIC8vIFByZXZlbnRzIGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJp
bGl0eSBmcm9tCisgICAgICAvLyBjb3B5aW5nIGludGVybmFsIEVtYmVyIHByb3BlcnRpZXMKKyAg
ICAgIGlmIChrZXkuc3Vic3RyaW5nKDAsMikgPT09ICdfXycpIGNvbnRpbnVlOworCisgICAgICBy
ZXRba2V5XSA9IGRlZXAgPyBfY29weShvYmpba2V5XSwgZGVlcCwgc2VlbiwgY29waWVzKSA6IG9i
altrZXldOworICAgIH0KKyAgfQorCisgIGlmIChkZWVwKSB7CisgICAgc2Vlbi5wdXNoKG9iaik7
CisgICAgY29waWVzLnB1c2gocmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgor
ICBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIHBhc3NlZCBvYmplY3QuIFRoaXMgZnVuY3Rpb24gY2Fu
IHRha2UganVzdCBhYm91dAorICBhbnkgdHlwZSBvZiBvYmplY3QgYW5kIGNyZWF0ZSBhIGNsb25l
IG9mIGl0LCBpbmNsdWRpbmcgcHJpbWl0aXZlIHZhbHVlcworICAod2hpY2ggYXJlIG5vdCBhY3R1
YWxseSBjbG9uZWQgYmVjYXVzZSB0aGV5IGFyZSBpbW11dGFibGUpLgorCisgIElmIHRoZSBwYXNz
ZWQgb2JqZWN0IGltcGxlbWVudHMgdGhlIGBjbG9uZSgpYCBtZXRob2QsIHRoZW4gdGhpcyBmdW5j
dGlvbgorICB3aWxsIHNpbXBseSBjYWxsIHRoYXQgbWV0aG9kIGFuZCByZXR1cm4gdGhlIHJlc3Vs
dC4KKworICBAbWV0aG9kIGNvcHkKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gb2Jq
ZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUKKyAgQHBhcmFtIHtCb29sZWFufSBkZWVwIElmIHRydWUs
IGEgZGVlcCBjb3B5IG9mIHRoZSBvYmplY3QgaXMgbWFkZQorICBAcmV0dXJuIHtPYmplY3R9IFRo
ZSBjbG9uZWQgb2JqZWN0CisqLworRW1iZXIuY29weSA9IGZ1bmN0aW9uKG9iaiwgZGVlcCkgewor
ICAvLyBmYXN0IHBhdGhzCisgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1u
dWxsKSByZXR1cm4gb2JqOyAvLyBjYW4ndCBjb3B5IHByaW1pdGl2ZXMKKyAgaWYgKEVtYmVyLkNv
cHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSByZXR1cm4gb2JqLmNvcHkoZGVl
cCk7CisgIHJldHVybiBfY29weShvYmosIGRlZXAsIGRlZXAgPyBbXSA6IG51bGwsIGRlZXAgPyBb
XSA6IG51bGwpOworfTsKKworLyoqCisgIENvbnZlbmllbmNlIG1ldGhvZCB0byBpbnNwZWN0IGFu
IG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgIGNvbnZlcnQgdGhlIG9iamVj
dCBpbnRvIGEgdXNlZnVsIHN0cmluZyBkZXNjcmlwdGlvbi4KKworICBJdCBpcyBhIHByZXR0eSBz
aW1wbGUgaW1wbGVtZW50YXRpb24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBtb3JlIHJvYnVzdCwK
KyAgdXNlIHNvbWV0aGluZyBsaWtlIEpTRHVtcDogaHR0cHM6Ly9naXRodWIuY29tL05WL2pzRHVt
cAorCisgIEBtZXRob2QgaW5zcGVjdAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBv
YmogVGhlIG9iamVjdCB5b3Ugd2FudCB0byBpbnNwZWN0LgorICBAcmV0dXJuIHtTdHJpbmd9IEEg
ZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdAorKi8KK0VtYmVyLmluc3BlY3QgPSBmdW5jdGlvbihv
YmopIHsKKyAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgewor
ICAgIHJldHVybiBvYmogKyAnJzsKKyAgfQorCisgIHZhciB2LCByZXQgPSBbXTsKKyAgZm9yKHZh
ciBrZXkgaW4gb2JqKSB7CisgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAg
ICB2ID0gb2JqW2tleV07CisgICAgICBpZiAodiA9PT0gJ3RvU3RyaW5nJykgeyBjb250aW51ZTsg
fSAvLyBpZ25vcmUgdXNlbGVzcyBpdGVtcworICAgICAgaWYgKEVtYmVyLnR5cGVPZih2KSA9PT0g
J2Z1bmN0aW9uJykgeyB2ID0gImZ1bmN0aW9uKCkgeyAuLi4gfSI7IH0KKyAgICAgIHJldC5wdXNo
KGtleSArICI6ICIgKyB2KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICJ7IiArIHJldC5qb2luKCIs
ICIpICsgIn0iOworfTsKKworLyoqCisgIENvbXBhcmVzIHR3byBvYmplY3RzLCByZXR1cm5pbmcg
dHJ1ZSBpZiB0aGV5IGFyZSBsb2dpY2FsbHkgZXF1YWwuIFRoaXMgaXMKKyAgYSBkZWVwZXIgY29t
cGFyaXNvbiB0aGFuIGEgc2ltcGxlIHRyaXBsZSBlcXVhbC4gRm9yIHNldHMgaXQgd2lsbCBjb21w
YXJlIHRoZQorICBpbnRlcm5hbCBvYmplY3RzLiBGb3IgYW55IG90aGVyIG9iamVjdCB0aGF0IGlt
cGxlbWVudHMgYGlzRXF1YWwoKWAgaXQgd2lsbAorICByZXNwZWN0IHRoYXQgbWV0aG9kLgorCisg
IGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuaXNFcXVhbCgnaGVsbG8nLCAnaGVsbG8nKTsgIC8vIHRy
dWUKKyAgRW1iZXIuaXNFcXVhbCgxLCAyKTsgICAgICAgICAgICAgIC8vIGZhbHNlCisgIEVtYmVy
LmlzRXF1YWwoWzQsMl0sIFs0LDJdKTsgICAgICAvLyBmYWxzZQorICBgYGAKKworICBAbWV0aG9k
IGlzRXF1YWwKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gYSBmaXJzdCBvYmplY3Qg
dG8gY29tcGFyZQorICBAcGFyYW0ge09iamVjdH0gYiBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUK
KyAgQHJldHVybiB7Qm9vbGVhbn0KKyovCitFbWJlci5pc0VxdWFsID0gZnVuY3Rpb24oYSwgYikg
eworICBpZiAoYSAmJiAnZnVuY3Rpb24nPT09dHlwZW9mIGEuaXNFcXVhbCkgcmV0dXJuIGEuaXNF
cXVhbChiKTsKKyAgcmV0dXJuIGEgPT09IGI7Cit9OworCisvLyBVc2VkIGJ5IEVtYmVyLmNvbXBh
cmUKK0VtYmVyLk9SREVSX0RFRklOSVRJT04gPSBFbWJlci5FTlYuT1JERVJfREVGSU5JVElPTiB8
fCBbCisgICd1bmRlZmluZWQnLAorICAnbnVsbCcsCisgICdib29sZWFuJywKKyAgJ251bWJlcics
CisgICdzdHJpbmcnLAorICAnYXJyYXknLAorICAnb2JqZWN0JywKKyAgJ2luc3RhbmNlJywKKyAg
J2Z1bmN0aW9uJywKKyAgJ2NsYXNzJywKKyAgJ2RhdGUnCitdOworCisvKioKKyAgUmV0dXJucyBh
bGwgb2YgdGhlIGtleXMgZGVmaW5lZCBvbiBhbiBvYmplY3Qgb3IgaGFzaC4gVGhpcyBpcyB1c2Vm
dWwKKyAgd2hlbiBpbnNwZWN0aW5nIG9iamVjdHMgZm9yIGRlYnVnZ2luZy4gT24gYnJvd3NlcnMg
dGhhdCBzdXBwb3J0IGl0LCB0aGlzCisgIHVzZXMgdGhlIG5hdGl2ZSBgT2JqZWN0LmtleXNgIGlt
cGxlbWVudGF0aW9uLgorCisgIEBtZXRob2Qga2V5cworICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7
T2JqZWN0fSBvYmoKKyAgQHJldHVybiB7QXJyYXl9IEFycmF5IGNvbnRhaW5pbmcga2V5cyBvZiBv
YmoKKyovCitFbWJlci5rZXlzID0gT2JqZWN0LmtleXM7CisKK2lmICghRW1iZXIua2V5cykgewor
ICBFbWJlci5rZXlzID0gZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIHJldCA9IFtdOworICAgIGZv
cih2YXIga2V5IGluIG9iaikgeworICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7
IHJldC5wdXNoKGtleSk7IH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfTsKK30KKworLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgorLy8gRVJST1IKKy8vCisKK3ZhciBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxl
TmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2sn
XTsKKworLyoqCisgIEEgc3ViY2xhc3Mgb2YgdGhlIEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0IGZv
ciB1c2UgaW4gRW1iZXIuCisKKyAgQGNsYXNzIEVycm9yCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
QGV4dGVuZHMgRXJyb3IKKyAgQGNvbnN0cnVjdG9yCisqLworRW1iZXIuRXJyb3IgPSBmdW5jdGlv
bigpIHsKKyAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOworCisgIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFyZSBub3QgZW51bWVy
YWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRtcGAgZG9lc24ndCB3
b3JrLgorICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4Kysp
IHsKKyAgICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTsKKyAg
fQorfTsKKworRW1iZXIuRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVycm9yLnByb3Rv
dHlwZSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIK
K0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KKwordmFyIFNUUklOR19EQVNIRVJJWkVfUkVH
RVhQID0gKC9bIF9dL2cpOwordmFyIFNUUklOR19EQVNIRVJJWkVfQ0FDSEUgPSB7fTsKK3ZhciBT
VFJJTkdfREVDQU1FTElaRV9SRUdFWFAgPSAoLyhbYS16XSkoW0EtWl0pL2cpOwordmFyIFNUUklO
R19DQU1FTElaRV9SRUdFWFAgPSAoLyhcLXxffFwufFxzKSsoLik/L2cpOwordmFyIFNUUklOR19V
TkRFUlNDT1JFX1JFR0VYUF8xID0gKC8oW2EtelxkXSkoW0EtWl0rKS9nKTsKK3ZhciBTVFJJTkdf
VU5ERVJTQ09SRV9SRUdFWFBfMiA9ICgvXC18XHMrL2cpOworCisvKioKKyAgRGVmaW5lcyB0aGUg
aGFzaCBvZiBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuIFVzZWQg
YnkKKyAgdGhlIGBFbWJlci5TdHJpbmcubG9jKClgIGhlbHBlci4gVG8gbG9jYWxpemUsIGFkZCBz
dHJpbmcgdmFsdWVzIHRvIHRoaXMKKyAgaGFzaC4KKworICBAcHJvcGVydHkgU1RSSU5HUworICBA
Zm9yIEVtYmVyCisgIEB0eXBlIEhhc2gKKyovCitFbWJlci5TVFJJTkdTID0ge307CisKKy8qKgor
ICBEZWZpbmVzIHN0cmluZyBoZWxwZXIgbWV0aG9kcyBpbmNsdWRpbmcgc3RyaW5nIGZvcm1hdHRp
bmcgYW5kIGxvY2FsaXphdGlvbi4KKyAgVW5sZXNzIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5T
dHJpbmdgIGlzIGBmYWxzZWAgdGhlc2UgbWV0aG9kcyB3aWxsIGFsc28gYmUKKyAgYWRkZWQgdG8g
dGhlIGBTdHJpbmcucHJvdG90eXBlYCBhcyB3ZWxsLgorCisgIEBjbGFzcyBTdHJpbmcKKyAgQG5h
bWVzcGFjZSBFbWJlcgorICBAc3RhdGljCisqLworRW1iZXIuU3RyaW5nID0geworCisgIC8qKgor
ICAgIEFwcGx5IGZvcm1hdHRpbmcgb3B0aW9ucyB0byB0aGUgc3RyaW5nLiBUaGlzIHdpbGwgbG9v
ayBmb3Igb2NjdXJyZW5jZXMKKyAgICBvZiAiJUAiIGluIHlvdXIgc3RyaW5nIGFuZCBzdWJzdGl0
dXRlIHRoZW0gd2l0aCB0aGUgYXJndW1lbnRzIHlvdSBwYXNzIGludG8KKyAgICB0aGlzIG1ldGhv
ZC4gSWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgc3BlY2lmaWMgb3JkZXIgb2YgcmVwbGFjZW1l
bnQsCisgICAgeW91IGNhbiBhZGQgYSBudW1iZXIgYWZ0ZXIgdGhlIGtleSBhcyB3ZWxsIHRvIGlu
ZGljYXRlIHdoaWNoIGFyZ3VtZW50CisgICAgeW91IHdhbnQgdG8gaW5zZXJ0LgorCisgICAgT3Jk
ZXJlZCBpbnNlcnRpb25zIGFyZSBtb3N0IHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGxvYyBzdHJpbmdz
IHdoZXJlIHZhbHVlcworICAgIHlvdSBuZWVkIHRvIGluc2VydCBtYXkgYXBwZWFyIGluIGRpZmZl
cmVudCBvcmRlcnMuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgIkhlbGxvICVAICVAIi5mbXQo
J0pvaG4nLCAnRG9lJyk7ICAgICAvLyAiSGVsbG8gSm9obiBEb2UiCisgICAgIkhlbGxvICVAMiwg
JUAxIi5mbXQoJ0pvaG4nLCAnRG9lJyk7ICAvLyAiSGVsbG8gRG9lLCBKb2huIgorICAgIGBgYAor
CisgICAgQG1ldGhvZCBmbXQKKyAgICBAcGFyYW0ge09iamVjdC4uLn0gW2FyZ3NdCisgICAgQHJl
dHVybiB7U3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nCisgICovCisgIGZtdDogZnVuY3Rpb24oc3Ry
LCBmb3JtYXRzKSB7CisgICAgLy8gZmlyc3QsIHJlcGxhY2UgYW55IE9SREVSRUQgcmVwbGFjZW1l
bnRzLgorICAgIHZhciBpZHggID0gMDsgLy8gdGhlIGN1cnJlbnQgaW5kZXggZm9yIG5vbi1udW1l
cmljYWwgcmVwbGFjZW1lbnRzCisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lQChbMC05XSspPy9n
LCBmdW5jdGlvbihzLCBhcmdJbmRleCkgeworICAgICAgYXJnSW5kZXggPSAoYXJnSW5kZXgpID8g
cGFyc2VJbnQoYXJnSW5kZXgsMCkgLSAxIDogaWR4KysgOworICAgICAgcyA9IGZvcm1hdHNbYXJn
SW5kZXhdOworICAgICAgcmV0dXJuICgocyA9PT0gbnVsbCkgPyAnKG51bGwpJyA6IChzID09PSB1
bmRlZmluZWQpID8gJycgOiBzKS50b1N0cmluZygpOworICAgIH0pIDsKKyAgfSwKKworICAvKioK
KyAgICBGb3JtYXRzIHRoZSBwYXNzZWQgc3RyaW5nLCBidXQgZmlyc3QgbG9va3MgdXAgdGhlIHN0
cmluZyBpbiB0aGUgbG9jYWxpemVkCisgICAgc3RyaW5ncyBoYXNoLiBUaGlzIGlzIGEgY29udmVu
aWVudCB3YXkgdG8gbG9jYWxpemUgdGV4dC4gU2VlCisgICAgYEVtYmVyLlN0cmluZy5mbXQoKWAg
Zm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZm9ybWF0dGluZy4KKworICAgIE5vdGUgdGhhdCBpdCBp
cyB0cmFkaXRpb25hbCBidXQgbm90IHJlcXVpcmVkIHRvIHByZWZpeCBsb2NhbGl6ZWQgc3RyaW5n
CisgICAga2V5cyB3aXRoIGFuIHVuZGVyc2NvcmUgb3Igb3RoZXIgY2hhcmFjdGVyIHNvIHlvdSBj
YW4gZWFzaWx5IGlkZW50aWZ5CisgICAgbG9jYWxpemVkIHN0cmluZ3MuCisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgRW1iZXIuU1RSSU5HUyA9IHsKKyAgICAgICdfSGVsbG8gV29ybGQnOiAnQm9u
am91ciBsZSBtb25kZScsCisgICAgICAnX0hlbGxvICVAICVAJzogJ0JvbmpvdXIgJUAgJUAnCisg
ICAgfTsKKworICAgIEVtYmVyLlN0cmluZy5sb2MoIl9IZWxsbyBXb3JsZCIpOyAgLy8gJ0Jvbmpv
dXIgbGUgbW9uZGUnOworICAgIEVtYmVyLlN0cmluZy5sb2MoIl9IZWxsbyAlQCAlQCIsIFsiSm9o
biIsICJTbWl0aCJdKTsgIC8vICJCb25qb3VyIEpvaG4gU21pdGgiOworICAgIGBgYAorCisgICAg
QG1ldGhvZCBsb2MKKyAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZm9ybWF0
CisgICAgQHBhcmFtIHtBcnJheX0gZm9ybWF0cyBPcHRpb25hbCBhcnJheSBvZiBwYXJhbWV0ZXJz
IHRvIGludGVycG9sYXRlIGludG8gc3RyaW5nLgorICAgIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0
dGVkIHN0cmluZworICAqLworICBsb2M6IGZ1bmN0aW9uKHN0ciwgZm9ybWF0cykgeworICAgIHN0
ciA9IEVtYmVyLlNUUklOR1Nbc3RyXSB8fCBzdHI7CisgICAgcmV0dXJuIEVtYmVyLlN0cmluZy5m
bXQoc3RyLCBmb3JtYXRzKSA7CisgIH0sCisKKyAgLyoqCisgICAgU3BsaXRzIGEgc3RyaW5nIGlu
dG8gc2VwYXJhdGUgdW5pdHMgc2VwYXJhdGVkIGJ5IHNwYWNlcywgZWxpbWluYXRpbmcgYW55Cisg
ICAgZW1wdHkgc3RyaW5ncyBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1l
dGhvZCBmb3Igc3BsaXQgdGhhdAorICAgIGlzIG1vc3RseSB1c2VmdWwgd2hlbiBhcHBsaWVkIHRv
IHRoZSBgU3RyaW5nLnByb3RvdHlwZWAuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIu
U3RyaW5nLncoImFscGhhIGJldGEgZ2FtbWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeworICAg
ICAgY29uc29sZS5sb2coa2V5KTsKKyAgICB9KTsKKworICAgIC8vID4gYWxwaGEKKyAgICAvLyA+
IGJldGEKKyAgICAvLyA+IGdhbW1hCisgICAgYGBgCisKKyAgICBAbWV0aG9kIHcKKyAgICBAcGFy
YW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gc3BsaXQKKyAgICBAcmV0dXJuIHtTdHJpbmd9
IHNwbGl0IHN0cmluZworICAqLworICB3OiBmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci5zcGxp
dCgvXHMrLyk7IH0sCisKKyAgLyoqCisgICAgQ29udmVydHMgYSBjYW1lbGl6ZWQgc3RyaW5nIGlu
dG8gYWxsIGxvd2VyIGNhc2Ugc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLgorCisgICAgYGBgamF2
YXNjcmlwdAorICAgICdpbm5lckhUTUwnLmRlY2FtZWxpemUoKTsgICAgICAgICAgIC8vICdpbm5l
cl9odG1sJworICAgICdhY3Rpb25fbmFtZScuZGVjYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2FjdGlv
bl9uYW1lJworICAgICdjc3MtY2xhc3MtbmFtZScuZGVjYW1lbGl6ZSgpOyAgICAgLy8gJ2Nzcy1j
bGFzcy1uYW1lJworICAgICdteSBmYXZvcml0ZSBpdGVtcycuZGVjYW1lbGl6ZSgpOyAgLy8gJ215
IGZhdm9yaXRlIGl0ZW1zJworICAgIGBgYAorCisgICAgQG1ldGhvZCBkZWNhbWVsaXplCisgICAg
QHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGRlY2FtZWxpemUuCisgICAgQHJldHVy
biB7U3RyaW5nfSB0aGUgZGVjYW1lbGl6ZWQgc3RyaW5nLgorICAqLworICBkZWNhbWVsaXplOiBm
dW5jdGlvbihzdHIpIHsKKyAgICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX0RFQ0FNRUxJWkVf
UkVHRVhQLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpOworICB9LAorCisgIC8qKgorICAgIFJlcGxh
Y2VzIHVuZGVyc2NvcmVzIG9yIHNwYWNlcyB3aXRoIGRhc2hlcy4KKworICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAnaW5uZXJIVE1MJy5kYXNoZXJpemUoKTsgICAgICAgICAgLy8gJ2lubmVyLWh0bWwn
CisgICAgJ2FjdGlvbl9uYW1lJy5kYXNoZXJpemUoKTsgICAgICAgIC8vICdhY3Rpb24tbmFtZScK
KyAgICAnY3NzLWNsYXNzLW5hbWUnLmRhc2hlcml6ZSgpOyAgICAgLy8gJ2Nzcy1jbGFzcy1uYW1l
JworICAgICdteSBmYXZvcml0ZSBpdGVtcycuZGFzaGVyaXplKCk7ICAvLyAnbXktZmF2b3JpdGUt
aXRlbXMnCisgICAgYGBgCisKKyAgICBAbWV0aG9kIGRhc2hlcml6ZQorICAgIEBwYXJhbSB7U3Ry
aW5nfSBzdHIgVGhlIHN0cmluZyB0byBkYXNoZXJpemUuCisgICAgQHJldHVybiB7U3RyaW5nfSB0
aGUgZGFzaGVyaXplZCBzdHJpbmcuCisgICovCisgIGRhc2hlcml6ZTogZnVuY3Rpb24oc3RyKSB7
CisgICAgdmFyIGNhY2hlID0gU1RSSU5HX0RBU0hFUklaRV9DQUNIRSwKKyAgICAgICAgcmV0ICAg
PSBjYWNoZVtzdHJdOworCisgICAgaWYgKHJldCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9
IGVsc2UgeworICAgICAgcmV0ID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUoc3RyKS5yZXBsYWNl
KFNUUklOR19EQVNIRVJJWkVfUkVHRVhQLCctJyk7CisgICAgICBjYWNoZVtzdHJdID0gcmV0Owor
ICAgIH0KKworICAgIHJldHVybiByZXQ7CisgIH0sCisKKyAgLyoqCisgICAgUmV0dXJucyB0aGUg
bG93ZXJDYXNlQ2FtZWwgZm9ybSBvZiBhIHN0cmluZy4KKworICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAnaW5uZXJIVE1MJy5jYW1lbGl6ZSgpOyAgICAgICAgICAvLyAnaW5uZXJIVE1MJworICAgICdh
Y3Rpb25fbmFtZScuY2FtZWxpemUoKTsgICAgICAgIC8vICdhY3Rpb25OYW1lJworICAgICdjc3Mt
Y2xhc3MtbmFtZScuY2FtZWxpemUoKTsgICAgIC8vICdjc3NDbGFzc05hbWUnCisgICAgJ215IGZh
dm9yaXRlIGl0ZW1zJy5jYW1lbGl6ZSgpOyAgLy8gJ215RmF2b3JpdGVJdGVtcycKKyAgICBgYGAK
KworICAgIEBtZXRob2QgY2FtZWxpemUKKyAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJp
bmcgdG8gY2FtZWxpemUuCisgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgY2FtZWxpemVkIHN0cmlu
Zy4KKyAgKi8KKyAgY2FtZWxpemU6IGZ1bmN0aW9uKHN0cikgeworICAgIHJldHVybiBzdHIucmVw
bGFjZShTVFJJTkdfQ0FNRUxJWkVfUkVHRVhQLCBmdW5jdGlvbihtYXRjaCwgc2VwYXJhdG9yLCBj
aHIpIHsKKyAgICAgIHJldHVybiBjaHIgPyBjaHIudG9VcHBlckNhc2UoKSA6ICcnOworICAgIH0p
OworICB9LAorCisgIC8qKgorICAgIFJldHVybnMgdGhlIFVwcGVyQ2FtZWxDYXNlIGZvcm0gb2Yg
YSBzdHJpbmcuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgJ2lubmVySFRNTCcuY2xhc3NpZnko
KTsgICAgICAgICAgLy8gJ0lubmVySFRNTCcKKyAgICAnYWN0aW9uX25hbWUnLmNsYXNzaWZ5KCk7
ICAgICAgICAvLyAnQWN0aW9uTmFtZScKKyAgICAnY3NzLWNsYXNzLW5hbWUnLmNsYXNzaWZ5KCk7
ICAgICAvLyAnQ3NzQ2xhc3NOYW1lJworICAgICdteSBmYXZvcml0ZSBpdGVtcycuY2xhc3NpZnko
KTsgIC8vICdNeUZhdm9yaXRlSXRlbXMnCisgICAgYGBgIAorCisgICAgQG1ldGhvZCBjbGFzc2lm
eQorICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBjbGFzc2lmeQorICAgIEBy
ZXR1cm4ge1N0cmluZ30gdGhlIGNsYXNzaWZpZWQgc3RyaW5nCisgICovCisgIGNsYXNzaWZ5OiBm
dW5jdGlvbihzdHIpIHsKKyAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoIi4iKSwKKyAgICAgICAg
b3V0ID0gW107CisKKyAgICBmb3IgKHZhciBpPTAsIGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykg
eworICAgICAgdmFyIGNhbWVsaXplZCA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZShwYXJ0c1tpXSk7
CisgICAgICBvdXQucHVzaChjYW1lbGl6ZWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjYW1l
bGl6ZWQuc3Vic3RyKDEpKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LmpvaW4oIi4iKTsKKyAg
fSwKKworICAvKioKKyAgICBNb3JlIGdlbmVyYWwgdGhhbiBkZWNhbWVsaXplLiBSZXR1cm5zIHRo
ZSBsb3dlclxfY2FzZVxfYW5kXF91bmRlcnNjb3JlZAorICAgIGZvcm0gb2YgYSBzdHJpbmcuCisK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgJ2lubmVySFRNTCcudW5kZXJzY29yZSgpOyAgICAgICAg
ICAvLyAnaW5uZXJfaHRtbCcKKyAgICAnYWN0aW9uX25hbWUnLnVuZGVyc2NvcmUoKTsgICAgICAg
IC8vICdhY3Rpb25fbmFtZScKKyAgICAnY3NzLWNsYXNzLW5hbWUnLnVuZGVyc2NvcmUoKTsgICAg
IC8vICdjc3NfY2xhc3NfbmFtZScKKyAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLnVuZGVyc2NvcmUo
KTsgIC8vICdteV9mYXZvcml0ZV9pdGVtcycKKyAgICBgYGAKKworICAgIEBtZXRob2QgdW5kZXJz
Y29yZQorICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byB1bmRlcnNjb3JlLgor
ICAgIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuZGVyc2NvcmVkIHN0cmluZy4KKyAgKi8KKyAgdW5k
ZXJzY29yZTogZnVuY3Rpb24oc3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19V
TkRFUlNDT1JFX1JFR0VYUF8xLCAnJDFfJDInKS4KKyAgICAgIHJlcGxhY2UoU1RSSU5HX1VOREVS
U0NPUkVfUkVHRVhQXzIsICdfJykudG9Mb3dlckNhc2UoKTsKKyAgfSwKKworICAvKioKKyAgICBS
ZXR1cm5zIHRoZSBDYXBpdGFsaXplZCBmb3JtIG9mIGEgc3RyaW5nCisKKyAgICAgICAnaW5uZXJI
VE1MJy5jYXBpdGFsaXplKCkgICAgICAgICA9PiAnSW5uZXJIVE1MJworICAgICAgICdhY3Rpb25f
bmFtZScuY2FwaXRhbGl6ZSgpICAgICAgID0+ICdBY3Rpb25fbmFtZScKKyAgICAgICAnY3NzLWNs
YXNzLW5hbWUnLmNhcGl0YWxpemUoKSAgICA9PiAnQ3NzLWNsYXNzLW5hbWUnCisgICAgICAgJ215
IGZhdm9yaXRlIGl0ZW1zJy5jYXBpdGFsaXplKCkgPT4gJ015IGZhdm9yaXRlIGl0ZW1zJworCisg
ICAgQG1ldGhvZCBjYXBpdGFsaXplCisgICAgQHBhcmFtIHtTdHJpbmd9IHN0cgorICAgIEByZXR1
cm4ge1N0cmluZ30KKyAgKi8KKyAgY2FwaXRhbGl6ZTogZnVuY3Rpb24oc3RyKSB7CisgICAgcmV0
dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHIoMSk7CisgIH0KKwor
fTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1
Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCisKKwordmFyIGZtdCA9IEVtYmVyLlN0cmluZy5m
bXQsCisgICAgdyAgID0gRW1iZXIuU3RyaW5nLncsCisgICAgbG9jID0gRW1iZXIuU3RyaW5nLmxv
YywKKyAgICBjYW1lbGl6ZSA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSwKKyAgICBkZWNhbWVsaXpl
ID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCisgICAgZGFzaGVyaXplID0gRW1iZXIuU3RyaW5n
LmRhc2hlcml6ZSwKKyAgICB1bmRlcnNjb3JlID0gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUsCisg
ICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0cmluZy5jYXBpdGFsaXplLAorICAgIGNsYXNzaWZ5ID0g
RW1iZXIuU3RyaW5nLmNsYXNzaWZ5OworCitpZiAoRW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09
IHRydWUgfHwgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nKSB7CisKKyAgLyoqCisgICAg
U2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL2ZtdCJ9fXt7L2Nyb3NzTGlua319CisKKyAg
ICBAbWV0aG9kIGZtdAorICAgIEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUu
Zm10ID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGZtdCh0aGlzLCBhcmd1bWVudHMpOworICB9
OworCisgIC8qKgorICAgIFNlZSB7eyNjcm9zc0xpbmsgIkVtYmVyLlN0cmluZy93In19e3svY3Jv
c3NMaW5rfX0KKworICAgIEBtZXRob2QgdworICAgIEBmb3IgU3RyaW5nCisgICovCisgIFN0cmlu
Zy5wcm90b3R5cGUudyA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB3KHRoaXMpOworICB9Owor
CisgIC8qKgorICAgIFNlZSB7eyNjcm9zc0xpbmsgIkVtYmVyLlN0cmluZy9sb2MifX17ey9jcm9z
c0xpbmt9fQorCisgICAgQG1ldGhvZCBsb2MKKyAgICBAZm9yIFN0cmluZworICAqLworICBTdHJp
bmcucHJvdG90eXBlLmxvYyA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBsb2ModGhpcywgYXJn
dW1lbnRzKTsKKyAgfTsKKworICAvKioKKyAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJp
bmcvY2FtZWxpemUifX17ey9jcm9zc0xpbmt9fQorCisgICAgQG1ldGhvZCBjYW1lbGl6ZQorICAg
IEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUuY2FtZWxpemUgPSBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gY2FtZWxpemUodGhpcyk7CisgIH07CisKKyAgLyoqCisgICAgU2Vl
IHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL2RlY2FtZWxpemUifX17ey9jcm9zc0xpbmt9fQor
CisgICAgQG1ldGhvZCBkZWNhbWVsaXplCisgICAgQGZvciBTdHJpbmcKKyAgKi8KKyAgU3RyaW5n
LnByb3RvdHlwZS5kZWNhbWVsaXplID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlY2FtZWxp
emUodGhpcyk7CisgIH07CisKKyAgLyoqCisgICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3Ry
aW5nL2Rhc2hlcml6ZSJ9fXt7L2Nyb3NzTGlua319CisKKyAgICBAbWV0aG9kIGRhc2hlcml6ZQor
ICAgIEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUuZGFzaGVyaXplID0gZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIGRhc2hlcml6ZSh0aGlzKTsKKyAgfTsKKworICAvKioKKyAg
ICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJpbmcvdW5kZXJzY29yZSJ9fXt7L2Nyb3NzTGlu
a319CisKKyAgICBAbWV0aG9kIHVuZGVyc2NvcmUKKyAgICBAZm9yIFN0cmluZworICAqLworICBT
dHJpbmcucHJvdG90eXBlLnVuZGVyc2NvcmUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdW5k
ZXJzY29yZSh0aGlzKTsKKyAgfTsKKworICAvKioKKyAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJl
ci5TdHJpbmcvY2xhc3NpZnkifX17ey9jcm9zc0xpbmt9fQorCisgICAgQG1ldGhvZCBjbGFzc2lm
eQorICAgIEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUuY2xhc3NpZnkgPSBm
dW5jdGlvbigpIHsKKyAgICByZXR1cm4gY2xhc3NpZnkodGhpcyk7CisgIH07CisKKyAgLyoqCisg
ICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL2NhcGl0YWxpemUifX17ey9jcm9zc0xp
bmt9fQorCisgICAgQG1ldGhvZCBjYXBpdGFsaXplCisgICAgQGZvciBTdHJpbmcKKyAgKi8KKyAg
U3RyaW5nLnByb3RvdHlwZS5jYXBpdGFsaXplID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGNh
cGl0YWxpemUodGhpcyk7CisgIH07CisKK30KKworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkg
eworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisKK3Zh
ciBhX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOworCitpZiAoRW1iZXIuRVhURU5EX1BS
T1RPVFlQRVMgPT09IHRydWUgfHwgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb24pIHsK
KworICAvKioKKyAgICBUaGUgYHByb3BlcnR5YCBleHRlbnNpb24gb2YgSmF2YXNjcmlwdCdzIEZ1
bmN0aW9uIHByb3RvdHlwZSBpcyBhdmFpbGFibGUKKyAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJP
VE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcworICAgIGB0
cnVlYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisKKyAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFs
bG93IHlvdSB0byB0cmVhdCBhIGZ1bmN0aW9uIGxpa2UgYSBwcm9wZXJ0eToKKworICAgIGBgYGph
dmFzY3JpcHQKKyAgICBNeUFwcC5wcmVzaWRlbnQgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAg
ICAgIGZpcnN0TmFtZTogIkJhcmFjayIsCisgICAgICBsYXN0TmFtZTogIk9iYW1hIiwKKworICAg
ICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0
TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CisKKyAgICAgICAgLy8gQ2FsbCB0
aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVuY3Rpb24gYXMgYSBwcm9wZXJ0eQorICAgICAgfS5wcm9w
ZXJ0eSgpCisgICAgfSk7CisKKyAgICBNeUFwcC5wcmVzaWRlbnQuZ2V0KCdmdWxsTmFtZScpOyAg
ICAvLyAiQmFyYWNrIE9iYW1hIgorICAgIGBgYAorCisgICAgVHJlYXRpbmcgYSBmdW5jdGlvbiBs
aWtlIGEgcHJvcGVydHkgaXMgdXNlZnVsIGJlY2F1c2UgdGhleSBjYW4gd29yayB3aXRoCisgICAg
YmluZGluZ3MsIGp1c3QgbGlrZSBhbnkgb3RoZXIgcHJvcGVydHkuCisKKyAgICBNYW55IGNvbXB1
dGVkIHByb3BlcnRpZXMgaGF2ZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgcHJvcGVydGllcy4gRm9y
CisgICAgZXhhbXBsZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBgZnVsbE5hbWVgIHByb3Bl
cnR5IGRlcGVuZHMgb24KKyAgICBgZmlyc3ROYW1lYCBhbmQgYGxhc3ROYW1lYCB0byBkZXRlcm1p
bmUgaXRzIHZhbHVlLiBZb3UgY2FuIHRlbGwgRW1iZXIKKyAgICBhYm91dCB0aGVzZSBkZXBlbmRl
bmNpZXMgbGlrZSB0aGlzOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15QXBwLnByZXNpZGVu
dCA9IEVtYmVyLk9iamVjdC5jcmVhdGUoeworICAgICAgZmlyc3ROYW1lOiAiQmFyYWNrIiwKKyAg
ICAgIGxhc3ROYW1lOiAiT2JhbWEiLAorCisgICAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFz
dE5hbWUnKTsKKworICAgICAgICAvLyBUZWxsIEVtYmVyLmpzIHRoYXQgdGhpcyBjb21wdXRlZCBw
cm9wZXJ0eSBkZXBlbmRzIG9uIGZpcnN0TmFtZQorICAgICAgICAvLyBhbmQgbGFzdE5hbWUKKyAg
ICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCisgICAgfSk7CisgICAgYGBg
CisKKyAgICBNYWtlIHN1cmUgeW91IGxpc3QgdGhlc2UgZGVwZW5kZW5jaWVzIHNvIEVtYmVyIGtu
b3dzIHdoZW4gdG8gdXBkYXRlCisgICAgYmluZGluZ3MgdGhhdCBjb25uZWN0IHRvIGEgY29tcHV0
ZWQgcHJvcGVydHkuIENoYW5naW5nIGEgZGVwZW5kZW5jeQorICAgIHdpbGwgbm90IGltbWVkaWF0
ZWx5IHRyaWdnZXIgYW4gdXBkYXRlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSwgYnV0CisgICAg
d2lsbCBpbnN0ZWFkIGNsZWFyIHRoZSBjYWNoZSBzbyB0aGF0IGl0IGlzIHVwZGF0ZWQgd2hlbiB0
aGUgbmV4dCBgZ2V0YAorICAgIGlzIGNhbGxlZCBvbiB0aGUgcHJvcGVydHkuCisKKyAgICBTZWUg
e3sjY3Jvc3NMaW5rICJFbWJlci5Db21wdXRlZFByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0sCisg
ICAgICB7eyNjcm9zc0xpbmsgIkVtYmVyL2NvbXB1dGVkIn19e3svY3Jvc3NMaW5rfX0KKworICAg
IEBtZXRob2QgcHJvcGVydHkKKyAgICBAZm9yIEZ1bmN0aW9uCisgICovCisgIEZ1bmN0aW9uLnBy
b3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKCkgeworICAgIHZhciByZXQgPSBFbWJlci5jb21w
dXRlZCh0aGlzKTsKKyAgICByZXR1cm4gcmV0LnByb3BlcnR5LmFwcGx5KHJldCwgYXJndW1lbnRz
KTsKKyAgfTsKKworICAvKioKKyAgICBUaGUgYG9ic2VydmVzYCBleHRlbnNpb24gb2YgSmF2YXNj
cmlwdCdzIEZ1bmN0aW9uIHByb3RvdHlwZSBpcyBhdmFpbGFibGUKKyAgICB3aGVuIGBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBp
cworICAgIHRydWUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgorCisgICAgWW91IGNhbiBvYnNlcnZl
IHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAorICAgIGNh
bGwgdG8gdGhlIGVuZCBvZiB5b3VyIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gY2xhc3NlcyB0aGF0
IHlvdSB3cml0ZS4KKyAgICBGb3IgZXhhbXBsZToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBF
bWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIHZhbHVlT2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgewor
ICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2Vz
CisgICAgICB9Lm9ic2VydmVzKCd2YWx1ZScpCisgICAgfSk7CisgICAgYGBgCisKKyAgICBTZWUg
e3sjY3Jvc3NMaW5rICJFbWJlci5PYnNlcnZhYmxlL29ic2VydmVzIn19e3svY3Jvc3NMaW5rfX0K
KworICAgIEBtZXRob2Qgb2JzZXJ2ZXMKKyAgICBAZm9yIEZ1bmN0aW9uCisgICovCisgIEZ1bmN0
aW9uLnByb3RvdHlwZS5vYnNlcnZlcyA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX19lbWJlcl9v
YnNlcnZlc19fID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgcmV0dXJuIHRoaXM7Cisg
IH07CisKKyAgLyoqCisgICAgVGhlIGBvYnNlcnZlc0JlZm9yZWAgZXh0ZW5zaW9uIG9mIEphdmFz
Y3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMKKyAgICBhdmFpbGFibGUgd2hlbiBgRW1iZXIu
RVhURU5EX1BST1RPVFlQRVNgIG9yCisgICAgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0
aW9uYCBpcyB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KKworICAgIFlvdSBjYW4gZ2V0IG5v
dGlmaWVkIHdoZW4gYSBwcm9wZXJ0eSBjaGFuZ2VzIGlzIGFib3V0IHRvIGhhcHBlbiBieQorICAg
IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzQmVmb3JlYCBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBt
ZXRob2QKKyAgICBkZWNsYXJhdGlvbnMgaW4gY2xhc3NlcyB0aGF0IHlvdSB3cml0ZS4gRm9yIGV4
YW1wbGU6CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Cisg
ICAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gRXhlY3V0ZXMgd2hl
bmV2ZXIgdGhlICJ2YWx1ZSIgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlCisgICAgICB9Lm9i
c2VydmVzQmVmb3JlKCd2YWx1ZScpCisgICAgfSk7CisgICAgYGBgCisKKyAgICBTZWUge3sjY3Jv
c3NMaW5rICJFbWJlci5PYnNlcnZhYmxlL29ic2VydmVzQmVmb3JlIn19e3svY3Jvc3NMaW5rfX0K
KworICAgIEBtZXRob2Qgb2JzZXJ2ZXNCZWZvcmUKKyAgICBAZm9yIEZ1bmN0aW9uCisgICovCisg
IEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZlc0JlZm9yZSA9IGZ1bmN0aW9uKCkgeworICAgIHRo
aXMuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Cisg
ICAgcmV0dXJuIHRoaXM7CisgIH07CisKK30KKworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkg
eworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3Vi
bW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIEhFTFBFUlMKKy8vCisKK3ZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK3ZhciBhX3NsaWNlID0gQXJyYXkucHJv
dG90eXBlLnNsaWNlOwordmFyIGFfaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRl
eE9mOworCit2YXIgY29udGV4dHMgPSBbXTsKKworZnVuY3Rpb24gcG9wQ3R4KCkgeworICByZXR1
cm4gY29udGV4dHMubGVuZ3RoPT09MCA/IHt9IDogY29udGV4dHMucG9wKCk7Cit9CisKK2Z1bmN0
aW9uIHB1c2hDdHgoY3R4KSB7CisgIGNvbnRleHRzLnB1c2goY3R4KTsKKyAgcmV0dXJuIG51bGw7
Cit9CisKK2Z1bmN0aW9uIGl0ZXIoa2V5LCB2YWx1ZSkgeworICB2YXIgdmFsdWVQcm92aWRlZCA9
IGFyZ3VtZW50cy5sZW5ndGggPT09IDI7CisKKyAgZnVuY3Rpb24gaShpdGVtKSB7CisgICAgdmFy
IGN1ciA9IGdldChpdGVtLCBrZXkpOworICAgIHJldHVybiB2YWx1ZVByb3ZpZGVkID8gdmFsdWU9
PT1jdXIgOiAhIWN1cjsKKyAgfQorICByZXR1cm4gaSA7Cit9CisKKy8qKgorICBUaGlzIG1peGlu
IGRlZmluZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgZW51bWVyYWJsZSBv
YmplY3RzCisgIGluIEVtYmVyLiBNb3N0IG9mIHRoZXNlIG1ldGhvZHMgZm9sbG93IHRoZSBzdGFu
ZGFyZCBBcnJheSBpdGVyYXRpb24KKyAgQVBJIGRlZmluZWQgdXAgdG8gSmF2YVNjcmlwdCAxLjgg
KGV4Y2x1ZGluZyBsYW5ndWFnZS1zcGVjaWZpYyBmZWF0dXJlcyB0aGF0CisgIGNhbm5vdCBiZSBl
bXVsYXRlZCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBKYXZhU2NyaXB0KS4KKworICBUaGlzIG1peGlu
IGlzIGFwcGxpZWQgYXV0b21hdGljYWxseSB0byB0aGUgQXJyYXkgY2xhc3Mgb24gcGFnZSBsb2Fk
LCBzbyB5b3UKKyAgY2FuIHVzZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiBzaW1wbGUgYXJyYXlz
LiBJZiBBcnJheSBhbHJlYWR5IGltcGxlbWVudHMKKyAgb25lIG9mIHRoZXNlIG1ldGhvZHMsIHRo
ZSBtaXhpbiB3aWxsIG5vdCBvdmVycmlkZSB0aGVtLgorCisgICMjIFdyaXRpbmcgWW91ciBPd24g
RW51bWVyYWJsZQorCisgIFRvIG1ha2UgeW91ciBvd24gY3VzdG9tIGNsYXNzIGVudW1lcmFibGUs
IHlvdSBuZWVkIHR3byBpdGVtczoKKworICAxLiBZb3UgbXVzdCBoYXZlIGEgbGVuZ3RoIHByb3Bl
cnR5LiBUaGlzIHByb3BlcnR5IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIKKyAgICAgdGhlIG51bWJl
ciBvZiBpdGVtcyBpbiB5b3VyIGVudW1lcmFibGUgb2JqZWN0IGNoYW5nZXMuIElmIHlvdSB1c2lu
ZyB0aGlzCisgICAgIHdpdGggYW4gYEVtYmVyLk9iamVjdGAgc3ViY2xhc3MsIHlvdSBzaG91bGQg
YmUgc3VyZSB0byBjaGFuZ2UgdGhlIGxlbmd0aAorICAgICBwcm9wZXJ0eSB1c2luZyBgc2V0KCku
YAorCisgIDIuIElmIHlvdSBtdXN0IGltcGxlbWVudCBgbmV4dE9iamVjdCgpLmAgU2VlIGRvY3Vt
ZW50YXRpb24uCisKKyAgT25jZSB5b3UgaGF2ZSB0aGVzZSB0d28gbWV0aG9kcyBpbXBsZW1lbnQs
IGFwcGx5IHRoZSBgRW1iZXIuRW51bWVyYWJsZWAgbWl4aW4KKyAgdG8geW91ciBjbGFzcyBhbmQg
eW91IHdpbGwgYmUgYWJsZSB0byBlbnVtZXJhdGUgdGhlIGNvbnRlbnRzIG9mIHlvdXIgb2JqZWN0
CisgIGxpa2UgYW55IG90aGVyIGNvbGxlY3Rpb24uCisKKyAgIyMgVXNpbmcgRW1iZXIgRW51bWVy
YXRpb24gd2l0aCBPdGhlciBMaWJyYXJpZXMKKworICBNYW55IG90aGVyIGxpYnJhcmllcyBwcm92
aWRlIHNvbWUga2luZCBvZiBpdGVyYXRvciBvciBlbnVtZXJhdGlvbiBsaWtlCisgIGZhY2lsaXR5
LiBUaGlzIGlzIG9mdGVuIHdoZXJlIHRoZSBtb3N0IGNvbW1vbiBBUEkgY29uZmxpY3RzIG9jY3Vy
LgorICBFbWJlcidzIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBhcyBmcmllbmRseSBhcyBwb3NzaWJs
ZSB3aXRoIG90aGVyCisgIGxpYnJhcmllcyBieSBpbXBsZW1lbnRpbmcgb25seSBtZXRob2RzIHRo
YXQgbW9zdGx5IGNvcnJlc3BvbmQgdG8gdGhlCisgIEphdmFTY3JpcHQgMS44IEFQSS4KKworICBA
Y2xhc3MgRW51bWVyYWJsZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk1p
eGluCisgIEBzaW5jZSBFbWJlciAwLjkKKyovCitFbWJlci5FbnVtZXJhYmxlID0gRW1iZXIuTWl4
aW4uY3JlYXRlKAorICAvKiogQHNjb3BlIEVtYmVyLkVudW1lcmFibGUucHJvdG90eXBlICovIHsK
KworICAvLyBjb21wYXRpYmlsaXR5CisgIGlzRW51bWVyYWJsZTogdHJ1ZSwKKworICAvKioKKyAg
ICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gbWFrZSB5b3VyIGNsYXNzIGVudW1lcmFibGUuCisK
KyAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGwgcmVwZWF0ZWRseSBkdXJpbmcgZW51bWVyYXRp
b24uIFRoZSBpbmRleCB2YWx1ZQorICAgIHdpbGwgYWx3YXlzIGJlZ2luIHdpdGggMCBhbmQgaW5j
cmVtZW50IG1vbm90b25pY2FsbHkuIFlvdSBkb24ndCBoYXZlIHRvCisgICAgcmVseSBvbiB0aGUg
aW5kZXggdmFsdWUgdG8gZGV0ZXJtaW5lIHdoYXQgb2JqZWN0IHRvIHJldHVybiwgYnV0IHlvdSBz
aG91bGQKKyAgICBhbHdheXMgY2hlY2sgdGhlIHZhbHVlIGFuZCBzdGFydCBmcm9tIHRoZSBiZWdp
bm5pbmcgd2hlbiB5b3Ugc2VlIHRoZQorICAgIHJlcXVlc3RlZCBpbmRleCBpcyAwLgorCisgICAg
VGhlIGBwcmV2aW91c09iamVjdGAgaXMgdGhlIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBmcm9t
IHRoZSBsYXN0IGNhbGwKKyAgICB0byBgbmV4dE9iamVjdGAgZm9yIHRoZSBjdXJyZW50IGl0ZXJh
dGlvbi4gVGhpcyBpcyBhIHVzZWZ1bCB3YXkgdG8KKyAgICBtYW5hZ2UgaXRlcmF0aW9uIGlmIHlv
dSBhcmUgdHJhY2luZyBhIGxpbmtlZCBsaXN0LCBmb3IgZXhhbXBsZS4KKworICAgIEZpbmFsbHkg
dGhlIGNvbnRleHQgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGNvbnRhaW4gYSBoYXNoIHlvdSBjYW4g
dXNlIGFzCisgICAgYSAic2NyYXRjaHBhZCIgdG8gbWFpbnRhaW4gYW55IG90aGVyIHN0YXRlIHlv
dSBuZWVkIGluIG9yZGVyIHRvIGl0ZXJhdGUKKyAgICBwcm9wZXJseS4gVGhlIGNvbnRleHQgb2Jq
ZWN0IGlzIHJldXNlZCBhbmQgaXMgbm90IHJlc2V0IGJldHdlZW4KKyAgICBpdGVyYXRpb25zIHNv
IG1ha2Ugc3VyZSB5b3Ugc2V0dXAgdGhlIGNvbnRleHQgd2l0aCBhIGZyZXNoIHN0YXRlIHdoZW5l
dmVyCisgICAgdGhlIGluZGV4IHBhcmFtZXRlciBpcyAwLgorCisgICAgR2VuZXJhbGx5IGl0ZXJh
dG9ycyB3aWxsIGNvbnRpbnVlIHRvIGNhbGwgYG5leHRPYmplY3RgIHVudGlsIHRoZSBpbmRleAor
ICAgIHJlYWNoZXMgdGhlIHlvdXIgY3VycmVudCBsZW5ndGgtMS4gSWYgeW91IHJ1biBvdXQgb2Yg
ZGF0YSBiZWZvcmUgdGhpcworICAgIHRpbWUgZm9yIHNvbWUgcmVhc29uLCB5b3Ugc2hvdWxkIHNp
bXBseSByZXR1cm4gdW5kZWZpbmVkLgorCisgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24g
b2YgdGhpcyBtZXRob2Qgc2ltcGx5IGxvb2tzIHVwIHRoZSBpbmRleC4KKyAgICBUaGlzIHdvcmtz
IGdyZWF0IG9uIGFueSBBcnJheS1saWtlIG9iamVjdHMuCisKKyAgICBAbWV0aG9kIG5leHRPYmpl
Y3QKKyAgICBAcGFyYW0ge051bWJlcn0gaW5kZXggdGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGl0
ZXJhdGlvbgorICAgIEBwYXJhbSB7T2JqZWN0fSBwcmV2aW91c09iamVjdCB0aGUgdmFsdWUgcmV0
dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCB0byAKKyAgICAgIGBuZXh0T2JqZWN0YC4KKyAgICBAcGFy
YW0ge09iamVjdH0gY29udGV4dCBhIGNvbnRleHQgb2JqZWN0IHlvdSBjYW4gdXNlIHRvIG1haW50
YWluIHN0YXRlLgorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBp
dGVyYXRpb24gb3IgdW5kZWZpbmVkCisgICovCisgIG5leHRPYmplY3Q6IEVtYmVyLnJlcXVpcmVk
KEZ1bmN0aW9uKSwKKworICAvKioKKyAgICBIZWxwZXIgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0
IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4gVGhpcyBpcyB1c3VhbGx5CisgICAgdXNlZCBieSBi
aW5kaW5ncyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIGZyYW1ld29yayB0byBleHRyYWN0IGEgc2lu
Z2xlCisgICAgb2JqZWN0IGlmIHRoZSBlbnVtZXJhYmxlIGNvbnRhaW5zIG9ubHkgb25lIGl0ZW0u
CisKKyAgICBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIHlvdSBzaG91bGQgaW1wbGVtZW50
IGl0IHNvIHRoYXQgaXQgd2lsbAorICAgIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZWFj
aCB0aW1lIGl0IGlzIGNhbGxlZC4gSWYgeW91ciBlbnVtZXJhYmxlCisgICAgY29udGFpbnMgb25s
eSBvbmUgb2JqZWN0LCB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiB0aGF0IG9iamVj
dC4KKyAgICBJZiB5b3VyIGVudW1lcmFibGUgaXMgZW1wdHksIHRoaXMgbWV0aG9kIHNob3VsZCBy
ZXR1cm4gYHVuZGVmaW5lZGAuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9IFsi
YSIsICJiIiwgImMiXTsKKyAgICBhcnIuZmlyc3RPYmplY3QoKTsgIC8vICJhIgorCisgICAgdmFy
IGFyciA9IFtdOworICAgIGFyci5maXJzdE9iamVjdCgpOyAgLy8gdW5kZWZpbmVkCisgICAgYGBg
CisKKyAgICBAcHJvcGVydHkgZmlyc3RPYmplY3QKKyAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBv
YmplY3Qgb3IgdW5kZWZpbmVkCisgICovCisgIGZpcnN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKKyAgICBpZiAoZ2V0KHRoaXMsICdsZW5ndGgnKT09PTApIHJldHVybiB1bmRl
ZmluZWQgOworCisgICAgLy8gaGFuZGxlIGdlbmVyaWMgZW51bWVyYWJsZXMKKyAgICB2YXIgY29u
dGV4dCA9IHBvcEN0eCgpLCByZXQ7CisgICAgcmV0ID0gdGhpcy5uZXh0T2JqZWN0KDAsIG51bGws
IGNvbnRleHQpOworICAgIHB1c2hDdHgoY29udGV4dCk7CisgICAgcmV0dXJuIHJldCA7CisgIH0p
LnByb3BlcnR5KCdbXScpLAorCisgIC8qKgorICAgIEhlbHBlciBtZXRob2QgcmV0dXJucyB0aGUg
bGFzdCBvYmplY3QgZnJvbSBhIGNvbGxlY3Rpb24uIElmIHlvdXIgZW51bWVyYWJsZQorICAgIGNv
bnRhaW5zIG9ubHkgb25lIG9iamVjdCwgdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4g
dGhhdCBvYmplY3QuCisgICAgSWYgeW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhv
ZCBzaG91bGQgcmV0dXJuIGB1bmRlZmluZWRgLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZh
ciBhcnIgPSBbImEiLCAiYiIsICJjIl07CisgICAgYXJyLmxhc3RPYmplY3QoKTsgIC8vICJjIgor
CisgICAgdmFyIGFyciA9IFtdOworICAgIGFyci5sYXN0T2JqZWN0KCk7ICAvLyB1bmRlZmluZWQK
KyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBsYXN0T2JqZWN0CisgICAgQHJldHVybiB7T2JqZWN0
fSB0aGUgbGFzdCBvYmplY3Qgb3IgdW5kZWZpbmVkCisgICovCisgIGxhc3RPYmplY3Q6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcp
OworICAgIGlmIChsZW49PT0wKSByZXR1cm4gdW5kZWZpbmVkIDsKKyAgICB2YXIgY29udGV4dCA9
IHBvcEN0eCgpLCBpZHg9MCwgY3VyLCBsYXN0ID0gbnVsbDsKKyAgICBkbyB7CisgICAgICBsYXN0
ID0gY3VyOworICAgICAgY3VyID0gdGhpcy5uZXh0T2JqZWN0KGlkeCsrLCBsYXN0LCBjb250ZXh0
KTsKKyAgICB9IHdoaWxlIChjdXIgIT09IHVuZGVmaW5lZCk7CisgICAgcHVzaEN0eChjb250ZXh0
KTsKKyAgICByZXR1cm4gbGFzdDsKKyAgfSkucHJvcGVydHkoJ1tdJyksCisKKyAgLyoqCisgICAg
UmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBvYmplY3QgY2FuIGJlIGZvdW5kIGluIHRoZSBy
ZWNlaXZlci4gVGhlCisgICAgZGVmYXVsdCB2ZXJzaW9uIHdpbGwgaXRlcmF0ZSB0aHJvdWdoIHRo
ZSBlbnVtZXJhYmxlIHVudGlsIHRoZSBvYmplY3QKKyAgICBpcyBmb3VuZC4gWW91IG1heSB3YW50
IHRvIG92ZXJyaWRlIHRoaXMgd2l0aCBhIG1vcmUgZWZmaWNpZW50IHZlcnNpb24uCisKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKKyAgICBhcnIuY29u
dGFpbnMoImEiKTsgLy8gdHJ1ZQorICAgIGFyci5jb250YWlucygieiIpOyAvLyBmYWxzZQorICAg
IGBgYAorCisgICAgQG1ldGhvZCBjb250YWlucworICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhl
IG9iamVjdCB0byBzZWFyY2ggZm9yLgorICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBv
YmplY3QgaXMgZm91bmQgaW4gZW51bWVyYWJsZS4KKyAgKi8KKyAgY29udGFpbnM6IGZ1bmN0aW9u
KG9iaikgeworICAgIHJldHVybiB0aGlzLmZpbmQoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gaXRl
bT09PW9iajsgfSkgIT09IHVuZGVmaW5lZDsKKyAgfSwKKworICAvKioKKyAgICBJdGVyYXRlcyB0
aHJvdWdoIHRoZSBlbnVtZXJhYmxlLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24gb24gZWFj
aAorICAgIGl0ZW0uIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBgZm9yRWFjaCgpYCBt
ZXRob2QgZGVmaW5lZCBpbgorICAgIEphdmFTY3JpcHQgMS42LgorCisgICAgVGhlIGNhbGxiYWNr
IG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAo
YWxsCisgICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKKyAgICBgYGAKKworICAgIC0g
YGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBpbmRl
eGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBlbnVtZXJh
YmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorCisgICAgTm90ZSB0aGF0IGlu
IGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRh
cmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4
dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CisgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9u
IGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisKKyAgICBAbWV0aG9kIGZvckVhY2gKKyAg
ICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAg
IEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICBA
cmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCisgICovCisgIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxi
YWNrLCB0YXJnZXQpIHsKKyAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0
aHJvdyBuZXcgVHlwZUVycm9yKCkgOworICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcp
LCBsYXN0ID0gbnVsbCwgY29udGV4dCA9IHBvcEN0eCgpOworCisgICAgaWYgKHRhcmdldCA9PT0g
dW5kZWZpbmVkKSB0YXJnZXQgPSBudWxsOworCisgICAgZm9yKHZhciBpZHg9MDtpZHg8bGVuO2lk
eCsrKSB7CisgICAgICB2YXIgbmV4dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRl
eHQpIDsKKyAgICAgIGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRoaXMpOworICAg
ICAgbGFzdCA9IG5leHQgOworICAgIH0KKyAgICBsYXN0ID0gbnVsbCA7CisgICAgY29udGV4dCA9
IHB1c2hDdHgoY29udGV4dCk7CisgICAgcmV0dXJuIHRoaXMgOworICB9LAorCisgIC8qKgorICAg
IEFsaWFzIGZvciBgbWFwUHJvcGVydHlgCisKKyAgICBAbWV0aG9kIGdldEVhY2gKKyAgICBAcGFy
YW0ge1N0cmluZ30ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgQHJldHVybiB7QXJyYXl9
IFRoZSBtYXBwZWQgYXJyYXkuCisgICovCisgIGdldEVhY2g6IGZ1bmN0aW9uKGtleSkgeworICAg
IHJldHVybiB0aGlzLm1hcFByb3BlcnR5KGtleSk7CisgIH0sCisKKyAgLyoqCisgICAgU2V0cyB0
aGUgdmFsdWUgb24gdGhlIG5hbWVkIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlci4gVGhpcyBpcyBt
b3JlCisgICAgZWZmaWNpZW50IHRoYW4gdXNpbmcgb3RoZXIgbWV0aG9kcyBkZWZpbmVkIG9uIHRo
aXMgaGVscGVyLiBJZiB0aGUgb2JqZWN0CisgICAgaW1wbGVtZW50cyBFbWJlci5PYnNlcnZhYmxl
LCB0aGUgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIHRvIGBzZXQoKSxgIG90aGVyd2lzZQorICAgIGl0
IHdpbGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2JqZWN0cyBhcmUgc2tpcHBlZC4KKworICAg
IEBtZXRob2Qgc2V0RWFjaAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQK
KyAgICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIG9iamVjdCB0byBzZXQKKyAgICBAcmV0dXJu
IHtPYmplY3R9IHJlY2VpdmVyCisgICovCisgIHNldEVhY2g6IGZ1bmN0aW9uKGtleSwgdmFsdWUp
IHsKKyAgICByZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgIHNldChp
dGVtLCBrZXksIHZhbHVlKTsKKyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBNYXBzIGFsbCBv
ZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uIHRvIGFub3RoZXIgdmFsdWUsIHJldHVybmlu
ZworICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFwKClgIGRl
ZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYuCisKKyAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBw
cm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICBwYXJh
bWV0ZXJzIGFyZSBvcHRpb25hbCk6CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24o
aXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgIGBgYAorCisgICAgLSBgaXRlbWAgaXMgdGhl
IGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgIC0gYGluZGV4YCBpcyB0aGUgY3Vy
cmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgorICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBl
bnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisKKyAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBtYXBw
ZWQgdmFsdWUuCisKKyAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91
IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgb2JqZWN0IHRoYXQgd2lsbCBi
ZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKKyAgICB0
byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVj
dC4KKworICAgIEBtZXRob2QgbWFwCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhl
IGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRh
cmdldCBvYmplY3QgdG8gdXNlCisgICAgQHJldHVybiB7QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXku
CisgICovCisgIG1hcDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgeworICAgIHZhciByZXQg
PSBbXTsKKyAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oeCwgaWR4LCBpKSB7CisgICAgICByZXRb
aWR4XSA9IGNhbGxiYWNrLmNhbGwodGFyZ2V0LCB4LCBpZHgsaSk7CisgICAgfSk7CisgICAgcmV0
dXJuIHJldCA7CisgIH0sCisKKyAgLyoqCisgICAgU2ltaWxhciB0byBtYXAsIHRoaXMgc3BlY2lh
bGl6ZWQgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkCisgICAgcHJvcGVy
dHkgb24gYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbi4KKworICAgIEBtZXRob2QgbWFwUHJv
cGVydHkKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAg
QHJldHVybiB7QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXkuCisgICovCisgIG1hcFByb3BlcnR5OiBm
dW5jdGlvbihrZXkpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24obmV4dCkgeworICAg
ICAgcmV0dXJuIGdldChuZXh0LCBrZXkpOworICAgIH0pOworICB9LAorCisgIC8qKgorICAgIFJl
dHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB0
aGF0IHRoZSBwYXNzZWQKKyAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yLiBUaGlzIG1ldGhv
ZCBjb3JyZXNwb25kcyB0byBgZmlsdGVyKClgIGRlZmluZWQgaW4KKyAgICBKYXZhU2NyaXB0IDEu
Ni4KKworICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhl
IGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToK
KworICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJs
ZSk7CisgICAgYGBgCisKKyAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBp
dGVyYXRpb24uCisgICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVy
YXRpb24uCisgICAgLSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2Vs
Zi4KKworICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVt
IGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCisgICAgb3RoZXJ3aXNlLgorCisgICAgTm90ZSB0aGF0
IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFs
IHRhcmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29u
dGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CisgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0
aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisKKyAgICBAbWV0aG9kIGZpbHRlcgor
ICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisg
ICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQorICAg
IEByZXR1cm4ge0FycmF5fSBBIGZpbHRlcmVkIGFycmF5LgorICAqLworICBmaWx0ZXI6IGZ1bmN0
aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICB2YXIgcmV0ID0gW107CisgICAgdGhpcy5mb3JF
YWNoKGZ1bmN0aW9uKHgsIGlkeCwgaSkgeworICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGFyZ2V0
LCB4LCBpZHgsIGkpKSByZXQucHVzaCh4KTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmV0IDsKKyAg
fSwKKworICAvKioKKyAgICBSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIG9mIHRoZSBpdGVtcyBp
biB0aGUgZW51bWVyYXRpb24gd2hlcmUgdGhlIHBhc3NlZAorICAgIGZ1bmN0aW9uIHJldHVybnMg
ZmFsc2UgZm9yLiBUaGlzIG1ldGhvZCBpcyB0aGUgaW52ZXJzZSBvZiBmaWx0ZXIoKS4KKworICAg
IFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2lu
ZyBzaWduYXR1cmUgKGFsbAorICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKKworICAgICAg
ICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKKworICAgIC0gKml0ZW0qIGlz
IHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtICppbmRleCogaXMgdGhl
IGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbgorICAgIC0gKmVudW1lcmFibGUqIGlzIHRo
ZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisKKyAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBh
IGZhbHNleSB2YWx1ZSB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLgorCisgICAg
Tm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFu
IG9wdGlvbmFsIHRhcmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzICJ0aGlzIiBv
biB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CisgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJh
dG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisKKyAgICBAbWV0aG9k
IHJlamVjdAorICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBl
eGVjdXRlCisgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRv
IHVzZQorICAgIEByZXR1cm4ge0FycmF5fSBBIHJlamVjdGVkIGFycmF5LgorICAgKi8KKyAgcmVq
ZWN0OiBmdW5jdGlvbihjYWxsYmFjaywgdGFyZ2V0KSB7CisgICAgcmV0dXJuIHRoaXMuZmlsdGVy
KGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICEoY2FsbGJhY2suYXBwbHkodGFyZ2V0LCBhcmd1
bWVudHMpKTsKKyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIGFuIGFycmF5IHdp
dGgganVzdCB0aGUgaXRlbXMgd2l0aCB0aGUgbWF0Y2hlZCBwcm9wZXJ0eS4gWW91CisgICAgY2Fu
IHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4g
T3RoZXJ3aXNlCisgICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRl
cyB0byBgdHJ1ZWAuCisKKyAgICBAbWV0aG9kIGZpbHRlclByb3BlcnR5CisgICAgQHBhcmFtIHtT
dHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFs
dWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KKyAgICBAcmV0dXJuIHtBcnJheX0g
ZmlsdGVyZWQgYXJyYXkKKyAgKi8KKyAgZmlsdGVyUHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFs
dWUpIHsKKyAgICByZXR1cm4gdGhpcy5maWx0ZXIoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp
KTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGl0ZW1zIHRo
YXQgZG8gbm90IGhhdmUgdHJ1dGh5IHZhbHVlcyBmb3IKKyAgICBrZXkuICBZb3UgY2FuIHBhc3Mg
YW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4gIE90aGVy
d2lzZQorICAgIHRoaXMgd2lsbCBtYXRjaCBhbnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8g
ZmFsc2UuCisKKyAgICBAbWV0aG9kIHJlamVjdFByb3BlcnR5CisgICAgQHBhcmFtIHtTdHJpbmd9
IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9w
dGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KKyAgICBAcmV0dXJuIHtBcnJheX0gcmVqZWN0
ZWQgYXJyYXkKKyAgKi8KKyAgcmVqZWN0UHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
KyAgICB2YXIgZXhhY3RWYWx1ZSA9IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGdldChpdGVtLCBr
ZXkpID09PSB2YWx1ZTsgfSwKKyAgICAgICAgaGFzVmFsdWUgPSBmdW5jdGlvbihpdGVtKSB7IHJl
dHVybiAhIWdldChpdGVtLCBrZXkpOyB9LAorICAgICAgICB1c2UgPSAoYXJndW1lbnRzLmxlbmd0
aCA9PT0gMiA/IGV4YWN0VmFsdWUgOiBoYXNWYWx1ZSk7CisKKyAgICByZXR1cm4gdGhpcy5yZWpl
Y3QodXNlKTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGluIHRo
ZSBhcnJheSBmb3Igd2hpY2ggdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZS4KKyAgICBUaGlzIG1l
dGhvZCB3b3JrcyBzaW1pbGFyIHRvIHRoZSBgZmlsdGVyKClgIG1ldGhvZCBkZWZpbmVkIGluIEph
dmFTY3JpcHQgMS42CisgICAgZXhjZXB0IHRoYXQgaXQgd2lsbCBzdG9wIHdvcmtpbmcgb24gdGhl
IGFycmF5IG9uY2UgYSBtYXRjaCBpcyBmb3VuZC4KKworICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAg
IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5j
dGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgYGBgCisKKyAgICAtIGBpdGVtYCBp
cyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgLSBgaW5kZXhgIGlzIHRo
ZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgLSBgZW51bWVyYWJsZWAgaXMg
dGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KKworICAgIEl0IHNob3VsZCByZXR1cm4gdGhl
IGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCisgICAg
b3RoZXJ3aXNlLgorCisgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlv
dSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwg
YmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CisgICAg
dG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmpl
Y3QuCisKKyAgICBAbWV0aG9kIGZpbmQKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBU
aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUg
dGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICBAcmV0dXJuIHtPYmplY3R9IEZvdW5kIGl0ZW0gb3Ig
YHVuZGVmaW5lZGAuCisgICovCisgIGZpbmQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsK
KyAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7CisgICAgaWYgKHRhcmdldCA9PT0g
dW5kZWZpbmVkKSB0YXJnZXQgPSBudWxsOworCisgICAgdmFyIGxhc3QgPSBudWxsLCBuZXh0LCBm
b3VuZCA9IGZhbHNlLCByZXQgOworICAgIHZhciBjb250ZXh0ID0gcG9wQ3R4KCk7CisgICAgZm9y
KHZhciBpZHg9MDtpZHg8bGVuICYmICFmb3VuZDtpZHgrKykgeworICAgICAgbmV4dCA9IHRoaXMu
bmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRleHQpIDsKKyAgICAgIGlmIChmb3VuZCA9IGNhbGxi
YWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRoaXMpKSByZXQgPSBuZXh0IDsKKyAgICAgIGxh
c3QgPSBuZXh0IDsKKyAgICB9CisgICAgbmV4dCA9IGxhc3QgPSBudWxsIDsKKyAgICBjb250ZXh0
ID0gcHVzaEN0eChjb250ZXh0KTsKKyAgICByZXR1cm4gcmV0IDsKKyAgfSwKKworICAvKioKKyAg
ICBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIHdpdGggYSBwcm9wZXJ0eSBtYXRjaGluZyB0aGUgcGFz
c2VkIHZhbHVlLiBZb3UKKyAgICBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQg
d2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKKyAgICB0aGlzIHdpbGwgbWF0Y2ggYW55
IHByb3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KKworICAgIFRoaXMgbWV0aG9kIHdv
cmtzIG11Y2ggbGlrZSB0aGUgbW9yZSBnZW5lcmljIGBmaW5kKClgIG1ldGhvZC4KKworICAgIEBt
ZXRob2QgZmluZFByb3BlcnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkg
dG8gdGVzdAorICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRl
c3QgYWdhaW5zdC4KKyAgICBAcmV0dXJuIHtPYmplY3R9IGZvdW5kIGl0ZW0gb3IgYHVuZGVmaW5l
ZGAKKyAgKi8KKyAgZmluZFByb3BlcnR5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgcmV0
dXJuIHRoaXMuZmluZChpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOworICB9LAorCisgIC8q
KgorICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyB0cnVl
IGZvciBldmVyeSBpdGVtIGluIHRoZQorICAgIGVudW1lcmF0aW9uLiBUaGlzIGNvcnJlc3BvbmRz
IHdpdGggdGhlIGBldmVyeSgpYCBtZXRob2QgaW4gSmF2YVNjcmlwdCAxLjYuCisKKyAgICBUaGUg
Y2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2ln
bmF0dXJlIChhbGwKKyAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgIGBgYAor
CisgICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAg
IC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgorICAgIC0g
YGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisKKyAgICBJdCBz
aG91bGQgcmV0dXJuIHRoZSBgdHJ1ZWAgb3IgYGZhbHNlYC4KKworICAgIE5vdGUgdGhhdCBpbiBh
ZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJn
ZXQKKyAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQu
IFRoaXMgaXMgYSBnb29kIHdheQorICAgIHRvIGdpdmUgeW91ciBpdGVyYXRvciBmdW5jdGlvbiBh
Y2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LgorCisgICAgRXhhbXBsZSBVc2FnZToKKworICAg
IGBgYGphdmFzY3JpcHQKKyAgICBpZiAocGVvcGxlLmV2ZXJ5KGlzRW5naW5lZXIpKSB7IFBheWNo
ZWNrcy5hZGRCaWdCb251cygpOyB9CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGV2ZXJ5CisgICAg
QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICBA
cGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgQHJl
dHVybiB7Qm9vbGVhbn0KKyAgKi8KKyAgZXZlcnk6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQp
IHsKKyAgICByZXR1cm4gIXRoaXMuZmluZChmdW5jdGlvbih4LCBpZHgsIGkpIHsKKyAgICAgIHJl
dHVybiAhY2FsbGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSk7CisgICAgfSk7CisgIH0sCisK
KyAgLyoqCisgICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBwcm9wZXJ0eSByZXNvbHZl
cyB0byBgdHJ1ZWAgZm9yIGFsbCBpdGVtcyBpbgorICAgIHRoZSBlbnVtZXJhYmxlLiBUaGlzIG1l
dGhvZCBpcyBvZnRlbiBzaW1wbGVyL2Zhc3RlciB0aGFuIHVzaW5nIGEgY2FsbGJhY2suCisKKyAg
ICBAbWV0aG9kIGV2ZXJ5UHJvcGVydHkKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9w
ZXJ0eSB0byB0ZXN0CisgICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUg
dG8gdGVzdCBhZ2FpbnN0LgorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICovCisgIGV2ZXJ5UHJv
cGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpcy5ldmVyeShpdGVy
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOworICB9LAorCisKKyAgLyoqCisgICAgUmV0dXJucyBg
dHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGFueSBpdGVtIGlu
IHRoZQorICAgIGVudW1lcmF0aW9uLiBUaGlzIGNvcnJlc3BvbmRzIHdpdGggdGhlIGBzb21lKClg
IG1ldGhvZCBpbiBKYXZhU2NyaXB0IDEuNi4KKworICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91
IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAgIHBh
cmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5jdGlv
bihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgYGBgCisKKyAgICAtIGBpdGVtYCBpcyB0
aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgLSBgaW5kZXhgIGlzIHRoZSBj
dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgLSBgZW51bWVyYWJsZWAgaXMgdGhl
IGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KKworICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0
cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCisgICAgb3Ro
ZXJ3aXNlLgorCisgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBj
YW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwgYmUg
c2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CisgICAgdG8g
Z2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3Qu
CisKKyAgICBVc2FnZSBFeGFtcGxlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIGlmIChwZW9w
bGUuc29tZShpc01hbmFnZXIpKSB7IFBheWNoZWNrcy5hZGRCaWdnZXJCb251cygpOyB9CisgICAg
YGBgCisKKyAgICBAbWV0aG9kIHNvbWUKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBU
aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUg
dGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICBAcmV0dXJuIHtBcnJheX0gQSBmaWx0ZXJlZCBhcnJh
eS4KKyAgKi8KKyAgc29tZTogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgeworICAgIHJldHVy
biAhIXRoaXMuZmluZChmdW5jdGlvbih4LCBpZHgsIGkpIHsKKyAgICAgIHJldHVybiAhIWNhbGxi
YWNrLmNhbGwodGFyZ2V0LCB4LCBpZHgsIGkpOworICAgIH0pOworICB9LAorCisgIC8qKgorICAg
IFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gYHRydWVg
IGZvciBhbnkgaXRlbSBpbgorICAgIHRoZSBlbnVtZXJhYmxlLiBUaGlzIG1ldGhvZCBpcyBvZnRl
biBzaW1wbGVyL2Zhc3RlciB0aGFuIHVzaW5nIGEgY2FsbGJhY2suCisKKyAgICBAbWV0aG9kIHNv
bWVQcm9wZXJ0eQorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QK
KyAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWlu
c3QuCisgICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgCisgICovCisgIHNvbWVQcm9wZXJ0eTog
ZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgIHJldHVybiB0aGlzLnNvbWUoaXRlci5hcHBseSh0
aGlzLCBhcmd1bWVudHMpKTsKKyAgfSwKKworICAvKioKKyAgICBUaGlzIHdpbGwgY29tYmluZSB0
aGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9yIGludG8gYSBzaW5nbGUgdmFsdWUuIEl0CisgICAg
aXMgYSB1c2VmdWwgd2F5IHRvIGNvbGxlY3QgYSBzdW1tYXJ5IHZhbHVlIGZyb20gYW4gZW51bWVy
YXRpb24uIFRoaXMKKyAgICBjb3JyZXNwb25kcyB0byB0aGUgYHJlZHVjZSgpYCBtZXRob2QgZGVm
aW5lZCBpbiBKYXZhU2NyaXB0IDEuOC4KKworICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHBy
b3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAgIHBhcmFt
ZXRlcnMgYXJlIG9wdGlvbmFsKToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5jdGlvbihw
cmV2aW91c1ZhbHVlLCBpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgYGBgCisKKyAgICAt
IGBwcmV2aW91c1ZhbHVlYCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCB0
byB0aGUgaXRlcmF0b3IuCisgICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUg
aXRlcmF0aW9uLgorICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRl
cmF0aW9uLgorICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNl
bGYuCisKKyAgICBSZXR1cm4gdGhlIG5ldyBjdW11bGF0aXZlIHZhbHVlLgorCisgICAgSW4gYWRk
aXRpb24gdG8gdGhlIGNhbGxiYWNrIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBpbml0aWFsVmFsdWVg
LiBBbiBlcnJvcgorICAgIHdpbGwgYmUgcmFpc2VkIGlmIHlvdSBkbyBub3QgcGFzcyBhbiBpbml0
aWFsIHZhbHVlIGFuZCB0aGUgZW51bWVyYXRvciBpcworICAgIGVtcHR5LgorCisgICAgTm90ZSB0
aGF0IHVubGlrZSB0aGUgb3RoZXIgbWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgYWxsb3cg
eW91IHRvCisgICAgcGFzcyBhIHRhcmdldCBvYmplY3QgdG8gc2V0IGFzIHRoaXMgZm9yIHRoZSBj
YWxsYmFjay4gSXQncyBwYXJ0IG9mIHRoZQorICAgIHNwZWMuIFNvcnJ5LgorCisgICAgQG1ldGhv
ZCByZWR1Y2UKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsVmFsdWUgSW5pdGlhbCB2YWx1ZSBm
b3IgdGhlIHJlZHVjZQorICAgIEBwYXJhbSB7U3RyaW5nfSByZWR1Y2VyUHJvcGVydHkgaW50ZXJu
YWwgdXNlIG9ubHkuCisgICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVkdWNlZCB2YWx1ZS4KKyAg
Ki8KKyAgcmVkdWNlOiBmdW5jdGlvbihjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCByZWR1Y2VyUHJv
cGVydHkpIHsKKyAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7IHRocm93
IG5ldyBUeXBlRXJyb3IoKTsgfQorCisgICAgdmFyIHJldCA9IGluaXRpYWxWYWx1ZTsKKworICAg
IHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpKSB7CisgICAgICByZXQgPSBjYWxsYmFjay5j
YWxsKG51bGwsIHJldCwgaXRlbSwgaSwgdGhpcywgcmVkdWNlclByb3BlcnR5KTsKKyAgICB9LCB0
aGlzKTsKKworICAgIHJldHVybiByZXQ7CisgIH0sCisKKyAgLyoqCisgICAgSW52b2tlcyB0aGUg
bmFtZWQgbWV0aG9kIG9uIGV2ZXJ5IG9iamVjdCBpbiB0aGUgcmVjZWl2ZXIgdGhhdAorICAgIGlt
cGxlbWVudHMgaXQuIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBpbXBsZW1lbnRhdGlv
biBpbgorICAgIFByb3RvdHlwZSAxLjYuCisKKyAgICBAbWV0aG9kIGludm9rZQorICAgIEBwYXJh
bSB7U3RyaW5nfSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICBAcGFyYW0g
e09iamVjdC4uLn0gYXJncyBvcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBhcyB3ZWxsLgorICAg
IEByZXR1cm4ge0FycmF5fSByZXR1cm4gdmFsdWVzIGZyb20gY2FsbGluZyBpbnZva2UuCisgICov
CisgIGludm9rZTogZnVuY3Rpb24obWV0aG9kTmFtZSkgeworICAgIHZhciBhcmdzLCByZXQgPSBb
XTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD4xKSBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSk7CisKKyAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oeCwgaWR4KSB7CisgICAgICB2
YXIgbWV0aG9kID0geCAmJiB4W21ldGhvZE5hbWVdOworICAgICAgaWYgKCdmdW5jdGlvbicgPT09
IHR5cGVvZiBtZXRob2QpIHsKKyAgICAgICAgcmV0W2lkeF0gPSBhcmdzID8gbWV0aG9kLmFwcGx5
KHgsIGFyZ3MpIDogbWV0aG9kLmNhbGwoeCk7CisgICAgICB9CisgICAgfSwgdGhpcyk7CisKKyAg
ICByZXR1cm4gcmV0OworICB9LAorCisgIC8qKgorICAgIFNpbXBseSBjb252ZXJ0cyB0aGUgZW51
bWVyYWJsZSBpbnRvIGEgZ2VudWluZSBhcnJheS4gVGhlIG9yZGVyIGlzIG5vdAorICAgIGd1YXJh
bnRlZWQuIENvcnJlc3BvbmRzIHRvIHRoZSBtZXRob2QgaW1wbGVtZW50ZWQgYnkgUHJvdG90eXBl
LgorCisgICAgQG1ldGhvZCB0b0FycmF5CisgICAgQHJldHVybiB7QXJyYXl9IHRoZSBlbnVtZXJh
YmxlIGFzIGFuIGFycmF5LgorICAqLworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
cmV0ID0gW107CisgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKG8sIGlkeCkgeyByZXRbaWR4XSA9
IG87IH0pOworICAgIHJldHVybiByZXQgOworICB9LAorCisgIC8qKgorICAgIFJldHVybnMgYSBj
b3B5IG9mIHRoZSBhcnJheSB3aXRoIGFsbCBudWxsIGVsZW1lbnRzIHJlbW92ZWQuCisKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9IFsiYSIsIG51bGwsICJjIiwgbnVsbF07CisgICAg
YXJyLmNvbXBhY3QoKTsgIC8vIFsiYSIsICJjIl0KKyAgICBgYGAKKworICAgIEBtZXRob2QgY29t
cGFjdAorICAgIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgd2l0aG91dCBudWxsIGVsZW1lbnRz
LgorICAqLworICBjb21wYWN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMud2l0aG91dChudWxs
KTsgfSwKKworICAvKioKKyAgICBSZXR1cm5zIGEgbmV3IGVudW1lcmFibGUgdGhhdCBleGNsdWRl
cyB0aGUgcGFzc2VkIHZhbHVlLiBUaGUgZGVmYXVsdAorICAgIGltcGxlbWVudGF0aW9uIHJldHVy
bnMgYW4gYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlwZSB1bmxlc3MKKyAgICB0
aGUgcmVjZWl2ZXIgZG9lcyBub3QgY29udGFpbiB0aGUgdmFsdWUuCisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImEiLCAiYyJdOworICAgIGFyci53aXRob3V0
KCJhIik7ICAvLyBbImIiLCAiYyJdCisgICAgYGBgCisKKyAgICBAbWV0aG9kIHdpdGhvdXQKKyAg
ICBAcGFyYW0ge09iamVjdH0gdmFsdWUKKyAgICBAcmV0dXJuIHtFbWJlci5FbnVtZXJhYmxlfQor
ICAqLworICB3aXRob3V0OiBmdW5jdGlvbih2YWx1ZSkgeworICAgIGlmICghdGhpcy5jb250YWlu
cyh2YWx1ZSkpIHJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCisgICAgdmFyIHJldCA9IFtd
IDsKKyAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oaykgeworICAgICAgaWYgKGsgIT09IHZhbHVl
KSByZXRbcmV0Lmxlbmd0aF0gPSBrOworICAgIH0pIDsKKyAgICByZXR1cm4gcmV0IDsKKyAgfSwK
KworICAvKioKKyAgICBSZXR1cm5zIGEgbmV3IGVudW1lcmFibGUgdGhhdCBjb250YWlucyBvbmx5
IHVuaXF1ZSB2YWx1ZXMuIFRoZSBkZWZhdWx0CisgICAgaW1wbGVtZW50YXRpb24gcmV0dXJucyBh
biBhcnJheSByZWdhcmRsZXNzIG9mIHRoZSByZWNlaXZlciB0eXBlLgorCisgICAgYGBgamF2YXNj
cmlwdAorICAgIHZhciBhcnIgPSBbImEiLCAiYSIsICJiIiwgImIiXTsKKyAgICBhcnIudW5pcSgp
OyAgLy8gWyJhIiwgImIiXQorICAgIGBgYAorCisgICAgQG1ldGhvZCB1bmlxCisgICAgQHJldHVy
biB7RW1iZXIuRW51bWVyYWJsZX0KKyAgKi8KKyAgdW5pcTogZnVuY3Rpb24oKSB7CisgICAgdmFy
IHJldCA9IFtdOworICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrKXsKKyAgICAgIGlmIChhX2lu
ZGV4T2YocmV0LCBrKTwwKSByZXQucHVzaChrKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmV0Owor
ICB9LAorCisgIC8qKgorICAgIFRoaXMgcHJvcGVydHkgd2lsbCB0cmlnZ2VyIGFueXRpbWUgdGhl
IGVudW1lcmFibGUncyBjb250ZW50IGNoYW5nZXMuCisgICAgWW91IGNhbiBvYnNlcnZlIHRoaXMg
cHJvcGVydHkgdG8gYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgZW51bWVyYWJsZXMKKyAg
ICBjb250ZW50LgorCisgICAgRm9yIHBsYWluIGVudW1lcmFibGVzLCB0aGlzIHByb3BlcnR5IGlz
IHJlYWQgb25seS4gYEVtYmVyLkFycmF5YCBvdmVycmlkZXMKKyAgICB0aGlzIG1ldGhvZC4KKwor
ICAgIEBwcm9wZXJ0eSBbXQorICAgIEB0eXBlIEVtYmVyLkFycmF5CisgICovCisgICdbXSc6IEVt
YmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpczsKKyAg
fSksCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLgorICAvLyBFTlVNRVJBQkxFIE9CU0VSVkVSUworICAvLworCisgIC8qKgor
ICAgIFJlZ2lzdGVycyBhbiBlbnVtZXJhYmxlIG9ic2VydmVyLiBNdXN0IGltcGxlbWVudCBgRW1i
ZXIuRW51bWVyYWJsZU9ic2VydmVyYAorICAgIG1peGluLgorCisgICAgQG1ldGhvZCBhZGRFbnVt
ZXJhYmxlT2JzZXJ2ZXIKKyAgICBAcGFyYW0gdGFyZ2V0IHtPYmplY3R9CisgICAgQHBhcmFtIG9w
dHMge0hhc2h9CisgICovCisgIGFkZEVudW1lcmFibGVPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0
LCBvcHRzKSB7CisgICAgdmFyIHdpbGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFuZ2Up
IHx8ICdlbnVtZXJhYmxlV2lsbENoYW5nZScsCisgICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAm
JiBvcHRzLmRpZENoYW5nZSkgfHwgJ2VudW1lcmFibGVEaWRDaGFuZ2UnOworCisgICAgdmFyIGhh
c09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOworICAgIGlm
ICghaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2hhc0VudW1l
cmFibGVPYnNlcnZlcnMnKTsKKyAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCAnQGVudW1lcmFi
bGU6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKKyAgICBFbWJlci5hZGRMaXN0ZW5lcih0
aGlzLCAnQGVudW1lcmFibGU6Y2hhbmdlJywgdGFyZ2V0LCBkaWRDaGFuZ2UpOworICAgIGlmICgh
aGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnaGFzRW51bWVyYWJs
ZU9ic2VydmVycycpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIFJlbW92
ZXMgYSByZWdpc3RlcmVkIGVudW1lcmFibGUgb2JzZXJ2ZXIuCisKKyAgICBAbWV0aG9kIHJlbW92
ZUVudW1lcmFibGVPYnNlcnZlcgorICAgIEBwYXJhbSB0YXJnZXQge09iamVjdH0KKyAgICBAcGFy
YW0gW29wdHNdIHtIYXNofQorICAqLworICByZW1vdmVFbnVtZXJhYmxlT2JzZXJ2ZXI6IGZ1bmN0
aW9uKHRhcmdldCwgb3B0cykgeworICAgIHZhciB3aWxsQ2hhbmdlID0gKG9wdHMgJiYgb3B0cy53
aWxsQ2hhbmdlKSB8fCAnZW51bWVyYWJsZVdpbGxDaGFuZ2UnLAorICAgICAgICBkaWRDaGFuZ2Ug
ID0gKG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UpIHx8ICdlbnVtZXJhYmxlRGlkQ2hhbmdlJzsKKwor
ICAgIHZhciBoYXNPYnNlcnZlcnMgPSBnZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMn
KTsKKyAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywg
J2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKyAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlz
LCAnQGVudW1lcmFibGU6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKKyAgICBFbWJlci5y
ZW1vdmVMaXN0ZW5lcih0aGlzLCAnQGVudW1lcmFibGU6Y2hhbmdlJywgdGFyZ2V0LCBkaWRDaGFu
Z2UpOworICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMs
ICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAg
LyoqCisgICAgQmVjb21lcyB0cnVlIHdoZW5ldmVyIHRoZSBhcnJheSBjdXJyZW50bHkgaGFzIG9i
c2VydmVycyB3YXRjaGluZyBjaGFuZ2VzCisgICAgb24gdGhlIGFycmF5LgorCisgICAgQHByb3Bl
cnR5IGhhc0VudW1lcmFibGVPYnNlcnZlcnMKKyAgICBAdHlwZSBCb29sZWFuCisgICovCisgIGhh
c0VudW1lcmFibGVPYnNlcnZlcnM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiBFbWJlci5oYXNMaXN0ZW5lcnModGhpcywgJ0BlbnVtZXJhYmxlOmNoYW5nZScpIHx8IEVt
YmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGVudW1lcmFibGU6YmVmb3JlJyk7CisgIH0pLAorCisK
KyAgLyoqCisgICAgSW52b2tlIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIHRoZSBjb250ZW50cyBv
ZiB5b3VyIGVudW1lcmFibGUgd2lsbAorICAgIGNoYW5nZS4gWW91IGNhbiBlaXRoZXIgb21pdCB0
aGUgcGFyYW1ldGVycyBjb21wbGV0ZWx5IG9yIHBhc3MgdGhlIG9iamVjdHMKKyAgICB0byBiZSBy
ZW1vdmVkIG9yIGFkZGVkIGlmIGF2YWlsYWJsZSBvciBqdXN0IGEgY291bnQuCisKKyAgICBAbWV0
aG9kIGVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZQorICAgIEBwYXJhbSB7RW1iZXIuRW51bWVy
YWJsZXxOdW1iZXJ9IHJlbW92aW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8KKyAg
ICAgIGJlIHJlbW92ZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSByZW1vdmVkLgorICAg
IEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZXxOdW1iZXJ9IGFkZGluZyBBbiBlbnVtZXJhYmxlIG9m
IHRoZSBvYmplY3RzIHRvIGJlCisgICAgICBhZGRlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRv
IGJlIGFkZGVkLgorICAgIEBjaGFpbmFibGUKKyAgKi8KKyAgZW51bWVyYWJsZUNvbnRlbnRXaWxs
Q2hhbmdlOiBmdW5jdGlvbihyZW1vdmluZywgYWRkaW5nKSB7CisKKyAgICB2YXIgcmVtb3ZlQ250
LCBhZGRDbnQsIGhhc0RlbHRhOworCisgICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgcmVtb3Zp
bmcpIHJlbW92ZUNudCA9IHJlbW92aW5nOworICAgIGVsc2UgaWYgKHJlbW92aW5nKSByZW1vdmVD
bnQgPSBnZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsKKyAgICBlbHNlIHJlbW92ZUNudCA9IHJlbW92
aW5nID0gLTE7CisKKyAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBhZGRpbmcpIGFkZENudCA9
IGFkZGluZzsKKyAgICBlbHNlIGlmIChhZGRpbmcpIGFkZENudCA9IGdldChhZGRpbmcsJ2xlbmd0
aCcpOworICAgIGVsc2UgYWRkQ250ID0gYWRkaW5nID0gLTE7CisKKyAgICBoYXNEZWx0YSA9IGFk
ZENudDwwIHx8IHJlbW92ZUNudDwwIHx8IGFkZENudC1yZW1vdmVDbnQhPT0wOworCisgICAgaWYg
KHJlbW92aW5nID09PSAtMSkgcmVtb3ZpbmcgPSBudWxsOworICAgIGlmIChhZGRpbmcgICA9PT0g
LTEpIGFkZGluZyAgID0gbnVsbDsKKworICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LCAnW10nKTsKKyAgICBpZiAoaGFzRGVsdGEpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LCAnbGVuZ3RoJyk7CisgICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsICdAZW51bWVyYWJsZTpiZWZv
cmUnLCBbdGhpcywgcmVtb3ZpbmcsIGFkZGluZ10pOworCisgICAgcmV0dXJuIHRoaXM7CisgIH0s
CisKKyAgLyoqCisgICAgSW52b2tlIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHlv
dXIgZW51bWVyYWJsZSBoYXMgY2hhbmdlZC4KKyAgICBUaGlzIHdpbGwgbm90aWZ5IGFueSBvYnNl
cnZlcnMgd2F0Y2hpbmcgZm9yIGNvbnRlbnQgY2hhbmdlcy4gSWYgeW91ciBhcmUKKyAgICBpbXBs
ZW1lbnRpbmcgYW4gb3JkZXJlZCBlbnVtZXJhYmxlIChzdWNoIGFzIGFuIGFycmF5KSwgYWxzbyBw
YXNzIHRoZQorICAgIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIHdoZXJlIHRoZSBjb250ZW50IGNoYW5n
ZWQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0bworICAgIG5vdGlmeSByYW5nZSBvYnNlcnZlcnMu
CisKKyAgICBAbWV0aG9kIGVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlCisgICAgQHBhcmFtIHtO
dW1iZXJ9IFtzdGFydF0gb3B0aW9uYWwgc3RhcnQgb2Zmc2V0IGZvciB0aGUgY29udGVudCBjaGFu
Z2UuCisgICAgICBGb3IgdW5vcmRlcmVkIGVudW1lcmFibGVzLCB5b3Ugc2hvdWxkIGFsd2F5cyBw
YXNzIC0xLgorICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZXxOdW1iZXJ9IHJlbW92aW5nIEFu
IGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8KKyAgICAgIGJlIHJlbW92ZWQgb3IgdGhlIG51
bWJlciBvZiBpdGVtcyB0byBiZSByZW1vdmVkLgorICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJs
ZXxOdW1iZXJ9IGFkZGluZyAgQW4gZW51bWVyYWJsZSBvZiB0aGUgb2JqZWN0cyB0bworICAgICAg
YmUgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBhZGRlZC4KKyAgICBAY2hhaW5h
YmxlCisgICovCisgIGVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihyZW1vdmlu
ZywgYWRkaW5nKSB7CisgICAgdmFyIG5vdGlmeSA9IHRoaXMucHJvcGVydHlEaWRDaGFuZ2UsIHJl
bW92ZUNudCwgYWRkQ250LCBoYXNEZWx0YTsKKworICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9m
IHJlbW92aW5nKSByZW1vdmVDbnQgPSByZW1vdmluZzsKKyAgICBlbHNlIGlmIChyZW1vdmluZykg
cmVtb3ZlQ250ID0gZ2V0KHJlbW92aW5nLCAnbGVuZ3RoJyk7CisgICAgZWxzZSByZW1vdmVDbnQg
PSByZW1vdmluZyA9IC0xOworCisgICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgYWRkaW5nKSBh
ZGRDbnQgPSBhZGRpbmc7CisgICAgZWxzZSBpZiAoYWRkaW5nKSBhZGRDbnQgPSBnZXQoYWRkaW5n
LCAnbGVuZ3RoJyk7CisgICAgZWxzZSBhZGRDbnQgPSBhZGRpbmcgPSAtMTsKKworICAgIGhhc0Rl
bHRhID0gYWRkQ250PDAgfHwgcmVtb3ZlQ250PDAgfHwgYWRkQ250LXJlbW92ZUNudCE9PTA7CisK
KyAgICBpZiAocmVtb3ZpbmcgPT09IC0xKSByZW1vdmluZyA9IG51bGw7CisgICAgaWYgKGFkZGlu
ZyAgID09PSAtMSkgYWRkaW5nICAgPSBudWxsOworCisgICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMs
ICdAZW51bWVyYWJsZTpjaGFuZ2UnLCBbdGhpcywgcmVtb3ZpbmcsIGFkZGluZ10pOworICAgIGlm
IChoYXNEZWx0YSkgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xlbmd0aCcpOworICAg
IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdbXScpOworCisgICAgcmV0dXJuIHRoaXMg
OworICB9CisKK30pIDsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVs
ZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCisvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBIRUxQRVJT
CisvLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIG1ldGEgPSBFbWJl
ci5tZXRhLCBtYXAgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMubWFwLCBjYWNoZUZvciA9IEVtYmVy
LmNhY2hlRm9yOworCitmdW5jdGlvbiBub25lKG9iaikgeyByZXR1cm4gb2JqPT09bnVsbCB8fCBv
Ymo9PT11bmRlZmluZWQ7IH0KKworLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gQVJSQVkKKy8vCisvKioKKyAgVGhpcyBtb2R1
bGUgaW1wbGVtZW50cyBPYnNlcnZlci1mcmllbmRseSBBcnJheS1saWtlIGJlaGF2aW9yLiBUaGlz
IG1peGluIGlzCisgIHBpY2tlZCB1cCBieSB0aGUgQXJyYXkgY2xhc3MgYXMgd2VsbCBhcyBvdGhl
ciBjb250cm9sbGVycywgZXRjLiB0aGF0IHdhbnQgdG8KKyAgYXBwZWFyIHRvIGJlIGFycmF5cy4K
KworICBVbmxpa2UgYEVtYmVyLkVudW1lcmFibGUsYCB0aGlzIG1peGluIGRlZmluZXMgbWV0aG9k
cyBzcGVjaWZpY2FsbHkgZm9yCisgIGNvbGxlY3Rpb25zIHRoYXQgcHJvdmlkZSBpbmRleC1vcmRl
cmVkIGFjY2VzcyB0byB0aGVpciBjb250ZW50cy4gV2hlbiB5b3UKKyAgYXJlIGRlc2lnbmluZyBj
b2RlIHRoYXQgbmVlZHMgdG8gYWNjZXB0IGFueSBraW5kIG9mIEFycmF5LWxpa2Ugb2JqZWN0LCB5
b3UKKyAgc2hvdWxkIHVzZSB0aGVzZSBtZXRob2RzIGluc3RlYWQgb2YgQXJyYXkgcHJpbWl0aXZl
cyBiZWNhdXNlIHRoZXNlIHdpbGwKKyAgcHJvcGVybHkgbm90aWZ5IG9ic2VydmVycyBvZiBjaGFu
Z2VzIHRvIHRoZSBhcnJheS4KKworICBBbHRob3VnaCB0aGVzZSBtZXRob2RzIGFyZSBlZmZpY2ll
bnQsIHRoZXkgZG8gYWRkIGEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gdG8KKyAgeW91ciBhcHBsaWNh
dGlvbiBzbyBpdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgdGhlbSBvbmx5IHdoZW4geW91IG5lZWQg
dGhlCisgIGZsZXhpYmlsaXR5IG9mIHVzaW5nIGJvdGggdHJ1ZSBKYXZhU2NyaXB0IGFycmF5cyBh
bmQgInZpcnR1YWwiIGFycmF5cyBzdWNoCisgIGFzIGNvbnRyb2xsZXJzIGFuZCBjb2xsZWN0aW9u
cy4KKworICBZb3UgY2FuIHVzZSB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRv
IGFjY2VzcyBhbmQgbW9kaWZ5IGFycmF5CisgIGNvbnRlbnRzIGluIGEgS1ZPLWZyaWVuZGx5IHdh
eS4gWW91IGNhbiBhbHNvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQorICBtZW1iZXJzaGlwIGlm
IGFuIGFycmF5IGNoYW5nZXMgYnkgY2hhbmdpbmcgdGhlIHN5bnRheCBvZiB0aGUgcHJvcGVydHkg
dG8KKyAgYC5vYnNlcnZlcygnKm15UHJvcGVydHkuW10nKWAuCisKKyAgVG8gc3VwcG9ydCBgRW1i
ZXIuQXJyYXlgIGluIHlvdXIgb3duIGNsYXNzLCB5b3UgbXVzdCBvdmVycmlkZSB0d28KKyAgcHJp
bWl0aXZlcyB0byB1c2UgaXQ6IGByZXBsYWNlKClgIGFuZCBgb2JqZWN0QXQoKWAuCisKKyAgTm90
ZSB0aGF0IHRoZSBFbWJlci5BcnJheSBtaXhpbiBhbHNvIGluY29ycG9yYXRlcyB0aGUgYEVtYmVy
LkVudW1lcmFibGVgCisgIG1peGluLiBBbGwgYEVtYmVyLkFycmF5YC1saWtlIG9iamVjdHMgYXJl
IGFsc28gZW51bWVyYWJsZS4KKworICBAY2xhc3MgQXJyYXkKKyAgQG5hbWVzcGFjZSBFbWJlcgor
ICBAZXh0ZW5kcyBFbWJlci5NaXhpbgorICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCisgIEBzaW5j
ZSBFbWJlciAwLjkuMAorKi8KK0VtYmVyLkFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVy
LkVudW1lcmFibGUsIC8qKiBAc2NvcGUgRW1iZXIuQXJyYXkucHJvdG90eXBlICovIHsKKworICAv
LyBjb21wYXRpYmlsaXR5CisgIGlzU0NBcnJheTogdHJ1ZSwKKworICAvKioKKyAgICBZb3VyIGFy
cmF5IG11c3Qgc3VwcG9ydCB0aGUgYGxlbmd0aGAgcHJvcGVydHkuIFlvdXIgcmVwbGFjZSBtZXRo
b2RzIHNob3VsZAorICAgIHNldCB0aGlzIHByb3BlcnR5IHdoZW5ldmVyIGl0IGNoYW5nZXMuCisK
KyAgICBAcHJvcGVydHkge051bWJlcn0gbGVuZ3RoCisgICovCisgIGxlbmd0aDogRW1iZXIucmVx
dWlyZWQoKSwKKworICAvKioKKyAgICBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGBp
bmRleGAuIElmIHRoZSBnaXZlbiBgaW5kZXhgIGlzIG5lZ2F0aXZlCisgICAgb3IgaXMgZ3JlYXRl
ciBvciBlcXVhbCB0aGFuIHRoZSBhcnJheSBsZW5ndGgsIHJldHVybnMgYHVuZGVmaW5lZGAuCisK
KyAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8g
c3VwcG9ydCBgRW1iZXIuQXJyYXlgLgorICAgIElmIHlvdXIgb2JqZWN0IHN1cHBvcnRzIHJldHJp
ZXZpbmcgdGhlIHZhbHVlIG9mIGFuIGFycmF5IGl0ZW0gdXNpbmcgYGdldCgpYAorICAgIChpLmUu
IGBteUFycmF5LmdldCgwKWApLCB0aGVuIHlvdSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhp
cyBtZXRob2QKKyAgICB5b3Vyc2VsZi4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgYXJy
ID0gWydhJywgJ2InLCAnYycsICdkJ107CisgICAgYXJyLm9iamVjdEF0KDApOyAgIC8vICJhIgor
ICAgIGFyci5vYmplY3RBdCgzKTsgICAvLyAiZCIKKyAgICBhcnIub2JqZWN0QXQoLTEpOyAgLy8g
dW5kZWZpbmVkCisgICAgYXJyLm9iamVjdEF0KDQpOyAgIC8vIHVuZGVmaW5lZAorICAgIGFyci5v
YmplY3RBdCg1KTsgICAvLyB1bmRlZmluZWQKKyAgICBgYGAKKworICAgIEBtZXRob2Qgb2JqZWN0
QXQKKyAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1
cm4uCisgICovCisgIG9iamVjdEF0OiBmdW5jdGlvbihpZHgpIHsKKyAgICBpZiAoKGlkeCA8IDAp
IHx8IChpZHg+PWdldCh0aGlzLCAnbGVuZ3RoJykpKSByZXR1cm4gdW5kZWZpbmVkIDsKKyAgICBy
ZXR1cm4gZ2V0KHRoaXMsIGlkeCk7CisgIH0sCisKKyAgLyoqCisgICAgVGhpcyByZXR1cm5zIHRo
ZSBvYmplY3RzIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlcywgdXNpbmcgYG9iamVjdEF0YC4KKwor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgYXJyID3CoFsnYScsICdiJywgJ2MnLCAnZCddOwor
ICAgIGFyci5vYmplY3RzQXQoWzAsIDEsIDJdKTsgIC8vIFsiYSIsICJiIiwgImMiXQorICAgIGFy
ci5vYmplY3RzQXQoWzIsIDMsIDRdKTsgIC8vIFsiYyIsICJkIiwgdW5kZWZpbmVkXQorICAgIGBg
YAorCisgICAgQG1ldGhvZCBvYmplY3RzQXQKKyAgICBAcGFyYW0ge0FycmF5fSBpbmRleGVzIEFu
IGFycmF5IG9mIGluZGV4ZXMgb2YgaXRlbXMgdG8gcmV0dXJuLgorICAgKi8KKyAgb2JqZWN0c0F0
OiBmdW5jdGlvbihpbmRleGVzKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIHJldHVybiBt
YXAoaW5kZXhlcywgZnVuY3Rpb24oaWR4KXsgcmV0dXJuIHNlbGYub2JqZWN0QXQoaWR4KTsgfSk7
CisgIH0sCisKKyAgLy8gb3ZlcnJpZGVzIEVtYmVyLkVudW1lcmFibGUgdmVyc2lvbgorICBuZXh0
T2JqZWN0OiBmdW5jdGlvbihpZHgpIHsKKyAgICByZXR1cm4gdGhpcy5vYmplY3RBdChpZHgpOwor
ICB9LAorCisgIC8qKgorICAgIFRoaXMgaXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWFsIGFy
cmF5IGNvbnRlbnQgcHJvcGVydHkuIElmIHlvdSBnZXQKKyAgICB0aGlzIHByb3BlcnR5LCBpdCB3
aWxsIHJldHVybiB0aGlzLiBJZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgaXQgYSBuZXcKKyAgICBh
cnJheSwgaXQgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGNvbnRlbnQuCisKKyAgICBUaGlzIHBy
b3BlcnR5IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBkZWZpbmVkIGluIGBFbWJlci5F
bnVtZXJhYmxlYC4KKworICAgIEBwcm9wZXJ0eSBbXQorICAqLworICAnW10nOiBFbWJlci5jb21w
dXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQp
IHRoaXMucmVwbGFjZSgwLCBnZXQodGhpcywgJ2xlbmd0aCcpLCB2YWx1ZSkgOworICAgIHJldHVy
biB0aGlzIDsKKyAgfSksCisKKyAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzLm9iamVjdEF0KDApOworICB9KSwKKworICBsYXN0T2JqZWN0
OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5vYmplY3RBdChn
ZXQodGhpcywgJ2xlbmd0aCcpLTEpOworICB9KSwKKworICAvLyBvcHRpbWl6ZWQgdmVyc2lvbiBm
cm9tIEVudW1lcmFibGUKKyAgY29udGFpbnM6IGZ1bmN0aW9uKG9iail7CisgICAgcmV0dXJuIHRo
aXMuaW5kZXhPZihvYmopID49IDA7CisgIH0sCisKKyAgLy8gQWRkIGFueSBleHRyYSBtZXRob2Rz
IHRvIEVtYmVyLkFycmF5IHRoYXQgYXJlIG5hdGl2ZSB0byB0aGUgYnVpbHQtaW4gQXJyYXkuCisg
IC8qKgorICAgIFJldHVybnMgYSBuZXcgYXJyYXkgdGhhdCBpcyBhIHNsaWNlIG9mIHRoZSByZWNl
aXZlci4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHVzZXMgdGhlIG9ic2VydmFibGUgYXJyYXkg
bWV0aG9kcyB0byByZXRyaWV2ZSB0aGUgb2JqZWN0cyBmb3IgdGhlIG5ldworICAgIHNsaWNlLgor
CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBhcnIgPSBbJ3JlZCcsICdncmVlbicsICdibHVl
J107CisgICAgYXJyLnNsaWNlKDApOyAgICAgICAvLyBbJ3JlZCcsICdncmVlbicsICdibHVlJ10K
KyAgICBhcnIuc2xpY2UoMCwgMik7ICAgIC8vIFsncmVkJywgJ2dyZWVuJ10KKyAgICBhcnIuc2xp
Y2UoMSwgMTAwKTsgIC8vIFsnZ3JlZW4nLCAnYmx1ZSddCisgICAgYGBgCisKKyAgICBAbWV0aG9k
IHNsaWNlCisgICAgQHBhcmFtIGJlZ2luSW5kZXgge0ludGVnZXJ9IChPcHRpb25hbCkgaW5kZXgg
dG8gYmVnaW4gc2xpY2luZyBmcm9tLgorICAgIEBwYXJhbSBlbmRJbmRleCB7SW50ZWdlcn0gKE9w
dGlvbmFsKSBpbmRleCB0byBlbmQgdGhlIHNsaWNlIGF0LgorICAgIEByZXR1cm4ge0FycmF5fSBO
ZXcgYXJyYXkgd2l0aCBzcGVjaWZpZWQgc2xpY2UKKyAgKi8KKyAgc2xpY2U6IGZ1bmN0aW9uKGJl
Z2luSW5kZXgsIGVuZEluZGV4KSB7CisgICAgdmFyIHJldCA9IFtdOworICAgIHZhciBsZW5ndGgg
PSBnZXQodGhpcywgJ2xlbmd0aCcpIDsKKyAgICBpZiAobm9uZShiZWdpbkluZGV4KSkgYmVnaW5J
bmRleCA9IDAgOworICAgIGlmIChub25lKGVuZEluZGV4KSB8fCAoZW5kSW5kZXggPiBsZW5ndGgp
KSBlbmRJbmRleCA9IGxlbmd0aCA7CisgICAgd2hpbGUoYmVnaW5JbmRleCA8IGVuZEluZGV4KSB7
CisgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB0aGlzLm9iamVjdEF0KGJlZ2luSW5kZXgrKykgOwor
ICAgIH0KKyAgICByZXR1cm4gcmV0IDsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIHRoZSBp
bmRleCBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICBJZiBubyBg
c3RhcnRBdGAgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBzdGFydGluZyBsb2NhdGlvbiB0bworICAg
IHNlYXJjaCBpcyAwLiBJZiBpdCdzIG5lZ2F0aXZlLCB3aWxsIGNvdW50IGJhY2t3YXJkIGZyb20K
KyAgICB0aGUgZW5kIG9mIHRoZSBhcnJheS4gUmV0dXJucyAtMSBpZiBubyBtYXRjaCBpcyBmb3Vu
ZC4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgYXJyID0gWyJhIiwgImIiLCAiYyIsICJk
IiwgImEiXTsKKyAgICBhcnIuaW5kZXhPZigiYSIpOyAgICAgICAvLyAgMAorICAgIGFyci5pbmRl
eE9mKCJ6Iik7ICAgICAgIC8vIC0xCisgICAgYXJyLmluZGV4T2YoImEiLCAyKTsgICAgLy8gIDQK
KyAgICBhcnIuaW5kZXhPZigiYSIsIC0xKTsgICAvLyAgNAorICAgIGFyci5pbmRleE9mKCJiIiwg
Myk7ICAgIC8vIC0xCisgICAgYXJyLmluZGV4T2YoImEiLCAxMDApOyAgLy8gLTEKKyAgICBgYGAK
KworICAgIEBtZXRob2QgaW5kZXhPZgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdGhlIGl0
ZW0gdG8gc2VhcmNoIGZvcgorICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydEF0IG9wdGlvbmFsIHN0
YXJ0aW5nIGxvY2F0aW9uIHRvIHNlYXJjaCwgZGVmYXVsdCAwCisgICAgQHJldHVybiB7TnVtYmVy
fSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQKKyAgKi8KKyAgaW5kZXhPZjogZnVuY3Rpb24ob2Jq
ZWN0LCBzdGFydEF0KSB7CisgICAgdmFyIGlkeCwgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsK
KworICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQgPSAwOworICAgIGlmIChz
dGFydEF0IDwgMCkgc3RhcnRBdCArPSBsZW47CisKKyAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4PGxl
bjtpZHgrKykgeworICAgICAgaWYgKHRoaXMub2JqZWN0QXQoaWR4LCB0cnVlKSA9PT0gb2JqZWN0
KSByZXR1cm4gaWR4IDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9LAorCisgIC8qKgorICAg
IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBvYmplY3QncyBsYXN0IG9jY3VycmVuY2Uu
CisgICAgSWYgbm8gYHN0YXJ0QXRgIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgc2VhcmNoIHN0YXJ0
cyBmcm9tCisgICAgdGhlIGxhc3QgcG9zaXRpb24uIElmIGl0J3MgbmVnYXRpdmUsIHdpbGwgY291
bnQgYmFja3dhcmQKKyAgICBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlm
IG5vIG1hdGNoIGlzIGZvdW5kLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBhcnIgPSBb
ImEiLCAiYiIsICJjIiwgImQiLCAiYSJdOworICAgIGFyci5sYXN0SW5kZXhPZigiYSIpOyAgICAg
ICAvLyAgNAorICAgIGFyci5sYXN0SW5kZXhPZigieiIpOyAgICAgICAvLyAtMQorICAgIGFyci5s
YXN0SW5kZXhPZigiYSIsIDIpOyAgICAvLyAgMAorICAgIGFyci5sYXN0SW5kZXhPZigiYSIsIC0x
KTsgICAvLyAgNAorICAgIGFyci5sYXN0SW5kZXhPZigiYiIsIDMpOyAgICAvLyAgMQorICAgIGFy
ci5sYXN0SW5kZXhPZigiYSIsIDEwMCk7ICAvLyAgNAorICAgIGBgYAorCisgICAgQG1ldGhvZCBs
YXN0SW5kZXhPZgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdGhlIGl0ZW0gdG8gc2VhcmNo
IGZvcgorICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydEF0IG9wdGlvbmFsIHN0YXJ0aW5nIGxvY2F0
aW9uIHRvIHNlYXJjaCwgZGVmYXVsdCAwCisgICAgQHJldHVybiB7TnVtYmVyfSBpbmRleCBvciAt
MSBpZiBub3QgZm91bmQKKyAgKi8KKyAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uKG9iamVjdCwgc3Rh
cnRBdCkgeworICAgIHZhciBpZHgsIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CisKKyAgICBp
ZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0QXQgPj0gbGVuKSBzdGFydEF0ID0gbGVu
LTE7CisgICAgaWYgKHN0YXJ0QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKKworICAgIGZvcihpZHg9
c3RhcnRBdDtpZHg+PTA7aWR4LS0pIHsKKyAgICAgIGlmICh0aGlzLm9iamVjdEF0KGlkeCkgPT09
IG9iamVjdCkgcmV0dXJuIGlkeCA7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfSwKKworICAv
LyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCisgIC8vIEFSUkFZIE9CU0VSVkVSUworICAvLworCisgIC8qKgorICAgIEFkZHMgYW4gYXJy
YXkgb2JzZXJ2ZXIgdG8gdGhlIHJlY2VpdmluZyBhcnJheS4gVGhlIGFycmF5IG9ic2VydmVyIG9i
amVjdAorICAgIG5vcm1hbGx5IG11c3QgaW1wbGVtZW50IHR3byBtZXRob2RzOgorCisgICAgKiBg
YXJyYXlXaWxsQ2hhbmdlKHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0
aG9kIHdpbGwgYmUKKyAgICAgIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgaXMgbW9kaWZp
ZWQuCisgICAgKiBgYXJyYXlEaWRDaGFuZ2Uoc3RhcnQsIHJlbW92ZUNvdW50LCBhZGRDb3VudClg
IC0gVGhpcyBtZXRob2Qgd2lsbCBiZQorICAgICAgY2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIGFycmF5
IGlzIG1vZGlmaWVkLgorCisgICAgQm90aCBjYWxsYmFja3Mgd2lsbCBiZSBwYXNzZWQgdGhlIHN0
YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UgYXMgd2VsbCBhCisgICAgYSBjb3VudCBvZiB0aGUg
aXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQgYWRkZWQuIFlvdSBjYW4gdXNlIHRoZXNlIGNhbGxiYWNr
cworICAgIHRvIG9wdGlvbmFsbHkgaW5zcGVjdCB0aGUgYXJyYXkgZHVyaW5nIHRoZSBjaGFuZ2Us
IGNsZWFyIGNhY2hlcywgb3IgZG8KKyAgICBhbnkgb3RoZXIgYm9va2tlZXBpbmcgbmVjZXNzYXJ5
LgorCisgICAgSW4gYWRkaXRpb24gdG8gcGFzc2luZyBhIHRhcmdldCwgeW91IGNhbiBhbHNvIGlu
Y2x1ZGUgYW4gb3B0aW9ucyBoYXNoCisgICAgd2hpY2ggeW91IGNhbiB1c2UgdG8gb3ZlcnJpZGUg
dGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiB0aGUKKyAgICB0YXJnZXQu
CisKKyAgICBAbWV0aG9kIGFkZEFycmF5T2JzZXJ2ZXIKKyAgICBAcGFyYW0ge09iamVjdH0gdGFy
Z2V0IFRoZSBvYnNlcnZlciBvYmplY3QuCisgICAgQHBhcmFtIHtIYXNofSBvcHRzIE9wdGlvbmFs
IGhhc2ggb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZworICAgICAgYHdpbGxDaGFu
Z2VgLCBgZGlkQ2hhbmdlYCwgYW5kIGEgYGNvbnRleHRgIG9wdGlvbi4KKyAgICBAcmV0dXJuIHtF
bWJlci5BcnJheX0gcmVjZWl2ZXIKKyAgKi8KKyAgYWRkQXJyYXlPYnNlcnZlcjogZnVuY3Rpb24o
dGFyZ2V0LCBvcHRzKSB7CisgICAgdmFyIHdpbGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxD
aGFuZ2UpIHx8ICdhcnJheVdpbGxDaGFuZ2UnLAorICAgICAgICBkaWRDaGFuZ2UgID0gKG9wdHMg
JiYgb3B0cy5kaWRDaGFuZ2UpIHx8ICdhcnJheURpZENoYW5nZSc7CisKKyAgICB2YXIgaGFzT2Jz
ZXJ2ZXJzID0gZ2V0KHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOworICAgIGlmICghaGFzT2Jz
ZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJz
Jyk7CisgICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgJ0BhcnJheTpiZWZvcmUnLCB0YXJnZXQs
IHdpbGxDaGFuZ2UpOworICAgIEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdAYXJyYXk6Y2hhbmdl
JywgdGFyZ2V0LCBkaWRDaGFuZ2UpOworICAgIGlmICghaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9w
ZXJ0eURpZENoYW5nZSh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKKyAgICByZXR1cm4gdGhp
czsKKyAgfSwKKworICAvKioKKyAgICBSZW1vdmVzIGFuIGFycmF5IG9ic2VydmVyIGZyb20gdGhl
IG9iamVjdCBpZiB0aGUgb2JzZXJ2ZXIgaXMgY3VycmVudAorICAgIHJlZ2lzdGVyZWQuIENhbGxp
bmcgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBvYmplY3Qgd2lsbAor
ICAgIGhhdmUgbm8gZWZmZWN0LgorCisgICAgQG1ldGhvZCByZW1vdmVBcnJheU9ic2VydmVyCisg
ICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IG9ic2VydmluZyB0aGUgYXJyYXku
CisgICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCisgICovCisgIHJlbW92ZUFycmF5
T2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgeworICAgIHZhciB3aWxsQ2hhbmdlID0g
KG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAnYXJyYXlXaWxsQ2hhbmdlJywKKyAgICAgICAg
ZGlkQ2hhbmdlICA9IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnYXJyYXlEaWRDaGFuZ2Un
OworCisgICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMn
KTsKKyAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywg
J2hhc0FycmF5T2JzZXJ2ZXJzJyk7CisgICAgRW1iZXIucmVtb3ZlTGlzdGVuZXIodGhpcywgJ0Bh
cnJheTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOworICAgIEVtYmVyLnJlbW92ZUxpc3Rl
bmVyKHRoaXMsICdAYXJyYXk6Y2hhbmdlJywgdGFyZ2V0LCBkaWRDaGFuZ2UpOworICAgIGlmICho
YXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2Vy
dmVycycpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIEJlY29tZXMgdHJ1
ZSB3aGVuZXZlciB0aGUgYXJyYXkgY3VycmVudGx5IGhhcyBvYnNlcnZlcnMgd2F0Y2hpbmcgY2hh
bmdlcworICAgIG9uIHRoZSBhcnJheS4KKworICAgIEBwcm9wZXJ0eSBCb29sZWFuCisgICovCisg
IGhhc0FycmF5T2JzZXJ2ZXJzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6Y2hhbmdlJykgfHwgRW1iZXIuaGFz
TGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6YmVmb3JlJyk7CisgIH0pLAorCisgIC8qKgorICAgIElm
IHlvdSBhcmUgaW1wbGVtZW50aW5nIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGBFbWJlci5BcnJh
eWAsIGNhbGwgdGhpcworICAgIG1ldGhvZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgY29udGVudCBj
aGFuZ2VzIHRvIG5vdGlmeSBhbnkgb2JzZXJ2ZXJzIGFuZAorICAgIGludmFsaWRhdGUgYW55IHJl
bGF0ZWQgcHJvcGVydGllcy4gUGFzcyB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGNoYW5nZQor
ICAgIGFzIHdlbGwgYXMgYSBkZWx0YSBvZiB0aGUgYW1vdW50cyB0byBjaGFuZ2UuCisKKyAgICBA
bWV0aG9kIGFycmF5Q29udGVudFdpbGxDaGFuZ2UKKyAgICBAcGFyYW0ge051bWJlcn0gc3RhcnRJ
ZHggVGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJheSB0aGF0IHdpbGwgY2hhbmdlLgorICAg
IEBwYXJhbSB7TnVtYmVyfSByZW1vdmVBbXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwg
YmUgcmVtb3ZlZC4gSWYgeW91IAorICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwCisgICAgQHBh
cmFtIHtOdW1iZXJ9IGFkZEFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSBhZGRl
ZCAgSWYgeW91IAorICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwLgorICAgIEByZXR1cm4ge0Vt
YmVyLkFycmF5fSByZWNlaXZlcgorICAqLworICBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlOiBmdW5j
dGlvbihzdGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXQpIHsKKworICAgIC8vIGlmIG5vIGFyZ3Mg
YXJlIHBhc3NlZCBhc3N1bWUgZXZlcnl0aGluZyBjaGFuZ2VzCisgICAgaWYgKHN0YXJ0SWR4PT09
dW5kZWZpbmVkKSB7CisgICAgICBzdGFydElkeCA9IDA7CisgICAgICByZW1vdmVBbXQgPSBhZGRB
bXQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlbW92ZUFtdCA9PT0gdW5kZWZpbmVk
KSByZW1vdmVBbXQ9LTE7CisgICAgICBpZiAoYWRkQW10ICAgID09PSB1bmRlZmluZWQpIGFkZEFt
dD0tMTsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIEBlYWNoIHByb3h5IGlzIHNldCB1
cCBpZiBhbnlvbmUgaXMgb2JzZXJ2aW5nIEBlYWNoCisgICAgaWYgKEVtYmVyLmlzV2F0Y2hpbmco
dGhpcywgJ0BlYWNoJykpIHsgZ2V0KHRoaXMsICdAZWFjaCcpOyB9CisKKyAgICBFbWJlci5zZW5k
RXZlbnQodGhpcywgJ0BhcnJheTpiZWZvcmUnLCBbdGhpcywgc3RhcnRJZHgsIHJlbW92ZUFtdCwg
YWRkQW10XSk7CisKKyAgICB2YXIgcmVtb3ZpbmcsIGxpbTsKKyAgICBpZiAoc3RhcnRJZHg+PTAg
JiYgcmVtb3ZlQW10Pj0wICYmIGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpKSB7
CisgICAgICByZW1vdmluZyA9IFtdOworICAgICAgbGltID0gc3RhcnRJZHgrcmVtb3ZlQW10Owor
ICAgICAgZm9yKHZhciBpZHg9c3RhcnRJZHg7aWR4PGxpbTtpZHgrKykgcmVtb3ZpbmcucHVzaCh0
aGlzLm9iamVjdEF0KGlkeCkpOworICAgIH0gZWxzZSB7CisgICAgICByZW1vdmluZyA9IHJlbW92
ZUFtdDsKKyAgICB9CisKKyAgICB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShyZW1v
dmluZywgYWRkQW10KTsKKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIGFycmF5Q29udGVu
dERpZENoYW5nZTogZnVuY3Rpb24oc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10KSB7CisKKyAg
ICAvLyBpZiBubyBhcmdzIGFyZSBwYXNzZWQgYXNzdW1lIGV2ZXJ5dGhpbmcgY2hhbmdlcworICAg
IGlmIChzdGFydElkeD09PXVuZGVmaW5lZCkgeworICAgICAgc3RhcnRJZHggPSAwOworICAgICAg
cmVtb3ZlQW10ID0gYWRkQW10ID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZW1vdmVB
bXQgPT09IHVuZGVmaW5lZCkgcmVtb3ZlQW10PS0xOworICAgICAgaWYgKGFkZEFtdCAgICA9PT0g
dW5kZWZpbmVkKSBhZGRBbXQ9LTE7CisgICAgfQorCisgICAgdmFyIGFkZGluZywgbGltOworICAg
IGlmIChzdGFydElkeD49MCAmJiBhZGRBbXQ+PTAgJiYgZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxl
T2JzZXJ2ZXJzJykpIHsKKyAgICAgIGFkZGluZyA9IFtdOworICAgICAgbGltID0gc3RhcnRJZHgr
YWRkQW10OworICAgICAgZm9yKHZhciBpZHg9c3RhcnRJZHg7aWR4PGxpbTtpZHgrKykgYWRkaW5n
LnB1c2godGhpcy5vYmplY3RBdChpZHgpKTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkaW5nID0g
YWRkQW10OworICAgIH0KKworICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UocmVt
b3ZlQW10LCBhZGRpbmcpOworICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAnQGFycmF5OmNoYW5n
ZScsIFt0aGlzLCBzdGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXRdKTsKKworICAgIHZhciBsZW5n
dGggICAgICA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCisgICAgICAgIGNhY2hlZEZpcnN0ID0gY2Fj
aGVGb3IodGhpcywgJ2ZpcnN0T2JqZWN0JyksCisgICAgICAgIGNhY2hlZExhc3QgID0gY2FjaGVG
b3IodGhpcywgJ2xhc3RPYmplY3QnKTsKKyAgICBpZiAodGhpcy5vYmplY3RBdCgwKSAhPT0gY2Fj
aGVkRmlyc3QpIHsKKyAgICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RP
YmplY3QnKTsKKyAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVj
dCcpOworICAgIH0KKyAgICBpZiAodGhpcy5vYmplY3RBdChsZW5ndGgtMSkgIT09IGNhY2hlZExh
c3QpIHsKKyAgICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcp
OworICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIEVOVU1FUkFURUQg
UFJPUEVSVElFUworICAvLworCisgIC8qKgorICAgIFJldHVybnMgYSBzcGVjaWFsIG9iamVjdCB0
aGF0IGNhbiBiZSB1c2VkIHRvIG9ic2VydmUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzCisgICAgb24g
dGhlIGFycmF5LiBKdXN0IGdldCBhbiBlcXVpdmFsZW50IHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0
IGFuZCBpdCB3aWxsCisgICAgcmV0dXJuIGFuIGVudW1lcmFibGUgdGhhdCBtYXBzIGF1dG9tYXRp
Y2FsbHkgdG8gdGhlIG5hbWVkIGtleSBvbiB0aGUKKyAgICBtZW1iZXIgb2JqZWN0cy4KKworICAg
IEBwcm9wZXJ0eSBAZWFjaAorICAqLworICAnQGVhY2gnOiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bigpIHsKKyAgICBpZiAoIXRoaXMuX19lYWNoKSB0aGlzLl9fZWFjaCA9IG5ldyBFbWJlci5FYWNo
UHJveHkodGhpcyk7CisgICAgcmV0dXJuIHRoaXMuX19lYWNoOworICB9KQorCit9KSA7CisKK30p
KCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUg
ZW1iZXItcnVudGltZQorKi8KKworCisvKioKKyAgSW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1l
dGhvZHMgZm9yIGNvbXBhcmluZyBvYmplY3RzLiBBZGQgdGhpcyBtaXhpbiB0bworICBhbnkgY2xh
c3MgeW91IGNyZWF0ZSB0aGF0IGNhbiBjb21wYXJlIGl0cyBpbnN0YW5jZXMuCisKKyAgWW91IHNo
b3VsZCBpbXBsZW1lbnQgdGhlIGBjb21wYXJlKClgIG1ldGhvZC4KKworICBAY2xhc3MgQ29tcGFy
YWJsZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk1peGluCisgIEBzaW5j
ZSBFbWJlciAwLjkKKyovCitFbWJlci5Db21wYXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKCAv
KiogQHNjb3BlIEVtYmVyLkNvbXBhcmFibGUucHJvdG90eXBlICoveworCisgIC8qKgorICAgIHdh
bGsgbGlrZSBhIGR1Y2suIEluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIGNvbXBhcmVk
LgorCisgICAgQHByb3BlcnR5IGlzQ29tcGFyYWJsZQorICAgIEB0eXBlIEJvb2xlYW4KKyAgICBA
ZGVmYXVsdCB0cnVlCisgICovCisgIGlzQ29tcGFyYWJsZTogdHJ1ZSwKKworICAvKioKKyAgICBP
dmVycmlkZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgdHdv
IHBhcmFtZXRlcnMuIFRoZQorICAgIGNvbXBhcmUgbWV0aG9kIHNob3VsZCByZXR1cm46CisKKyAg
ICAtIGAtMWAgaWYgYGEgPCBiYAorICAgIC0gYDBgIGlmIGBhID09IGJgCisgICAgLSBgMWAgaWYg
YGEgPiBiYAorCisgICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByYWlzZXMgYW4gZXhjZXB0aW9u
LgorCisgICAgQG1ldGhvZCBjb21wYXJlCisgICAgQHBhcmFtIGEge09iamVjdH0gdGhlIGZpcnN0
IG9iamVjdCB0byBjb21wYXJlCisgICAgQHBhcmFtIGIge09iamVjdH0gdGhlIHNlY29uZCBvYmpl
Y3QgdG8gY29tcGFyZQorICAgIEByZXR1cm4ge0ludGVnZXJ9IHRoZSByZXN1bHQgb2YgdGhlIGNv
bXBhcmlzb24KKyAgKi8KKyAgY29tcGFyZTogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pCisKK30p
OworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0Bz
dWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KKworCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldDsKKworLyoqCisgIEltcGxlbWVudHMgc29tZSBzdGFuZGFyZCBtZXRob2Rz
IGZvciBjb3B5aW5nIGFuIG9iamVjdC4gQWRkIHRoaXMgbWl4aW4gdG8KKyAgYW55IG9iamVjdCB5
b3UgY3JlYXRlIHRoYXQgY2FuIGNyZWF0ZSBhIGNvcHkgb2YgaXRzZWxmLiBUaGlzIG1peGluIGlz
CisgIGFkZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGJ1aWx0LWluIGFycmF5LgorCisgIFlvdSBz
aG91bGQgZ2VuZXJhbGx5IGltcGxlbWVudCB0aGUgYGNvcHkoKWAgbWV0aG9kIHRvIHJldHVybiBh
IGNvcHkgb2YgdGhlCisgIHJlY2VpdmVyLgorCisgIE5vdGUgdGhhdCBgZnJvemVuQ29weSgpYCB3
aWxsIG9ubHkgd29yayBpZiB5b3UgYWxzbyBpbXBsZW1lbnQKKyAgYEVtYmVyLkZyZWV6YWJsZWAu
CisKKyAgQGNsYXNzIENvcHlhYmxlCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1i
ZXIuTWl4aW4KKyAgQHNpbmNlIEVtYmVyIDAuOQorKi8KK0VtYmVyLkNvcHlhYmxlID0gRW1iZXIu
TWl4aW4uY3JlYXRlKAorLyoqIEBzY29wZSBFbWJlci5Db3B5YWJsZS5wcm90b3R5cGUgKi8gewor
CisgIC8qKgorICAgIE92ZXJyaWRlIHRvIHJldHVybiBhIGNvcHkgb2YgdGhlIHJlY2VpdmVyLiBE
ZWZhdWx0IGltcGxlbWVudGF0aW9uIHJhaXNlcworICAgIGFuIGV4Y2VwdGlvbi4KKworICAgIEBt
ZXRob2QgY29weQorICAgIEBwYXJhbSBkZWVwIHtCb29sZWFufSBpZiBgdHJ1ZWAsIGEgZGVlcCBj
b3B5IG9mIHRoZSBvYmplY3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBAcmV0dXJuIHtPYmplY3R9IGNv
cHkgb2YgcmVjZWl2ZXIKKyAgKi8KKyAgY29weTogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAor
CisgIC8qKgorICAgIElmIHRoZSBvYmplY3QgaW1wbGVtZW50cyBgRW1iZXIuRnJlZXphYmxlYCwg
dGhlbiB0aGlzIHdpbGwgcmV0dXJuIGEgbmV3CisgICAgY29weSBpZiB0aGUgb2JqZWN0IGlzIG5v
dCBmcm96ZW4gYW5kIHRoZSByZWNlaXZlciBpZiB0aGUgb2JqZWN0IGlzIGZyb3plbi4KKworICAg
IFJhaXNlcyBhbiBleGNlcHRpb24gaWYgeW91IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIG9uIGEg
b2JqZWN0IHRoYXQgZG9lcworICAgIG5vdCBzdXBwb3J0IGZyZWV6aW5nLgorCisgICAgWW91IHNo
b3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IHdhbnQgYSBjb3B5IG9mIGEgZnJlZXph
YmxlIG9iamVjdAorICAgIHNpbmNlIGEgZnJlZXphYmxlIG9iamVjdCBjYW4gc2ltcGx5IHJldHVy
biBpdHNlbGYgd2l0aG91dCBhY3R1YWxseQorICAgIGNvbnN1bWluZyBtb3JlIG1lbW9yeS4KKwor
ICAgIEBtZXRob2QgZnJvemVuQ29weQorICAgIEByZXR1cm4ge09iamVjdH0gY29weSBvZiByZWNl
aXZlciBvciByZWNlaXZlcgorICAqLworICBmcm96ZW5Db3B5OiBmdW5jdGlvbigpIHsKKyAgICBp
ZiAoRW1iZXIuRnJlZXphYmxlICYmIEVtYmVyLkZyZWV6YWJsZS5kZXRlY3QodGhpcykpIHsKKyAg
ICAgIHJldHVybiBnZXQodGhpcywgJ2lzRnJvemVuJykgPyB0aGlzIDogdGhpcy5jb3B5KCkuZnJl
ZXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcihFbWJlci5TdHJpbmcu
Zm10KCIlQCBkb2VzIG5vdCBzdXBwb3J0IGZyZWV6aW5nIiwgW3RoaXNdKSk7CisgICAgfQorICB9
Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgor
QHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldDsKKworLyoqCisgIFRoZSBgRW1iZXIuRnJlZXphYmxlYCBtaXhpbiBpbXBs
ZW1lbnRzIHNvbWUgYmFzaWMgbWV0aG9kcyBmb3IgbWFya2luZyBhbgorICBvYmplY3QgYXMgZnJv
emVuLiBPbmNlIGFuIG9iamVjdCBpcyBmcm96ZW4gaXQgc2hvdWxkIGJlIHJlYWQgb25seS4gTm8g
Y2hhbmdlcworICBtYXkgYmUgbWFkZSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9iamVjdC4K
KworICAjIyBFbmZvcmNlbWVudAorCisgIFRvIGZ1bGx5IHN1cHBvcnQgZnJlZXppbmcgaW4geW91
ciBzdWJjbGFzcywgeW91IG11c3QgaW5jbHVkZSB0aGlzIG1peGluIGFuZAorICBvdmVycmlkZSBh
bnkgbWV0aG9kIHRoYXQgbWlnaHQgYWx0ZXIgYW55IHByb3BlcnR5IG9uIHRoZSBvYmplY3QgdG8g
aW5zdGVhZAorICByYWlzZSBhbiBleGNlcHRpb24uIFlvdSBjYW4gY2hlY2sgdGhlIHN0YXRlIG9m
IGFuIG9iamVjdCBieSBjaGVja2luZyB0aGUKKyAgYGlzRnJvemVuYCBwcm9wZXJ0eS4KKworICBB
bHRob3VnaCBmdXR1cmUgdmVyc2lvbnMgb2YgSmF2YVNjcmlwdCBtYXkgc3VwcG9ydCBsYW5ndWFn
ZS1sZXZlbCBmcmVlemluZworICBvYmplY3Qgb2JqZWN0cywgdGhhdCBpcyBub3QgdGhlIGNhc2Ug
dG9kYXkuIEV2ZW4gaWYgYW4gb2JqZWN0IGlzIGZyZWV6YWJsZSwKKyAgaXQgaXMgc3RpbGwgdGVj
aG5pY2FsbHkgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBvYmplY3QsIGV2ZW4gdGhvdWdoIGl0IGNv
dWxkCisgIGJyZWFrIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdGhhdCBkbyBub3Qg
ZXhwZWN0IGEgZnJvemVuIG9iamVjdCB0bworICBjaGFuZ2UuIEl0IGlzLCB0aGVyZWZvcmUsIHZl
cnkgaW1wb3J0YW50IHRoYXQgeW91IGFsd2F5cyByZXNwZWN0IHRoZQorICBgaXNGcm96ZW5gIHBy
b3BlcnR5IG9uIGFsbCBmcmVlemFibGUgb2JqZWN0cy4KKworICAjIyBFeGFtcGxlIFVzYWdlCisK
KyAgVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgYSBzaW1wbGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50
IHRoZSBgRW1iZXIuRnJlZXphYmxlYAorICBwcm90b2NvbC4KKworICBgYGBqYXZhc2NyaXB0Cisg
IENvbnRhY3QgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkZyZWV6YWJsZSwgeworICAgIGZp
cnN0TmFtZTogbnVsbCwKKyAgICBsYXN0TmFtZTogbnVsbCwKKworICAgIC8vIHN3YXBzIHRoZSBu
YW1lcworICAgIHN3YXBOYW1lczogZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5nZXQoJ2lz
RnJvemVuJykpIHRocm93IEVtYmVyLkZST1pFTl9FUlJPUjsKKyAgICAgIHZhciB0bXAgPSB0aGlz
LmdldCgnZmlyc3ROYW1lJyk7CisgICAgICB0aGlzLnNldCgnZmlyc3ROYW1lJywgdGhpcy5nZXQo
J2xhc3ROYW1lJykpOworICAgICAgdGhpcy5zZXQoJ2xhc3ROYW1lJywgdG1wKTsKKyAgICAgIHJl
dHVybiB0aGlzOworICAgIH0KKworICB9KTsKKworICBjID0gQ29udGV4dC5jcmVhdGUoeyBmaXJz
dE5hbWU6ICJKb2huIiwgbGFzdE5hbWU6ICJEb2UiIH0pOworICBjLnN3YXBOYW1lcygpOyAgLy8g
cmV0dXJucyBjCisgIGMuZnJlZXplKCk7CisgIGMuc3dhcE5hbWVzKCk7ICAvLyBFWENFUFRJT04K
KyAgYGBgCisKKyAgIyMgQ29weWluZworCisgIFVzdWFsbHkgdGhlIGBFbWJlci5GcmVlemFibGVg
IHByb3RvY29sIGlzIGltcGxlbWVudGVkIGluIGNvb3BlcmF0aW9uIHdpdGggdGhlCisgIGBFbWJl
ci5Db3B5YWJsZWAgcHJvdG9jb2wsIHdoaWNoIGRlZmluZXMgYSBgZnJvemVuQ29weSgpYCBtZXRo
b2QgdGhhdCB3aWxsCisgIHJldHVybiBhIGZyb3plbiBvYmplY3QsIGlmIHRoZSBvYmplY3QgaW1w
bGVtZW50cyB0aGlzIG1ldGhvZCBhcyB3ZWxsLgorCisgIEBjbGFzcyBGcmVlemFibGUKKyAgQG5h
bWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5NaXhpbgorICBAc2luY2UgRW1iZXIgMC45
CisqLworRW1iZXIuRnJlZXphYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKAorLyoqIEBzY29wZSBF
bWJlci5GcmVlemFibGUucHJvdG90eXBlICovIHsKKworICAvKioKKyAgICBTZXQgdG8gYHRydWVg
IHdoZW4gdGhlIG9iamVjdCBpcyBmcm96ZW4uIFVzZSB0aGlzIHByb3BlcnR5IHRvIGRldGVjdAor
ICAgIHdoZXRoZXIgeW91ciBvYmplY3QgaXMgZnJvemVuIG9yIG5vdC4KKworICAgIEBwcm9wZXJ0
eSBpc0Zyb3plbgorICAgIEB0eXBlIEJvb2xlYW4KKyAgKi8KKyAgaXNGcm96ZW46IGZhbHNlLAor
CisgIC8qKgorICAgIEZyZWV6ZXMgdGhlIG9iamVjdC4gT25jZSB0aGlzIG1ldGhvZCBoYXMgYmVl
biBjYWxsZWQgdGhlIG9iamVjdCBzaG91bGQKKyAgICBubyBsb25nZXIgYWxsb3cgYW55IHByb3Bl
cnRpZXMgdG8gYmUgZWRpdGVkLgorCisgICAgQG1ldGhvZCBmcmVlemUKKyAgICBAcmV0dXJuIHtP
YmplY3R9IHJlY2VpdmVyCisgICovCisgIGZyZWV6ZTogZnVuY3Rpb24oKSB7CisgICAgaWYgKGdl
dCh0aGlzLCAnaXNGcm96ZW4nKSkgcmV0dXJuIHRoaXM7CisgICAgc2V0KHRoaXMsICdpc0Zyb3pl
bicsIHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9CisKK30pOworCitFbWJlci5GUk9aRU5f
RVJST1IgPSAiRnJvemVuIG9iamVjdCBjYW5ub3QgYmUgbW9kaWZpZWQuIjsKKworfSkoKTsKKwor
CisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCisqLworCit2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNo
OworCisvKioKKyAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBBUEkgZm9yIG1vZGlmeWluZyBnZW5l
cmljIGVudW1lcmFibGVzLiBUaGVzZSBtZXRob2RzCisgIGNhbiBiZSBhcHBsaWVkIHRvIGFuIG9i
amVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgb3JkZXJlZCBvcgorICB1bm9yZGVyZWQu
CisKKyAgTm90ZSB0aGF0IGFuIEVudW1lcmFibGUgY2FuIGNoYW5nZSBldmVuIGlmIGl0IGRvZXMg
bm90IGltcGxlbWVudCB0aGlzIG1peGluLgorICBGb3IgZXhhbXBsZSwgYSBNYXBwZWRFbnVtZXJh
YmxlIGNhbm5vdCBiZSBkaXJlY3RseSBtb2RpZmllZCBidXQgaWYgaXRzCisgIHVuZGVybHlpbmcg
ZW51bWVyYWJsZSBjaGFuZ2VzLCBpdCB3aWxsIGNoYW5nZSBhbHNvLgorCisgICMjIEFkZGluZyBP
YmplY3RzCisKKyAgVG8gYWRkIGFuIG9iamVjdCB0byBhbiBlbnVtZXJhYmxlLCB1c2UgdGhlIGBh
ZGRPYmplY3QoKWAgbWV0aG9kLiBUaGlzCisgIG1ldGhvZCB3aWxsIG9ubHkgYWRkIHRoZSBvYmpl
Y3QgdG8gdGhlIGVudW1lcmFibGUgaWYgdGhlIG9iamVjdCBpcyBub3QKKyAgYWxyZWFkeSBwcmVz
ZW50IGFuZCB0aGUgb2JqZWN0IGlmIG9mIGEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGVudW1lcmFi
bGUuCisKKyAgYGBgamF2YXNjcmlwdAorICBzZXQuYWRkT2JqZWN0KGNvbnRhY3QpOworICBgYGAK
KworICAjIyBSZW1vdmluZyBPYmplY3RzCisKKyAgVG8gcmVtb3ZlIGFuIG9iamVjdCBmb3JtIGFu
IGVudW1lcmFibGUsIHVzZSB0aGUgYHJlbW92ZU9iamVjdCgpYCBtZXRob2QuIFRoaXMKKyAgd2ls
bCBvbmx5IHJlbW92ZSB0aGUgb2JqZWN0IGlmIGl0IGlzIGFscmVhZHkgaW4gdGhlIGVudW1lcmFi
bGUsIG90aGVyd2lzZQorICB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgorCisgIGBgYGphdmFz
Y3JpcHQKKyAgc2V0LnJlbW92ZU9iamVjdChjb250YWN0KTsKKyAgYGBgCisKKyAgIyMgSW1wbGVt
ZW50aW5nIEluIFlvdXIgT3duIENvZGUKKworICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhbiBv
YmplY3QgYW5kIHdhbnQgdG8gc3VwcG9ydCB0aGlzIEFQSSwganVzdCBpbmNsdWRlCisgIHRoaXMg
bWl4aW4gaW4geW91ciBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2RzLiBJ
biB5b3VyIHVuaXQKKyAgdGVzdHMsIGJlIHN1cmUgdG8gYXBwbHkgdGhlIEVtYmVyLk11dGFibGVF
bnVtZXJhYmxlVGVzdHMgdG8geW91ciBvYmplY3QuCisKKyAgQGNsYXNzIE11dGFibGVFbnVtZXJh
YmxlCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyAgQHVzZXMg
RW1iZXIuRW51bWVyYWJsZQorKi8KK0VtYmVyLk11dGFibGVFbnVtZXJhYmxlID0gRW1iZXIuTWl4
aW4uY3JlYXRlKEVtYmVyLkVudW1lcmFibGUsCisgIC8qKiBAc2NvcGUgRW1iZXIuTXV0YWJsZUVu
dW1lcmFibGUucHJvdG90eXBlICovIHsKKworICAvKioKKyAgICBfX1JlcXVpcmVkLl9fIFlvdSBt
dXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgorCisgICAgQXR0
ZW1wdHMgdG8gYWRkIHRoZSBwYXNzZWQgb2JqZWN0IHRvIHRoZSByZWNlaXZlciBpZiB0aGUgb2Jq
ZWN0IGlzIG5vdAorICAgIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgY29sbGVjdGlvbi4gSWYgdGhl
IG9iamVjdCBpcyBwcmVzZW50LCB0aGlzIG1ldGhvZAorICAgIGhhcyBubyBlZmZlY3QuCisKKyAg
ICBJZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBvZiBhIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0aGUg
cmVjZWl2ZXIKKyAgICB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24u
CisKKyAgICBAbWV0aG9kIGFkZE9iamVjdAorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhl
IG9iamVjdCB0byBhZGQgdG8gdGhlIGVudW1lcmFibGUuCisgICAgQHJldHVybiB7T2JqZWN0fSB0
aGUgcGFzc2VkIG9iamVjdAorICAqLworICBhZGRPYmplY3Q6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0
aW9uKSwKKworICAvKioKKyAgICBBZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVy
YWJsZSB0byB0aGUgcmVjZWl2ZXIuCisKKyAgICBAbWV0aG9kIGFkZE9iamVjdHMKKyAgICBAcGFy
YW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgorICAgIEBy
ZXR1cm4ge09iamVjdH0gcmVjZWl2ZXIKKyAgKi8KKyAgYWRkT2JqZWN0czogZnVuY3Rpb24ob2Jq
ZWN0cykgeworICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRoaXMpOworICAgIGZvckVh
Y2gob2JqZWN0cywgZnVuY3Rpb24ob2JqKSB7IHRoaXMuYWRkT2JqZWN0KG9iaik7IH0sIHRoaXMp
OworICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKKyAgICByZXR1cm4gdGhpczsK
KyAgfSwKKworICAvKioKKyAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlz
IG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgorCisgICAgQXR0ZW1wdHMgdG8gcmVtb3ZlIHRo
ZSBwYXNzZWQgb2JqZWN0IGZyb20gdGhlIHJlY2VpdmVyIGNvbGxlY3Rpb24gaWYgdGhlCisgICAg
b2JqZWN0IGlzIGluIHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmplY3QgaXMg
bm90IHByZXNlbnQsCisgICAgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KKworICAgIElmIHRo
ZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZl
cgorICAgIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKworICAg
IEBtZXRob2QgcmVtb3ZlT2JqZWN0CisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2Jq
ZWN0IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnVtZXJhYmxlLgorICAgIEByZXR1cm4ge09iamVjdH0g
dGhlIHBhc3NlZCBvYmplY3QKKyAgKi8KKyAgcmVtb3ZlT2JqZWN0OiBFbWJlci5yZXF1aXJlZChG
dW5jdGlvbiksCisKKworICAvKioKKyAgICBSZW1vdmVzIGVhY2ggb2JqZWN0cyBpbiB0aGUgcGFz
c2VkIGVudW1lcmFibGUgZnJvbSB0aGUgcmVjZWl2ZXIuCisKKyAgICBAbWV0aG9kIHJlbW92ZU9i
amVjdHMKKyAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMg
dG8gcmVtb3ZlCisgICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAqLworICByZW1vdmVP
YmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CisgICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5n
ZXModGhpcyk7CisgICAgZm9yRWFjaChvYmplY3RzLCBmdW5jdGlvbihvYmopIHsgdGhpcy5yZW1v
dmVPYmplY3Qob2JqKTsgfSwgdGhpcyk7CisgICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRo
aXMpOworICAgIHJldHVybiB0aGlzOworICB9CisKK30pOworCit9KSgpOworCisKKworKGZ1bmN0
aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyov
CisvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uCisvLyBDT05TVEFOVFMKKy8vCisKK3ZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0g
IkluZGV4IG91dCBvZiByYW5nZSIgOwordmFyIEVNUFRZID0gW107CisKKy8vIC4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIEhFTFBF
UlMKKy8vCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9yRWFjaCA9
IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOworCisvKioKKyAgVGhpcyBtaXhpbiBkZWZp
bmVzIHRoZSBBUEkgZm9yIG1vZGlmeWluZyBhcnJheS1saWtlIG9iamVjdHMuIFRoZXNlIG1ldGhv
ZHMKKyAgY2FuIGJlIGFwcGxpZWQgb25seSB0byBhIGNvbGxlY3Rpb24gdGhhdCBrZWVwcyBpdHMg
aXRlbXMgaW4gYW4gb3JkZXJlZCBzZXQuCisKKyAgTm90ZSB0aGF0IGFuIEFycmF5IGNhbiBjaGFu
Z2UgZXZlbiBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtaXhpbi4KKyAgRm9yIGV4YW1w
bGUsIG9uZSBtaWdodCBpbXBsZW1lbnQgYSBTcGFyc2VBcnJheSB0aGF0IGNhbm5vdCBiZSBkaXJl
Y3RseQorICBtb2RpZmllZCwgYnV0IGlmIGl0cyB1bmRlcmx5aW5nIGVudW1lcmFibGUgY2hhbmdl
cywgaXQgd2lsbCBjaGFuZ2UgYWxzby4KKworICBAY2xhc3MgTXV0YWJsZUFycmF5CisgIEBuYW1l
c3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyAgQHVzZXMgRW1iZXIuQXJyYXkK
KyAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKKyovCitFbWJlci5NdXRhYmxlQXJyYXkg
PSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuQXJyYXksIEVtYmVyLk11dGFibGVFbnVtZXJhYmxl
LAorICAvKiogQHNjb3BlIEVtYmVyLk11dGFibGVBcnJheS5wcm90b3R5cGUgKi8geworCisgIC8q
KgorICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFw
cGx5IHRoaXMgbWl4aW4uCisKKyAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZlcyB5b3Ug
bXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgLgorICAgIFlvdSBzaG91bGQg
cmVwbGFjZSBhbXQgb2JqZWN0cyBzdGFydGVkIGF0IGlkeCB3aXRoIHRoZSBvYmplY3RzIGluIHRo
ZQorICAgIHBhc3NlZCBhcnJheS4gWW91IHNob3VsZCBhbHNvIGNhbGwgYHRoaXMuZW51bWVyYWJs
ZUNvbnRlbnREaWRDaGFuZ2UoKWAKKworICAgIEBtZXRob2QgcmVwbGFjZQorICAgIEBwYXJhbSB7
TnVtYmVyfSBpZHggU3RhcnRpbmcgaW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UuIElmIAor
ICAgICAgaWR4ID49IGxlbmd0aCwgdGhlbiBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXku
CisgICAgQHBhcmFtIHtOdW1iZXJ9IGFtdCBOdW1iZXIgb2YgZWxlbWVudHMgdGhhdCBzaG91bGQg
YmUgcmVtb3ZlZCBmcm9tIAorICAgICAgdGhlIGFycmF5LCBzdGFydGluZyBhdCAqaWR4Ki4KKyAg
ICBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEFuIGFycmF5IG9mIHplcm8gb3IgbW9yZSBvYmplY3Rz
IHRoYXQgc2hvdWxkIGJlIAorICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlkeCoK
KyAgKi8KKyAgcmVwbGFjZTogRW1iZXIucmVxdWlyZWQoKSwKKworICAvKioKKyAgICBSZW1vdmUg
YWxsIGVsZW1lbnRzIGZyb20gc2VsZi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91CisgICAgd2FudCB0
byByZXVzZSBhbiBleGlzdGluZyBhcnJheSB3aXRob3V0IGhhdmluZyB0byByZWNyZWF0ZSBpdC4K
KworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAi
Ymx1ZSJdOworICAgIGNvbG9yLmxlbmd0aCgpOyAgIC8vICAzCisgICAgY29sb3JzLmNsZWFyKCk7
ICAgLy8gIFtdCisgICAgY29sb3JzLmxlbmd0aCgpOyAgLy8gIDAKKyAgICBgYGAKKworICAgIEBt
ZXRob2QgY2xlYXIKKyAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gQW4gZW1wdHkgQXJyYXkuCisg
ICovCisgIGNsZWFyOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVu
Z3RoJyk7CisgICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIHRoaXM7CisgICAgdGhpcy5yZXBsYWNl
KDAsIGxlbiwgRU1QVFkpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIFRo
aXMgd2lsbCB1c2UgdGhlIHByaW1pdGl2ZSBgcmVwbGFjZSgpYCBtZXRob2QgdG8gaW5zZXJ0IGFu
IG9iamVjdCBhdCB0aGUKKyAgICBzcGVjaWZpZWQgaW5kZXguCisKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKKyAgICBjb2xvcnMu
aW5zZXJ0QXQoMiwgInllbGxvdyIpOyAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJs
dWUiXQorICAgIGNvbG9ycy5pbnNlcnRBdCg1LCAib3JhbmdlIik7ICAvLyBFcnJvcjogSW5kZXgg
b3V0IG9mIHJhbmdlCisgICAgYGBgCisKKyAgICBAbWV0aG9kIGluc2VydEF0CisgICAgQHBhcmFt
IHtOdW1iZXJ9IGlkeCBpbmRleCBvZiBpbnNlcnQgdGhlIG9iamVjdCBhdC4KKyAgICBAcGFyYW0g
e09iamVjdH0gb2JqZWN0IG9iamVjdCB0byBpbnNlcnQKKyAgKi8KKyAgaW5zZXJ0QXQ6IGZ1bmN0
aW9uKGlkeCwgb2JqZWN0KSB7CisgICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnbGVuZ3RoJykpIHRo
cm93IG5ldyBFcnJvcihPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OKSA7CisgICAgdGhpcy5yZXBsYWNl
KGlkeCwgMCwgW29iamVjdF0pIDsKKyAgICByZXR1cm4gdGhpcyA7CisgIH0sCisKKyAgLyoqCisg
ICAgUmVtb3ZlIGFuIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHVzaW5nIHRoZSBgcmVw
bGFjZSgpYCBwcmltaXRpdmUKKyAgICBtZXRob2QuIFlvdSBjYW4gcGFzcyBlaXRoZXIgYSBzaW5n
bGUgaW5kZXgsIG9yIGEgc3RhcnQgYW5kIGEgbGVuZ3RoLgorCisgICAgSWYgeW91IHBhc3MgYSBz
dGFydCBhbmQgbGVuZ3RoIHRoYXQgaXMgYmV5b25kIHRoZQorICAgIGxlbmd0aCB0aGlzIG1ldGhv
ZCB3aWxsIHRocm93IGFuIGBFbWJlci5PVVRfT0ZfUkFOR0VfRVhDRVBUSU9OYAorCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIiwgInll
bGxvdyIsICJvcmFuZ2UiXTsKKyAgICBjb2xvcnMucmVtb3ZlQXQoMCk7ICAgICAvLyBbImdyZWVu
IiwgImJsdWUiLCAieWVsbG93IiwgIm9yYW5nZSJdCisgICAgY29sb3JzLnJlbW92ZUF0KDIsIDIp
OyAgLy8gWyJncmVlbiIsICJibHVlIl0KKyAgICBjb2xvcnMucmVtb3ZlQXQoNCwgMik7ICAvLyBF
cnJvcjogSW5kZXggb3V0IG9mIHJhbmdlCisgICAgYGBgCisKKyAgICBAbWV0aG9kIHJlbW92ZUF0
CisgICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IGluZGV4LCBzdGFydCBvZiByYW5nZQorICAgIEBw
YXJhbSB7TnVtYmVyfSBsZW4gbGVuZ3RoIG9mIHBhc3NpbmcgcmFuZ2UKKyAgICBAcmV0dXJuIHtP
YmplY3R9IHJlY2VpdmVyCisgICovCisgIHJlbW92ZUF0OiBmdW5jdGlvbihzdGFydCwgbGVuKSB7
CisgICAgaWYgKCdudW1iZXInID09PSB0eXBlb2Ygc3RhcnQpIHsKKworICAgICAgaWYgKChzdGFy
dCA8IDApIHx8IChzdGFydCA+PSBnZXQodGhpcywgJ2xlbmd0aCcpKSkgeworICAgICAgICB0aHJv
dyBuZXcgRXJyb3IoT1VUX09GX1JBTkdFX0VYQ0VQVElPTik7CisgICAgICB9CisKKyAgICAgIC8v
IGZhc3QgY2FzZQorICAgICAgaWYgKGxlbiA9PT0gdW5kZWZpbmVkKSBsZW4gPSAxOworICAgICAg
dGhpcy5yZXBsYWNlKHN0YXJ0LCBsZW4sIEVNUFRZKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhp
cyA7CisgIH0sCisKKyAgLyoqCisgICAgUHVzaCB0aGUgb2JqZWN0IG9udG8gdGhlIGVuZCBvZiB0
aGUgYXJyYXkuIFdvcmtzIGp1c3QgbGlrZSBgcHVzaCgpYCBidXQgaXQKKyAgICBpcyBLVk8tY29t
cGxpYW50LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJn
cmVlbiIsICJibHVlIl07CisgICAgY29sb3JzLnB1c2hPYmplY3QoImJsYWNrIik7ICAgICAgICAg
ICAgICAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayJdCisgICAgY29sb3JzLnB1
c2hPYmplY3QoWyJ5ZWxsb3ciLCAib3JhbmdlIl0pOyAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1
ZSIsICJibGFjayIsIFsieWVsbG93IiwgIm9yYW5nZSJdXQorICAgIGBgYAorCisgICAgQG1ldGhv
ZCBwdXNoT2JqZWN0CisgICAgQHBhcmFtIHthbnl0aGluZ30gb2JqIG9iamVjdCB0byBwdXNoCisg
ICovCisgIHB1c2hPYmplY3Q6IGZ1bmN0aW9uKG9iaikgeworICAgIHRoaXMuaW5zZXJ0QXQoZ2V0
KHRoaXMsICdsZW5ndGgnKSwgb2JqKSA7CisgICAgcmV0dXJuIG9iaiA7CisgIH0sCisKKyAgLyoq
CisgICAgQWRkIHRoZSBvYmplY3RzIGluIHRoZSBwYXNzZWQgbnVtZXJhYmxlIHRvIHRoZSBlbmQg
b2YgdGhlIGFycmF5LiBEZWZlcnMKKyAgICBub3RpZnlpbmcgb2JzZXJ2ZXJzIG9mIHRoZSBjaGFu
Z2UgdW50aWwgYWxsIG9iamVjdHMgYXJlIGFkZGVkLgorCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIl07CisgICAgY29sb3JzLnB1c2hP
YmplY3RzKCJibGFjayIpOyAgICAgICAgICAgICAgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUi
LCAiYmxhY2siXQorICAgIGNvbG9ycy5wdXNoT2JqZWN0cyhbInllbGxvdyIsICJvcmFuZ2UiXSk7
ICAvLyBbInJlZCIsICJncmVlbiIsICJibHVlIiwgImJsYWNrIiwgInllbGxvdyIsICJvcmFuZ2Ui
XQorICAgIGBgYAorCisgICAgQG1ldGhvZCBwdXNoT2JqZWN0cworICAgIEBwYXJhbSB7RW1iZXIu
RW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKKyAgICBAcmV0dXJuIHtFbWJl
ci5BcnJheX0gcmVjZWl2ZXIKKyAgKi8KKyAgcHVzaE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMp
IHsKKyAgICB0aGlzLnJlcGxhY2UoZ2V0KHRoaXMsICdsZW5ndGgnKSwgMCwgb2JqZWN0cyk7Cisg
ICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgUG9wIG9iamVjdCBmcm9tIGFycmF5
IG9yIG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0IGxpa2UgYHBvcCgpYCBidXQKKyAg
ICBpdCBpcyBLVk8tY29tcGxpYW50LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xv
cnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIl07CisgICAgY29sb3JzLnBvcE9iamVjdCgpOyAg
IC8vICJibHVlIgorICAgIGNvbnNvbGUubG9nKGNvbG9ycyk7ICAvLyBbInJlZCIsICJncmVlbiJd
CisgICAgYGBgCisKKyAgICBAbWV0aG9kIHBvcE9iamVjdAorICAgIEByZXR1cm4gb2JqZWN0Cisg
ICovCisgIHBvcE9iamVjdDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGxlbiA9IGdldCh0aGlzLCAn
bGVuZ3RoJykgOworICAgIGlmIChsZW4gPT09IDApIHJldHVybiBudWxsIDsKKworICAgIHZhciBy
ZXQgPSB0aGlzLm9iamVjdEF0KGxlbi0xKSA7CisgICAgdGhpcy5yZW1vdmVBdChsZW4tMSwgMSkg
OworICAgIHJldHVybiByZXQgOworICB9LAorCisgIC8qKgorICAgIFNoaWZ0IGFuIG9iamVjdCBm
cm9tIHN0YXJ0IG9mIGFycmF5IG9yIG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0Cisg
ICAgbGlrZSBgc2hpZnQoKWAgYnV0IGl0IGlzIEtWTy1jb21wbGlhbnQuCisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKKyAgICBj
b2xvcnMuc2hpZnRPYmplY3QoKTsgIC8vICJyZWQiCisgICAgY29uc29sZS5sb2coY29sb3JzKTsg
ICAvLyBbImdyZWVuIiwgImJsdWUiXQorICAgIGBgYAorCisgICAgQG1ldGhvZCBzaGlmdE9iamVj
dAorICAgIEByZXR1cm4gb2JqZWN0CisgICovCisgIHNoaWZ0T2JqZWN0OiBmdW5jdGlvbigpIHsK
KyAgICBpZiAoZ2V0KHRoaXMsICdsZW5ndGgnKSA9PT0gMCkgcmV0dXJuIG51bGwgOworICAgIHZh
ciByZXQgPSB0aGlzLm9iamVjdEF0KDApIDsKKyAgICB0aGlzLnJlbW92ZUF0KDApIDsKKyAgICBy
ZXR1cm4gcmV0IDsKKyAgfSwKKworICAvKioKKyAgICBVbnNoaWZ0IGFuIG9iamVjdCB0byBzdGFy
dCBvZiBhcnJheS4gV29ya3MganVzdCBsaWtlIGB1bnNoaWZ0KClgIGJ1dCBpdCBpcworICAgIEtW
Ty1jb21wbGlhbnQuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXTsKKyAgICBjb2xvcnMudW5zaGlmdE9iamVjdCgieWVsbG93Iik7
ICAgICAgICAgICAgIC8vIFsieWVsbG93IiwgInJlZCIsICJncmVlbiIsICJibHVlIl0KKyAgICBj
b2xvcnMudW5zaGlmdE9iamVjdChbImJsYWNrIiwgIndoaXRlIl0pOyAgIC8vIFtbImJsYWNrIiwg
IndoaXRlIl0sICJ5ZWxsb3ciLCAicmVkIiwgImdyZWVuIiwgImJsdWUiXQorICAgIGBgYAorCisg
ICAgQG1ldGhvZCB1bnNoaWZ0T2JqZWN0CisgICAgQHBhcmFtIHthbnl0aGluZ30gb2JqIG9iamVj
dCB0byB1bnNoaWZ0CisgICovCisgIHVuc2hpZnRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgeworICAg
IHRoaXMuaW5zZXJ0QXQoMCwgb2JqKSA7CisgICAgcmV0dXJuIG9iaiA7CisgIH0sCisKKyAgLyoq
CisgICAgQWRkcyB0aGUgbmFtZWQgb2JqZWN0cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJh
eS4gRGVmZXJzIG5vdGlmeWluZworICAgIG9ic2VydmVycyB1bnRpbCBhbGwgb2JqZWN0cyBoYXZl
IGJlZW4gYWRkZWQuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXTsKKyAgICBjb2xvcnMudW5zaGlmdE9iamVjdHMoWyJibGFjayIs
ICJ3aGl0ZSJdKTsgICAvLyBbImJsYWNrIiwgIndoaXRlIiwgInJlZCIsICJncmVlbiIsICJibHVl
Il0KKyAgICBjb2xvcnMudW5zaGlmdE9iamVjdHMoInllbGxvdyIpOyAgICAgICAgICAgICAvLyBU
eXBlIEVycm9yOiAndW5kZWZpbmVkJyBpcyBub3QgYSBmdW5jdGlvbgorICAgIGBgYAorCisgICAg
QG1ldGhvZCB1bnNoaWZ0T2JqZWN0cworICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2Jq
ZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKKyAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2
ZXIKKyAgKi8KKyAgdW5zaGlmdE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKKyAgICB0aGlz
LnJlcGxhY2UoMCwgMCwgb2JqZWN0cyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoq
CisgICAgUmV2ZXJzZSBvYmplY3RzIGluIHRoZSBhcnJheS4gV29ya3MganVzdCBsaWtlIGByZXZl
cnNlKClgIGJ1dCBpdCBpcworICAgIEtWTy1jb21wbGlhbnQuCisKKyAgICBAbWV0aG9kIHJldmVy
c2VPYmplY3RzCisgICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCisgICAqLworICBy
ZXZlcnNlT2JqZWN0czogZnVuY3Rpb24oKSB7CisgICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVu
Z3RoJyk7CisgICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIHRoaXM7CisgICAgdmFyIG9iamVjdHMg
PSB0aGlzLnRvQXJyYXkoKS5yZXZlcnNlKCk7CisgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2Jq
ZWN0cyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgUmVwbGFjZSBhbGwg
dGhlIHRoZSByZWNlaXZlcidzIGNvbnRlbnQgd2l0aCBjb250ZW50IG9mIHRoZSBhcmd1bWVudC4K
KyAgICBJZiBhcmd1bWVudCBpcyBhbiBlbXB0eSBhcnJheSByZWNlaXZlciB3aWxsIGJlIGNsZWFy
ZWQuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVu
IiwgImJsdWUiXTsKKyAgICBjb2xvcnMuc2V0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAg
Ly8gWyJibGFjayIsICJ3aGl0ZSJdCisgICAgY29sb3JzLnNldE9iamVjdHMoW10pOyAgICAgICAg
ICAgICAgICAgIC8vIFtdCisgICAgYGBgCisKKyAgICBAbWV0aG9kIHNldE9iamVjdHMKKyAgICBA
cGFyYW0ge0VtYmVyLkFycmF5fSBvYmplY3RzIGFycmF5IHdob3NlIGNvbnRlbnQgd2lsbCBiZSB1
c2VkIGZvciByZXBsYWNpbmcKKyAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyCisg
ICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyIHdpdGggdGhlIG5ldyBjb250ZW50Cisg
ICAqLworICBzZXRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CisgICAgaWYgKG9iamVjdHMu
bGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5jbGVhcigpOworCisgICAgdmFyIGxlbiA9IGdldCh0
aGlzLCAnbGVuZ3RoJyk7CisgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7CisgICAg
cmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBJTVBMRU1FTlQgRW1iZXIuTXV0YWJs
ZUVudW1lcmFibGUKKyAgLy8KKworICByZW1vdmVPYmplY3Q6IGZ1bmN0aW9uKG9iaikgeworICAg
IHZhciBsb2MgPSBnZXQodGhpcywgJ2xlbmd0aCcpIHx8IDA7CisgICAgd2hpbGUoLS1sb2MgPj0g
MCkgeworICAgICAgdmFyIGN1ck9iamVjdCA9IHRoaXMub2JqZWN0QXQobG9jKSA7CisgICAgICBp
ZiAoY3VyT2JqZWN0ID09PSBvYmopIHRoaXMucmVtb3ZlQXQobG9jKSA7CisgICAgfQorICAgIHJl
dHVybiB0aGlzIDsKKyAgfSwKKworICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgeworICAgIGlm
ICghdGhpcy5jb250YWlucyhvYmopKSB0aGlzLnB1c2hPYmplY3Qob2JqKTsKKyAgICByZXR1cm4g
dGhpcyA7CisgIH0KKworfSk7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgor
QG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCit2YXIgZ2V0ID0g
RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGRlZmluZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5l
UHJvcGVydHk7CisKKy8qKgorICAjIyBPdmVydmlldworCisgIFRoaXMgbWl4aW4gcHJvdmlkZXMg
cHJvcGVydGllcyBhbmQgcHJvcGVydHkgb2JzZXJ2aW5nIGZ1bmN0aW9uYWxpdHksIGNvcmUKKyAg
ZmVhdHVyZXMgb2YgdGhlIEVtYmVyIG9iamVjdCBtb2RlbC4KKworICBQcm9wZXJ0aWVzIGFuZCBv
YnNlcnZlcnMgYWxsb3cgb25lIG9iamVjdCB0byBvYnNlcnZlIGNoYW5nZXMgdG8gYQorICBwcm9w
ZXJ0eSBvbiBhbm90aGVyIG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhlIGZ1bmRhbWVudGFsIHdh
eXMgdGhhdAorICBtb2RlbHMsIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyBjb21tdW5pY2F0ZSB3aXRo
IGVhY2ggb3RoZXIgaW4gYW4gRW1iZXIKKyAgYXBwbGljYXRpb24uCisKKyAgQW55IG9iamVjdCB0
aGF0IGhhcyB0aGlzIG1peGluIGFwcGxpZWQgY2FuIGJlIHVzZWQgaW4gb2JzZXJ2ZXIKKyAgb3Bl
cmF0aW9ucy4gVGhhdCBpbmNsdWRlcyBgRW1iZXIuT2JqZWN0YCBhbmQgbW9zdCBvYmplY3RzIHlv
dSB3aWxsCisgIGludGVyYWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIgRW1iZXIgYXBwbGljYXRp
b24uCisKKyAgTm90ZSB0aGF0IHlvdSB3aWxsIG5vdCBnZW5lcmFsbHkgYXBwbHkgdGhpcyBtaXhp
biB0byBjbGFzc2VzIHlvdXJzZWxmLAorICBidXQgeW91IHdpbGwgdXNlIHRoZSBmZWF0dXJlcyBw
cm92aWRlZCBieSB0aGlzIG1vZHVsZSBmcmVxdWVudGx5LCBzbyBpdAorICBpcyBpbXBvcnRhbnQg
dG8gdW5kZXJzdGFuZCBob3cgdG8gdXNlIGl0LgorCisgICMjIFVzaW5nIGBnZXQoKWAgYW5kIGBz
ZXQoKWAKKworICBCZWNhdXNlIG9mIEVtYmVyJ3Mgc3VwcG9ydCBmb3IgYmluZGluZ3MgYW5kIG9i
c2VydmVycywgeW91IHdpbGwgYWx3YXlzCisgIGFjY2VzcyBwcm9wZXJ0aWVzIHVzaW5nIHRoZSBn
ZXQgbWV0aG9kLCBhbmQgc2V0IHByb3BlcnRpZXMgdXNpbmcgdGhlCisgIHNldCBtZXRob2QuIFRo
aXMgYWxsb3dzIHRoZSBvYnNlcnZpbmcgb2JqZWN0cyB0byBiZSBub3RpZmllZCBhbmQKKyAgY29t
cHV0ZWQgcHJvcGVydGllcyB0byBiZSBoYW5kbGVkIHByb3Blcmx5LgorCisgIE1vcmUgZG9jdW1l
bnRhdGlvbiBhYm91dCBgZ2V0YCBhbmQgYHNldGAgYXJlIGJlbG93LgorCisgICMjIE9ic2Vydmlu
ZyBQcm9wZXJ0eSBDaGFuZ2VzCisKKyAgWW91IHR5cGljYWxseSBvYnNlcnZlIHByb3BlcnR5IGNo
YW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAorICBjYWxsIHRvIHRoZSBlbmQg
b2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCisg
IEZvciBleGFtcGxlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7
CisgICAgdmFsdWVPYnNlcnZlcjogZnVuY3Rpb24oKSB7CisgICAgICAvLyBFeGVjdXRlcyB3aGVu
ZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCisgICAgfS5vYnNlcnZlcygndmFsdWUn
KQorICB9KTsKKyAgYGBgCisKKyAgQWx0aG91Z2ggdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gd2F5
IHRvIGFkZCBhbiBvYnNlcnZlciwgdGhpcyBjYXBhYmlsaXR5CisgIGlzIGFjdHVhbGx5IGJ1aWx0
IGludG8gdGhlIGBFbWJlci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0d28gbWV0aG9kcworICBk
ZWZpbmVkIGluIHRoaXMgbWl4aW46IGBhZGRPYnNlcnZlcmAgYW5kIGByZW1vdmVPYnNlcnZlcmAu
IFlvdSBjYW4gdXNlCisgIHRoZXNlIHR3byBtZXRob2RzIHRvIGFkZCBhbmQgcmVtb3ZlIG9ic2Vy
dmVycyB5b3Vyc2VsZiBpZiB5b3UgbmVlZCB0bworICBkbyBzbyBhdCBydW50aW1lLgorCisgIFRv
IGFkZCBhbiBvYnNlcnZlciBmb3IgYSBwcm9wZXJ0eSwgY2FsbDoKKworICBgYGBqYXZhc2NyaXB0
CisgIG9iamVjdC5hZGRPYnNlcnZlcigncHJvcGVydHlLZXknLCB0YXJnZXRPYmplY3QsIHRhcmdl
dEFjdGlvbikKKyAgYGBgCisKKyAgVGhpcyB3aWxsIGNhbGwgdGhlIGB0YXJnZXRBY3Rpb25gIG1l
dGhvZCBvbiB0aGUgYHRhcmdldE9iamVjdGAgdG8gYmUgY2FsbGVkCisgIHdoZW5ldmVyIHRoZSB2
YWx1ZSBvZiB0aGUgYHByb3BlcnR5S2V5YCBjaGFuZ2VzLgorCisgIE5vdGUgdGhhdCBpZiBgcHJv
cGVydHlLZXlgIGlzIGEgY29tcHV0ZWQgcHJvcGVydHksIHRoZSBvYnNlcnZlciB3aWxsIGJlCisg
IGNhbGxlZCB3aGVuIGFueSBvZiB0aGUgcHJvcGVydHkgZGVwZW5kZW5jaWVzIGFyZSBjaGFuZ2Vk
LCBldmVuIGlmIHRoZQorICByZXN1bHRpbmcgdmFsdWUgb2YgdGhlIGNvbXB1dGVkIHByb3BlcnR5
IGlzIHVuY2hhbmdlZC4gVGhpcyBpcyBuZWNlc3NhcnkKKyAgYmVjYXVzZSBjb21wdXRlZCBwcm9w
ZXJ0aWVzIGFyZSBub3QgY29tcHV0ZWQgdW50aWwgYGdldGAgaXMgY2FsbGVkLgorCisgIEBjbGFz
cyBPYnNlcnZhYmxlCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuTWl4aW4K
KyovCitFbWJlci5PYnNlcnZhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKC8qKiBAc2NvcGUgRW1i
ZXIuT2JzZXJ2YWJsZS5wcm90b3R5cGUgKi8geworCisgIC8qKgorICAgIFJldHJpZXZlcyB0aGUg
dmFsdWUgb2YgYSBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3QuCisKKyAgICBUaGlzIG1ldGhvZCBp
cyB1c3VhbGx5IHNpbWlsYXIgdG8gdXNpbmcgYG9iamVjdFtrZXlOYW1lXWAgb3IgYG9iamVjdC5r
ZXlOYW1lYCwKKyAgICBob3dldmVyIGl0IHN1cHBvcnRzIGJvdGggY29tcHV0ZWQgcHJvcGVydGll
cyBhbmQgdGhlIHVua25vd25Qcm9wZXJ0eQorICAgIGhhbmRsZXIuCisKKyAgICBCZWNhdXNlIGBn
ZXRgIHVuaWZpZXMgdGhlIHN5bnRheCBmb3IgYWNjZXNzaW5nIGFsbCB0aGVzZSBraW5kcworICAg
IG9mIHByb3BlcnRpZXMsIGl0IGNhbiBtYWtlIG1hbnkgcmVmYWN0b3JpbmdzIGVhc2llciwgc3Vj
aCBhcyByZXBsYWNpbmcgYQorICAgIHNpbXBsZSBwcm9wZXJ0eSB3aXRoIGEgY29tcHV0ZWQgcHJv
cGVydHksIG9yIHZpY2UgdmVyc2EuCisKKyAgICAjIyMgQ29tcHV0ZWQgUHJvcGVydGllcworCisg
ICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgbWV0aG9kcyBkZWZpbmVkIHdpdGggdGhlIGBwcm9w
ZXJ0eWAgbW9kaWZpZXIKKyAgICBkZWNsYXJlZCBhdCB0aGUgZW5kLCBzdWNoIGFzOgorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIGZ1bGxOYW1lOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0
aGlzLmdldEVhY2goJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpLmNvbXBhY3QoKS5qb2luKCcgJyk7
CisgICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKKyAgICBgYGAKKworICAg
IFdoZW4geW91IGNhbGwgYGdldGAgb24gYSBjb21wdXRlZCBwcm9wZXJ0eSwgdGhlIGZ1bmN0aW9u
IHdpbGwgYmUKKyAgICBjYWxsZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSByZXR1cm5l
ZCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbgorICAgIGl0c2VsZi4KKworICAgICMjIyBVbmtub3du
IFByb3BlcnRpZXMKKworICAgIExpa2V3aXNlLCBpZiB5b3UgdHJ5IHRvIGNhbGwgYGdldGAgb24g
YSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcworICAgIGB1bmRlZmluZWRgLCB0aGUgYHVua25vd25Q
cm9wZXJ0eSgpYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG9iamVjdC4KKyAgICBJZiB0
aGlzIG1ldGhvZCByZXR1cm5zIGFueSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLCBpdCB3
aWxsIGJlIHJldHVybmVkCisgICAgaW5zdGVhZC4gVGhpcyBhbGxvd3MgeW91IHRvIGltcGxlbWVu
dCAidmlydHVhbCIgcHJvcGVydGllcyB0aGF0IGFyZQorICAgIG5vdCBkZWZpbmVkIHVwZnJvbnQu
CisKKyAgICBAbWV0aG9kIGdldAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIHByb3BlcnR5
IHRvIHJldHJpZXZlCisgICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3Ig
dW5kZWZpbmVkLgorICAqLworICBnZXQ6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAgICByZXR1cm4g
Z2V0KHRoaXMsIGtleU5hbWUpOworICB9LAorCisgIC8qKgorICAgIFRvIGdldCBtdWx0aXBsZSBw
cm9wZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYGdldFByb3BlcnRpZXNgCisgICAgd2l0aCBhIGxpc3Qg
b2Ygc3RyaW5ncyBvciBhbiBhcnJheToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICByZWNvcmQu
Z2V0UHJvcGVydGllcygnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnKTsgIC8vIHsg
Zmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Cisg
ICAgYGBgCisKKyAgICBpcyBlcXVpdmFsZW50IHRvOgorCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHJlY29yZC5nZXRQcm9wZXJ0aWVzKFsnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUn
XSk7ICAvLyB7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScsIHppcENvZGU6ICcx
MDAxMScgfQorICAgIGBgYAorCisgICAgQG1ldGhvZCBnZXRQcm9wZXJ0aWVzCisgICAgQHBhcmFt
IHtTdHJpbmcuLi58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQKKyAgICBAcmV0dXJuIHtIYXNo
fQorICAqLworICBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmV0ID0ge307
CisgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBhcmd1bWVudHM7CisgICAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGggPT09IDEgJiYgRW1iZXIudHlwZU9mKGFyZ3VtZW50c1swXSkgPT09ICdhcnJheScpIHsK
KyAgICAgIHByb3BlcnR5TmFtZXMgPSBhcmd1bWVudHNbMF07CisgICAgfQorICAgIGZvcih2YXIg
aSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICByZXRbcHJvcGVy
dHlOYW1lc1tpXV0gPSBnZXQodGhpcywgcHJvcGVydHlOYW1lc1tpXSk7CisgICAgfQorICAgIHJl
dHVybiByZXQ7CisgIH0sCisKKyAgLyoqCisgICAgU2V0cyB0aGUgcHJvdmlkZWQga2V5IG9yIHBh
dGggdG8gdGhlIHZhbHVlLgorCisgICAgVGhpcyBtZXRob2QgaXMgZ2VuZXJhbGx5IHZlcnkgc2lt
aWxhciB0byBjYWxsaW5nIGBvYmplY3Rba2V5XSA9IHZhbHVlYCBvcgorICAgIGBvYmplY3Qua2V5
ID0gdmFsdWVgLCBleGNlcHQgdGhhdCBpdCBwcm92aWRlcyBzdXBwb3J0IGZvciBjb21wdXRlZAor
ICAgIHByb3BlcnRpZXMsIHRoZSBgdW5rbm93blByb3BlcnR5KClgIG1ldGhvZCBhbmQgcHJvcGVy
dHkgb2JzZXJ2ZXJzLgorCisgICAgIyMjIENvbXB1dGVkIFByb3BlcnRpZXMKKworICAgIElmIHlv
dSB0cnkgdG8gc2V0IGEgdmFsdWUgb24gYSBrZXkgdGhhdCBoYXMgYSBjb21wdXRlZCBwcm9wZXJ0
eSBoYW5kbGVyCisgICAgZGVmaW5lZCAoc2VlIHRoZSBgZ2V0KClgIG1ldGhvZCBmb3IgYW4gZXhh
bXBsZSksIHRoZW4gYHNldCgpYCB3aWxsIGNhbGwKKyAgICB0aGF0IG1ldGhvZCwgcGFzc2luZyBi
b3RoIHRoZSB2YWx1ZSBhbmQga2V5IGluc3RlYWQgb2Ygc2ltcGx5IGNoYW5naW5nCisgICAgdGhl
IHZhbHVlIGl0c2VsZi4gVGhpcyBpcyB1c2VmdWwgZm9yIHRob3NlIHRpbWVzIHdoZW4geW91IG5l
ZWQgdG8KKyAgICBpbXBsZW1lbnQgYSBwcm9wZXJ0eSB0aGF0IGlzIGNvbXBvc2VkIG9mIG9uZSBv
ciBtb3JlIG1lbWJlcgorICAgIHByb3BlcnRpZXMuCisKKyAgICAjIyMgVW5rbm93biBQcm9wZXJ0
aWVzCisKKyAgICBJZiB5b3UgdHJ5IHRvIHNldCBhIHZhbHVlIG9uIGEga2V5IHRoYXQgaXMgdW5k
ZWZpbmVkIGluIHRoZSB0YXJnZXQKKyAgICBvYmplY3QsIHRoZW4gdGhlIGB1bmtub3duUHJvcGVy
dHkoKWAgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkLiBUaGlzCisgICAgZ2l2ZXMgeW91
IGFuIG9wcG9ydHVuaXR5IHRvIGltcGxlbWVudCBjb21wbGV4ICJ2aXJ0dWFsIiBwcm9wZXJ0aWVz
IHRoYXQKKyAgICBhcmUgbm90IHByZWRlZmluZWQgb24gdGhlIG9iamVjdC4gSWYgYHVua25vd25Q
cm9wZXJ0eSgpYCByZXR1cm5zCisgICAgdW5kZWZpbmVkLCB0aGVuIGBzZXQoKWAgd2lsbCBzaW1w
bHkgc2V0IHRoZSB2YWx1ZSBvbiB0aGUgb2JqZWN0LgorCisgICAgIyMjIFByb3BlcnR5IE9ic2Vy
dmVycworCisgICAgSW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlIHByb3BlcnR5LCBgc2V0KClg
IHdpbGwgYWxzbyByZWdpc3RlciBhIHByb3BlcnR5CisgICAgY2hhbmdlIHdpdGggdGhlIG9iamVj
dC4gVW5sZXNzIHlvdSBoYXZlIHBsYWNlZCB0aGlzIGNhbGwgaW5zaWRlIG9mIGEKKyAgICBgYmVn
aW5Qcm9wZXJ0eUNoYW5nZXMoKWAgYW5kIGBlbmRQcm9wZXJ0eUNoYW5nZXMoKSxgIGFueSAibG9j
YWwiIG9ic2VydmVycworICAgIChpLmUuIG9ic2VydmVyIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhl
IHNhbWUgb2JqZWN0KSwgd2lsbCBiZSBjYWxsZWQKKyAgICBpbW1lZGlhdGVseS4gQW55ICJyZW1v
dGUiIG9ic2VydmVycyAoaS5lLiBvYnNlcnZlciBtZXRob2RzIGRlY2xhcmVkIG9uCisgICAgYW5v
dGhlciBvYmplY3QpIHdpbGwgYmUgcGxhY2VkIGluIGEgcXVldWUgYW5kIGNhbGxlZCBhdCBhIGxh
dGVyIHRpbWUgaW4gYQorICAgIGNvYWxlc2NlZCBtYW5uZXIuCisKKyAgICAjIyMgQ2hhaW5pbmcK
KworICAgIEluIGFkZGl0aW9uIHRvIHByb3BlcnR5IGNoYW5nZXMsIGBzZXQoKWAgcmV0dXJucyB0
aGUgdmFsdWUgb2YgdGhlIG9iamVjdAorICAgIGl0c2VsZiBzbyB5b3UgY2FuIGRvIGNoYWluaW5n
IGxpa2UgdGhpczoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICByZWNvcmQuc2V0KCdmaXJzdE5h
bWUnLCAnQ2hhcmxlcycpLnNldCgnbGFzdE5hbWUnLCAnSm9sbGV5Jyk7CisgICAgYGBgCisKKyAg
ICBAbWV0aG9kIHNldAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIHByb3BlcnR5IHRvIHNl
dAorICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IG9yIGBudWxsYC4K
KyAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQorICAqLworICBzZXQ6IGZ1bmN0aW9uKGtl
eU5hbWUsIHZhbHVlKSB7CisgICAgc2V0KHRoaXMsIGtleU5hbWUsIHZhbHVlKTsKKyAgICByZXR1
cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBUbyBzZXQgbXVsdGlwbGUgcHJvcGVydGllcyBh
dCBvbmNlLCBjYWxsIGBzZXRQcm9wZXJ0aWVzYAorICAgIHdpdGggYSBIYXNoOgorCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVzKHsgZmlyc3ROYW1lOiAnQ2hhcmxl
cycsIGxhc3ROYW1lOiAnSm9sbGV5JyB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2Qgc2V0UHJv
cGVydGllcworICAgIEBwYXJhbSB7SGFzaH0gaGFzaCB0aGUgaGFzaCBvZiBrZXlzIGFuZCB2YWx1
ZXMgdG8gc2V0CisgICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgKi8KKyAgc2V0UHJv
cGVydGllczogZnVuY3Rpb24oaGFzaCkgeworICAgIHJldHVybiBFbWJlci5zZXRQcm9wZXJ0aWVz
KHRoaXMsIGhhc2gpOworICB9LAorCisgIC8qKgorICAgIEJlZ2lucyBhIGdyb3VwaW5nIG9mIHBy
b3BlcnR5IGNoYW5nZXMuCisKKyAgICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBncm91cCBw
cm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQgbm90aWZpY2F0aW9ucworICAgIHdpbGwgbm90IGJlIHNl
bnQgdW50aWwgdGhlIGNoYW5nZXMgYXJlIGZpbmlzaGVkLiBJZiB5b3UgcGxhbiB0byBtYWtlIGEK
KyAgICBsYXJnZSBudW1iZXIgb2YgY2hhbmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlv
dSBzaG91bGQgY2FsbCB0aGlzCisgICAgbWV0aG9kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNo
YW5nZXMgdG8gYmVnaW4gZGVmZXJyaW5nIGNoYW5nZQorICAgIG5vdGlmaWNhdGlvbnMuIFdoZW4g
eW91IGFyZSBkb25lIG1ha2luZyBjaGFuZ2VzLCBjYWxsCisgICAgYGVuZFByb3BlcnR5Q2hhbmdl
cygpYCB0byBkZWxpdmVyIHRoZSBkZWZlcnJlZCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgZW5k
CisgICAgZGVmZXJyaW5nLgorCisgICAgQG1ldGhvZCBiZWdpblByb3BlcnR5Q2hhbmdlcworICAg
IEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9CisgICovCisgIGJlZ2luUHJvcGVydHlDaGFuZ2Vz
OiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOworICAgIHJl
dHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIEVuZHMgYSBncm91cGluZyBvZiBwcm9wZXJ0
eSBjaGFuZ2VzLgorCisgICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gZ3JvdXAgcHJvcGVy
dHkgY2hhbmdlcyBzbyB0aGF0IG5vdGlmaWNhdGlvbnMKKyAgICB3aWxsIG5vdCBiZSBzZW50IHVu
dGlsIHRoZSBjaGFuZ2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCisgICAg
bGFyZ2UgbnVtYmVyIG9mIGNoYW5nZXMgdG8gYW4gb2JqZWN0IGF0IG9uZSB0aW1lLCB5b3Ugc2hv
dWxkIGNhbGwKKyAgICBgYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKWAgYXQgdGhlIGJlZ2lubmluZyBv
ZiB0aGUgY2hhbmdlcyB0byBkZWZlciBjaGFuZ2UKKyAgICBub3RpZmljYXRpb25zLiBXaGVuIHlv
dSBhcmUgZG9uZSBtYWtpbmcgY2hhbmdlcywgY2FsbCB0aGlzIG1ldGhvZCB0bworICAgIGRlbGl2
ZXIgdGhlIGRlZmVycmVkIGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCBlbmQgZGVmZXJyaW5nLgor
CisgICAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKKyAgICBAcmV0dXJuIHtFbWJlci5PYnNl
cnZhYmxlfQorICAqLworICBlbmRQcm9wZXJ0eUNoYW5nZXM6IGZ1bmN0aW9uKCkgeworICAgIEVt
YmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8q
KgorICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lzdGVtIHRoYXQgYSBwcm9wZXJ0eSBpcyBhYm91
dCB0byBjaGFuZ2UuCisKKyAgICBTb21ldGltZXMgeW91IG5lZWQgdG8gY2hhbmdlIGEgdmFsdWUg
ZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB3aXRob3V0CisgICAgYWN0dWFsbHkgY2FsbGluZyBgZ2V0
KClgIG9yIGBzZXQoKWAgb24gaXQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgdGhpcworICAg
IG1ldGhvZCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlKClgIGluc3RlYWQuIENhbGxpbmcgdGhlc2Ug
dHdvIG1ldGhvZHMKKyAgICB0b2dldGhlciB3aWxsIG5vdGlmeSBhbGwgb2JzZXJ2ZXJzIHRoYXQg
dGhlIHByb3BlcnR5IGhhcyBwb3RlbnRpYWxseQorICAgIGNoYW5nZWQgdmFsdWUuCisKKyAgICBO
b3RlIHRoYXQgeW91IG11c3QgYWx3YXlzIGNhbGwgYHByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBw
cm9wZXJ0eURpZENoYW5nZWAKKyAgICBhcyBhIHBhaXIuIElmIHlvdSBkbyBub3QsIGl0IG1heSBn
ZXQgdGhlIHByb3BlcnR5IGNoYW5nZSBncm91cHMgb3V0IG9mCisgICAgb3JkZXIgYW5kIGNhdXNl
IG5vdGlmaWNhdGlvbnMgdG8gYmUgZGVsaXZlcmVkIG1vcmUgb2Z0ZW4gdGhhbiB5b3Ugd291bGQK
KyAgICBsaWtlLgorCisgICAgQG1ldGhvZCBwcm9wZXJ0eVdpbGxDaGFuZ2UKKyAgICBAcGFyYW0g
e1N0cmluZ30ga2V5IFRoZSBwcm9wZXJ0eSBrZXkgdGhhdCBpcyBhYm91dCB0byBjaGFuZ2UuCisg
ICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgKi8KKyAgcHJvcGVydHlXaWxsQ2hhbmdl
OiBmdW5jdGlvbihrZXlOYW1lKXsKKyAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywg
a2V5TmFtZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgTm90aWZ5IHRo
ZSBvYnNlcnZlciBzeXN0ZW0gdGhhdCBhIHByb3BlcnR5IGhhcyBqdXN0IGNoYW5nZWQuCisKKyAg
ICBTb21ldGltZXMgeW91IG5lZWQgdG8gY2hhbmdlIGEgdmFsdWUgZGlyZWN0bHkgb3IgaW5kaXJl
Y3RseSB3aXRob3V0CisgICAgYWN0dWFsbHkgY2FsbGluZyBgZ2V0KClgIG9yIGBzZXQoKWAgb24g
aXQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgdGhpcworICAgIG1ldGhvZCBhbmQgYHByb3Bl
cnR5V2lsbENoYW5nZSgpYCBpbnN0ZWFkLiBDYWxsaW5nIHRoZXNlIHR3byBtZXRob2RzCisgICAg
dG9nZXRoZXIgd2lsbCBub3RpZnkgYWxsIG9ic2VydmVycyB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMg
cG90ZW50aWFsbHkKKyAgICBjaGFuZ2VkIHZhbHVlLgorCisgICAgTm90ZSB0aGF0IHlvdSBtdXN0
IGFsd2F5cyBjYWxsIGBwcm9wZXJ0eVdpbGxDaGFuZ2VgIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2Vg
CisgICAgYXMgYSBwYWlyLiBJZiB5b3UgZG8gbm90LCBpdCBtYXkgZ2V0IHRoZSBwcm9wZXJ0eSBj
aGFuZ2UgZ3JvdXBzIG91dCBvZgorICAgIG9yZGVyIGFuZCBjYXVzZSBub3RpZmljYXRpb25zIHRv
IGJlIGRlbGl2ZXJlZCBtb3JlIG9mdGVuIHRoYW4geW91IHdvdWxkCisgICAgbGlrZS4KKworICAg
IEBtZXRob2QgcHJvcGVydHlEaWRDaGFuZ2UKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBU
aGUgcHJvcGVydHkga2V5IHRoYXQgaGFzIGp1c3QgY2hhbmdlZC4KKyAgICBAcmV0dXJuIHtFbWJl
ci5PYnNlcnZhYmxlfQorICAqLworICBwcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24oa2V5TmFt
ZSkgeworICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtleU5hbWUpOworICAgIHJl
dHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIENvbnZlbmllbmNlIG1ldGhvZCB0byBjYWxs
IGBwcm9wZXJ0eVdpbGxDaGFuZ2VgIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2VgIGluCisgICAgc3Vj
Y2Vzc2lvbi4KKworICAgIEBtZXRob2Qgbm90aWZ5UHJvcGVydHlDaGFuZ2UKKyAgICBAcGFyYW0g
e1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkga2V5IHRvIGJlIG5vdGlmaWVkIGFib3V0Lgor
ICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9CisgICovCisgIG5vdGlmeVByb3BlcnR5Q2hh
bmdlOiBmdW5jdGlvbihrZXlOYW1lKSB7CisgICAgdGhpcy5wcm9wZXJ0eVdpbGxDaGFuZ2Uoa2V5
TmFtZSk7CisgICAgdGhpcy5wcm9wZXJ0eURpZENoYW5nZShrZXlOYW1lKTsKKyAgICByZXR1cm4g
dGhpczsKKyAgfSwKKworICBhZGRCZWZvcmVPYnNlcnZlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQs
IG1ldGhvZCkgeworICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0
LCBtZXRob2QpOworICB9LAorCisgIC8qKgorICAgIEFkZHMgYW4gb2JzZXJ2ZXIgb24gYSBwcm9w
ZXJ0eS4KKworICAgIFRoaXMgaXMgdGhlIGNvcmUgbWV0aG9kIHVzZWQgdG8gcmVnaXN0ZXIgYW4g
b2JzZXJ2ZXIgZm9yIGEgcHJvcGVydHkuCisKKyAgICBPbmNlIHlvdSBjYWxsIHRoaXMgbWV0aG9k
LCBhbnl0aW1lIHRoZSBrZXkncyB2YWx1ZSBpcyBzZXQsIHlvdXIgb2JzZXJ2ZXIKKyAgICB3aWxs
IGJlIG5vdGlmaWVkLiBOb3RlIHRoYXQgdGhlIG9ic2VydmVycyBhcmUgdHJpZ2dlcmVkIGFueXRp
bWUgdGhlCisgICAgdmFsdWUgaXMgc2V0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaGFzIGFj
dHVhbGx5IGNoYW5nZWQuIFlvdXIKKyAgICBvYnNlcnZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8g
aGFuZGxlIHRoYXQuCisKKyAgICBZb3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCBjb250ZXh0
IHBhcmFtZXRlciB0byB0aGlzIG1ldGhvZC4gVGhlCisgICAgY29udGV4dCB3aWxsIGJlIHBhc3Nl
ZCB0byB5b3VyIG9ic2VydmVyIG1ldGhvZCB3aGVuZXZlciBpdCBpcyB0cmlnZ2VyZWQuCisgICAg
Tm90ZSB0aGF0IGlmIHlvdSBhZGQgdGhlIHNhbWUgdGFyZ2V0L21ldGhvZCBwYWlyIG9uIGEga2V5
IG11bHRpcGxlIHRpbWVzCisgICAgd2l0aCBkaWZmZXJlbnQgY29udGV4dCBwYXJhbWV0ZXJzLCB5
b3VyIG9ic2VydmVyIHdpbGwgb25seSBiZSBjYWxsZWQgb25jZQorICAgIHdpdGggdGhlIGxhc3Qg
Y29udGV4dCB5b3UgcGFzc2VkLgorCisgICAgIyMjIE9ic2VydmVyIE1ldGhvZHMKKworICAgIE9i
c2VydmVyIG1ldGhvZHMgeW91IHBhc3Mgc2hvdWxkIGdlbmVyYWxseSBoYXZlIHRoZSBmb2xsb3dp
bmcgc2lnbmF0dXJlIGlmCisgICAgeW91IGRvIG5vdCBwYXNzIGEgYGNvbnRleHRgIHBhcmFtZXRl
cjoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBmb29EaWRDaGFuZ2U6IGZ1bmN0aW9uKHNlbmRl
ciwga2V5LCB2YWx1ZSwgcmV2KSB7IH07CisgICAgYGBgCisKKyAgICBUaGUgc2VuZGVyIGlzIHRo
ZSBvYmplY3QgdGhhdCBjaGFuZ2VkLiBUaGUga2V5IGlzIHRoZSBwcm9wZXJ0eSB0aGF0CisgICAg
Y2hhbmdlcy4gVGhlIHZhbHVlIHByb3BlcnR5IGlzIGN1cnJlbnRseSByZXNlcnZlZCBhbmQgdW51
c2VkLiBUaGUgcmV2CisgICAgaXMgdGhlIGxhc3QgcHJvcGVydHkgcmV2aXNpb24gb2YgdGhlIG9i
amVjdCB3aGVuIGl0IGNoYW5nZWQsIHdoaWNoIHlvdSBjYW4KKyAgICB1c2UgdG8gZGV0ZWN0IGlm
IHRoZSBrZXkgdmFsdWUgaGFzIHJlYWxseSBjaGFuZ2VkIG9yIG5vdC4KKworICAgIElmIHlvdSBw
YXNzIGEgYGNvbnRleHRgIHBhcmFtZXRlciwgdGhlIGNvbnRleHQgd2lsbCBiZSBwYXNzZWQgYmVm
b3JlIHRoZQorICAgIHJldmlzaW9uIGxpa2Ugc286CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
Zm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUsIGNvbnRleHQsIHJldikg
eyB9OworICAgIGBgYAorCisgICAgVXN1YWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0aGUgdmFsdWUs
IGNvbnRleHQgb3IgcmV2aXNpb24gcGFyYW1ldGVycyBhdAorICAgIHRoZSBlbmQuIEluIHRoaXMg
Y2FzZSwgaXQgaXMgY29tbW9uIHRvIHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0YWtlCisg
ICAgb25seSBhIHNlbmRlciBhbmQga2V5IHZhbHVlIGFzIHBhcmFtZXRlcnMgb3IsIGlmIHlvdSBh
cmVuJ3QgaW50ZXJlc3RlZCBpbgorICAgIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRvIHdyaXRlIGFu
IG9ic2VydmVyIHRoYXQgaGFzIG5vIHBhcmFtZXRlcnMgYXQgYWxsLgorCisgICAgQG1ldGhvZCBh
ZGRPYnNlcnZlcgorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgor
ICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCisg
ICAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4K
KyAgICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHNlbGYKKyAgKi8KKyAgYWRkT2JzZXJ2ZXI6IGZ1
bmN0aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICBFbWJlci5hZGRPYnNlcnZlcih0aGlz
LCBrZXksIHRhcmdldCwgbWV0aG9kKTsKKyAgfSwKKworICAvKioKKyAgICBSZW1vdmUgYW4gb2Jz
ZXJ2ZXIgeW91IGhhdmUgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIHRoaXMgb2JqZWN0LiBQYXNz
CisgICAgdGhlIHNhbWUga2V5LCB0YXJnZXQsIGFuZCBtZXRob2QgeW91IHBhc3NlZCB0byBgYWRk
T2JzZXJ2ZXIoKWAgYW5kIHlvdXIKKyAgICB0YXJnZXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBu
b3RpZmljYXRpb25zLgorCisgICAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgorICAgIEBwYXJhbSB7
U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgorICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJn
ZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCisgICAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rp
b259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KKyAgICBAcmV0dXJuIHtFbWJlci5PYnNl
cnZhYmxlfSByZWNlaXZlcgorICAqLworICByZW1vdmVPYnNlcnZlcjogZnVuY3Rpb24oa2V5LCB0
YXJnZXQsIG1ldGhvZCkgeworICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHRoaXMsIGtleSwgdGFy
Z2V0LCBtZXRob2QpOworICB9LAorCisgIC8qKgorICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBv
YmplY3QgY3VycmVudGx5IGhhcyBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBmb3IgYQorICAgIHBhcnRp
Y3VsYXIga2V5LiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBwb3RlbnRpYWxseSBkZWZlciBw
ZXJmb3JtaW5nCisgICAgYW4gZXhwZW5zaXZlIGFjdGlvbiB1bnRpbCBzb21lb25lIGJlZ2lucyBv
YnNlcnZpbmcgYSBwYXJ0aWN1bGFyIHByb3BlcnR5CisgICAgb24gdGhlIG9iamVjdC4KKworICAg
IEBtZXRob2QgaGFzT2JzZXJ2ZXJGb3IKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSB0byBj
aGVjaworICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICovCisgIGhhc09ic2VydmVyRm9yOiBmdW5j
dGlvbihrZXkpIHsKKyAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIGtleSsnOmNo
YW5nZScpOworICB9LAorCisgIC8qKgorICAgIEBkZXByZWNhdGVkCisgICAgQG1ldGhvZCBnZXRQ
YXRoCisgICAgQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gcmV0cmll
dmUKKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB1bmRlZmluZWQu
CisgICovCisgIGdldFBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKKyAgICBFbWJlci5kZXByZWNhdGUo
ImdldFBhdGggaXMgZGVwcmVjYXRlZCBzaW5jZSBnZXQgbm93IHN1cHBvcnRzIHBhdGhzIik7Cisg
ICAgcmV0dXJuIHRoaXMuZ2V0KHBhdGgpOworICB9LAorCisgIC8qKgorICAgIEBkZXByZWNhdGVk
CisgICAgQG1ldGhvZCBzZXRQYXRoCisgICAgQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHBhdGgg
dG8gdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBzZXQKKyAgICBAcGFyYW0ge09iamVjdH0gdmFs
dWUgVGhlIHZhbHVlIHRvIHNldCBvciBgbnVsbGAuCisgICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2
YWJsZX0KKyAgKi8KKyAgc2V0UGF0aDogZnVuY3Rpb24ocGF0aCwgdmFsdWUpIHsKKyAgICBFbWJl
ci5kZXByZWNhdGUoInNldFBhdGggaXMgZGVwcmVjYXRlZCBzaW5jZSBzZXQgbm93IHN1cHBvcnRz
IHBhdGhzIik7CisgICAgcmV0dXJuIHRoaXMuc2V0KHBhdGgsIHZhbHVlKTsKKyAgfSwKKworICAv
KioKKyAgICBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHksIG9yIGEgZGVmYXVsdCB2
YWx1ZSBpbiB0aGUgY2FzZSB0aGF0IHRoZQorICAgIHByb3BlcnR5IHJldHVybnMgYHVuZGVmaW5l
ZGAuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcGVyc29uLmdldFdpdGhEZWZhdWx0KCdsYXN0
TmFtZScsICdEb2UnKTsKKyAgICBgYGAKKworICAgIEBtZXRob2QgZ2V0V2l0aERlZmF1bHQKKyAg
ICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0
cmlldmUKKyAgICBAcGFyYW0ge09iamVjdH0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1
cm4gaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHVuZGVmaW5lZAorICAgIEByZXR1cm4ge09iamVj
dH0gVGhlIHByb3BlcnR5IHZhbHVlIG9yIHRoZSBkZWZhdWx0VmFsdWUuCisgICovCisgIGdldFdp
dGhEZWZhdWx0OiBmdW5jdGlvbihrZXlOYW1lLCBkZWZhdWx0VmFsdWUpIHsKKyAgICByZXR1cm4g
RW1iZXIuZ2V0V2l0aERlZmF1bHQodGhpcywga2V5TmFtZSwgZGVmYXVsdFZhbHVlKTsKKyAgfSwK
KworICAvKioKKyAgICBTZXQgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQg
dmFsdWUgcGx1cyBzb21lIGFtb3VudC4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBwZXJzb24u
aW5jcmVtZW50UHJvcGVydHkoJ2FnZScpOworICAgIHRlYW0uaW5jcmVtZW50UHJvcGVydHkoJ3Nj
b3JlJywgMik7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGluY3JlbWVudFByb3BlcnR5CisgICAg
QHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGluY3Jl
bWVudAorICAgIEBwYXJhbSB7T2JqZWN0fSBpbmNyZW1lbnQgVGhlIGFtb3VudCB0byBpbmNyZW1l
bnQgYnkuIERlZmF1bHRzIHRvIDEKKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgcHJvcGVy
dHkgdmFsdWUKKyAgKi8KKyAgaW5jcmVtZW50UHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUsIGlu
Y3JlbWVudCkgeworICAgIGlmICghaW5jcmVtZW50KSB7IGluY3JlbWVudCA9IDE7IH0KKyAgICBz
ZXQodGhpcywga2V5TmFtZSwgKGdldCh0aGlzLCBrZXlOYW1lKSB8fCAwKStpbmNyZW1lbnQpOwor
ICAgIHJldHVybiBnZXQodGhpcywga2V5TmFtZSk7CisgIH0sCisKKyAgLyoqCisgICAgU2V0IHRo
ZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IHZhbHVlIG1pbnVzIHNvbWUgYW1v
dW50LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHBsYXllci5kZWNyZW1lbnRQcm9wZXJ0eSgn
bGl2ZXMnKTsKKyAgICBvcmMuZGVjcmVtZW50UHJvcGVydHkoJ2hlYWx0aCcsIDUpOworICAgIGBg
YAorCisgICAgQG1ldGhvZCBkZWNyZW1lbnRQcm9wZXJ0eQorICAgIEBwYXJhbSB7U3RyaW5nfSBr
ZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWNyZW1lbnQKKyAgICBAcGFyYW0g
e09iamVjdH0gaW5jcmVtZW50IFRoZSBhbW91bnQgdG8gZGVjcmVtZW50IGJ5LiBEZWZhdWx0cyB0
byAxCisgICAgQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlCisgICovCisg
IGRlY3JlbWVudFByb3BlcnR5OiBmdW5jdGlvbihrZXlOYW1lLCBpbmNyZW1lbnQpIHsKKyAgICBp
ZiAoIWluY3JlbWVudCkgeyBpbmNyZW1lbnQgPSAxOyB9CisgICAgc2V0KHRoaXMsIGtleU5hbWUs
IChnZXQodGhpcywga2V5TmFtZSkgfHwgMCktaW5jcmVtZW50KTsKKyAgICByZXR1cm4gZ2V0KHRo
aXMsIGtleU5hbWUpOworICB9LAorCisgIC8qKgorICAgIFNldCB0aGUgdmFsdWUgb2YgYSBib29s
ZWFuIHByb3BlcnR5IHRvIHRoZSBvcHBvc2l0ZSBvZiBpdCdzCisgICAgY3VycmVudCB2YWx1ZS4K
KworICAgIGBgYGphdmFzY3JpcHQKKyAgICBzdGFyc2hpcC50b2dnbGVQcm9wZXJ0eSgnd2FycERy
aXZlRW5hZ2VkJyk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIHRvZ2dsZVByb3BlcnR5CisgICAg
QHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHRvZ2ds
ZQorICAgIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICAqLworICB0
b2dnbGVQcm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSkgeworICAgIHNldCh0aGlzLCBrZXlOYW1l
LCAhZ2V0KHRoaXMsIGtleU5hbWUpKTsKKyAgICByZXR1cm4gZ2V0KHRoaXMsIGtleU5hbWUpOwor
ICB9LAorCisgIC8qKgorICAgIFJldHVybnMgdGhlIGNhY2hlZCB2YWx1ZSBvZiBhIGNvbXB1dGVk
IHByb3BlcnR5LCBpZiBpdCBleGlzdHMuCisgICAgVGhpcyBhbGxvd3MgeW91IHRvIGluc3BlY3Qg
dGhlIHZhbHVlIG9mIGEgY29tcHV0ZWQgcHJvcGVydHkKKyAgICB3aXRob3V0IGFjY2lkZW50YWxs
eSBpbnZva2luZyBpdCBpZiBpdCBpcyBpbnRlbmRlZCB0byBiZQorICAgIGdlbmVyYXRlZCBsYXpp
bHkuCisKKyAgICBAbWV0aG9kIGNhY2hlRm9yCisgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUK
KyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlIGNvbXB1dGVkIHBy
b3BlcnR5LCBpZiBhbnkKKyAgKi8KKyAgY2FjaGVGb3I6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAg
ICByZXR1cm4gRW1iZXIuY2FjaGVGb3IodGhpcywga2V5TmFtZSk7CisgIH0sCisKKyAgLy8gaW50
ZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICBvYnNlcnZlcnNGb3JLZXk6IGZ1bmN0aW9u
KGtleU5hbWUpIHsKKyAgICByZXR1cm4gRW1iZXIub2JzZXJ2ZXJzRm9yKHRoaXMsIGtleU5hbWUp
OworICB9Cit9KTsKKworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxl
IGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisKK3ZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldDsKKworLyoqCitAY2xhc3MgVGFyZ2V0QWN0aW9uU3VwcG9ydAor
QG5hbWVzcGFjZSBFbWJlcgorQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyovCitFbWJlci5UYXJnZXRB
Y3Rpb25TdXBwb3J0ID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAgdGFyZ2V0OiBudWxsLAorICBh
Y3Rpb246IG51bGwsCisKKyAgdGFyZ2V0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigp
IHsKKyAgICB2YXIgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKTsKKworICAgIGlmIChFbWJl
ci50eXBlT2YodGFyZ2V0KSA9PT0gInN0cmluZyIpIHsKKyAgICAgIHZhciB2YWx1ZSA9IGdldCh0
aGlzLCB0YXJnZXQpOworICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSBn
ZXQoRW1iZXIubG9va3VwLCB0YXJnZXQpOyB9CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBl
bHNlIHsKKyAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfQorICB9KS5wcm9wZXJ0eSgndGFyZ2V0
JyksCisKKyAgdHJpZ2dlckFjdGlvbjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGFjdGlvbiA9IGdl
dCh0aGlzLCAnYWN0aW9uJyksCisgICAgICAgIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0T2Jq
ZWN0Jyk7CisKKyAgICBpZiAodGFyZ2V0ICYmIGFjdGlvbikgeworICAgICAgdmFyIHJldDsKKwor
ICAgICAgaWYgKHR5cGVvZiB0YXJnZXQuc2VuZCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBy
ZXQgPSB0YXJnZXQuc2VuZChhY3Rpb24sIHRoaXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgYWN0aW9uID0gdGFy
Z2V0W2FjdGlvbl07CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYWN0aW9uLmNhbGwodGFyZ2V0
LCB0aGlzKTsKKyAgICAgIH0KKyAgICAgIGlmIChyZXQgIT09IGZhbHNlKSByZXQgPSB0cnVlOwor
CisgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICB9Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVs
ZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCisvKioKKyAgVGhpcyBtaXhp
biBhbGxvd3MgZm9yIEVtYmVyIG9iamVjdHMgdG8gc3Vic2NyaWJlIHRvIGFuZCBlbWl0IGV2ZW50
cy4KKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5k
KEVtYmVyLkV2ZW50ZWQsIHsKKyAgICBncmVldDogZnVuY3Rpb24oKSB7CisgICAgICAvLyAuLi4K
KyAgICAgIHRoaXMudHJpZ2dlcignZ3JlZXQnKTsKKyAgICB9CisgIH0pOworCisgIHZhciBwZXJz
b24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpOworCisgIHBlcnNvbi5vbignZ3JlZXQnLCBmdW5jdGlv
bigpIHsKKyAgICBjb25zb2xlLmxvZygnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcpOworICB9KTsK
KworICBwZXJzb24uZ3JlZXQoKTsKKworICAvLyBvdXRwdXRzOiAnT3VyIHBlcnNvbiBoYXMgZ3Jl
ZXRlZCcKKyAgYGBgCisKKyAgQGNsYXNzIEV2ZW50ZWQKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBA
ZXh0ZW5kcyBFbWJlci5NaXhpbgorICovCitFbWJlci5FdmVudGVkID0gRW1iZXIuTWl4aW4uY3Jl
YXRlKHsKKworICAvKioKKyAgIFN1YnNjcmliZXMgdG8gYSBuYW1lZCBldmVudCB3aXRoIGdpdmVu
IGZ1bmN0aW9uLgorCisgICBgYGBqYXZhc2NyaXB0CisgICBwZXJzb24ub24oJ2RpZExvYWQnLCBm
dW5jdGlvbigpIHsKKyAgICAgLy8gZmlyZWQgb25jZSB0aGUgcGVyc29uIGhhcyBsb2FkZWQKKyAg
IH0pOworICAgYGBgCisKKyAgIEFuIG9wdGlvbmFsIHRhcmdldCBjYW4gYmUgcGFzc2VkIGluIGFz
IHRoZSAybmQgYXJndW1lbnQgdGhhdCB3aWxsCisgICBiZSBzZXQgYXMgdGhlICJ0aGlzIiBmb3Ig
dGhlIGNhbGxiYWNrLiBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3VyCisgICBmdW5jdGlv
biBhY2Nlc3MgdG8gdGhlIG9iamVjdCB0cmlnZ2VyaW5nIHRoZSBldmVudC4gV2hlbiB0aGUgdGFy
Z2V0CisgICBwYXJhbWV0ZXIgaXMgdXNlZCB0aGUgY2FsbGJhY2sgYmVjb21lcyB0aGUgdGhpcmQg
YXJndW1lbnQuCisKKyAgIEBtZXRob2Qgb24KKyAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBu
YW1lIG9mIHRoZSBldmVudAorICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAidGhpcyIg
YmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCisgICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgVGhl
IGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgKi8KKyAgb246IGZ1bmN0aW9uKG5hbWUsIHRhcmdldCwg
bWV0aG9kKSB7CisgICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgbmFtZSwgdGFyZ2V0LCBtZXRo
b2QpOworICB9LAorCisgIC8qKgorICAgIFN1YnNjcmliZXMgYSBmdW5jdGlvbiB0byBhIG5hbWVk
IGV2ZW50IGFuZCB0aGVuIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbgorICAgIGFmdGVyIHRoZSBm
aXJzdCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIEl0IGlzIGdvb2QgdG8gdXNlIGBgb25l
YGAgd2hlbgorICAgIHlvdSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IHRpbWUgYW4gZXZlbnQg
aGFzIHRha2VuIHBsYWNlLgorCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBvcHRpb25hbCAy
bmQgYXJndW1lbnQgdGhhdCB3aWxsIGJlY29tZSB0aGUgInRoaXMiCisgICAgdmFsdWUgZm9yIHRo
ZSBjYWxsYmFjay4gSWYgdGhpcyBhcmd1bWVudCBpcyBwYXNzZWQgdGhlbiB0aGUgM3JkIGFyZ3Vt
ZW50CisgICAgYmVjb21lcyB0aGUgZnVuY3Rpb24uCisKKyAgICBAbWV0aG9kIG9uZQorICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAorICAgIEBwYXJhbSB7T2Jq
ZWN0fSBbdGFyZ2V0XSBUaGUgInRoaXMiIGJpbmRpbmcgZm9yIHRoZSBjYWxsYmFjaworICAgIEBw
YXJhbSB7RnVuY3Rpb259IG1ldGhvZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAqLworICBv
bmU6IGZ1bmN0aW9uKG5hbWUsIHRhcmdldCwgbWV0aG9kKSB7CisgICAgaWYgKCFtZXRob2QpIHsK
KyAgICAgIG1ldGhvZCA9IHRhcmdldDsKKyAgICAgIHRhcmdldCA9IG51bGw7CisgICAgfQorCisg
ICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgbmFtZSwgdGFyZ2V0LCBtZXRob2QsIHRydWUpOwor
ICB9LAorCisgIC8qKgorICAgIFRyaWdnZXJzIGEgbmFtZWQgZXZlbnQgZm9yIHRoZSBvYmplY3Qu
IEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICAgIHdpbGwgYmUgcGFzc2VkIGFzIHBhcmFtZXRl
cnMgdG8gdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBzdWJzY3JpYmVkIHRvIHRoZQorICAgIGV2ZW50
LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHBlcnNvbi5vbignZGlkRWF0JywgZnVuY3Rpb24o
Zm9vZCkgeworICAgICAgY29uc29sZS5sb2coJ3BlcnNvbiBhdGUgc29tZSAnICsgZm9vZCk7Cisg
ICAgfSk7CisKKyAgICBwZXJzb24udHJpZ2dlcignZGlkRWF0JywgJ2Jyb2Njb2xpJyk7CisKKyAg
ICAvLyBvdXRwdXRzOiBwZXJzb24gYXRlIHNvbWUgYnJvY2NvbGkKKyAgICBgYGAKKyAgICBAbWV0
aG9kIHRyaWdnZXIKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZl
bnQKKyAgICBAcGFyYW0ge09iamVjdC4uLn0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFz
cyBvbgorICAqLworICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIGFyZ3MgPSBb
XSwgaSwgbDsKKyAgICBmb3IgKGkgPSAxLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisgICAgfQorICAgIEVtYmVyLnNl
bmRFdmVudCh0aGlzLCBuYW1lLCBhcmdzKTsKKyAgfSwKKworICBmaXJlOiBmdW5jdGlvbihuYW1l
KSB7CisgICAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5FdmVudGVkI2ZpcmUoKSBoYXMgYmVlbiBk
ZXByZWNhdGVkIGluIGZhdm9yIG9mIHRyaWdnZXIoKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGpR
dWVyeS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIDEuMC4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUg
dG8gY2FsbCB0cmlnZ2VyKCkgaW5zdGVhZC4iKTsKKyAgICB0aGlzLnRyaWdnZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKKyAgfSwKKworICAvKioKKyAgICBDYW5jZWxzIHN1YnNjcmlwdGlvbiBm
b3IgZ2l2ZSBuYW1lLCB0YXJnZXQsIGFuZCBtZXRob2QuCisKKyAgICBAbWV0aG9kIG9mZgorICAg
IEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAorICAgIEBwYXJhbSB7
T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgc3Vic2NyaXB0aW9uCisgICAgQHBhcmFt
IHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBmdW5jdGlvbiBvZiB0aGUgc3Vic2NyaXB0aW9uCisgICov
CisgIG9mZjogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICBFbWJlci5yZW1v
dmVMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7CisgIH0sCisKKyAgLyoqCisg
ICAgQ2hlY2tzIHRvIHNlZSBpZiBvYmplY3QgaGFzIGFueSBzdWJzY3JpcHRpb25zIGZvciBuYW1l
ZCBldmVudC4KKworICAgIEBtZXRob2QgaGFzCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhl
IG5hbWUgb2YgdGhlIGV2ZW50CisgICAgQHJldHVybiB7Qm9vbGVhbn0gZG9lcyB0aGUgb2JqZWN0
IGhhdmUgYSBzdWJzY3JpcHRpb24gZm9yIGV2ZW50CisgICAqLworICBoYXM6IGZ1bmN0aW9uKG5h
bWUpIHsKKyAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIG5hbWUpOworICB9Cit9
KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBSU1ZQID0gcmVxdWlyZU1vZHVs
ZSgicnN2cCIpOworCitSU1ZQLmFzeW5jID0gZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsK
KyAgRW1iZXIucnVuLnNjaGVkdWxlKCdhY3Rpb25zJywgYmluZGluZywgY2FsbGJhY2spOworfTsK
KworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisKK3Zh
ciBnZXQgPSBFbWJlci5nZXQsCisgICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisK
Ky8qKgorICBAY2xhc3MgRGVmZXJyZWQKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBF
bWJlci5NaXhpbgorICovCitFbWJlci5EZWZlcnJlZE1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKKyAgLyoqCisgICAgQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJl
ZCBvYmplY3QgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCisKKyAgICBAbWV0aG9kIHRoZW4KKyAg
ICBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lQ2FsbGJhY2sgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBi
ZSBjYWxsZWQgd2hlbiBkb25lCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gZmFpbENhbGxiYWNrIGEg
Y2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZmFpbGVkCisgICovCisgIHRoZW46
IGZ1bmN0aW9uKGRvbmVDYWxsYmFjaywgZmFpbENhbGxiYWNrKSB7CisgICAgdmFyIHByb21pc2Ug
PSBnZXQodGhpcywgJ3Byb21pc2UnKTsKKyAgICByZXR1cm4gcHJvbWlzZS50aGVuLmFwcGx5KHBy
b21pc2UsIGFyZ3VtZW50cyk7CisgIH0sCisKKyAgLyoqCisgICAgUmVzb2x2ZSBhIERlZmVycmVk
IG9iamVjdCBhbmQgY2FsbCBhbnkgYGRvbmVDYWxsYmFja3NgIHdpdGggdGhlIGdpdmVuIGFyZ3Mu
CisKKyAgICBAbWV0aG9kIHJlc29sdmUKKyAgKi8KKyAgcmVzb2x2ZTogZnVuY3Rpb24odmFsdWUp
IHsKKyAgICBnZXQodGhpcywgJ3Byb21pc2UnKS5yZXNvbHZlKHZhbHVlKTsKKyAgfSwKKworICAv
KioKKyAgICBSZWplY3QgYSBEZWZlcnJlZCBvYmplY3QgYW5kIGNhbGwgYW55IGBmYWlsQ2FsbGJh
Y2tzYCB3aXRoIHRoZSBnaXZlbiBhcmdzLgorCisgICAgQG1ldGhvZCByZWplY3QKKyAgKi8KKyAg
cmVqZWN0OiBmdW5jdGlvbih2YWx1ZSkgeworICAgIGdldCh0aGlzLCAncHJvbWlzZScpLnJlamVj
dCh2YWx1ZSk7CisgIH0sCisKKyAgcHJvbWlzZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIG5ldyBSU1ZQLlByb21pc2UoKTsKKyAgfSkKK30pOworCisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CitFbWJlci5D
b250YWluZXIgPSByZXF1aXJlTW9kdWxlKCdjb250YWluZXInKTsKK0VtYmVyLkNvbnRhaW5lci5z
ZXQgPSBFbWJlci5zZXQ7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KKworCisvLyBOT1RFOiB0aGlz
IG9iamVjdCBzaG91bGQgbmV2ZXIgYmUgaW5jbHVkZWQgZGlyZWN0bHkuIEluc3RlYWQgdXNlIEVt
YmVyLgorLy8gRW1iZXIuT2JqZWN0LiBXZSBvbmx5IGRlZmluZSB0aGlzIHNlcGFyYXRlbHkgc28g
dGhhdCBFbWJlci5TZXQgY2FuIGRlcGVuZCBvbiBpdAorCisKK3ZhciBzZXQgPSBFbWJlci5zZXQs
IGdldCA9IEVtYmVyLmdldCwKKyAgICBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZSwKKyAgICBvX2Rl
ZmluZVByb3BlcnR5ID0gRW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHksCisgICAgYV9zbGlj
ZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKKyAgICBHVUlEX0tFWSA9IEVtYmVyLkdVSURfS0VZ
LAorICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAorICAgIGdlbmVyYXRlR3VpZCA9IEVtYmVy
LmdlbmVyYXRlR3VpZCwKKyAgICBtZXRhID0gRW1iZXIubWV0YSwKKyAgICByZXdhdGNoID0gRW1i
ZXIucmV3YXRjaCwKKyAgICBmaW5pc2hDaGFpbnMgPSBFbWJlci5maW5pc2hDaGFpbnMsCisgICAg
ZGVzdHJveSA9IEVtYmVyLmRlc3Ryb3ksCisgICAgc2NoZWR1bGUgPSBFbWJlci5ydW4uc2NoZWR1
bGUsCisgICAgTWl4aW4gPSBFbWJlci5NaXhpbiwKKyAgICBhcHBseU1peGluID0gTWl4aW4uX2Fw
cGx5LAorICAgIGZpbmlzaFBhcnRpYWwgPSBNaXhpbi5maW5pc2hQYXJ0aWFsLAorICAgIHJlb3Bl
biA9IE1peGluLnByb3RvdHlwZS5yZW9wZW4sCisgICAgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVy
LkVOVi5NQU5EQVRPUllfU0VUVEVSLAorICAgIGluZGV4T2YgPSBFbWJlci5FbnVtZXJhYmxlVXRp
bHMuaW5kZXhPZjsKKwordmFyIHVuZGVmaW5lZERlc2NyaXB0b3IgPSB7CisgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZSwKKyAgd3JpdGFibGU6IHRydWUsCisgIGVudW1lcmFibGU6IGZhbHNlLAorICB2YWx1
ZTogdW5kZWZpbmVkCit9OworCitmdW5jdGlvbiBtYWtlQ3RvcigpIHsKKworICAvLyBOb3RlOiBh
dm9pZCBhY2Nlc3NpbmcgYW55IHByb3BlcnRpZXMgb24gdGhlIG9iamVjdCBzaW5jZSBpdCBtYWtl
cyB0aGUKKyAgLy8gbWV0aG9kIGEgbG90IGZhc3Rlci4gVGhpcyBpcyBnbHVlIGNvZGUgc28gd2Ug
d2FudCBpdCB0byBiZSBhcyBmYXN0IGFzCisgIC8vIHBvc3NpYmxlLgorCisgIHZhciB3YXNBcHBs
aWVkID0gZmFsc2UsIGluaXRNaXhpbnMsIGluaXRQcm9wZXJ0aWVzOworCisgIHZhciBDbGFzcyA9
IGZ1bmN0aW9uKCkgeworICAgIGlmICghd2FzQXBwbGllZCkgeworICAgICAgQ2xhc3MucHJvdG8o
KTsgLy8gcHJlcGFyZSBwcm90b3R5cGUuLi4KKyAgICB9CisgICAgb19kZWZpbmVQcm9wZXJ0eSh0
aGlzLCBHVUlEX0tFWSwgdW5kZWZpbmVkRGVzY3JpcHRvcik7CisgICAgb19kZWZpbmVQcm9wZXJ0
eSh0aGlzLCAnX3N1cGVyJywgdW5kZWZpbmVkRGVzY3JpcHRvcik7CisgICAgdmFyIG0gPSBtZXRh
KHRoaXMpOworICAgIG0ucHJvdG8gPSB0aGlzOworICAgIGlmIChpbml0TWl4aW5zKSB7CisgICAg
ICAvLyBjYXB0dXJlIGxvY2FsbHkgc28gd2UgY2FuIGNsZWFyIHRoZSBjbG9zZWQgb3ZlciB2YXJp
YWJsZQorICAgICAgdmFyIG1peGlucyA9IGluaXRNaXhpbnM7CisgICAgICBpbml0TWl4aW5zID0g
bnVsbDsKKyAgICAgIHRoaXMucmVvcGVuLmFwcGx5KHRoaXMsIG1peGlucyk7CisgICAgfQorICAg
IGlmIChpbml0UHJvcGVydGllcykgeworICAgICAgLy8gY2FwdHVyZSBsb2NhbGx5IHNvIHdlIGNh
biBjbGVhciB0aGUgY2xvc2VkIG92ZXIgdmFyaWFibGUKKyAgICAgIHZhciBwcm9wcyA9IGluaXRQ
cm9wZXJ0aWVzOworICAgICAgaW5pdFByb3BlcnRpZXMgPSBudWxsOworCisgICAgICB2YXIgY29u
Y2F0ZW5hdGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllczsKKworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAg
ICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tpXTsKKyAgICAgICAgZm9yICh2YXIga2V5TmFtZSBp
biBwcm9wZXJ0aWVzKSB7CisgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5
KGtleU5hbWUpKSB7IGNvbnRpbnVlOyB9CisKKyAgICAgICAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0
aWVzW2tleU5hbWVdLAorICAgICAgICAgICAgICBJU19CSU5ESU5HID0gRW1iZXIuSVNfQklORElO
RzsKKworICAgICAgICAgIGlmIChJU19CSU5ESU5HLnRlc3Qoa2V5TmFtZSkpIHsKKyAgICAgICAg
ICAgIHZhciBiaW5kaW5ncyA9IG0uYmluZGluZ3M7CisgICAgICAgICAgICBpZiAoIWJpbmRpbmdz
KSB7CisgICAgICAgICAgICAgIGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IHt9OworICAgICAgICAg
ICAgfSBlbHNlIGlmICghbS5oYXNPd25Qcm9wZXJ0eSgnYmluZGluZ3MnKSkgeworICAgICAgICAg
ICAgICBiaW5kaW5ncyA9IG0uYmluZGluZ3MgPSBvX2NyZWF0ZShtLmJpbmRpbmdzKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJpbmRpbmdzW2tleU5hbWVdID0gdmFsdWU7CisgICAgICAg
ICAgfQorCisgICAgICAgICAgdmFyIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVdOworCisgICAgICAg
ICAgRW1iZXIuYXNzZXJ0KCJFbWJlci5PYmplY3QuY3JlYXRlIG5vIGxvbmdlciBzdXBwb3J0cyBk
ZWZpbmluZyBjb21wdXRlZCBwcm9wZXJ0aWVzLiIsICEodmFsdWUgaW5zdGFuY2VvZiBFbWJlci5D
b21wdXRlZFByb3BlcnR5KSk7CisgICAgICAgICAgRW1iZXIuYXNzZXJ0KCJFbWJlci5PYmplY3Qu
Y3JlYXRlIG5vIGxvbmdlciBzdXBwb3J0cyBkZWZpbmluZyBtZXRob2RzIHRoYXQgY2FsbCBfc3Vw
ZXIuIiwgISh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUudG9TdHJpbmcoKS5p
bmRleE9mKCcuX3N1cGVyJykgIT09IC0xKSk7CisKKyAgICAgICAgICBpZiAoY29uY2F0ZW5hdGVk
UHJvcGVydGllcyAmJiBpbmRleE9mKGNvbmNhdGVuYXRlZFByb3BlcnRpZXMsIGtleU5hbWUpID49
IDApIHsKKyAgICAgICAgICAgIHZhciBiYXNlVmFsdWUgPSB0aGlzW2tleU5hbWVdOworCisgICAg
ICAgICAgICBpZiAoYmFzZVZhbHVlKSB7CisgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09
PSB0eXBlb2YgYmFzZVZhbHVlLmNvbmNhdCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gYmFz
ZVZhbHVlLmNvbmNhdCh2YWx1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgdmFsdWUgPSBFbWJlci5tYWtlQXJyYXkoYmFzZVZhbHVlKS5jb25jYXQodmFsdWUpOwor
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB2YWx1
ZSA9IEVtYmVyLm1ha2VBcnJheSh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQor
CisgICAgICAgICAgaWYgKGRlc2MpIHsKKyAgICAgICAgICAgIGRlc2Muc2V0KHRoaXMsIGtleU5h
bWUsIHZhbHVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHR5cGVvZiB0
aGlzLnNldFVua25vd25Qcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKGtleU5hbWUgaW4gdGhp
cykpIHsKKyAgICAgICAgICAgICAgdGhpcy5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFtZSwgdmFs
dWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChNQU5EQVRPUllfU0VUVEVSKSB7CisgICAgICAg
ICAgICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsIGtleU5hbWUsIG51bGwsIHZhbHVlKTsg
Ly8gc2V0dXAgbWFuZGF0b3J5IHNldHRlcgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgdGhpc1trZXlOYW1lXSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmaW5pc2hQYXJ0aWFsKHRoaXMsIG0pOwor
ICAgIGRlbGV0ZSBtLnByb3RvOworICAgIGZpbmlzaENoYWlucyh0aGlzKTsKKyAgICB0aGlzLmlu
aXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfTsKKworICBDbGFzcy50b1N0cmluZyA9IE1p
eGluLnByb3RvdHlwZS50b1N0cmluZzsKKyAgQ2xhc3Mud2lsbFJlb3BlbiA9IGZ1bmN0aW9uKCkg
eworICAgIGlmICh3YXNBcHBsaWVkKSB7CisgICAgICBDbGFzcy5Qcm90b3R5cGVNaXhpbiA9IE1p
eGluLmNyZWF0ZShDbGFzcy5Qcm90b3R5cGVNaXhpbik7CisgICAgfQorCisgICAgd2FzQXBwbGll
ZCA9IGZhbHNlOworICB9OworICBDbGFzcy5faW5pdE1peGlucyA9IGZ1bmN0aW9uKGFyZ3MpIHsg
aW5pdE1peGlucyA9IGFyZ3M7IH07CisgIENsYXNzLl9pbml0UHJvcGVydGllcyA9IGZ1bmN0aW9u
KGFyZ3MpIHsgaW5pdFByb3BlcnRpZXMgPSBhcmdzOyB9OworCisgIENsYXNzLnByb3RvID0gZnVu
Y3Rpb24oKSB7CisgICAgdmFyIHN1cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNsYXNzOworICAgIGlm
IChzdXBlcmNsYXNzKSB7IHN1cGVyY2xhc3MucHJvdG8oKTsgfQorCisgICAgaWYgKCF3YXNBcHBs
aWVkKSB7CisgICAgICB3YXNBcHBsaWVkID0gdHJ1ZTsKKyAgICAgIENsYXNzLlByb3RvdHlwZU1p
eGluLmFwcGx5UGFydGlhbChDbGFzcy5wcm90b3R5cGUpOworICAgICAgcmV3YXRjaChDbGFzcy5w
cm90b3R5cGUpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLnByb3RvdHlwZTsKKyAgfTsKKwor
ICByZXR1cm4gQ2xhc3M7CisKK30KKwordmFyIENvcmVPYmplY3QgPSBtYWtlQ3RvcigpOworQ29y
ZU9iamVjdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gIkVtYmVyLkNvcmVPYmplY3Qi
OyB9OworCitDb3JlT2JqZWN0LlByb3RvdHlwZU1peGluID0gTWl4aW4uY3JlYXRlKHsKKyAgcmVv
cGVuOiBmdW5jdGlvbigpIHsKKyAgICBhcHBseU1peGluKHRoaXMsIGFyZ3VtZW50cywgdHJ1ZSk7
CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgaXNJbnN0YW5jZTogdHJ1ZSwKKworICBpbml0
OiBmdW5jdGlvbigpIHt9LAorCisgIC8qKgorICAgIERlZmluZXMgdGhlIHByb3BlcnRpZXMgdGhh
dCB3aWxsIGJlIGNvbmNhdGVuYXRlZCBmcm9tIHRoZSBzdXBlcmNsYXNzCisgICAgKGluc3RlYWQg
b2Ygb3ZlcnJpZGRlbikuCisKKyAgICBCeSBkZWZhdWx0LCB3aGVuIHlvdSBleHRlbmQgYW4gRW1i
ZXIgY2xhc3MgYSBwcm9wZXJ0eSBkZWZpbmVkIGluCisgICAgdGhlIHN1YmNsYXNzIG92ZXJyaWRl
cyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0IGlzIGRlZmluZWQKKyAgICBpbiB0
aGUgc3VwZXJjbGFzcy4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgaXQgaXMg
cHJlZmVyYWJsZQorICAgIHRvIGJ1aWxkIHVwIGEgcHJvcGVydHkncyB2YWx1ZSBieSBjb21iaW5p
bmcgdGhlIHN1cGVyY2xhc3MnIHByb3BlcnR5CisgICAgdmFsdWUgd2l0aCB0aGUgc3ViY2xhc3Mn
IHZhbHVlLiBBbiBleGFtcGxlIG9mIHRoaXMgaW4gdXNlIHdpdGhpbiBFbWJlcgorICAgIGlzIHRo
ZSBgY2xhc3NOYW1lc2AgcHJvcGVydHkgb2YgYEVtYmVyLlZpZXdgLgorCisgICAgSGVyZSBpcyBz
b21lIHNhbXBsZSBjb2RlIHNob3dpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvbmNhdGVu
YXRlZAorICAgIHByb3BlcnR5IGFuZCBhIG5vcm1hbCBvbmU6CisKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgQXBwLkJhclZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBzb21lTm9uQ29u
Y2F0ZW5hdGVkUHJvcGVydHk6IFsnYmFyJ10sCisgICAgICBjbGFzc05hbWVzOiBbJ2JhciddCisg
ICAgfSk7CisKKyAgICBBcHAuRm9vQmFyVmlldyA9IEFwcC5CYXJWaWV3LmV4dGVuZCh7CisgICAg
ICBzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHk6IFsnZm9vJ10sCisgICAgICBjbGFzc05hbWVz
OiBbJ2ZvbyddLAorICAgIH0pOworCisgICAgdmFyIGZvb0JhclZpZXcgPSBBcHAuRm9vQmFyVmll
dy5jcmVhdGUoKTsKKyAgICBmb29CYXJWaWV3LmdldCgnc29tZU5vbkNvbmNhdGVuYXRlZFByb3Bl
cnR5Jyk7IC8vIFsnZm9vJ10KKyAgICBmb29CYXJWaWV3LmdldCgnY2xhc3NOYW1lcycpOyAvLyBb
J2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbyddCisgICAgYGBgCisKKyAgICBUaGlzIGJlaGF2aW9y
IGV4dGVuZHMgdG8gb2JqZWN0IGNyZWF0aW9uIGFzIHdlbGwuIENvbnRpbnVpbmcgdGhlCisgICAg
YWJvdmUgZXhhbXBsZToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgdmlldyA9IEFwcC5G
b29CYXJWaWV3LmNyZWF0ZSh7CisgICAgICBzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHk6IFsn
YmF6J10sCisgICAgICBjbGFzc05hbWVzOiBbJ2JheiddCisgICAgfSkKKyAgICB2aWV3LmdldCgn
c29tZU5vbkNvbmNhdGVuYXRlZFByb3BlcnR5Jyk7IC8vIFsnYmF6J10KKyAgICB2aWV3LmdldCgn
Y2xhc3NOYW1lcycpOyAvLyBbJ2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbycsICdiYXonXQorICAg
IGBgYAorICAgIEFkZGluZyBhIHNpbmdsZSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBhbiBhcnJheSB3
aWxsIGp1c3QgYWRkIGl0IGluIHRoZSBhcnJheToKKyAgICAKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIHZpZXcgPSBBcHAuRm9vQmFyVmlldy5jcmVhdGUoeworICAgICAgY2xhc3NOYW1lczog
J2JheicKKyAgICB9KQorICAgIHZpZXcuZ2V0KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmll
dycsICdiYXInLCAnZm9vJywgJ2JheiddCisgICAgYGBgCisgICAgCisgICAgVXNpbmcgdGhlIGBj
b25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBwcm9wZXJ0eSwgd2UgY2FuIHRlbGwgdG8gRW1iZXIgdGhh
dCBtaXgKKyAgICB0aGUgY29udGVudCBvZiB0aGUgcHJvcGVydGllcy4KKworICAgIEluIGBFbWJl
ci5WaWV3YCB0aGUgYGNsYXNzTmFtZUJpbmRpbmdzYCBhbmQgYGF0dHJpYnV0ZUJpbmRpbmdzYCBw
cm9wZXJ0aWVzCisgICAgYXJlIGFsc28gY29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlvbiB0byBgY2xh
c3NOYW1lc2AuCisKKyAgICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3UgdG8gdXNl
IHRocm91Z2hvdXQgdGhlIEVtYmVyIG9iamVjdCBtb2RlbCwKKyAgICBhbHRob3VnaCB0eXBpY2Fs
IGFwcCBkZXZlbG9wZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGl0IGluZnJlcXVlbnRseS4KKworICAg
IEBwcm9wZXJ0eSBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzCisgICAgQHR5cGUgQXJyYXkKKyAgICBA
ZGVmYXVsdCBudWxsCisgICovCisgIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IG51bGwsCisKKyAg
LyoqCisgICAgQHByb3BlcnR5IGlzRGVzdHJveWVkCisgICAgQGRlZmF1bHQgZmFsc2UKKyAgKi8K
KyAgaXNEZXN0cm95ZWQ6IGZhbHNlLAorCisgIC8qKgorICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3lp
bmcKKyAgICBAZGVmYXVsdCBmYWxzZQorICAqLworICBpc0Rlc3Ryb3lpbmc6IGZhbHNlLAorCisg
IC8qKgorICAgIERlc3Ryb3lzIGFuIG9iamVjdCBieSBzZXR0aW5nIHRoZSBgaXNEZXN0cm95ZWRg
IGZsYWcgYW5kIHJlbW92aW5nIGl0cworICAgIG1ldGFkYXRhLCB3aGljaCBlZmZlY3RpdmVseSBk
ZXN0cm95cyBvYnNlcnZlcnMgYW5kIGJpbmRpbmdzLgorCisgICAgSWYgeW91IHRyeSB0byBzZXQg
YSBwcm9wZXJ0eSBvbiBhIGRlc3Ryb3llZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCisg
ICAgcmFpc2VkLgorCisgICAgTm90ZSB0aGF0IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxlZCBmb3Ig
dGhlIGVuZCBvZiB0aGUgcnVuIGxvb3AgYW5kIGRvZXMgbm90CisgICAgaGFwcGVuIGltbWVkaWF0
ZWx5LgorCisgICAgQG1ldGhvZCBkZXN0cm95CisgICAgQHJldHVybiB7RW1iZXIuT2JqZWN0fSBy
ZWNlaXZlcgorICAqLworICBkZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5fZGlk
Q2FsbERlc3Ryb3kpIHsgcmV0dXJuOyB9CisKKyAgICB0aGlzLmlzRGVzdHJveWluZyA9IHRydWU7
CisgICAgdGhpcy5fZGlkQ2FsbERlc3Ryb3kgPSB0cnVlOworCisgICAgaWYgKHRoaXMud2lsbERl
c3Ryb3kpIHsgdGhpcy53aWxsRGVzdHJveSgpOyB9CisKKyAgICBzY2hlZHVsZSgnZGVzdHJveScs
IHRoaXMsIHRoaXMuX3NjaGVkdWxlZERlc3Ryb3kpOworICAgIHJldHVybiB0aGlzOworICB9LAor
CisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBJbnZva2VkIGJ5IHRoZSBydW4gbG9vcCB0byBh
Y3R1YWxseSBkZXN0cm95IHRoZSBvYmplY3QuIFRoaXMgaXMKKyAgICBzY2hlZHVsZWQgZm9yIGV4
ZWN1dGlvbiBieSB0aGUgYGRlc3Ryb3lgIG1ldGhvZC4KKworICAgIEBtZXRob2QgX3NjaGVkdWxl
ZERlc3Ryb3kKKyAgKi8KKyAgX3NjaGVkdWxlZERlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIGRl
c3Ryb3kodGhpcyk7CisgICAgc2V0KHRoaXMsICdpc0Rlc3Ryb3llZCcsIHRydWUpOworCisgICAg
aWYgKHRoaXMuZGlkRGVzdHJveSkgeyB0aGlzLmRpZERlc3Ryb3koKTsgfQorICB9LAorCisgIGJp
bmQ6IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CisgICAgaWYgKCEoZnJvbSBpbnN0YW5jZW9mIEVtYmVy
LkJpbmRpbmcpKSB7IGZyb20gPSBFbWJlci5CaW5kaW5nLmZyb20oZnJvbSk7IH0KKyAgICBmcm9t
LnRvKHRvKS5jb25uZWN0KHRoaXMpOworICAgIHJldHVybiBmcm9tOworICB9LAorCisgIC8qKgor
ICAgIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2hpY2ggYXR0ZW1wdHMgdG8gcHJv
dmlkZSBtb3JlIGluZm9ybWF0aW9uCisgICAgdGhhbiBKYXZhc2NyaXB0J3MgYHRvU3RyaW5nYCB0
eXBpY2FsbHkgZG9lcywgaW4gYSBnZW5lcmljIHdheSBmb3IgYWxsIEVtYmVyCisgICAgb2JqZWN0
cy4KKworICAgICAgICBBcHAuUGVyc29uID0gRW0uT2JqZWN0LmV4dGVuZCgpCisgICAgICAgIHBl
cnNvbiA9IEFwcC5QZXJzb24uY3JlYXRlKCkKKyAgICAgICAgcGVyc29uLnRvU3RyaW5nKCkgLy89
PiAiPEFwcC5QZXJzb246ZW1iZXIxMDI0PiIKKworICAgIElmIHRoZSBvYmplY3QncyBjbGFzcyBp
cyBub3QgZGVmaW5lZCBvbiBhbiBFbWJlciBuYW1lc3BhY2UsIGl0IHdpbGwKKyAgICBpbmRpY2F0
ZSBpdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdpc3RlcmVkIHN1cGVyY2xhc3M6CisKKyAgICAg
ICAgU3R1ZGVudCA9IEFwcC5QZXJzb24uZXh0ZW5kKCkKKyAgICAgICAgc3R1ZGVudCA9IFN0dWRl
bnQuY3JlYXRlKCkKKyAgICAgICAgc3R1ZGVudC50b1N0cmluZygpIC8vPT4gIjwoc3ViY2xhc3Mg
b2YgQXBwLlBlcnNvbik6ZW1iZXIxMDI1PiIKKworICAgIElmIHRoZSBtZXRob2QgYHRvU3RyaW5n
RXh0ZW5zaW9uYCBpcyBkZWZpbmVkLCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUKKyAgICBpbmNs
dWRlZCBpbiB0aGUgb3V0cHV0LgorCisgICAgICAgIEFwcC5UZWFjaGVyID0gQXBwLlBlcnNvbi5l
eHRlbmQoeworICAgICAgICAgIHRvU3RyaW5nRXh0ZW5zaW9uOiBmdW5jdGlvbigpeworICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdmdWxsTmFtZScpOworICAgICAgICAgIH0KKyAgICAgICAg
fSk7CisgICAgICAgIHRlYWNoZXIgPSBBcHAuVGVhY2hlci5jcmVhdGUoKQorICAgICAgICB0ZWFj
aGVyLnRvU3RyaW5nKCk7IC8vICM9PiAiPEFwcC5UZWFjaGVyOmVtYmVyMTAyNjpUb20gRGFsZT4i
CisKKyAgICBAbWV0aG9kIHRvU3RyaW5nCisgICAgQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgcmVw
cmVzZW50YXRpb24KKyAgKi8KKyAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkgeworICAg
IHZhciBoYXNUb1N0cmluZ0V4dGVuc2lvbiA9IHR5cGVvZiB0aGlzLnRvU3RyaW5nRXh0ZW5zaW9u
ID09PSAnZnVuY3Rpb24nLAorICAgICAgICBleHRlbnNpb24gPSBoYXNUb1N0cmluZ0V4dGVuc2lv
biA/ICI6IiArIHRoaXMudG9TdHJpbmdFeHRlbnNpb24oKSA6ICcnOworICAgIHZhciByZXQgPSAn
PCcrdGhpcy5jb25zdHJ1Y3Rvci50b1N0cmluZygpKyc6JytndWlkRm9yKHRoaXMpK2V4dGVuc2lv
bisnPic7CisgICAgdGhpcy50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhyZXQpOworICAgIHJldHVy
biByZXQ7CisgIH0KK30pOworCitDb3JlT2JqZWN0LlByb3RvdHlwZU1peGluLm93bmVyQ29uc3Ry
dWN0b3IgPSBDb3JlT2JqZWN0OworCitmdW5jdGlvbiBtYWtlVG9TdHJpbmcocmV0KSB7CisgIHJl
dHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIHJldDsgfTsKK30KKworaWYgKEVtYmVyLmNvbmZpZy5v
dmVycmlkZVByb3RvdHlwZU1peGluKSB7CisgIEVtYmVyLmNvbmZpZy5vdmVycmlkZVByb3RvdHlw
ZU1peGluKENvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4pOworfQorCitDb3JlT2JqZWN0Ll9fc3Vw
ZXJfXyA9IG51bGw7CisKK3ZhciBDbGFzc01peGluID0gTWl4aW4uY3JlYXRlKHsKKworICBDbGFz
c01peGluOiBFbWJlci5yZXF1aXJlZCgpLAorCisgIFByb3RvdHlwZU1peGluOiBFbWJlci5yZXF1
aXJlZCgpLAorCisgIGlzQ2xhc3M6IHRydWUsCisKKyAgaXNNZXRob2Q6IGZhbHNlLAorCisgIGV4
dGVuZDogZnVuY3Rpb24oKSB7CisgICAgdmFyIENsYXNzID0gbWFrZUN0b3IoKSwgcHJvdG87Cisg
ICAgQ2xhc3MuQ2xhc3NNaXhpbiA9IE1peGluLmNyZWF0ZSh0aGlzLkNsYXNzTWl4aW4pOworICAg
IENsYXNzLlByb3RvdHlwZU1peGluID0gTWl4aW4uY3JlYXRlKHRoaXMuUHJvdG90eXBlTWl4aW4p
OworCisgICAgQ2xhc3MuQ2xhc3NNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ2xhc3M7CisgICAg
Q2xhc3MuUHJvdG90eXBlTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENsYXNzOworCisgICAgcmVv
cGVuLmFwcGx5KENsYXNzLlByb3RvdHlwZU1peGluLCBhcmd1bWVudHMpOworCisgICAgQ2xhc3Mu
c3VwZXJjbGFzcyA9IHRoaXM7CisgICAgQ2xhc3MuX19zdXBlcl9fICA9IHRoaXMucHJvdG90eXBl
OworCisgICAgcHJvdG8gPSBDbGFzcy5wcm90b3R5cGUgPSBvX2NyZWF0ZSh0aGlzLnByb3RvdHlw
ZSk7CisgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDbGFzczsKKyAgICBnZW5lcmF0ZUd1aWQocHJv
dG8sICdlbWJlcicpOworICAgIG1ldGEocHJvdG8pLnByb3RvID0gcHJvdG87IC8vIHRoaXMgd2ls
bCBkaXNhYmxlIG9ic2VydmVycyBvbiBwcm90b3R5cGUKKworICAgIENsYXNzLkNsYXNzTWl4aW4u
YXBwbHkoQ2xhc3MpOworICAgIHJldHVybiBDbGFzczsKKyAgfSwKKworICBjcmVhdGVXaXRoTWl4
aW5zOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgQyA9IHRoaXM7CisgICAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGg+MCkgeyB0aGlzLl9pbml0TWl4aW5zKGFyZ3VtZW50cyk7IH0KKyAgICByZXR1cm4gbmV3
IEMoKTsKKyAgfSwKKworICBjcmVhdGU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBDID0gdGhpczsK
KyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD4wKSB7IHRoaXMuX2luaXRQcm9wZXJ0aWVzKGFyZ3Vt
ZW50cyk7IH0KKyAgICByZXR1cm4gbmV3IEMoKTsKKyAgfSwKKworICByZW9wZW46IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMud2lsbFJlb3BlbigpOworICAgIHJlb3Blbi5hcHBseSh0aGlzLlByb3Rv
dHlwZU1peGluLCBhcmd1bWVudHMpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIHJlb3Bl
bkNsYXNzOiBmdW5jdGlvbigpIHsKKyAgICByZW9wZW4uYXBwbHkodGhpcy5DbGFzc01peGluLCBh
cmd1bWVudHMpOworICAgIGFwcGx5TWl4aW4odGhpcywgYXJndW1lbnRzLCBmYWxzZSk7CisgICAg
cmV0dXJuIHRoaXM7CisgIH0sCisKKyAgZGV0ZWN0OiBmdW5jdGlvbihvYmopIHsKKyAgICBpZiAo
J2Z1bmN0aW9uJyAhPT0gdHlwZW9mIG9iaikgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB3aGlsZShv
YmopIHsKKyAgICAgIGlmIChvYmo9PT10aGlzKSB7IHJldHVybiB0cnVlOyB9CisgICAgICBvYmog
PSBvYmouc3VwZXJjbGFzczsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9LAorCisgIGRl
dGVjdEluc3RhbmNlOiBmdW5jdGlvbihvYmopIHsKKyAgICByZXR1cm4gb2JqIGluc3RhbmNlb2Yg
dGhpczsKKyAgfSwKKworICAvKioKKyAgICBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8g
YW5ub3RhdGUgY29tcHV0ZWQgcHJvcGVydGllcyB3aXRoIGFkZGl0aW9uYWwKKyAgICBtZXRhZGF0
YSBhYm91dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZhbHVlcyB0aGV5IG9wZXJhdGUgb24u
IEZvcgorICAgIGV4YW1wbGUsIGNvbXB1dGVkIHByb3BlcnR5IGZ1bmN0aW9ucyBtYXkgY2xvc2Ug
b3ZlciB2YXJpYWJsZXMgdGhhdCBhcmUgdGhlbgorICAgIG5vIGxvbmdlciBhdmFpbGFibGUgZm9y
IGludHJvc3BlY3Rpb24uCisKKyAgICBZb3UgY2FuIHBhc3MgYSBoYXNoIG9mIHRoZXNlIHZhbHVl
cyB0byBhIGNvbXB1dGVkIHByb3BlcnR5IGxpa2UgdGhpczoKKworICAgIGBgYGphdmFzY3JpcHQK
KyAgICBwZXJzb246IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHBlcnNvbklkID0gdGhpcy5nZXQo
J3BlcnNvbklkJyk7CisgICAgICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29u
SWQgfSk7CisgICAgfS5wcm9wZXJ0eSgpLm1ldGEoeyB0eXBlOiBBcHAuUGVyc29uIH0pCisgICAg
YGBgCisKKyAgICBPbmNlIHlvdSd2ZSBkb25lIHRoaXMsIHlvdSBjYW4gcmV0cmlldmUgdGhlIHZh
bHVlcyBzYXZlZCB0byB0aGUgY29tcHV0ZWQKKyAgICBwcm9wZXJ0eSBmcm9tIHlvdXIgY2xhc3Mg
bGlrZSB0aGlzOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15Q2xhc3MubWV0YUZvclByb3Bl
cnR5KCdwZXJzb24nKTsKKyAgICBgYGAKKworICAgIFRoaXMgd2lsbCByZXR1cm4gdGhlIG9yaWdp
bmFsIGhhc2ggdGhhdCB3YXMgcGFzc2VkIHRvIGBtZXRhKClgLgorCisgICAgQG1ldGhvZCBtZXRh
Rm9yUHJvcGVydHkKKyAgICBAcGFyYW0ga2V5IHtTdHJpbmd9IHByb3BlcnR5IG5hbWUKKyAgKi8K
KyAgbWV0YUZvclByb3BlcnR5OiBmdW5jdGlvbihrZXkpIHsKKyAgICB2YXIgZGVzYyA9IG1ldGEo
dGhpcy5wcm90bygpLCBmYWxzZSkuZGVzY3Nba2V5XTsKKworICAgIEVtYmVyLmFzc2VydCgibWV0
YUZvclByb3BlcnR5KCkgY291bGQgbm90IGZpbmQgYSBjb21wdXRlZCBwcm9wZXJ0eSB3aXRoIGtl
eSAnIitrZXkrIicuIiwgISFkZXNjICYmIGRlc2MgaW5zdGFuY2VvZiBFbWJlci5Db21wdXRlZFBy
b3BlcnR5KTsKKyAgICByZXR1cm4gZGVzYy5fbWV0YSB8fCB7fTsKKyAgfSwKKworICAvKioKKyAg
ICBJdGVyYXRlIG92ZXIgZWFjaCBjb21wdXRlZCBwcm9wZXJ0eSBmb3IgdGhlIGNsYXNzLCBwYXNz
aW5nIGl0cyBuYW1lCisgICAgYW5kIGFueSBhc3NvY2lhdGVkIG1ldGFkYXRhIChzZWUgYG1ldGFG
b3JQcm9wZXJ0eWApIHRvIHRoZSBjYWxsYmFjay4KKworICAgIEBtZXRob2QgZWFjaENvbXB1dGVk
UHJvcGVydHkKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAgIEBwYXJhbSB7T2Jq
ZWN0fSBiaW5kaW5nCisgICovCisgIGVhY2hDb21wdXRlZFByb3BlcnR5OiBmdW5jdGlvbihjYWxs
YmFjaywgYmluZGluZykgeworICAgIHZhciBwcm90byA9IHRoaXMucHJvdG8oKSwKKyAgICAgICAg
ZGVzY3MgPSBtZXRhKHByb3RvKS5kZXNjcywKKyAgICAgICAgZW1wdHkgPSB7fSwKKyAgICAgICAg
cHJvcGVydHk7CisKKyAgICBmb3IgKHZhciBuYW1lIGluIGRlc2NzKSB7CisgICAgICBwcm9wZXJ0
eSA9IGRlc2NzW25hbWVdOworCisgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBFbWJlci5D
b21wdXRlZFByb3BlcnR5KSB7CisgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZyB8fCB0aGlz
LCBuYW1lLCBwcm9wZXJ0eS5fbWV0YSB8fCBlbXB0eSk7CisgICAgICB9CisgICAgfQorICB9CisK
K30pOworCitDbGFzc01peGluLm93bmVyQ29uc3RydWN0b3IgPSBDb3JlT2JqZWN0OworCitpZiAo
RW1iZXIuY29uZmlnLm92ZXJyaWRlQ2xhc3NNaXhpbikgeworICBFbWJlci5jb25maWcub3ZlcnJp
ZGVDbGFzc01peGluKENsYXNzTWl4aW4pOworfQorCitDb3JlT2JqZWN0LkNsYXNzTWl4aW4gPSBD
bGFzc01peGluOworQ2xhc3NNaXhpbi5hcHBseShDb3JlT2JqZWN0KTsKKworLyoqCisgIEBjbGFz
cyBDb3JlT2JqZWN0CisgIEBuYW1lc3BhY2UgRW1iZXIKKyovCitFbWJlci5Db3JlT2JqZWN0ID0g
Q29yZU9iamVjdDsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBl
bWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLCBub25lID0gRW1iZXIu
aXNOb25lOworCisvKioKKyAgQW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4KKwor
ICBBIFNldCB3b3JrcyBhIGJpdCBsaWtlIGFuIGFycmF5IGV4Y2VwdCB0aGF0IGl0cyBpdGVtcyBh
cmUgbm90IG9yZGVyZWQuIFlvdQorICBjYW4gY3JlYXRlIGEgc2V0IHRvIGVmZmljaWVudGx5IHRl
c3QgZm9yIG1lbWJlcnNoaXAgZm9yIGFuIG9iamVjdC4gWW91IGNhbgorICBhbHNvIGl0ZXJhdGUg
dGhyb3VnaCBhIHNldCBqdXN0IGxpa2UgYW4gYXJyYXksIGV2ZW4gYWNjZXNzaW5nIG9iamVjdHMg
YnkKKyAgaW5kZXgsIGhvd2V2ZXIgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGFzIHRvIHRoZWlyIG9y
ZGVyLgorCisgIEFsbCBTZXRzIGFyZSBvYnNlcnZhYmxlIHZpYSB0aGUgRW51bWVyYWJsZSBPYnNl
cnZlciBBUEkgLSB3aGljaCB3b3JrcworICBvbiBhbnkgZW51bWVyYWJsZSBvYmplY3QgaW5jbHVk
aW5nIGJvdGggU2V0cyBhbmQgQXJyYXlzLgorCisgICMjIENyZWF0aW5nIGEgU2V0CisKKyAgWW91
IGNhbiBjcmVhdGUgYSBzZXQgbGlrZSB5b3Ugd291bGQgbW9zdCBvYmplY3RzIHVzaW5nCisgIGBu
ZXcgRW1iZXIuU2V0KClgLiBNb3N0IG5ldyBzZXRzIHlvdSBjcmVhdGUgd2lsbCBiZSBlbXB0eSwg
YnV0IHlvdSBjYW4KKyAgYWxzbyBpbml0aWFsaXplIHRoZSBzZXQgd2l0aCBzb21lIGNvbnRlbnQg
YnkgcGFzc2luZyBhbiBhcnJheSBvciBvdGhlcgorICBlbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8g
dGhlIGNvbnN0cnVjdG9yLgorCisgIEZpbmFsbHksIHlvdSBjYW4gcGFzcyBpbiBhbiBleGlzdGlu
ZyBzZXQgYW5kIHRoZSBzZXQgd2lsbCBiZSBjb3BpZWQuIFlvdQorICBjYW4gYWxzbyBjcmVhdGUg
YSBjb3B5IG9mIGEgc2V0IGJ5IGNhbGxpbmcgYEVtYmVyLlNldCNjb3B5KClgLgorCisgIGBgYGph
dmFzY3JpcHQKKyAgLy8gY3JlYXRlcyBhIG5ldyBlbXB0eSBzZXQKKyAgdmFyIGZvdW5kTmFtZXMg
PSBuZXcgRW1iZXIuU2V0KCk7CisKKyAgLy8gY3JlYXRlcyBhIHNldCB3aXRoIGZvdXIgbmFtZXMg
aW4gaXQuCisgIHZhciBuYW1lcyA9IG5ldyBFbWJlci5TZXQoWyJDaGFybGVzIiwgIlRvbSIsICJK
dWFuIiwgIkFsZXgiXSk7IC8vIDpQCisKKyAgLy8gY3JlYXRlcyBhIGNvcHkgb2YgdGhlIG5hbWVz
IHNldC4KKyAgdmFyIG5hbWVzQ29weSA9IG5ldyBFbWJlci5TZXQobmFtZXMpOworCisgIC8vIHNh
bWUgYXMgYWJvdmUuCisgIHZhciBhbm90aGVyTmFtZXNDb3B5ID0gbmFtZXMuY29weSgpOworICBg
YGAKKworICAjIyBBZGRpbmcvUmVtb3ZpbmcgT2JqZWN0cworCisgIFlvdSBnZW5lcmFsbHkgYWRk
IG9yIHJlbW92ZSBvYmplY3RzIGZyb20gYSBzZXQgdXNpbmcgYGFkZCgpYCBvcgorICBgcmVtb3Zl
KClgLiBZb3UgY2FuIGFkZCBhbnkgdHlwZSBvZiBvYmplY3QgaW5jbHVkaW5nIHByaW1pdGl2ZXMg
c3VjaCBhcworICBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuCisKKyAgVW5saWtlIGFy
cmF5cywgb2JqZWN0cyBjYW4gb25seSBleGlzdCBvbmUgdGltZSBpbiBhIHNldC4gSWYgeW91IGNh
bGwgYGFkZCgpYAorICBvbiBhIHNldCB3aXRoIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1l
cywgdGhlIG9iamVjdCB3aWxsIG9ubHkgYmUgYWRkZWQKKyAgb25jZS4gTGlrZXdpc2UsIGNhbGxp
bmcgYHJlbW92ZSgpYCB3aXRoIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcyB3aWxsCisg
IHJlbW92ZSB0aGUgb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGFuZCBoYXZlIG5vIGVmZmVjdCBvbiBm
dXR1cmUgY2FsbHMgdW50aWwKKyAgeW91IGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBzZXQgYWdhaW4u
CisKKyAgTk9URTogWW91IGNhbm5vdCBhZGQvcmVtb3ZlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0
byBhIHNldC4gQW55IGF0dGVtcHQgdG8gZG8KKyAgc28gd2lsbCBiZSBpZ25vcmVkLgorCisgIElu
IGFkZGl0aW9uIHRvIGFkZC9yZW1vdmUgeW91IGNhbiBhbHNvIGNhbGwgYHB1c2goKWAvYHBvcCgp
YC4gUHVzaCBiZWhhdmVzCisgIGp1c3QgbGlrZSBgYWRkKClgIGJ1dCBgcG9wKClgLCB1bmxpa2Ug
YHJlbW92ZSgpYCB3aWxsIHBpY2sgYW4gYXJiaXRyYXJ5CisgIG9iamVjdCwgcmVtb3ZlIGl0IGFu
ZCByZXR1cm4gaXQuIFRoaXMgaXMgYSBnb29kIHdheSB0byB1c2UgYSBzZXQgYXMgYSBqb2IKKyAg
cXVldWUgd2hlbiB5b3UgZG9uJ3QgY2FyZSB3aGljaCBvcmRlciB0aGUgam9icyBhcmUgZXhlY3V0
ZWQgaW4uCisKKyAgIyMgVGVzdGluZyBmb3IgYW4gT2JqZWN0CisKKyAgVG8gdGVzdCBmb3IgYW4g
b2JqZWN0J3MgcHJlc2VuY2UgaW4gYSBzZXQgeW91IHNpbXBseSBjYWxsCisgIGBFbWJlci5TZXQj
Y29udGFpbnMoKWAuCisKKyAgIyMgT2JzZXJ2aW5nIGNoYW5nZXMKKworICBXaGVuIHVzaW5nIGBF
bWJlci5TZXRgLCB5b3UgY2FuIG9ic2VydmUgdGhlIGAiW10iYCBwcm9wZXJ0eSB0byBiZQorICBh
bGVydGVkIHdoZW5ldmVyIHRoZSBjb250ZW50IGNoYW5nZXMuIFlvdSBjYW4gYWxzbyBhZGQgYW4g
ZW51bWVyYWJsZQorICBvYnNlcnZlciB0byB0aGUgc2V0IHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNp
ZmljIG9iamVjdHMgdGhhdCBhcmUgYWRkZWQgYW5kCisgIHJlbW92ZWQgZnJvbSB0aGUgc2V0LiBT
ZWUgYEVtYmVyLkVudW1lcmFibGVgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgIGVudW1lcmFi
bGVzLgorCisgIFRoaXMgaXMgb2Z0ZW4gdW5oZWxwZnVsLiBJZiB5b3UgYXJlIGZpbHRlcmluZyBz
ZXRzIG9mIG9iamVjdHMsIGZvciBpbnN0YW5jZSwKKyAgaXQgaXMgdmVyeSBpbmVmZmljaWVudCB0
byByZS1maWx0ZXIgYWxsIG9mIHRoZSBpdGVtcyBlYWNoIHRpbWUgdGhlIHNldAorICBjaGFuZ2Vz
LiBJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgeW91IGNvdWxkIGp1c3QgYWRqdXN0IHRoZSBmaWx0ZXJl
ZCBzZXQgYmFzZWQKKyAgb24gd2hhdCB3YXMgY2hhbmdlZCBvbiB0aGUgb3JpZ2luYWwgc2V0LiBU
aGUgc2FtZSBpc3N1ZSBhcHBsaWVzIHRvIG1lcmdpbmcKKyAgc2V0cywgYXMgd2VsbC4KKworICAj
IyBPdGhlciBNZXRob2RzCisKKyAgYEVtYmVyLlNldGAgcHJpbWFyeSBpbXBsZW1lbnRzIG90aGVy
IG1peGluIEFQSXMuIEZvciBhIGNvbXBsZXRlIHJlZmVyZW5jZQorICBvbiB0aGUgbWV0aG9kcyB5
b3Ugd2lsbCB1c2Ugd2l0aCBgRW1iZXIuU2V0YCwgcGxlYXNlIGNvbnN1bHQgdGhlc2UgbWl4aW5z
LgorICBUaGUgbW9zdCB1c2VmdWwgb25lcyB3aWxsIGJlIGBFbWJlci5FbnVtZXJhYmxlYCBhbmQK
KyAgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxlYCB3aGljaCBpbXBsZW1lbnQgbW9zdCBvZiB0aGUg
Y29tbW9uIGl0ZXJhdG9yCisgIG1ldGhvZHMgeW91IGFyZSB1c2VkIHRvIG9uIEFycmF5LgorCisg
IE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgRW1iZXIuQ29weWFibGVgIGFuZCBgRW1i
ZXIuRnJlZXphYmxlYAorICBBUElzIG9uIGBFbWJlci5TZXRgIGFzIHdlbGwuIE9uY2UgYSBzZXQg
aXMgZnJvemVuIGl0IGNhbiBubyBsb25nZXIgYmUKKyAgbW9kaWZpZWQuIFRoZSBiZW5lZml0IG9m
IHRoaXMgaXMgdGhhdCB3aGVuIHlvdSBjYWxsIGBmcm96ZW5Db3B5KClgIG9uIGl0LAorICBFbWJl
ciB3aWxsIGF2b2lkIG1ha2luZyBjb3BpZXMgb2YgdGhlIHNldC4gVGhpcyBhbGxvd3MgeW91IHRv
IHdyaXRlCisgIGNvZGUgdGhhdCBjYW4ga25vdyB3aXRoIGNlcnRhaW50eSB3aGVuIHRoZSB1bmRl
cmx5aW5nIHNldCBkYXRhIHdpbGwgb3IKKyAgd2lsbCBub3QgYmUgbW9kaWZpZWQuCisKKyAgQGNs
YXNzIFNldAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLkNvcmVPYmplY3QK
KyAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKKyAgQHVzZXMgRW1iZXIuQ29weWFibGUK
KyAgQHVzZXMgRW1iZXIuRnJlZXphYmxlCisgIEBzaW5jZSBFbWJlciAwLjkKKyovCitFbWJlci5T
ZXQgPSBFbWJlci5Db3JlT2JqZWN0LmV4dGVuZChFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwgRW1i
ZXIuQ29weWFibGUsIEVtYmVyLkZyZWV6YWJsZSwKKyAgLyoqIEBzY29wZSBFbWJlci5TZXQucHJv
dG90eXBlICovIHsKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIElNUExFTUVOVCBFTlVNRVJBQkxFIEFQSVMKKyAg
Ly8KKworICAvKioKKyAgICBUaGlzIHByb3BlcnR5IHdpbGwgY2hhbmdlIGFzIHRoZSBudW1iZXIg
b2Ygb2JqZWN0cyBpbiB0aGUgc2V0IGNoYW5nZXMuCisKKyAgICBAcHJvcGVydHkgbGVuZ3RoCisg
ICAgQHR5cGUgbnVtYmVyCisgICAgQGRlZmF1bHQgMAorICAqLworICBsZW5ndGg6IDAsCisKKyAg
LyoqCisgICAgQ2xlYXJzIHRoZSBzZXQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJl
dXNlIGFuIGV4aXN0aW5nIHNldAorICAgIHdpdGhvdXQgaGF2aW5nIHRvIHJlY3JlYXRlIGl0Lgor
CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXSk7CisgICAgY29sb3JzLmxlbmd0aDsgIC8vIDMKKyAgICBjb2xv
cnMuY2xlYXIoKTsKKyAgICBjb2xvcnMubGVuZ3RoOyAgLy8gMAorICAgIGBgYAorCisgICAgQG1l
dGhvZCBjbGVhcgorICAgIEByZXR1cm4ge0VtYmVyLlNldH0gQW4gZW1wdHkgU2V0CisgICovCisg
IGNsZWFyOiBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5pc0Zyb3plbikgeyB0aHJvdyBuZXcg
RXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsgfQorCisgICAgdmFyIGxlbiA9IGdldCh0aGlzLCAn
bGVuZ3RoJyk7CisgICAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm4gdGhpczsgfQorCisgICAgdmFy
IGd1aWQ7CisKKyAgICB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShsZW4sIDApOwor
ICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKKyAgICBF
bWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKKworICAgIGZvciAo
dmFyIGk9MDsgaSA8IGxlbjsgaSsrKXsKKyAgICAgIGd1aWQgPSBndWlkRm9yKHRoaXNbaV0pOwor
ICAgICAgZGVsZXRlIHRoaXNbZ3VpZF07CisgICAgICBkZWxldGUgdGhpc1tpXTsKKyAgICB9CisK
KyAgICBzZXQodGhpcywgJ2xlbmd0aCcsIDApOworCisgICAgRW1iZXIucHJvcGVydHlEaWRDaGFu
Z2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7CisgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhp
cywgJ2xhc3RPYmplY3QnKTsKKyAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKGxl
biwgMCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIHRy
dWUgaWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYWxzbyBhbiBlbnVtZXJhYmxlIHRoYXQgY29udGFp
bnMgdGhlCisgICAgc2FtZSBvYmplY3RzIGFzIHRoZSByZWNlaXZlci4KKworICAgIGBgYGphdmFz
Y3JpcHQKKyAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdLAorICAgICAg
ICBzYW1lX2NvbG9ycyA9IG5ldyBFbWJlci5TZXQoY29sb3JzKTsKKworICAgIHNhbWVfY29sb3Jz
LmlzRXF1YWwoY29sb3JzKTsgICAgICAgICAgICAgICAvLyB0cnVlCisgICAgc2FtZV9jb2xvcnMu
aXNFcXVhbChbInB1cnBsZSIsICJicm93biJdKTsgIC8vIGZhbHNlCisgICAgYGBgCisKKyAgICBA
bWV0aG9kIGlzRXF1YWwKKyAgICBAcGFyYW0ge0VtYmVyLlNldH0gb2JqIHRoZSBvdGhlciBvYmpl
Y3QuCisgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgKi8KKyAgaXNFcXVhbDogZnVuY3Rpb24ob2Jq
KSB7CisgICAgLy8gZmFpbCBmYXN0CisgICAgaWYgKCFFbWJlci5FbnVtZXJhYmxlLmRldGVjdChv
YmopKSByZXR1cm4gZmFsc2U7CisKKyAgICB2YXIgbG9jID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsK
KyAgICBpZiAoZ2V0KG9iaiwgJ2xlbmd0aCcpICE9PSBsb2MpIHJldHVybiBmYWxzZTsKKworICAg
IHdoaWxlKC0tbG9jID49IDApIHsKKyAgICAgIGlmICghb2JqLmNvbnRhaW5zKHRoaXNbbG9jXSkp
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSwKKworICAvKioK
KyAgICBBZGRzIGFuIG9iamVjdCB0byB0aGUgc2V0LiBPbmx5IG5vbi1gbnVsbGAgb2JqZWN0cyBj
YW4gYmUgYWRkZWQgdG8gYSBzZXQKKyAgICBhbmQgdGhvc2UgY2FuIG9ubHkgYmUgYWRkZWQgb25j
ZS4gSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBzZXQgb3IKKyAgICB0aGUgcGFzc2Vk
IHZhbHVlIGlzIG51bGwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKworICAgIFRo
aXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3QoKWAu
CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsK
KyAgICBjb2xvcnMuYWRkKCJibHVlIik7ICAgICAvLyBbImJsdWUiXQorICAgIGNvbG9ycy5hZGQo
ImJsdWUiKTsgICAgIC8vIFsiYmx1ZSJdCisgICAgY29sb3JzLmFkZCgicmVkIik7ICAgICAgLy8g
WyJibHVlIiwgInJlZCJdCisgICAgY29sb3JzLmFkZChudWxsKTsgICAgICAgLy8gWyJibHVlIiwg
InJlZCJdCisgICAgY29sb3JzLmFkZCh1bmRlZmluZWQpOyAgLy8gWyJibHVlIiwgInJlZCJdCisg
ICAgYGBgCisKKyAgICBAbWV0aG9kIGFkZAorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9i
amVjdCB0byBhZGQuCisgICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KKyAg
Ki8KKyAgYWRkOiBFbWJlci5hbGlhc01ldGhvZCgnYWRkT2JqZWN0JyksCisKKyAgLyoqCisgICAg
UmVtb3ZlcyB0aGUgb2JqZWN0IGZyb20gdGhlIHNldCBpZiBpdCBpcyBmb3VuZC4gSWYgeW91IHBh
c3MgYSBgbnVsbGAgdmFsdWUKKyAgICBvciBhbiBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG5vdCBp
biB0aGUgc2V0LCB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8KKyAgICBlZmZlY3QuIFRoaXMgaXMg
YW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5yZW1vdmVPYmplY3QoKWAuCisK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQi
LCAiZ3JlZW4iLCAiYmx1ZSJdKTsKKyAgICBjb2xvcnMucmVtb3ZlKCJyZWQiKTsgICAgIC8vIFsi
Ymx1ZSIsICJncmVlbiJdCisgICAgY29sb3JzLnJlbW92ZSgicHVycGxlIik7ICAvLyBbImJsdWUi
LCAiZ3JlZW4iXQorICAgIGNvbG9ycy5yZW1vdmUobnVsbCk7ICAgICAgLy8gWyJibHVlIiwgImdy
ZWVuIl0KKyAgICBgYGAKKworICAgIEBtZXRob2QgcmVtb3ZlCisgICAgQHBhcmFtIHtPYmplY3R9
IG9iaiBUaGUgb2JqZWN0IHRvIHJlbW92ZQorICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNl
dCBpdHNlbGYuCisgICovCisgIHJlbW92ZTogRW1iZXIuYWxpYXNNZXRob2QoJ3JlbW92ZU9iamVj
dCcpLAorCisgIC8qKgorICAgIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQg
YW5kIHJldHVybnMgaXQsIG9yIGBudWxsYCBpZiBpdCdzIGVtcHR5LgorCisgICAgYGBgamF2YXNj
cmlwdAorICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJdKTsK
KyAgICBjb2xvcnMucG9wKCk7ICAvLyAiYmx1ZSIKKyAgICBjb2xvcnMucG9wKCk7ICAvLyAiZ3Jl
ZW4iCisgICAgY29sb3JzLnBvcCgpOyAgLy8gbnVsbAorICAgIGBgYAorCisgICAgQG1ldGhvZCBw
b3AKKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSByZW1vdmVkIG9iamVjdCBmcm9tIHRoZSBzZXQg
b3IgbnVsbC4KKyAgKi8KKyAgcG9wOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoZ2V0KHRoaXMsICdp
c0Zyb3plbicpKSB0aHJvdyBuZXcgRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKKyAgICB2YXIg
b2JqID0gdGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IG51bGw7CisgICAg
dGhpcy5yZW1vdmUob2JqKTsKKyAgICByZXR1cm4gb2JqOworICB9LAorCisgIC8qKgorICAgIElu
c2VydHMgdGhlIGdpdmVuIG9iamVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQuIEl0IHJldHVy
bnMKKyAgICB0aGUgc2V0IGl0c2VsZi4KKworICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJl
ci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3QoKWAuCisKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKKyAgICBjb2xvcnMucHVzaCgicmVkIik7
ICAgLy8gWyJyZWQiXQorICAgIGNvbG9ycy5wdXNoKCJncmVlbiIpOyAvLyBbInJlZCIsICJncmVl
biJdCisgICAgY29sb3JzLnB1c2goImJsdWUiKTsgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUi
XQorICAgIGBgYAorCisgICAgQG1ldGhvZCBwdXNoCisgICAgQHJldHVybiB7RW1iZXIuU2V0fSBU
aGUgc2V0IGl0c2VsZi4KKyAgKi8KKyAgcHVzaDogRW1iZXIuYWxpYXNNZXRob2QoJ2FkZE9iamVj
dCcpLAorCisgIC8qKgorICAgIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQg
YW5kIHJldHVybnMgaXQsIG9yIGBudWxsYCBpZiBpdCdzIGVtcHR5LgorCisgICAgVGhpcyBpcyBh
biBhbGlhcyBmb3IgYEVtYmVyLlNldC5wb3AoKWAuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
dmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJncmVlbiIsICJibHVlIl0pOworICAgIGNvbG9y
cy5zaGlmdCgpOyAgLy8gImJsdWUiCisgICAgY29sb3JzLnNoaWZ0KCk7ICAvLyAiZ3JlZW4iCisg
ICAgY29sb3JzLnNoaWZ0KCk7ICAvLyBudWxsCisgICAgYGBgCisKKyAgICBAbWV0aG9kIHNoaWZ0
CisgICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVtb3ZlZCBvYmplY3QgZnJvbSB0aGUgc2V0IG9y
IG51bGwuCisgICovCisgIHNoaWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncG9wJyksCisKKyAgLyoq
CisgICAgSW5zZXJ0cyB0aGUgZ2l2ZW4gb2JqZWN0IG9uIHRvIHRoZSBlbmQgb2YgdGhlIHNldC4g
SXQgcmV0dXJucworICAgIHRoZSBzZXQgaXRzZWxmLgorCisgICAgVGhpcyBpcyBhbiBhbGlhcyBv
ZiBgRW1iZXIuU2V0LnB1c2goKWAKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29sb3Jz
ID0gbmV3IEVtYmVyLlNldCgpOworICAgIGNvbG9ycy51bnNoaWZ0KCJyZWQiKTsgICAgLy8gWyJy
ZWQiXQorICAgIGNvbG9ycy51bnNoaWZ0KCJncmVlbiIpOyAgLy8gWyJyZWQiLCAiZ3JlZW4iXQor
ICAgIGNvbG9ycy51bnNoaWZ0KCJibHVlIik7ICAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJd
CisgICAgYGBgCisKKyAgICBAbWV0aG9kIHVuc2hpZnQKKyAgICBAcmV0dXJuIHtFbWJlci5TZXR9
IFRoZSBzZXQgaXRzZWxmLgorICAqLworICB1bnNoaWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncHVz
aCcpLAorCisgIC8qKgorICAgIEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJh
YmxlIHRvIHRoZSBzZXQuCisKKyAgICBUaGlzIGlzIGFuIGFsaWFzIG9mIGBFbWJlci5NdXRhYmxl
RW51bWVyYWJsZS5hZGRPYmplY3RzKClgCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNv
bG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKKyAgICBjb2xvcnMuYWRkRWFjaChbInJlZCIsICJncmVl
biIsICJibHVlIl0pOyAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdCisgICAgYGBgCisKKyAg
ICBAbWV0aG9kIGFkZEVhY2gKKyAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMg
dGhlIG9iamVjdHMgdG8gYWRkLgorICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNl
bGYuCisgICovCisgIGFkZEVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmplY3RzJyksCisK
KyAgLyoqCisgICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFibGUg
dG8gdGhlIHNldC4KKworICAgIFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLk11dGFibGVFbnVt
ZXJhYmxlLnJlbW92ZU9iamVjdHMoKWAKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29s
b3JzID0gbmV3IEVtYmVyLlNldChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOworICAgIGNvbG9y
cy5yZW1vdmVFYWNoKFsicmVkIiwgImJsdWUiXSk7ICAvLyAgWyJncmVlbiJdCisgICAgYGBgCisK
KyAgICBAbWV0aG9kIHJlbW92ZUVhY2gKKyAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9i
amVjdHMgdGhlIG9iamVjdHMgdG8gcmVtb3ZlLgorICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhl
IHNldCBpdHNlbGYuCisgICovCisgIHJlbW92ZUVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZW1v
dmVPYmplY3RzJyksCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBQUklWQVRFIEVOVU1FUkFCTEUgU1VQUE9SVAor
ICAvLworCisgIGluaXQ6IGZ1bmN0aW9uKGl0ZW1zKSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKyAg
ICBpZiAoaXRlbXMpIHRoaXMuYWRkT2JqZWN0cyhpdGVtcyk7CisgIH0sCisKKyAgLy8gaW1wbGVt
ZW50IEVtYmVyLkVudW1lcmFibGUKKyAgbmV4dE9iamVjdDogZnVuY3Rpb24oaWR4KSB7CisgICAg
cmV0dXJuIHRoaXNbaWR4XTsKKyAgfSwKKworICAvLyBtb3JlIG9wdGltaXplZCB2ZXJzaW9uCisg
IGZpcnN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhp
cy5sZW5ndGggPiAwID8gdGhpc1swXSA6IHVuZGVmaW5lZDsKKyAgfSksCisKKyAgLy8gbW9yZSBv
cHRpbWl6ZWQgdmVyc2lvbgorICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IHVu
ZGVmaW5lZDsKKyAgfSksCisKKyAgLy8gaW1wbGVtZW50cyBFbWJlci5NdXRhYmxlRW51bWVyYWJs
ZQorICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgeworICAgIGlmIChnZXQodGhpcywgJ2lzRnJv
emVuJykpIHRocm93IG5ldyBFcnJvcihFbWJlci5GUk9aRU5fRVJST1IpOworICAgIGlmIChub25l
KG9iaikpIHJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCisKKyAgICB2YXIgZ3VpZCA9IGd1
aWRGb3Iob2JqKSwKKyAgICAgICAgaWR4ICA9IHRoaXNbZ3VpZF0sCisgICAgICAgIGxlbiAgPSBn
ZXQodGhpcywgJ2xlbmd0aCcpLAorICAgICAgICBhZGRlZCA7CisKKyAgICBpZiAoaWR4Pj0wICYm
IGlkeDxsZW4gJiYgKHRoaXNbaWR4XSA9PT0gb2JqKSkgcmV0dXJuIHRoaXM7IC8vIGFkZGVkCisK
KyAgICBhZGRlZCA9IFtvYmpdOworCisgICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudFdpbGxDaGFu
Z2UobnVsbCwgYWRkZWQpOworICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFz
dE9iamVjdCcpOworCisgICAgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICB0aGlzW2d1
aWRdID0gbGVuOworICAgIHRoaXNbbGVuXSA9IG9iajsKKyAgICBzZXQodGhpcywgJ2xlbmd0aCcs
IGxlbisxKTsKKworICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0
Jyk7CisgICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZShudWxsLCBhZGRlZCk7CisK
KyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvLyBpbXBsZW1lbnRzIEVtYmVyLk11dGFibGVF
bnVtZXJhYmxlCisgIHJlbW92ZU9iamVjdDogZnVuY3Rpb24ob2JqKSB7CisgICAgaWYgKGdldCh0
aGlzLCAnaXNGcm96ZW4nKSkgdGhyb3cgbmV3IEVycm9yKEVtYmVyLkZST1pFTl9FUlJPUik7Cisg
ICAgaWYgKG5vbmUob2JqKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KKworICAgIHZh
ciBndWlkID0gZ3VpZEZvcihvYmopLAorICAgICAgICBpZHggID0gdGhpc1tndWlkXSwKKyAgICAg
ICAgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSwKKyAgICAgICAgaXNGaXJzdCA9IGlkeCA9PT0g
MCwKKyAgICAgICAgaXNMYXN0ID0gaWR4ID09PSBsZW4tMSwKKyAgICAgICAgbGFzdCwgcmVtb3Zl
ZDsKKworCisgICAgaWYgKGlkeD49MCAmJiBpZHg8bGVuICYmICh0aGlzW2lkeF0gPT09IG9iaikp
IHsKKyAgICAgIHJlbW92ZWQgPSBbb2JqXTsKKworICAgICAgdGhpcy5lbnVtZXJhYmxlQ29udGVu
dFdpbGxDaGFuZ2UocmVtb3ZlZCwgbnVsbCk7CisgICAgICBpZiAoaXNGaXJzdCkgeyBFbWJlci5w
cm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7IH0KKyAgICAgIGlmIChpc0xh
c3QpICB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOyB9CisK
KyAgICAgIC8vIHN3YXAgaXRlbXMgLSBiYXNpY2FsbHkgbW92ZSB0aGUgaXRlbSB0byB0aGUgZW5k
IHNvIGl0IGNhbiBiZSByZW1vdmVkCisgICAgICBpZiAoaWR4IDwgbGVuLTEpIHsKKyAgICAgICAg
bGFzdCA9IHRoaXNbbGVuLTFdOworICAgICAgICB0aGlzW2lkeF0gPSBsYXN0OworICAgICAgICB0
aGlzW2d1aWRGb3IobGFzdCldID0gaWR4OworICAgICAgfQorCisgICAgICBkZWxldGUgdGhpc1tn
dWlkXTsKKyAgICAgIGRlbGV0ZSB0aGlzW2xlbi0xXTsKKyAgICAgIHNldCh0aGlzLCAnbGVuZ3Ro
JywgbGVuLTEpOworCisgICAgICBpZiAoaXNGaXJzdCkgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5n
ZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsgfQorICAgICAgaWYgKGlzTGFzdCkgIHsgRW1iZXIucHJv
cGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsgfQorICAgICAgdGhpcy5lbnVtZXJh
YmxlQ29udGVudERpZENoYW5nZShyZW1vdmVkLCBudWxsKTsKKyAgICB9CisKKyAgICByZXR1cm4g
dGhpczsKKyAgfSwKKworICAvLyBvcHRpbWl6ZWQgdmVyc2lvbgorICBjb250YWluczogZnVuY3Rp
b24ob2JqKSB7CisgICAgcmV0dXJuIHRoaXNbZ3VpZEZvcihvYmopXT49MDsKKyAgfSwKKworICBj
b3B5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgQyA9IHRoaXMuY29uc3RydWN0b3IsIHJldCA9IG5l
dyBDKCksIGxvYyA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgc2V0KHJldCwgJ2xlbmd0aCcs
IGxvYyk7CisgICAgd2hpbGUoLS1sb2M+PTApIHsKKyAgICAgIHJldFtsb2NdID0gdGhpc1tsb2Nd
OworICAgICAgcmV0W2d1aWRGb3IodGhpc1tsb2NdKV0gPSBsb2M7CisgICAgfQorICAgIHJldHVy
biByZXQ7CisgIH0sCisKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgIHZhciBsZW4gPSB0
aGlzLmxlbmd0aCwgaWR4LCBhcnJheSA9IFtdOworICAgIGZvcihpZHggPSAwOyBpZHggPCBsZW47
IGlkeCsrKSB7CisgICAgICBhcnJheVtpZHhdID0gdGhpc1tpZHhdOworICAgIH0KKyAgICByZXR1
cm4gIkVtYmVyLlNldDwlQD4iLmZtdChhcnJheS5qb2luKCcsJykpOworICB9CisKK30pOworCit9
KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxl
IGVtYmVyLXJ1bnRpbWUKKyovCisKKy8qKgorICBgRW1iZXIuT2JqZWN0YCBpcyB0aGUgbWFpbiBi
YXNlIGNsYXNzIGZvciBhbGwgRW1iZXIgb2JqZWN0cy4gSXQgaXMgYSBzdWJjbGFzcworICBvZiBg
RW1iZXIuQ29yZU9iamVjdGAgd2l0aCB0aGUgYEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFwcGxp
ZWQuIEZvciBkZXRhaWxzLAorICBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggb2YgdGhl
c2UuCisKKyAgQGNsYXNzIE9iamVjdAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVt
YmVyLkNvcmVPYmplY3QKKyAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQorKi8KK0VtYmVyLk9iamVj
dCA9IEVtYmVyLkNvcmVPYmplY3QuZXh0ZW5kKEVtYmVyLk9ic2VydmFibGUpOworRW1iZXIuT2Jq
ZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIuT2JqZWN0IjsgfTsKKwor
fSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVs
ZSBlbWJlci1ydW50aW1lCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpbmRleE9mID0gRW1i
ZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKKworLyoqCisgIEEgTmFtZXNwYWNlIGlzIGFuIG9i
amVjdCB1c3VhbGx5IHVzZWQgdG8gY29udGFpbiBvdGhlciBvYmplY3RzIG9yIG1ldGhvZHMKKyAg
c3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBmcmFtZXdvcmsuIENyZWF0ZSBhIG5hbWVzcGFjZSBh
bnl0aW1lIHlvdSB3YW50CisgIHRvIGRlZmluZSBvbmUgb2YgdGhlc2UgbmV3IGNvbnRhaW5lcnMu
CisKKyAgIyBFeGFtcGxlIFVzYWdlCisKKyAgYGBgamF2YXNjcmlwdAorICBNeUZyYW1ld29yayA9
IEVtYmVyLk5hbWVzcGFjZS5jcmVhdGUoeworICAgIFZFUlNJT046ICcxLjAuMCcKKyAgfSk7Cisg
IGBgYAorCisgIEBjbGFzcyBOYW1lc3BhY2UKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5k
cyBFbWJlci5PYmplY3QKKyovCit2YXIgTmFtZXNwYWNlID0gRW1iZXIuTmFtZXNwYWNlID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7CisgIGlzTmFtZXNwYWNlOiB0cnVlLAorCisgIGluaXQ6IGZ1bmN0
aW9uKCkgeworICAgIEVtYmVyLk5hbWVzcGFjZS5OQU1FU1BBQ0VTLnB1c2godGhpcyk7CisgICAg
RW1iZXIuTmFtZXNwYWNlLlBST0NFU1NFRCA9IGZhbHNlOworICB9LAorCisgIHRvU3RyaW5nOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOworICAgIGlmIChu
YW1lKSB7IHJldHVybiBuYW1lOyB9CisKKyAgICBmaW5kTmFtZXNwYWNlcygpOworICAgIHJldHVy
biB0aGlzW0VtYmVyLkdVSURfS0VZKydfbmFtZSddOworICB9LAorCisgIG5hbWVDbGFzc2VzOiBm
dW5jdGlvbigpIHsKKyAgICBwcm9jZXNzTmFtZXNwYWNlKFt0aGlzLnRvU3RyaW5nKCldLCB0aGlz
LCB7fSk7CisgIH0sCisKKyAgZGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgdmFyIG5hbWVzcGFj
ZXMgPSBFbWJlci5OYW1lc3BhY2UuTkFNRVNQQUNFUzsKKyAgICBFbWJlci5sb29rdXBbdGhpcy50
b1N0cmluZygpXSA9IHVuZGVmaW5lZDsKKyAgICBuYW1lc3BhY2VzLnNwbGljZShpbmRleE9mLmNh
bGwobmFtZXNwYWNlcywgdGhpcyksIDEpOworICAgIHRoaXMuX3N1cGVyKCk7CisgIH0KK30pOwor
CitOYW1lc3BhY2UucmVvcGVuQ2xhc3MoeworICBOQU1FU1BBQ0VTOiBbRW1iZXJdLAorICBOQU1F
U1BBQ0VTX0JZX0lEOiB7fSwKKyAgUFJPQ0VTU0VEOiBmYWxzZSwKKyAgcHJvY2Vzc0FsbDogcHJv
Y2Vzc0FsbE5hbWVzcGFjZXMsCisgIGJ5TmFtZTogZnVuY3Rpb24obmFtZSkgeworICAgIGlmICgh
RW1iZXIuQk9PVEVEKSB7CisgICAgICBwcm9jZXNzQWxsTmFtZXNwYWNlcygpOworICAgIH0KKwor
ICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lEW25hbWVdOworICB9Cit9KTsKKwordmFyIE5BTUVT
UEFDRVNfQllfSUQgPSBOYW1lc3BhY2UuTkFNRVNQQUNFU19CWV9JRDsKKwordmFyIGhhc093blBy
b3AgPSAoe30pLmhhc093blByb3BlcnR5LAorICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yOwor
CitmdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNlKHBhdGhzLCByb290LCBzZWVuKSB7CisgIHZhciBp
ZHggPSBwYXRocy5sZW5ndGg7CisKKyAgTkFNRVNQQUNFU19CWV9JRFtwYXRocy5qb2luKCcuJyld
ID0gcm9vdDsKKworICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBuYW1lc3Bh
Y2UsIGxvb2tpbmcgZm9yIGNsYXNzZXMKKyAgZm9yKHZhciBrZXkgaW4gcm9vdCkgeworICAgIGlm
ICghaGFzT3duUHJvcC5jYWxsKHJvb3QsIGtleSkpIHsgY29udGludWU7IH0KKyAgICB2YXIgb2Jq
ID0gcm9vdFtrZXldOworCisgICAgLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIGBFbWJlcmAg
bmFtZXNwYWNlLCBmb3IgZXhhbXBsZSwgdGhlCisgICAgLy8gYHBhdGhzYCB3aWxsIHN0YXJ0IHdp
dGggYFsiRW1iZXIiXWAuIEV2ZXJ5IGl0ZXJhdGlvbiB0aHJvdWdoCisgICAgLy8gdGhlIGxvb3Ag
d2lsbCB1cGRhdGUgdGhlICoqc2Vjb25kKiogZWxlbWVudCBvZiB0aGlzIGxpc3Qgd2l0aAorICAg
IC8vIHRoZSBrZXksIHNvIHByb2Nlc3NpbmcgYEVtYmVyLlZpZXdgIHdpbGwgbWFrZSB0aGUgQXJy
YXkKKyAgICAvLyBgWydFbWJlcicsICdWaWV3J11gLgorICAgIHBhdGhzW2lkeF0gPSBrZXk7CisK
KyAgICAvLyBJZiB3ZSBoYXZlIGZvdW5kIGFuIHVucHJvY2Vzc2VkIGNsYXNzCisgICAgaWYgKG9i
aiAmJiBvYmoudG9TdHJpbmcgPT09IGNsYXNzVG9TdHJpbmcpIHsKKyAgICAgIC8vIFJlcGxhY2Ug
dGhlIGNsYXNzJyBgdG9TdHJpbmdgIHdpdGggdGhlIGRvdC1zZXBhcmF0ZWQgcGF0aAorICAgICAg
Ly8gYW5kIHNldCBpdHMgYE5BTUVfS0VZYAorICAgICAgb2JqLnRvU3RyaW5nID0gbWFrZVRvU3Ry
aW5nKHBhdGhzLmpvaW4oJy4nKSk7CisgICAgICBvYmpbTkFNRV9LRVldID0gcGF0aHMuam9pbign
LicpOworCisgICAgLy8gU3VwcG9ydCBuZXN0ZWQgbmFtZXNwYWNlcworICAgIH0gZWxzZSBpZiAo
b2JqICYmIG9iai5pc05hbWVzcGFjZSkgeworICAgICAgLy8gU2tpcCBhbGlhc2VkIG5hbWVzcGFj
ZXMKKyAgICAgIGlmIChzZWVuW2d1aWRGb3Iob2JqKV0pIHsgY29udGludWU7IH0KKyAgICAgIHNl
ZW5bZ3VpZEZvcihvYmopXSA9IHRydWU7CisKKyAgICAgIC8vIFByb2Nlc3MgdGhlIGNoaWxkIG5h
bWVzcGFjZQorICAgICAgcHJvY2Vzc05hbWVzcGFjZShwYXRocywgb2JqLCBzZWVuKTsKKyAgICB9
CisgIH0KKworICBwYXRocy5sZW5ndGggPSBpZHg7IC8vIGN1dCBvdXQgbGFzdCBpdGVtCit9CisK
K2Z1bmN0aW9uIGZpbmROYW1lc3BhY2VzKCkgeworICB2YXIgTmFtZXNwYWNlID0gRW1iZXIuTmFt
ZXNwYWNlLCBsb29rdXAgPSBFbWJlci5sb29rdXAsIG9iaiwgaXNOYW1lc3BhY2U7CisKKyAgaWYg
KE5hbWVzcGFjZS5QUk9DRVNTRUQpIHsgcmV0dXJuOyB9CisKKyAgZm9yICh2YXIgcHJvcCBpbiBs
b29rdXApIHsKKyAgICAvLyBUaGVzZSBkb24ndCByYWlzZSBleGNlcHRpb25zIGJ1dCBjYW4gY2F1
c2Ugd2FybmluZ3MKKyAgICBpZiAocHJvcCA9PT0gInBhcmVudCIgfHwgcHJvcCA9PT0gInRvcCIg
fHwgcHJvcCA9PT0gImZyYW1lRWxlbWVudCIpIHsgY29udGludWU7IH0KKworICAgIC8vICBnZXQo
d2luZG93Lmdsb2JhbFN0b3JhZ2UsICdpc05hbWVzcGFjZScpIHdvdWxkIHRyeSB0byByZWFkIHRo
ZSBzdG9yYWdlIGZvciBkb21haW4gaXNOYW1lc3BhY2UgYW5kIGNhdXNlIGV4Y2VwdGlvbiBpbiBG
aXJlZm94LgorICAgIC8vIGdsb2JhbFN0b3JhZ2UgaXMgYSBzdG9yYWdlIG9ic29sZXRlZCBieSB0
aGUgV2hhdFdHIHN0b3JhZ2Ugc3BlY2lmaWNhdGlvbi4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1v
emlsbGEub3JnL2VuL0RPTS9TdG9yYWdlI2dsb2JhbFN0b3JhZ2UKKyAgICBpZiAocHJvcCA9PT0g
Imdsb2JhbFN0b3JhZ2UiICYmIGxvb2t1cC5TdG9yYWdlTGlzdCAmJiBsb29rdXAuZ2xvYmFsU3Rv
cmFnZSBpbnN0YW5jZW9mIGxvb2t1cC5TdG9yYWdlTGlzdCkgeyBjb250aW51ZTsgfQorICAgIC8v
IFVuZm9ydHVuYXRlbHksIHNvbWUgdmVyc2lvbnMgb2YgSUUgZG9uJ3Qgc3VwcG9ydCB3aW5kb3cu
aGFzT3duUHJvcGVydHkKKyAgICBpZiAobG9va3VwLmhhc093blByb3BlcnR5ICYmICFsb29rdXAu
aGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KKworICAgIC8vIEF0IHRpbWVzIHdl
IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgY2VydGFpbiBwcm9wZXJ0aWVzIGZvciBzZWN1cml0
eSByZWFzb25zLgorICAgIC8vIFRoZXJlIGFyZSBhbHNvIHRpbWVzIHdoZXJlIGV2ZW4gaWYgd2Ug
Y2FuIGFjY2VzcyB0aGVtLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZWlyIHByb3Bl
cnRpZXMuCisgICAgdHJ5IHsKKyAgICAgIG9iaiA9IEVtYmVyLmxvb2t1cFtwcm9wXTsKKyAgICAg
IGlzTmFtZXNwYWNlID0gb2JqICYmIG9iai5pc05hbWVzcGFjZTsKKyAgICB9IGNhdGNoIChlKSB7
CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoaXNOYW1lc3BhY2UpIHsKKyAgICAg
IEVtYmVyLmRlcHJlY2F0ZSgiTmFtZXNwYWNlcyBzaG91bGQgbm90IGJlZ2luIHdpdGggbG93ZXJj
YXNlLiIsIC9eW0EtWl0vLnRlc3QocHJvcCkpOworICAgICAgb2JqW05BTUVfS0VZXSA9IHByb3A7
CisgICAgfQorICB9Cit9CisKK3ZhciBOQU1FX0tFWSA9IEVtYmVyLk5BTUVfS0VZID0gRW1iZXIu
R1VJRF9LRVkgKyAnX25hbWUnOworCitmdW5jdGlvbiBzdXBlckNsYXNzU3RyaW5nKG1peGluKSB7
CisgIHZhciBzdXBlcmNsYXNzID0gbWl4aW4uc3VwZXJjbGFzczsKKyAgaWYgKHN1cGVyY2xhc3Mp
IHsKKyAgICBpZiAoc3VwZXJjbGFzc1tOQU1FX0tFWV0pIHsgcmV0dXJuIHN1cGVyY2xhc3NbTkFN
RV9LRVldOyB9CisgICAgZWxzZSB7IHJldHVybiBzdXBlckNsYXNzU3RyaW5nKHN1cGVyY2xhc3Mp
OyB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9Cit9CisKK2Z1bmN0aW9uIGNsYXNzVG9T
dHJpbmcoKSB7CisgIGlmICghRW1iZXIuQk9PVEVEICYmICF0aGlzW05BTUVfS0VZXSkgeworICAg
IHByb2Nlc3NBbGxOYW1lc3BhY2VzKCk7CisgIH0KKworICB2YXIgcmV0OworCisgIGlmICh0aGlz
W05BTUVfS0VZXSkgeworICAgIHJldCA9IHRoaXNbTkFNRV9LRVldOworICB9IGVsc2UgeworICAg
IHZhciBzdHIgPSBzdXBlckNsYXNzU3RyaW5nKHRoaXMpOworICAgIGlmIChzdHIpIHsKKyAgICAg
IHJldCA9ICIoc3ViY2xhc3Mgb2YgIiArIHN0ciArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAg
cmV0ID0gIih1bmtub3duIG1peGluKSI7CisgICAgfQorICAgIHRoaXMudG9TdHJpbmcgPSBtYWtl
VG9TdHJpbmcocmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2Z1bmN0aW9uIHByb2Nl
c3NBbGxOYW1lc3BhY2VzKCkgeworICB2YXIgdW5wcm9jZXNzZWROYW1lc3BhY2VzID0gIU5hbWVz
cGFjZS5QUk9DRVNTRUQsCisgICAgICB1bnByb2Nlc3NlZE1peGlucyA9IEVtYmVyLmFueVVucHJv
Y2Vzc2VkTWl4aW5zOworCisgIGlmICh1bnByb2Nlc3NlZE5hbWVzcGFjZXMpIHsKKyAgICBmaW5k
TmFtZXNwYWNlcygpOworICAgIE5hbWVzcGFjZS5QUk9DRVNTRUQgPSB0cnVlOworICB9CisKKyAg
aWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcyB8fCB1bnByb2Nlc3NlZE1peGlucykgeworICAgIHZh
ciBuYW1lc3BhY2VzID0gTmFtZXNwYWNlLk5BTUVTUEFDRVMsIG5hbWVzcGFjZTsKKyAgICBmb3Ig
KHZhciBpPTAsIGw9bmFtZXNwYWNlcy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICBuYW1lc3Bh
Y2UgPSBuYW1lc3BhY2VzW2ldOworICAgICAgcHJvY2Vzc05hbWVzcGFjZShbbmFtZXNwYWNlLnRv
U3RyaW5nKCldLCBuYW1lc3BhY2UsIHt9KTsKKyAgICB9CisKKyAgICBFbWJlci5hbnlVbnByb2Nl
c3NlZE1peGlucyA9IGZhbHNlOworICB9Cit9CisKK2Z1bmN0aW9uIG1ha2VUb1N0cmluZyhyZXQp
IHsKKyAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmV0OyB9OworfQorCitFbWJlci5NaXhp
bi5wcm90b3R5cGUudG9TdHJpbmcgPSBjbGFzc1RvU3RyaW5nOworCit9KSgpOworCisKKworKGZ1
bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUK
KyovCisKKy8qKgorICBEZWZpbmVzIGEgbmFtZXNwYWNlIHRoYXQgd2lsbCBjb250YWluIGFuIGV4
ZWN1dGFibGUgYXBwbGljYXRpb24uIFRoaXMgaXMKKyAgdmVyeSBzaW1pbGFyIHRvIGEgbm9ybWFs
IG5hbWVzcGFjZSBleGNlcHQgdGhhdCBpdCBpcyBleHBlY3RlZCB0byBpbmNsdWRlIGF0CisgIGxl
YXN0IGEgJ3JlYWR5JyBmdW5jdGlvbiB3aGljaCBjYW4gYmUgcnVuIHRvIGluaXRpYWxpemUgdGhl
IGFwcGxpY2F0aW9uLgorCisgIEN1cnJlbnRseSBgRW1iZXIuQXBwbGljYXRpb25gIGlzIHZlcnkg
c2ltaWxhciB0byBgRW1iZXIuTmFtZXNwYWNlLmAgIEhvd2V2ZXIsCisgIHRoaXMgY2xhc3MgbWF5
IGJlIGF1Z21lbnRlZCBieSBhZGRpdGlvbmFsIGZyYW1ld29ya3Mgc28gaXQgaXMgaW1wb3J0YW50
IHRvCisgIHVzZSB0aGlzIGluc3RhbmNlIHdoZW4gYnVpbGRpbmcgbmV3IGFwcGxpY2F0aW9ucy4K
KworICAjIEV4YW1wbGUgVXNhZ2UKKworICBgYGBqYXZhc2NyaXB0CisgIE15QXBwID0gRW1iZXIu
QXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICBWRVJTSU9OOiAnMS4wLjAnLAorICAgIHN0b3JlOiBF
bWJlci5TdG9yZS5jcmVhdGUoKS5mcm9tKEVtYmVyLmZpeHR1cmVzKQorICB9KTsKKworICBNeUFw
cC5yZWFkeSA9IGZ1bmN0aW9uKCkgeworICAgIC8vLi5pbml0IGNvZGUgZ29lcyBoZXJlLi4uCisg
IH0KKyAgYGBgCisKKyAgQGNsYXNzIEFwcGxpY2F0aW9uCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
QGV4dGVuZHMgRW1iZXIuTmFtZXNwYWNlCisqLworRW1iZXIuQXBwbGljYXRpb24gPSBFbWJlci5O
YW1lc3BhY2UuZXh0ZW5kKCk7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgor
QG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCisKK3ZhciBnZXQg
PSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKworLyoqCisgIEFuIEFycmF5UHJveHkgd3Jh
cHMgYW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5YCBhbmQvb3IK
KyAgYEVtYmVyLk11dGFibGVBcnJheSxgIGZvcndhcmRpbmcgYWxsIHJlcXVlc3RzLiBUaGlzIG1h
a2VzIGl0IHZlcnkgdXNlZnVsIGZvcgorICBhIG51bWJlciBvZiBiaW5kaW5nIHVzZSBjYXNlcyBv
ciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKKyAgb3V0IHRoZSB1bmRlcmx5
aW5nIGFycmF5IGlzIHVzZWZ1bC4KKworICBBIHNpbXBsZSBleGFtcGxlIG9mIHVzYWdlOgorCisg
IGBgYGphdmFzY3JpcHQKKyAgdmFyIHBldHMgPSBbJ2RvZycsICdjYXQnLCAnZmlzaCddOworICB2
YXIgYXAgPSBFbWJlci5BcnJheVByb3h5LmNyZWF0ZSh7IGNvbnRlbnQ6IEVtYmVyLkEocGV0cykg
fSk7CisKKyAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAgICAgICAgICAgICAgICAgICAgICAgIC8v
ICdkb2cnCisgIGFwLnNldCgnY29udGVudCcsIFsnYW1vZWJhJywgJ3BhcmFtZWNpdW0nXSk7Cisg
IGFwLmdldCgnZmlyc3RPYmplY3QnKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAnYW1vZWJh
JworICBgYGAKKworICBUaGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWZ1bCBhcyBhIGxheWVyIHRv
IHRyYW5zZm9ybSB0aGUgY29udGVudHMgb2YKKyAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFjY2Vz
c2VkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IG92ZXJyaWRpbmcKKyAgYG9iamVjdEF0Q29udGVudGA6
CisKKyAgYGBgamF2YXNjcmlwdAorICB2YXIgcGV0cyA9IFsnZG9nJywgJ2NhdCcsICdmaXNoJ107
CisgIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsKKyAgICAgIGNvbnRlbnQ6IEVt
YmVyLkEocGV0cyksCisgICAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgeworICAg
ICAgICAgIHJldHVybiB0aGlzLmdldCgnY29udGVudCcpLm9iamVjdEF0KGlkeCkudG9VcHBlckNh
c2UoKTsKKyAgICAgIH0KKyAgfSk7CisKKyAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyAuICdE
T0cnCisgIGBgYAorCisgIEBjbGFzcyBBcnJheVByb3h5CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
QGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgIEB1c2VzIEVtYmVyLk11dGFibGVBcnJheQorKi8KK0Vt
YmVyLkFycmF5UHJveHkgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJheSwK
Ky8qKiBAc2NvcGUgRW1iZXIuQXJyYXlQcm94eS5wcm90b3R5cGUgKi8geworCisgIC8qKgorICAg
IFRoZSBjb250ZW50IGFycmF5LiBNdXN0IGJlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYEVt
YmVyLkFycmF5YCBhbmQvb3IKKyAgICBgRW1iZXIuTXV0YWJsZUFycmF5LmAKKworICAgIEBwcm9w
ZXJ0eSBjb250ZW50CisgICAgQHR5cGUgRW1iZXIuQXJyYXkKKyAgKi8KKyAgY29udGVudDogbnVs
bCwKKworICAvKioKKyAgIFRoZSBhcnJheSB0aGF0IHRoZSBwcm94eSBwcmV0ZW5kcyB0byBiZS4g
SW4gdGhlIGRlZmF1bHQgYEFycmF5UHJveHlgCisgICBpbXBsZW1lbnRhdGlvbiwgdGhpcyBhbmQg
YGNvbnRlbnRgIGFyZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBvZiBgQXJyYXlQcm94eWAKKyAgIGNh
biBvdmVycmlkZSB0aGlzIHByb3BlcnR5IHRvIHByb3ZpZGUgdGhpbmdzIGxpa2Ugc29ydGluZyBh
bmQgZmlsdGVyaW5nLgorCisgICBAcHJvcGVydHkgYXJyYW5nZWRDb250ZW50CisgICovCisgIGFy
cmFuZ2VkQ29udGVudDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKSwKKworICAvKioK
KyAgICBTaG91bGQgYWN0dWFsbHkgcmV0cmlldmUgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVk
IGluZGV4IGZyb20gdGhlCisgICAgY29udGVudC4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhv
ZCBpbiBzdWJjbGFzc2VzIHRvIHRyYW5zZm9ybSB0aGUKKyAgICBjb250ZW50IGl0ZW0gdG8gc29t
ZXRoaW5nIG5ldy4KKworICAgIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29u
dGVudCBpcyBub24tYG51bGxgLgorCisgICAgQG1ldGhvZCBvYmplY3RBdENvbnRlbnQKKyAgICBA
cGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCB0byByZXRyaWV2ZS4KKyAgICBAcmV0dXJuIHtP
YmplY3R9IHRoZSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm9uZSBmb3VuZAorICAqLworICBvYmpl
Y3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgeworICAgIHJldHVybiBnZXQodGhpcywgJ2FycmFu
Z2VkQ29udGVudCcpLm9iamVjdEF0KGlkeCk7CisgIH0sCisKKyAgLyoqCisgICAgU2hvdWxkIGFj
dHVhbGx5IHJlcGxhY2UgdGhlIHNwZWNpZmllZCBvYmplY3RzIG9uIHRoZSBjb250ZW50IGFycmF5
LgorICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB0cmFu
c2Zvcm0gdGhlIGNvbnRlbnQgaXRlbQorICAgIGludG8gc29tZXRoaW5nIG5ldy4KKworICAgIFRo
aXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51bGxgLgor
CisgICAgQG1ldGhvZCByZXBsYWNlQ29udGVudAorICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhl
IHN0YXJ0aW5nIGluZGV4CisgICAgQHBhcmFtIHtOdW1iZXJ9IGFtdCBUaGUgbnVtYmVyIG9mIGl0
ZW1zIHRvIHJlbW92ZSBmcm9tIHRoZSBjb250ZW50LgorICAgIEBwYXJhbSB7QXJyYXl9IG9iamVj
dHMgT3B0aW9uYWwgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnQgb3IgbnVsbCBpZiBubworICAg
ICAgb2JqZWN0cy4KKyAgICBAcmV0dXJuIHt2b2lkfQorICAqLworICByZXBsYWNlQ29udGVudDog
ZnVuY3Rpb24oaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5y
ZXBsYWNlKGlkeCwgYW10LCBvYmplY3RzKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQor
CisgICAgSW52b2tlZCB3aGVuIHRoZSBjb250ZW50IHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5n
ZS4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCisgICAgZW50aXJlIGFycmF5IGNvbnRlbnQg
d2lsbCBjaGFuZ2UuCisKKyAgICBAbWV0aG9kIF9jb250ZW50V2lsbENoYW5nZQorICAqLworICBf
Y29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0aW9uKCkgeworICAg
IHRoaXMuX3RlYXJkb3duQ29udGVudCgpOworICB9LCAnY29udGVudCcpLAorCisgIF90ZWFyZG93
bkNvbnRlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250
ZW50Jyk7CisKKyAgICBpZiAoY29udGVudCkgeworICAgICAgY29udGVudC5yZW1vdmVBcnJheU9i
c2VydmVyKHRoaXMsIHsKKyAgICAgICAgd2lsbENoYW5nZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFu
Z2UnLAorICAgICAgICBkaWRDaGFuZ2U6ICdjb250ZW50QXJyYXlEaWRDaGFuZ2UnCisgICAgICB9
KTsKKyAgICB9CisgIH0sCisKKyAgY29udGVudEFycmF5V2lsbENoYW5nZTogRW1iZXIuSywKKyAg
Y29udGVudEFycmF5RGlkQ2hhbmdlOiBFbWJlci5LLAorCisgIC8qKgorICAgIEBwcml2YXRlCisK
KyAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMg
b2JzZXJ2ZXJzIHRoYXQgdGhlCisgICAgZW50aXJlIGFycmF5IGNvbnRlbnQgaGFzIGNoYW5nZWQu
CisKKyAgICBAbWV0aG9kIF9jb250ZW50RGlkQ2hhbmdlCisgICovCisgIF9jb250ZW50RGlkQ2hh
bmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICB2YXIgY29udGVudCA9IGdldCh0
aGlzLCAnY29udGVudCcpOworCisgICAgRW1iZXIuYXNzZXJ0KCJDYW4ndCBzZXQgQXJyYXlQcm94
eSdzIGNvbnRlbnQgdG8gaXRzZWxmIiwgY29udGVudCAhPT0gdGhpcyk7CisKKyAgICB0aGlzLl9z
ZXR1cENvbnRlbnQoKTsKKyAgfSwgJ2NvbnRlbnQnKSwKKworICBfc2V0dXBDb250ZW50OiBmdW5j
dGlvbigpIHsKKyAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpOworCisgICAg
aWYgKGNvbnRlbnQpIHsKKyAgICAgIGNvbnRlbnQuYWRkQXJyYXlPYnNlcnZlcih0aGlzLCB7Cisg
ICAgICAgIHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKKyAgICAgICAgZGlk
Q2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAgfSk7CisgICAgfQorICB9LAor
CisgIF9hcnJhbmdlZENvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcihmdW5j
dGlvbigpIHsKKyAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENv
bnRlbnQnKSwKKyAgICAgICAgbGVuID0gYXJyYW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29u
dGVudCwgJ2xlbmd0aCcpIDogMDsKKworICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlXaWxs
Q2hhbmdlKHRoaXMsIDAsIGxlbiwgdW5kZWZpbmVkKTsKKyAgICB0aGlzLmFycmFuZ2VkQ29udGVu
dFdpbGxDaGFuZ2UodGhpcyk7CisKKyAgICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVudChh
cnJhbmdlZENvbnRlbnQpOworICB9LCAnYXJyYW5nZWRDb250ZW50JyksCisKKyAgX2FycmFuZ2Vk
Q29udGVudERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdmFyIGFy
cmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50JyksCisgICAgICAgIGxl
biA9IGFycmFuZ2VkQ29udGVudCA/IGdldChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKSA6IDA7
CisKKyAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBBcnJheVByb3h5J3MgY29udGVudCB0byBp
dHNlbGYiLCBhcnJhbmdlZENvbnRlbnQgIT09IHRoaXMpOworCisgICAgdGhpcy5fc2V0dXBBcnJh
bmdlZENvbnRlbnQoKTsKKworICAgIHRoaXMuYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlKHRoaXMp
OworICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2UodGhpcywgMCwgdW5kZWZp
bmVkLCBsZW4pOworICB9LCAnYXJyYW5nZWRDb250ZW50JyksCisKKyAgX3NldHVwQXJyYW5nZWRD
b250ZW50OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMs
ICdhcnJhbmdlZENvbnRlbnQnKTsKKworICAgIGlmIChhcnJhbmdlZENvbnRlbnQpIHsKKyAgICAg
IGFycmFuZ2VkQ29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKKyAgICAgICAgd2lsbENo
YW5nZTogJ2FycmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZScsCisgICAgICAgIGRpZENoYW5n
ZTogJ2FycmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAgfSk7CisgICAgfQorICB9
LAorCisgIF90ZWFyZG93bkFycmFuZ2VkQ29udGVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGFy
cmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7CisKKyAgICBpZiAo
YXJyYW5nZWRDb250ZW50KSB7CisgICAgICBhcnJhbmdlZENvbnRlbnQucmVtb3ZlQXJyYXlPYnNl
cnZlcih0aGlzLCB7CisgICAgICAgIHdpbGxDaGFuZ2U6ICdhcnJhbmdlZENvbnRlbnRBcnJheVdp
bGxDaGFuZ2UnLAorICAgICAgICBkaWRDaGFuZ2U6ICdhcnJhbmdlZENvbnRlbnRBcnJheURpZENo
YW5nZScKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICBhcnJhbmdlZENvbnRlbnRXaWxsQ2hh
bmdlOiBFbWJlci5LLAorICBhcnJhbmdlZENvbnRlbnREaWRDaGFuZ2U6IEVtYmVyLkssCisKKyAg
b2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgeworICAgIHJldHVybiBnZXQodGhpcywgJ2NvbnRlbnQn
KSAmJiB0aGlzLm9iamVjdEF0Q29udGVudChpZHgpOworICB9LAorCisgIGxlbmd0aDogRW1iZXIu
Y29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlz
LCAnYXJyYW5nZWRDb250ZW50Jyk7CisgICAgcmV0dXJuIGFycmFuZ2VkQ29udGVudCA/IGdldChh
cnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKSA6IDA7CisgICAgLy8gTm8gZGVwZW5kZW5jaWVzIHNp
bmNlIEVudW1lcmFibGUgbm90aWZpZXMgbGVuZ3RoIG9mIGNoYW5nZQorICB9KSwKKworICByZXBs
YWNlOiBmdW5jdGlvbihpZHgsIGFtdCwgb2JqZWN0cykgeworICAgIEVtYmVyLmFzc2VydCgnVGhl
IGNvbnRlbnQgcHJvcGVydHkgb2YgJysgdGhpcy5jb25zdHJ1Y3RvciArICcgc2hvdWxkIGJlIHNl
dCBiZWZvcmUgbW9kaWZ5aW5nIGl0JywgdGhpcy5nZXQoJ2NvbnRlbnQnKSk7CisgICAgaWYgKGdl
dCh0aGlzLCAnY29udGVudCcpKSB0aGlzLnJlcGxhY2VDb250ZW50KGlkeCwgYW10LCBvYmplY3Rz
KTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICBhcnJhbmdlZENvbnRlbnRBcnJheVdpbGxD
aGFuZ2U6IGZ1bmN0aW9uKGl0ZW0sIGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKKyAgICB0
aGlzLmFycmF5Q29udGVudFdpbGxDaGFuZ2UoaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCk7Cisg
IH0sCisKKyAgYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGl0ZW0sIGlk
eCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKKyAgICB0aGlzLmFycmF5Q29udGVudERpZENoYW5n
ZShpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KTsKKyAgfSwKKworICBpbml0OiBmdW5jdGlvbigp
IHsKKyAgICB0aGlzLl9zdXBlcigpOworICAgIHRoaXMuX3NldHVwQ29udGVudCgpOworICAgIHRo
aXMuX3NldHVwQXJyYW5nZWRDb250ZW50KCk7CisgIH0sCisKKyAgd2lsbERlc3Ryb3k6IGZ1bmN0
aW9uKCkgeworICAgIHRoaXMuX3RlYXJkb3duQXJyYW5nZWRDb250ZW50KCk7CisgICAgdGhpcy5f
dGVhcmRvd25Db250ZW50KCk7CisgIH0KK30pOworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24o
KSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KKwor
dmFyIGdldCA9IEVtYmVyLmdldCwKKyAgICBzZXQgPSBFbWJlci5zZXQsCisgICAgZm10ID0gRW1i
ZXIuU3RyaW5nLmZtdCwKKyAgICBhZGRCZWZvcmVPYnNlcnZlciA9IEVtYmVyLmFkZEJlZm9yZU9i
c2VydmVyLAorICAgIGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsCisgICAgcmVtb3Zl
QmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlciwKKyAgICByZW1vdmVP
YnNlcnZlciA9IEVtYmVyLnJlbW92ZU9ic2VydmVyLAorICAgIHByb3BlcnR5V2lsbENoYW5nZSA9
IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSwKKyAgICBwcm9wZXJ0eURpZENoYW5nZSA9IEVtYmVy
LnByb3BlcnR5RGlkQ2hhbmdlOworCitmdW5jdGlvbiBjb250ZW50UHJvcGVydHlXaWxsQ2hhbmdl
KGNvbnRlbnQsIGNvbnRlbnRLZXkpIHsKKyAgdmFyIGtleSA9IGNvbnRlbnRLZXkuc2xpY2UoOCk7
IC8vIHJlbW92ZSAiY29udGVudC4iCisgIGlmIChrZXkgaW4gdGhpcykgeyByZXR1cm47IH0gIC8v
IGlmIHNoYWRvd2VkIGluIHByb3h5CisgIHByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXkpOwor
fQorCitmdW5jdGlvbiBjb250ZW50UHJvcGVydHlEaWRDaGFuZ2UoY29udGVudCwgY29udGVudEtl
eSkgeworICB2YXIga2V5ID0gY29udGVudEtleS5zbGljZSg4KTsgLy8gcmVtb3ZlICJjb250ZW50
LiIKKyAgaWYgKGtleSBpbiB0aGlzKSB7IHJldHVybjsgfSAvLyBpZiBzaGFkb3dlZCBpbiBwcm94
eQorICBwcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXkpOworfQorCisvKioKKyAgYEVtYmVyLk9i
amVjdFByb3h5YCBmb3J3YXJkcyBhbGwgcHJvcGVydGllcyBub3QgZGVmaW5lZCBieSB0aGUgcHJv
eHkgaXRzZWxmCisgIHRvIGEgcHJveGllZCBgY29udGVudGAgb2JqZWN0LgorCisgIGBgYGphdmFz
Y3JpcHQKKyAgb2JqZWN0ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgbmFtZTogJ0ZvbycK
KyAgfSk7CisKKyAgcHJveHkgPSBFbWJlci5PYmplY3RQcm94eS5jcmVhdGUoeworICAgIGNvbnRl
bnQ6IG9iamVjdAorICB9KTsKKworICAvLyBBY2Nlc3MgYW5kIGNoYW5nZSBleGlzdGluZyBwcm9w
ZXJ0aWVzCisgIHByb3h5LmdldCgnbmFtZScpICAgICAgICAgIC8vICdGb28nCisgIHByb3h5LnNl
dCgnbmFtZScsICdCYXInKTsKKyAgb2JqZWN0LmdldCgnbmFtZScpICAgICAgICAgLy8gJ0JhcicK
KworICAvLyBDcmVhdGUgbmV3ICdkZXNjcmlwdGlvbicgcHJvcGVydHkgb24gYG9iamVjdGAKKyAg
cHJveHkuc2V0KCdkZXNjcmlwdGlvbicsICdGb28gaXMgYSB3aGl6Ym9vIGJheicpOworICBvYmpl
Y3QuZ2V0KCdkZXNjcmlwdGlvbicpICAvLyAnRm9vIGlzIGEgd2hpemJvbyBiYXonCisgIGBgYAor
CisgIFdoaWxlIGBjb250ZW50YCBpcyB1bnNldCwgc2V0dGluZyBhIHByb3BlcnR5IHRvIGJlIGRl
bGVnYXRlZCB3aWxsIHRocm93IGFuCisgIEVycm9yLgorCisgIGBgYGphdmFzY3JpcHQKKyAgcHJv
eHkgPSBFbWJlci5PYmplY3RQcm94eS5jcmVhdGUoeworICAgIGNvbnRlbnQ6IG51bGwsCisgICAg
ZmxhZzogbnVsbAorICB9KTsKKyAgcHJveHkuc2V0KCdmbGFnJywgdHJ1ZSk7CisgIHByb3h5Lmdl
dCgnZmxhZycpOyAgICAgICAgIC8vIHRydWUKKyAgcHJveHkuZ2V0KCdmb28nKTsgICAgICAgICAg
Ly8gdW5kZWZpbmVkCisgIHByb3h5LnNldCgnZm9vJywgJ2RhdGEnKTsgIC8vIHRocm93cyBFcnJv
cgorICBgYGAKKworICBEZWxlZ2F0ZWQgcHJvcGVydGllcyBjYW4gYmUgYm91bmQgdG8gYW5kIHdp
bGwgY2hhbmdlIHdoZW4gY29udGVudCBpcyB1cGRhdGVkLgorCisgIENvbXB1dGVkIHByb3BlcnRp
ZXMgb24gdGhlIHByb3h5IGl0c2VsZiBjYW4gZGVwZW5kIG9uIGRlbGVnYXRlZCBwcm9wZXJ0aWVz
LgorCisgIGBgYGphdmFzY3JpcHQKKyAgUHJveHlXaXRoQ29tcHV0ZWRQcm9wZXJ0eSA9IEVtYmVy
Lk9iamVjdFByb3h5LmV4dGVuZCh7CisgICAgZnVsbE5hbWU6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHZhciBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyksCisgICAgICAgICAgbGFzdE5h
bWUgPSB0aGlzLmdldCgnbGFzdE5hbWUnKTsKKyAgICAgIGlmIChmaXJzdE5hbWUgJiYgbGFzdE5h
bWUpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOworICAgICAg
fQorICAgICAgcmV0dXJuIGZpcnN0TmFtZSB8fCBsYXN0TmFtZTsKKyAgICB9LnByb3BlcnR5KCdm
aXJzdE5hbWUnLCAnbGFzdE5hbWUnKQorICB9KTsKKworICBwcm94eSA9IFByb3h5V2l0aENvbXB1
dGVkUHJvcGVydHkuY3JlYXRlKCk7CisKKyAgcHJveHkuZ2V0KCdmdWxsTmFtZScpOyAgLy8gdW5k
ZWZpbmVkCisgIHByb3h5LnNldCgnY29udGVudCcsIHsKKyAgICBmaXJzdE5hbWU6ICdUb20nLCBs
YXN0TmFtZTogJ0RhbGUnCisgIH0pOyAvLyB0cmlnZ2VycyBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGZ1
bGxOYW1lIG9uIHByb3h5CisKKyAgcHJveHkuZ2V0KCdmdWxsTmFtZScpOyAgLy8gJ1RvbSBEYWxl
JworICBgYGAKKworICBAY2xhc3MgT2JqZWN0UHJveHkKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBA
ZXh0ZW5kcyBFbWJlci5PYmplY3QKKyovCitFbWJlci5PYmplY3RQcm94eSA9IEVtYmVyLk9iamVj
dC5leHRlbmQoCisvKiogQHNjb3BlIEVtYmVyLk9iamVjdFByb3h5LnByb3RvdHlwZSAqLyB7Cisg
IC8qKgorICAgIFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZC4K
KworICAgIEBwcm9wZXJ0eSBjb250ZW50CisgICAgQHR5cGUgRW1iZXIuT2JqZWN0CisgICAgQGRl
ZmF1bHQgbnVsbAorICAqLworICBjb250ZW50OiBudWxsLAorICBfY29udGVudERpZENoYW5nZTog
RW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgRW1iZXIuYXNzZXJ0KCJDYW4ndCBzZXQg
T2JqZWN0UHJveHkncyBjb250ZW50IHRvIGl0c2VsZiIsIHRoaXMuZ2V0KCdjb250ZW50JykgIT09
IHRoaXMpOworICB9LCAnY29udGVudCcpLAorCisgIGlzVHJ1dGh5OiBFbWJlci5jb21wdXRlZC5i
b29sKCdjb250ZW50JyksCisKKyAgX2RlYnVnQ29udGFpbmVyS2V5OiBudWxsLAorCisgIHdpbGxX
YXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkgPSAnY29u
dGVudC4nICsga2V5OworICAgIGFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51
bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOworICAgIGFkZE9ic2VydmVyKHRoaXMsIGNv
bnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7CisgIH0sCisKKyAgZGlk
VW53YXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkgPSAn
Y29udGVudC4nICsga2V5OworICAgIHJlbW92ZUJlZm9yZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRL
ZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOworICAgIHJlbW92ZU9ic2VydmVy
KHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7CisgIH0s
CisKKyAgdW5rbm93blByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnQg
PSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKKyAgICBpZiAoY29udGVudCkgeworICAgICAgcmV0dXJu
IGdldChjb250ZW50LCBrZXkpOworICAgIH0KKyAgfSwKKworICBzZXRVbmtub3duUHJvcGVydHk6
IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2Nv
bnRlbnQnKTsKKyAgICBFbWJlci5hc3NlcnQoZm10KCJDYW5ub3QgZGVsZWdhdGUgc2V0KCclQCcs
ICVAKSB0byB0aGUgJ2NvbnRlbnQnIHByb3BlcnR5IG9mIG9iamVjdCBwcm94eSAlQDogaXRzICdj
b250ZW50JyBpcyB1bmRlZmluZWQuIiwgW2tleSwgdmFsdWUsIHRoaXNdKSwgY29udGVudCk7Cisg
ICAgcmV0dXJuIHNldChjb250ZW50LCBrZXksIHZhbHVlKTsKKyAgfQorfSk7CisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXIt
cnVudGltZQorKi8KKworCit2YXIgc2V0ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQsIGd1
aWRGb3IgPSBFbWJlci5ndWlkRm9yOwordmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRp
bHMuZm9yRWFjaDsKKwordmFyIEVhY2hBcnJheSA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIu
QXJyYXksIHsKKworICBpbml0OiBmdW5jdGlvbihjb250ZW50LCBrZXlOYW1lLCBvd25lcikgewor
ICAgIHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5fa2V5TmFtZSA9IGtleU5hbWU7CisgICAgdGhp
cy5fb3duZXIgICA9IG93bmVyOworICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50OworICB9LAor
CisgIG9iamVjdEF0OiBmdW5jdGlvbihpZHgpIHsKKyAgICB2YXIgaXRlbSA9IHRoaXMuX2NvbnRl
bnQub2JqZWN0QXQoaWR4KTsKKyAgICByZXR1cm4gaXRlbSAmJiBnZXQoaXRlbSwgdGhpcy5fa2V5
TmFtZSk7CisgIH0sCisKKyAgbGVuZ3RoOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAg
ICB2YXIgY29udGVudCA9IHRoaXMuX2NvbnRlbnQ7CisgICAgcmV0dXJuIGNvbnRlbnQgPyBnZXQo
Y29udGVudCwgJ2xlbmd0aCcpIDogMDsKKyAgfSkKKworfSk7CisKK3ZhciBJU19PQlNFUlZFUiA9
IC9eLis6KGJlZm9yZXxjaGFuZ2UpJC87CisKK2Z1bmN0aW9uIGFkZE9ic2VydmVyRm9yQ29udGVu
dEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKKyAgdmFyIG9iamVjdHMg
PSBwcm94eS5fb2JqZWN0cywgZ3VpZDsKKyAgaWYgKCFvYmplY3RzKSBvYmplY3RzID0gcHJveHku
X29iamVjdHMgPSB7fTsKKworICB3aGlsZSgtLWxvYz49aWR4KSB7CisgICAgdmFyIGl0ZW0gPSBj
b250ZW50Lm9iamVjdEF0KGxvYyk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgIEVtYmVyLmFkZEJl
Zm9yZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleVdpbGxDaGFuZ2Un
KTsKKyAgICAgIEVtYmVyLmFkZE9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVu
dEtleURpZENoYW5nZScpOworCisgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbmRpY2llcyBl
YWNoIGl0ZW0gd2FzIGZvdW5kIGF0IHNvIHdlIGNhbiBtYXAKKyAgICAgIC8vIGl0IGJhY2sgd2hl
biB0aGUgb2JqIGNoYW5nZXMuCisgICAgICBndWlkID0gZ3VpZEZvcihpdGVtKTsKKyAgICAgIGlm
ICghb2JqZWN0c1tndWlkXSkgb2JqZWN0c1tndWlkXSA9IFtdOworICAgICAgb2JqZWN0c1tndWlk
XS5wdXNoKGxvYyk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9y
Q29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKKyAgdmFyIG9i
amVjdHMgPSBwcm94eS5fb2JqZWN0czsKKyAgaWYgKCFvYmplY3RzKSBvYmplY3RzID0gcHJveHku
X29iamVjdHMgPSB7fTsKKyAgdmFyIGluZGljaWVzLCBndWlkOworCisgIHdoaWxlKC0tbG9jPj1p
ZHgpIHsKKyAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2JqZWN0QXQobG9jKTsKKyAgICBpZiAoaXRl
bSkgeworICAgICAgRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJv
eHksICdjb250ZW50S2V5V2lsbENoYW5nZScpOworICAgICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIo
aXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5RGlkQ2hhbmdlJyk7CisKKyAgICAgIGd1
aWQgPSBndWlkRm9yKGl0ZW0pOworICAgICAgaW5kaWNpZXMgPSBvYmplY3RzW2d1aWRdOworICAg
ICAgaW5kaWNpZXNbaW5kaWNpZXMuaW5kZXhPZihsb2MpXSA9IG51bGw7CisgICAgfQorICB9Cit9
CisKKy8qKgorICBUaGlzIGlzIHRoZSBvYmplY3QgaW5zdGFuY2UgcmV0dXJuZWQgd2hlbiB5b3Ug
Z2V0IHRoZSBgQGVhY2hgIHByb3BlcnR5IG9uIGFuCisgIGFycmF5LiBJdCB1c2VzIHRoZSB1bmtu
b3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZQorICBFYWNoQXJyYXkg
aW5zdGFuY2VzIGZvciBwcm9wZXJ0eSBuYW1lcy4KKworICBAcHJpdmF0ZQorICBAY2xhc3MgRWFj
aFByb3h5CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisqLwor
RW1iZXIuRWFjaFByb3h5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisKKyAgaW5pdDogZnVuY3Rp
b24oY29udGVudCkgeworICAgIHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5fY29udGVudCA9IGNv
bnRlbnQ7CisgICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMpOworCisgICAgLy8gaW4g
Y2FzZSBzb21lb25lIGlzIGFscmVhZHkgb2JzZXJ2aW5nIHNvbWUga2V5cyBtYWtlIHN1cmUgdGhl
eSBhcmUKKyAgICAvLyBhZGRlZAorICAgIGZvckVhY2goRW1iZXIud2F0Y2hlZEV2ZW50cyh0aGlz
KSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7CisgICAgICB0aGlzLmRpZEFkZExpc3RlbmVyKGV2ZW50
TmFtZSk7CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAgWW91IGNhbiBkaXJlY3Rs
eSBhY2Nlc3MgbWFwcGVkIHByb3BlcnRpZXMgYnkgc2ltcGx5IHJlcXVlc3RpbmcgdGhlbS4KKyAg
ICBUaGUgYHVua25vd25Qcm9wZXJ0eWAgaGFuZGxlciB3aWxsIGdlbmVyYXRlIGFuIEVhY2hBcnJh
eSBvZiBlYWNoIGl0ZW0uCisKKyAgICBAbWV0aG9kIHVua25vd25Qcm9wZXJ0eQorICAgIEBwYXJh
bSBrZXlOYW1lIHtTdHJpbmd9CisgICAgQHBhcmFtIHZhbHVlIHthbnl0aGluZ30KKyAgKi8KKyAg
dW5rbm93blByb3BlcnR5OiBmdW5jdGlvbihrZXlOYW1lLCB2YWx1ZSkgeworICAgIHZhciByZXQ7
CisgICAgcmV0ID0gbmV3IEVhY2hBcnJheSh0aGlzLl9jb250ZW50LCBrZXlOYW1lLCB0aGlzKTsK
KyAgICBFbWJlci5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXlOYW1lLCBudWxsLCByZXQpOworICAg
IHRoaXMuYmVnaW5PYnNlcnZpbmdDb250ZW50S2V5KGtleU5hbWUpOworICAgIHJldHVybiByZXQ7
CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgorICAvLyBBUlJBWSBDSEFOR0VTCisgIC8vIEludm9rZXMgd2hlbmV2
ZXIgdGhlIGNvbnRlbnQgYXJyYXkgaXRzZWxmIGNoYW5nZXMuCisKKyAgYXJyYXlXaWxsQ2hhbmdl
OiBmdW5jdGlvbihjb250ZW50LCBpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7CisgICAgdmFy
IGtleXMgPSB0aGlzLl9rZXlzLCBrZXksIGFycmF5LCBsaW07CisKKyAgICBsaW0gPSByZW1vdmVk
Q250PjAgPyBpZHgrcmVtb3ZlZENudCA6IC0xOworICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFu
Z2VzKHRoaXMpOworCisgICAgZm9yKGtleSBpbiBrZXlzKSB7CisgICAgICBpZiAoIWtleXMuaGFz
T3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQorCisgICAgICBpZiAobGltPjApIHJlbW92
ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsKKwor
ICAgICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7CisgICAgfQorCisgICAg
RW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMuX2NvbnRlbnQsICdAZWFjaCcpOworICAgIEVt
YmVyLmVuZFByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKKyAgfSwKKworICBhcnJheURpZENoYW5nZTog
ZnVuY3Rpb24oY29udGVudCwgaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCkgeworICAgIHZhciBr
ZXlzID0gdGhpcy5fa2V5cywga2V5LCBhcnJheSwgbGltOworCisgICAgbGltID0gYWRkZWRDbnQ+
MCA/IGlkeCthZGRlZENudCA6IC0xOworICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRo
aXMpOworCisgICAgZm9yKGtleSBpbiBrZXlzKSB7CisgICAgICBpZiAoIWtleXMuaGFzT3duUHJv
cGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQorCisgICAgICBpZiAobGltPjApIGFkZE9ic2VydmVy
Rm9yQ29udGVudEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsKKworICAgICAgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywga2V5KTsKKyAgICB9CisKKyAgICBFbWJlci5wcm9w
ZXJ0eURpZENoYW5nZSh0aGlzLl9jb250ZW50LCAnQGVhY2gnKTsKKyAgICBFbWJlci5lbmRQcm9w
ZXJ0eUNoYW5nZXModGhpcyk7CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBMSVNURU4gRk9SIE5FVyBP
QlNFUlZFUlMgQU5EIE9USEVSIEVWRU5UIExJU1RFTkVSUworICAvLyBTdGFydCBtb25pdG9yaW5n
IGtleXMgYmFzZWQgb24gd2hvIGlzIGxpc3RlbmluZy4uLgorCisgIGRpZEFkZExpc3RlbmVyOiBm
dW5jdGlvbihldmVudE5hbWUpIHsKKyAgICBpZiAoSVNfT0JTRVJWRVIudGVzdChldmVudE5hbWUp
KSB7CisgICAgICB0aGlzLmJlZ2luT2JzZXJ2aW5nQ29udGVudEtleShldmVudE5hbWUuc2xpY2Uo
MCwgLTcpKTsKKyAgICB9CisgIH0sCisKKyAgZGlkUmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uKGV2
ZW50TmFtZSkgeworICAgIGlmIChJU19PQlNFUlZFUi50ZXN0KGV2ZW50TmFtZSkpIHsKKyAgICAg
IHRoaXMuc3RvcE9ic2VydmluZ0NvbnRlbnRLZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03KSk7Cisg
ICAgfQorICB9LAorCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gQ09OVEVOVCBLRVkgT0JTRVJWSU5HCisgIC8vIEFj
dHVhbCB3YXRjaCBrZXlzIG9uIHRoZSBzb3VyY2UgY29udGVudC4KKworICBiZWdpbk9ic2Vydmlu
Z0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAgICB2YXIga2V5cyA9IHRoaXMuX2tl
eXM7CisgICAgaWYgKCFrZXlzKSBrZXlzID0gdGhpcy5fa2V5cyA9IHt9OworICAgIGlmICgha2V5
c1trZXlOYW1lXSkgeworICAgICAga2V5c1trZXlOYW1lXSA9IDE7CisgICAgICB2YXIgY29udGVu
dCA9IHRoaXMuX2NvbnRlbnQsCisgICAgICAgICAgbGVuID0gZ2V0KGNvbnRlbnQsICdsZW5ndGgn
KTsKKyAgICAgIGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCB0aGlz
LCAwLCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICBrZXlzW2tleU5hbWVdKys7CisgICAgfQor
ICB9LAorCisgIHN0b3BPYnNlcnZpbmdDb250ZW50S2V5OiBmdW5jdGlvbihrZXlOYW1lKSB7Cisg
ICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgIGlmIChrZXlzICYmIChrZXlzW2tleU5hbWVd
PjApICYmICgtLWtleXNba2V5TmFtZV08PTApKSB7CisgICAgICB2YXIgY29udGVudCA9IHRoaXMu
X2NvbnRlbnQsCisgICAgICAgICAgbGVuICAgICA9IGdldChjb250ZW50LCAnbGVuZ3RoJyk7Cisg
ICAgICByZW1vdmVPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwgdGhpcywg
MCwgbGVuKTsKKyAgICB9CisgIH0sCisKKyAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1bmN0aW9u
KG9iaiwga2V5TmFtZSkgeworICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXlO
YW1lKTsKKyAgfSwKKworICBjb250ZW50S2V5RGlkQ2hhbmdlOiBmdW5jdGlvbihvYmosIGtleU5h
bWUpIHsKKyAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKKyAgfQor
Cit9KTsKKworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1i
ZXIKK0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KKworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQ7CisKKy8vIEFkZCBFbWJlci5BcnJheSB0byBBcnJheS5wcm90b3R5
cGUuIFJlbW92ZSBtZXRob2RzIHdpdGggbmF0aXZlCisvLyBpbXBsZW1lbnRhdGlvbnMgYW5kIHN1
cHBseSBzb21lIG1vcmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGdlbmVyaWMgbWV0aG9kcworLy8g
YmVjYXVzZSB0aGV5IGFyZSBzbyBjb21tb24uCit2YXIgTmF0aXZlQXJyYXkgPSBFbWJlci5NaXhp
bi5jcmVhdGUoRW1iZXIuTXV0YWJsZUFycmF5LCBFbWJlci5PYnNlcnZhYmxlLCBFbWJlci5Db3B5
YWJsZSwgeworCisgIC8vIGJlY2F1c2UgbGVuZ3RoIGlzIGEgYnVpbHQtaW4gcHJvcGVydHkgd2Ug
bmVlZCB0byBrbm93IHRvIGp1c3QgZ2V0IHRoZQorICAvLyBvcmlnaW5hbCBwcm9wZXJ0eS4KKyAg
Z2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICBpZiAoa2V5PT09J2xlbmd0aCcpIHJldHVybiB0aGlz
Lmxlbmd0aDsKKyAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGtleSkgcmV0dXJuIHRo
aXNba2V5XTsKKyAgICBlbHNlIHJldHVybiB0aGlzLl9zdXBlcihrZXkpOworICB9LAorCisgIG9i
amVjdEF0OiBmdW5jdGlvbihpZHgpIHsKKyAgICByZXR1cm4gdGhpc1tpZHhdOworICB9LAorCisg
IC8vIHByaW1pdGl2ZSBmb3IgYXJyYXkgc3VwcG9ydC4KKyAgcmVwbGFjZTogZnVuY3Rpb24oaWR4
LCBhbXQsIG9iamVjdHMpIHsKKworICAgIGlmICh0aGlzLmlzRnJvemVuKSB0aHJvdyBFbWJlci5G
Uk9aRU5fRVJST1IgOworCisgICAgLy8gaWYgd2UgcmVwbGFjZWQgZXhhY3RseSB0aGUgc2FtZSBu
dW1iZXIgb2YgaXRlbXMsIHRoZW4gcGFzcyBvbmx5IHRoZQorICAgIC8vIHJlcGxhY2VkIHJhbmdl
LiBPdGhlcndpc2UsIHBhc3MgdGhlIGZ1bGwgcmVtYWluaW5nIGFycmF5IGxlbmd0aAorICAgIC8v
IHNpbmNlIGV2ZXJ5dGhpbmcgaGFzIHNoaWZ0ZWQKKyAgICB2YXIgbGVuID0gb2JqZWN0cyA/IGdl
dChvYmplY3RzLCAnbGVuZ3RoJykgOiAwOworICAgIHRoaXMuYXJyYXlDb250ZW50V2lsbENoYW5n
ZShpZHgsIGFtdCwgbGVuKTsKKworICAgIGlmICghb2JqZWN0cyB8fCBvYmplY3RzLmxlbmd0aCA9
PT0gMCkgeworICAgICAgdGhpcy5zcGxpY2UoaWR4LCBhbXQpIDsKKyAgICB9IGVsc2UgeworICAg
ICAgdmFyIGFyZ3MgPSBbaWR4LCBhbXRdLmNvbmNhdChvYmplY3RzKSA7CisgICAgICB0aGlzLnNw
bGljZS5hcHBseSh0aGlzLGFyZ3MpIDsKKyAgICB9CisKKyAgICB0aGlzLmFycmF5Q29udGVudERp
ZENoYW5nZShpZHgsIGFtdCwgbGVuKTsKKyAgICByZXR1cm4gdGhpcyA7CisgIH0sCisKKyAgLy8g
SWYgeW91IGFzayBmb3IgYW4gdW5rbm93biBwcm9wZXJ0eSwgdGhlbiB0cnkgdG8gY29sbGVjdCB0
aGUgdmFsdWUKKyAgLy8gZnJvbSBtZW1iZXIgaXRlbXMuCisgIHVua25vd25Qcm9wZXJ0eTogZnVu
Y3Rpb24oa2V5LCB2YWx1ZSkgeworICAgIHZhciByZXQ7Ly8gPSB0aGlzLnJlZHVjZWRQcm9wZXJ0
eShrZXksIHZhbHVlKSA7CisgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkKSAmJiByZXQgPT09
IHVuZGVmaW5lZCkgeworICAgICAgcmV0ID0gdGhpc1trZXldID0gdmFsdWU7CisgICAgfQorICAg
IHJldHVybiByZXQgOworICB9LAorCisgIC8vIElmIGJyb3dzZXIgZGlkIG5vdCBpbXBsZW1lbnQg
aW5kZXhPZiBuYXRpdmVseSwgdGhlbiBvdmVycmlkZSB3aXRoCisgIC8vIHNwZWNpYWxpemVkIHZl
cnNpb24KKyAgaW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBzdGFydEF0KSB7CisgICAgdmFyIGlk
eCwgbGVuID0gdGhpcy5sZW5ndGg7CisKKyAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkKSBz
dGFydEF0ID0gMDsKKyAgICBlbHNlIHN0YXJ0QXQgPSAoc3RhcnRBdCA8IDApID8gTWF0aC5jZWls
KHN0YXJ0QXQpIDogTWF0aC5mbG9vcihzdGFydEF0KTsKKyAgICBpZiAoc3RhcnRBdCA8IDApIHN0
YXJ0QXQgKz0gbGVuOworCisgICAgZm9yKGlkeD1zdGFydEF0O2lkeDxsZW47aWR4KyspIHsKKyAg
ICAgIGlmICh0aGlzW2lkeF0gPT09IG9iamVjdCkgcmV0dXJuIGlkeCA7CisgICAgfQorICAgIHJl
dHVybiAtMTsKKyAgfSwKKworICBsYXN0SW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBzdGFydEF0
KSB7CisgICAgdmFyIGlkeCwgbGVuID0gdGhpcy5sZW5ndGg7CisKKyAgICBpZiAoc3RhcnRBdCA9
PT0gdW5kZWZpbmVkKSBzdGFydEF0ID0gbGVuLTE7CisgICAgZWxzZSBzdGFydEF0ID0gKHN0YXJ0
QXQgPCAwKSA/IE1hdGguY2VpbChzdGFydEF0KSA6IE1hdGguZmxvb3Ioc3RhcnRBdCk7CisgICAg
aWYgKHN0YXJ0QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKKworICAgIGZvcihpZHg9c3RhcnRBdDtp
ZHg+PTA7aWR4LS0pIHsKKyAgICAgIGlmICh0aGlzW2lkeF0gPT09IG9iamVjdCkgcmV0dXJuIGlk
eCA7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfSwKKworICBjb3B5OiBmdW5jdGlvbihkZWVw
KSB7CisgICAgaWYgKGRlZXApIHsKKyAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbihpdGVt
KXsgcmV0dXJuIEVtYmVyLmNvcHkoaXRlbSwgdHJ1ZSk7IH0pOworICAgIH0KKworICAgIHJldHVy
biB0aGlzLnNsaWNlKCk7CisgIH0KK30pOworCisvLyBSZW1vdmUgYW55IG1ldGhvZHMgaW1wbGVt
ZW50ZWQgbmF0aXZlbHkgc28gd2UgZG9uJ3Qgb3ZlcnJpZGUgdGhlbQordmFyIGlnbm9yZSA9IFsn
bGVuZ3RoJ107CitFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaChOYXRpdmVBcnJheS5rZXlz
KCksIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKKyAgaWYgKEFycmF5LnByb3RvdHlwZVttZXRob2RO
YW1lXSkgaWdub3JlLnB1c2gobWV0aG9kTmFtZSk7Cit9KTsKKworaWYgKGlnbm9yZS5sZW5ndGg+
MCkgeworICBOYXRpdmVBcnJheSA9IE5hdGl2ZUFycmF5LndpdGhvdXQuYXBwbHkoTmF0aXZlQXJy
YXksIGlnbm9yZSk7Cit9CisKKy8qKgorICBUaGUgTmF0aXZlQXJyYXkgbWl4aW4gY29udGFpbnMg
dGhlIHByb3BlcnRpZXMgbmVlZGVkIHRvIHRvIG1ha2UgdGhlIG5hdGl2ZQorICBBcnJheSBzdXBw
b3J0IEVtYmVyLk11dGFibGVBcnJheSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbnQgQVBJcy4gVW5s
ZXNzIHlvdQorICBoYXZlIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyBvciBgRW1iZXIuRVhURU5E
X1BST1RPVFlQRVMuQXJyYXlgIHNldCB0bworICBmYWxzZSwgdGhpcyB3aWxsIGJlIGFwcGxpZWQg
YXV0b21hdGljYWxseS4gT3RoZXJ3aXNlIHlvdSBjYW4gYXBwbHkgdGhlIG1peGluCisgIGF0IGFu
eXRpbWUgYnkgY2FsbGluZyBgRW1iZXIuTmF0aXZlQXJyYXkuYWN0aXZhdGVgLgorCisgIEBjbGFz
cyBOYXRpdmVBcnJheQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk1peGlu
CisgIEB1c2VzIEVtYmVyLk11dGFibGVBcnJheQorICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVy
YWJsZQorICBAdXNlcyBFbWJlci5Db3B5YWJsZQorICBAdXNlcyBFbWJlci5GcmVlemFibGUKKyov
CitFbWJlci5OYXRpdmVBcnJheSA9IE5hdGl2ZUFycmF5OworCisvKioKKyAgQ3JlYXRlcyBhbiBg
RW1iZXIuTmF0aXZlQXJyYXlgIGZyb20gYW4gQXJyYXkgbGlrZSBvYmplY3QuCisgIERvZXMgbm90
IG1vZGlmeSB0aGUgb3JpZ2luYWwgb2JqZWN0LgorCisgIEBtZXRob2QgQQorICBAZm9yIEVtYmVy
CisgIEByZXR1cm4ge0VtYmVyLk5hdGl2ZUFycmF5fQorKi8KK0VtYmVyLkEgPSBmdW5jdGlvbihh
cnIpeworICBpZiAoYXJyID09PSB1bmRlZmluZWQpIHsgYXJyID0gW107IH0KKyAgcmV0dXJuIEVt
YmVyLkFycmF5LmRldGVjdChhcnIpID8gYXJyIDogRW1iZXIuTmF0aXZlQXJyYXkuYXBwbHkoYXJy
KTsKK307CisKKy8qKgorICBBY3RpdmF0ZXMgdGhlIG1peGluIG9uIHRoZSBBcnJheS5wcm90b3R5
cGUgaWYgbm90IGFscmVhZHkgYXBwbGllZC4gQ2FsbGluZworICB0aGlzIG1ldGhvZCBtb3JlIHRo
YW4gb25jZSBpcyBzYWZlLgorCisgIEBtZXRob2QgYWN0aXZhdGUKKyAgQGZvciBFbWJlci5OYXRp
dmVBcnJheQorICBAc3RhdGljCisgIEByZXR1cm4ge3ZvaWR9CisqLworRW1iZXIuTmF0aXZlQXJy
YXkuYWN0aXZhdGUgPSBmdW5jdGlvbigpIHsKKyAgTmF0aXZlQXJyYXkuYXBwbHkoQXJyYXkucHJv
dG90eXBlKTsKKworICBFbWJlci5BID0gZnVuY3Rpb24oYXJyKSB7IHJldHVybiBhcnIgfHwgW107
IH07Cit9OworCitpZiAoRW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09IHRydWUgfHwgRW1iZXIu
RVhURU5EX1BST1RPVFlQRVMuQXJyYXkpIHsKKyAgRW1iZXIuTmF0aXZlQXJyYXkuYWN0aXZhdGUo
KTsKK30KKworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIERlZmVycmVkTWl4aW4g
PSBFbWJlci5EZWZlcnJlZE1peGluLCAvLyBtaXhpbnMvZGVmZXJyZWQKKyAgICBFbWJlck9iamVj
dCA9IEVtYmVyLk9iamVjdCwgICAgICAgICAgLy8gc3lzdGVtL29iamVjdAorICAgIGdldCA9IEVt
YmVyLmdldDsKKwordmFyIERlZmVycmVkID0gRW1iZXIuT2JqZWN0LmV4dGVuZChEZWZlcnJlZE1p
eGluKTsKKworRGVmZXJyZWQucmVvcGVuQ2xhc3MoeworICBwcm9taXNlOiBmdW5jdGlvbihjYWxs
YmFjaywgYmluZGluZykgeworICAgIHZhciBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpOwor
ICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgZGVmZXJyZWQpOworICAgIHJldHVybiBnZXQoZGVm
ZXJyZWQsICdwcm9taXNlJyk7CisgIH0KK30pOworCitFbWJlci5EZWZlcnJlZCA9IERlZmVycmVk
OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3Vi
bW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisKK3ZhciBsb2FkSG9va3MgPSBFbWJlci5FTlYuRU1C
RVJfTE9BRF9IT09LUyB8fCB7fTsKK3ZhciBsb2FkZWQgPSB7fTsKKworLyoqCitAbWV0aG9kIG9u
TG9hZAorQGZvciBFbWJlcgorQHBhcmFtIG5hbWUge1N0cmluZ30gbmFtZSBvZiBob29rCitAcGFy
YW0gY2FsbGJhY2sge0Z1bmN0aW9ufSBjYWxsYmFjayB0byBiZSBjYWxsZWQKKyovCitFbWJlci5v
bkxvYWQgPSBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykgeworICB2YXIgb2JqZWN0OworCisgIGxv
YWRIb29rc1tuYW1lXSA9IGxvYWRIb29rc1tuYW1lXSB8fCBFbWJlci5BKCk7CisgIGxvYWRIb29r
c1tuYW1lXS5wdXNoT2JqZWN0KGNhbGxiYWNrKTsKKworICBpZiAob2JqZWN0ID0gbG9hZGVkW25h
bWVdKSB7CisgICAgY2FsbGJhY2sob2JqZWN0KTsKKyAgfQorfTsKKworLyoqCitAbWV0aG9kIHJ1
bkxvYWRIb29rcworQGZvciBFbWJlcgorQHBhcmFtIG5hbWUge1N0cmluZ30gbmFtZSBvZiBob29r
CitAcGFyYW0gb2JqZWN0IHtPYmplY3R9IG9iamVjdCB0byBwYXNzIHRvIGNhbGxiYWNrcworKi8K
K0VtYmVyLnJ1bkxvYWRIb29rcyA9IGZ1bmN0aW9uKG5hbWUsIG9iamVjdCkgeworICB2YXIgaG9v
a3M7CisKKyAgbG9hZGVkW25hbWVdID0gb2JqZWN0OworCisgIGlmIChob29rcyA9IGxvYWRIb29r
c1tuYW1lXSkgeworICAgIGxvYWRIb29rc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNr
KSB7CisgICAgICBjYWxsYmFjayhvYmplY3QpOworICAgIH0pOworICB9Cit9OworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIGdl
dCA9IEVtYmVyLmdldDsKKworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1
bnRpbWUKKyovCisKKy8qKgorICBgRW1iZXIuQ29udHJvbGxlck1peGluYCBwcm92aWRlcyBhIHN0
YW5kYXJkIGludGVyZmFjZSBmb3IgYWxsIGNsYXNzZXMgdGhhdAorICBjb21wb3NlIEVtYmVyJ3Mg
Y29udHJvbGxlciBsYXllcjogYEVtYmVyLkNvbnRyb2xsZXJgLAorICBgRW1iZXIuQXJyYXlDb250
cm9sbGVyYCwgYW5kIGBFbWJlci5PYmplY3RDb250cm9sbGVyYC4KKworICBXaXRoaW4gYW4gYEVt
YmVyLlJvdXRlcmAtbWFuYWdlZCBhcHBsaWNhdGlvbiBzaW5nbGUgc2hhcmVkIGluc3RhY2VzIG9m
IGV2ZXJ5CisgIENvbnRyb2xsZXIgb2JqZWN0IGluIHlvdXIgYXBwbGljYXRpb24ncyBuYW1lc3Bh
Y2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAgYXBwbGljYXRpb24ncyBgRW1iZXIuUm91dGVyYCBp
bnN0YW5jZS4gU2VlIGBFbWJlci5BcHBsaWNhdGlvbiNpbml0aWFsaXplYAorICBmb3IgYWRkaXRp
b25hbCBpbmZvcm1hdGlvbi4KKworICAjIyBWaWV3cworCisgIEJ5IGRlZmF1bHQgYSBjb250cm9s
bGVyIGluc3RhbmNlIHdpbGwgYmUgdGhlIHJlbmRlcmluZyBjb250ZXh0CisgIGZvciBpdHMgYXNz
b2NpYXRlZCBgRW1iZXIuVmlldy5gIFRoaXMgY29ubmVjdGlvbiBpcyBtYWRlIGR1cmluZyBjYWxs
cyB0bworICBgRW1iZXIuQ29udHJvbGxlck1peGluI2Nvbm5lY3RPdXRsZXRgLgorCisgIFdpdGhp
biB0aGUgdmlldydzIHRlbXBsYXRlLCB0aGUgYEVtYmVyLlZpZXdgIGluc3RhbmNlIGNhbiBiZSBh
Y2Nlc3NlZAorICB0aHJvdWdoIHRoZSBjb250cm9sbGVyIHdpdGggYHt7dmlld319YC4KKworICAj
IyBUYXJnZXQgRm9yd2FyZGluZworCisgIEJ5IGRlZmF1bHQgYSBjb250cm9sbGVyIHdpbGwgdGFy
Z2V0IHlvdXIgYXBwbGljYXRpb24ncyBgRW1iZXIuUm91dGVyYAorICBpbnN0YW5jZS4gQ2FsbHMg
dG8gYHt7YWN0aW9ufX1gIHdpdGhpbiB0aGUgdGVtcGxhdGUgb2YgYSBjb250cm9sbGVyJ3Mgdmll
dworICBhcmUgZm9yd2FyZGVkIHRvIHRoZSByb3V0ZXIuIFNlZSBgRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzLmFjdGlvbmAgZm9yCisgIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKKyAgQGNsYXNz
IENvbnRyb2xsZXJNaXhpbgorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk1p
eGluCisqLworRW1iZXIuQ29udHJvbGxlck1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAg
LyogZHVja3R5cGUgYXMgYSBjb250cm9sbGVyICovCisgIGlzQ29udHJvbGxlcjogdHJ1ZSwKKwor
ICAvKioKKyAgICBUaGUgb2JqZWN0IHRvIHdoaWNoIGV2ZW50cyBmcm9tIHRoZSB2aWV3IHNob3Vs
ZCBiZSBzZW50LgorCisgICAgRm9yIGV4YW1wbGUsIHdoZW4gYSBIYW5kbGViYXJzIHRlbXBsYXRl
IHVzZXMgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsCisgICAgaXQgd2lsbCBhdHRlbXB0IHRvIHNl
bmQgdGhlIGV2ZW50IHRvIHRoZSB2aWV3J3MgY29udHJvbGxlcidzIGB0YXJnZXRgLgorCisgICAg
QnkgZGVmYXVsdCwgYSBjb250cm9sbGVyJ3MgYHRhcmdldGAgaXMgc2V0IHRvIHRoZSByb3V0ZXIg
YWZ0ZXIgaXQgaXMKKyAgICBpbnN0YW50aWF0ZWQgYnkgYEVtYmVyLkFwcGxpY2F0aW9uI2luaXRp
YWxpemVgLgorCisgICAgQHByb3BlcnR5IHRhcmdldAorICAgIEBkZWZhdWx0IG51bGwKKyAgKi8K
KyAgdGFyZ2V0OiBudWxsLAorCisgIGNvbnRhaW5lcjogbnVsbCwKKworICBzdG9yZTogbnVsbCwK
KworICBtb2RlbDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKSwKKworICBzZW5kOiBm
dW5jdGlvbihhY3Rpb25OYW1lKSB7CisgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSksIHRhcmdldDsKKworICAgIGlmICh0aGlzW2FjdGlvbk5hbWVdKSB7CisgICAgICBF
bWJlci5hc3NlcnQoIlRoZSBjb250cm9sbGVyICIgKyB0aGlzICsgIiBkb2VzIG5vdCBoYXZlIHRo
ZSBhY3Rpb24gIiArIGFjdGlvbk5hbWUsIHR5cGVvZiB0aGlzW2FjdGlvbk5hbWVdID09PSAnZnVu
Y3Rpb24nKTsKKyAgICAgIHRoaXNbYWN0aW9uTmFtZV0uYXBwbHkodGhpcywgYXJncyk7CisgICAg
fSBlbHNlIGlmKHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JykpIHsKKyAgICAgIEVtYmVyLmFz
c2VydCgiVGhlIHRhcmdldCBmb3IgY29udHJvbGxlciAiICsgdGhpcyArICIgKCIgKyB0YXJnZXQg
KyAiKSBkaWQgbm90IGRlZmluZSBhIGBzZW5kYCBtZXRob2QiLCB0eXBlb2YgdGFyZ2V0LnNlbmQg
PT09ICdmdW5jdGlvbicpOworICAgICAgdGFyZ2V0LnNlbmQuYXBwbHkodGFyZ2V0LCBhcmd1bWVu
dHMpOworICAgIH0KKyAgfQorfSk7CisKKy8qKgorICBAY2xhc3MgQ29udHJvbGxlcgorICBAbmFt
ZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICBAdXNlcyBFbWJlci5Db250
cm9sbGVyTWl4aW4KKyovCitFbWJlci5Db250cm9sbGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZChF
bWJlci5Db250cm9sbGVyTWl4aW4pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoq
CitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisKK3ZhciBnZXQg
PSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVV
dGlscy5mb3JFYWNoOworCisvKioKKyAgYEVtYmVyLlNvcnRhYmxlTWl4aW5gIHByb3ZpZGVzIGEg
c3RhbmRhcmQgaW50ZXJmYWNlIGZvciBhcnJheSBwcm94aWVzCisgIHRvIHNwZWNpZnkgYSBzb3J0
IG9yZGVyIGFuZCBtYWludGFpbiB0aGlzIHNvcnRpbmcgd2hlbiBvYmplY3RzIGFyZSBhZGRlZCwK
KyAgcmVtb3ZlZCwgb3IgdXBkYXRlZCB3aXRob3V0IGNoYW5naW5nIHRoZSBpbXBsaWNpdCBvcmRl
ciBvZiB0aGVpciB1bmRlcmx5aW5nCisgIGNvbnRlbnQgYXJyYXk6CisKKyAgYGBgamF2YXNjcmlw
dAorICBzb25ncyA9IFsKKyAgICB7dHJhY2tOdW1iZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGksIE9i
LUxhLURhJ30sCisgICAge3RyYWNrTnVtYmVyOiAyLCB0aXRsZTogJ0JhY2sgaW4gdGhlIFUuUy5T
LlIuJ30sCisgICAge3RyYWNrTnVtYmVyOiAzLCB0aXRsZTogJ0dsYXNzIE9uaW9uJ30sCisgIF07
CisKKyAgc29uZ3NDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmNyZWF0ZSh7Cisg
ICAgY29udGVudDogc29uZ3MsCisgICAgc29ydFByb3BlcnRpZXM6IFsndHJhY2tOdW1iZXInXSwK
KyAgICBzb3J0QXNjZW5kaW5nOiB0cnVlCisgIH0pOworCisgIHNvbmdzQ29udHJvbGxlci5nZXQo
J2ZpcnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0aGUg
VS5TLlMuUi4nfQorCisgIHNvbmdzQ29udHJvbGxlci5hZGRPYmplY3Qoe3RyYWNrTnVtYmVyOiAx
LCB0aXRsZTogJ0RlYXIgUHJ1ZGVuY2UnfSk7CisgIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0
T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6IDEsIHRpdGxlOiAnRGVhciBQcnVkZW5jZSd9Cisg
IGBgYAorCisgIEBjbGFzcyBTb3J0YWJsZU1peGluCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4
dGVuZHMgRW1iZXIuTWl4aW4KKyAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKKyovCitF
bWJlci5Tb3J0YWJsZU1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLk11dGFibGVFbnVt
ZXJhYmxlLCB7CisKKyAgLyoqCisgICAgU3BlY2lmaWVzIHdoaWNoIHByb3BlcnRpZXMgZGljdGF0
ZSB0aGUgYXJyYW5nZWRDb250ZW50J3Mgc29ydCBvcmRlci4KKworICAgIEBwcm9wZXJ0eSB7QXJy
YXl9IHNvcnRQcm9wZXJ0aWVzCisgICovCisgIHNvcnRQcm9wZXJ0aWVzOiBudWxsLAorCisgIC8q
KgorICAgIFNwZWNpZmllcyB0aGUgYXJyYW5nZWRDb250ZW50J3Mgc29ydCBkaXJlY3Rpb24KKwor
ICAgIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc29ydEFzY2VuZGluZworICAqLworICBzb3J0QXNjZW5k
aW5nOiB0cnVlLAorCisgIG9yZGVyQnk6IGZ1bmN0aW9uKGl0ZW0xLCBpdGVtMikgeworICAgIHZh
ciByZXN1bHQgPSAwLAorICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFBy
b3BlcnRpZXMnKSwKKyAgICAgICAgc29ydEFzY2VuZGluZyA9IGdldCh0aGlzLCAnc29ydEFzY2Vu
ZGluZycpOworCisgICAgRW1iZXIuYXNzZXJ0KCJ5b3UgbmVlZCB0byBkZWZpbmUgYHNvcnRQcm9w
ZXJ0aWVzYCIsICEhc29ydFByb3BlcnRpZXMpOworCisgICAgZm9yRWFjaChzb3J0UHJvcGVydGll
cywgZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7CisgICAgICBpZiAocmVzdWx0ID09PSAwKSB7Cisg
ICAgICAgIHJlc3VsdCA9IEVtYmVyLmNvbXBhcmUoZ2V0KGl0ZW0xLCBwcm9wZXJ0eU5hbWUpLCBn
ZXQoaXRlbTIsIHByb3BlcnR5TmFtZSkpOworICAgICAgICBpZiAoKHJlc3VsdCAhPT0gMCkgJiYg
IXNvcnRBc2NlbmRpbmcpIHsKKyAgICAgICAgICByZXN1bHQgPSAoLTEpICogcmVzdWx0OworICAg
ICAgICB9CisgICAgICB9CisgICAgfSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisg
IGRlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250
ZW50JyksCisgICAgICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJvcGVydGll
cycpOworCisgICAgaWYgKGNvbnRlbnQgJiYgc29ydFByb3BlcnRpZXMpIHsKKyAgICAgIGZvckVh
Y2goY29udGVudCwgZnVuY3Rpb24oaXRlbSkgeworICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0
aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVydHkpIHsKKyAgICAgICAgICBFbWJlci5yZW1vdmVPYnNl
cnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURp
ZENoYW5nZScpOworICAgICAgICB9LCB0aGlzKTsKKyAgICAgIH0sIHRoaXMpOworICAgIH0KKwor
ICAgIHJldHVybiB0aGlzLl9zdXBlcigpOworICB9LAorCisgIGlzU29ydGVkOiBFbWJlci5jb21w
dXRlZC5ib29sKCdzb3J0UHJvcGVydGllcycpLAorCisgIGFycmFuZ2VkQ29udGVudDogRW1iZXIu
Y29tcHV0ZWQoJ2NvbnRlbnQnLCAnc29ydFByb3BlcnRpZXMuQGVhY2gnLCBmdW5jdGlvbihrZXks
IHZhbHVlKSB7CisgICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKKyAgICAg
ICAgaXNTb3J0ZWQgPSBnZXQodGhpcywgJ2lzU29ydGVkJyksCisgICAgICAgIHNvcnRQcm9wZXJ0
aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJvcGVydGllcycpLAorICAgICAgICBzZWxmID0gdGhpczsK
KworICAgIGlmIChjb250ZW50ICYmIGlzU29ydGVkKSB7CisgICAgICBjb250ZW50ID0gY29udGVu
dC5zbGljZSgpOworICAgICAgY29udGVudC5zb3J0KGZ1bmN0aW9uKGl0ZW0xLCBpdGVtMikgewor
ICAgICAgICByZXR1cm4gc2VsZi5vcmRlckJ5KGl0ZW0xLCBpdGVtMik7CisgICAgICB9KTsKKyAg
ICAgIGZvckVhY2goY29udGVudCwgZnVuY3Rpb24oaXRlbSkgeworICAgICAgICBmb3JFYWNoKHNv
cnRQcm9wZXJ0aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVydHkpIHsKKyAgICAgICAgICBFbWJlci5h
ZGRPYnNlcnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9w
ZXJ0eURpZENoYW5nZScpOworICAgICAgICB9LCB0aGlzKTsKKyAgICAgIH0sIHRoaXMpOworICAg
ICAgcmV0dXJuIEVtYmVyLkEoY29udGVudCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRlbnQ7
CisgIH0pLAorCisgIF9jb250ZW50V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVu
Y3Rpb24oKSB7CisgICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKKyAgICAg
ICAgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7CisKKyAgICBp
ZiAoY29udGVudCAmJiBzb3J0UHJvcGVydGllcykgeworICAgICAgZm9yRWFjaChjb250ZW50LCBm
dW5jdGlvbihpdGVtKSB7CisgICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9u
KHNvcnRQcm9wZXJ0eSkgeworICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNv
cnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7Cisg
ICAgICAgIH0sIHRoaXMpOworICAgICAgfSwgdGhpcyk7CisgICAgfQorCisgICAgdGhpcy5fc3Vw
ZXIoKTsKKyAgfSwgJ2NvbnRlbnQnKSwKKworICBzb3J0QXNjZW5kaW5nV2lsbENoYW5nZTogRW1i
ZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fbGFzdFNvcnRBc2NlbmRp
bmcgPSBnZXQodGhpcywgJ3NvcnRBc2NlbmRpbmcnKTsKKyAgfSwgJ3NvcnRBc2NlbmRpbmcnKSwK
KworICBzb3J0QXNjZW5kaW5nRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsK
KyAgICBpZiAoZ2V0KHRoaXMsICdzb3J0QXNjZW5kaW5nJykgIT09IHRoaXMuX2xhc3RTb3J0QXNj
ZW5kaW5nKSB7CisgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdl
ZENvbnRlbnQnKTsKKyAgICAgIGFycmFuZ2VkQ29udGVudC5yZXZlcnNlT2JqZWN0cygpOworICAg
IH0KKyAgfSwgJ3NvcnRBc2NlbmRpbmcnKSwKKworICBjb250ZW50QXJyYXlXaWxsQ2hhbmdlOiBm
dW5jdGlvbihhcnJheSwgaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpIHsKKyAgICB2YXIg
aXNTb3J0ZWQgPSBnZXQodGhpcywgJ2lzU29ydGVkJyk7CisKKyAgICBpZiAoaXNTb3J0ZWQpIHsK
KyAgICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcp
OworICAgICAgdmFyIHJlbW92ZWRPYmplY3RzID0gYXJyYXkuc2xpY2UoaWR4LCBpZHgrcmVtb3Zl
ZENvdW50KTsKKyAgICAgIHZhciBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3Bl
cnRpZXMnKTsKKworICAgICAgZm9yRWFjaChyZW1vdmVkT2JqZWN0cywgZnVuY3Rpb24oaXRlbSkg
eworICAgICAgICBhcnJhbmdlZENvbnRlbnQucmVtb3ZlT2JqZWN0KGl0ZW0pOworCisgICAgICAg
IGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgeworICAgICAg
ICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRl
bnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7CisgICAgICAgIH0sIHRoaXMpOworICAgICAg
fSwgdGhpcyk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3N1cGVyKGFycmF5LCBpZHgsIHJl
bW92ZWRDb3VudCwgYWRkZWRDb3VudCk7CisgIH0sCisKKyAgY29udGVudEFycmF5RGlkQ2hhbmdl
OiBmdW5jdGlvbihhcnJheSwgaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpIHsKKyAgICB2
YXIgaXNTb3J0ZWQgPSBnZXQodGhpcywgJ2lzU29ydGVkJyksCisgICAgICAgIHNvcnRQcm9wZXJ0
aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJvcGVydGllcycpOworCisgICAgaWYgKGlzU29ydGVkKSB7
CisgICAgICB2YXIgYWRkZWRPYmplY3RzID0gYXJyYXkuc2xpY2UoaWR4LCBpZHgrYWRkZWRDb3Vu
dCk7CisgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRl
bnQnKTsKKworICAgICAgZm9yRWFjaChhZGRlZE9iamVjdHMsIGZ1bmN0aW9uKGl0ZW0pIHsKKyAg
ICAgICAgdGhpcy5pbnNlcnRJdGVtU29ydGVkKGl0ZW0pOworCisgICAgICAgIGZvckVhY2goc29y
dFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgeworICAgICAgICAgIEVtYmVyLmFk
ZE9ic2VydmVyKGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3Bl
cnR5RGlkQ2hhbmdlJyk7CisgICAgICAgIH0sIHRoaXMpOworICAgICAgfSwgdGhpcyk7CisgICAg
fQorCisgICAgcmV0dXJuIHRoaXMuX3N1cGVyKGFycmF5LCBpZHgsIHJlbW92ZWRDb3VudCwgYWRk
ZWRDb3VudCk7CisgIH0sCisKKyAgaW5zZXJ0SXRlbVNvcnRlZDogZnVuY3Rpb24oaXRlbSkgewor
ICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOwor
ICAgIHZhciBsZW5ndGggPSBnZXQoYXJyYW5nZWRDb250ZW50LCAnbGVuZ3RoJyk7CisKKyAgICB2
YXIgaWR4ID0gdGhpcy5fYmluYXJ5U2VhcmNoKGl0ZW0sIDAsIGxlbmd0aCk7CisgICAgYXJyYW5n
ZWRDb250ZW50Lmluc2VydEF0KGlkeCwgaXRlbSk7CisgIH0sCisKKyAgY29udGVudEl0ZW1Tb3J0
UHJvcGVydHlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICB2YXIgYXJyYW5nZWRDb250
ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwKKyAgICAgICAgb2xkSW5kZXggPSBh
cnJhbmdlZENvbnRlbnQuaW5kZXhPZihpdGVtKSwKKyAgICAgICAgbGVmdEl0ZW0gPSBhcnJhbmdl
ZENvbnRlbnQub2JqZWN0QXQob2xkSW5kZXggLSAxKSwKKyAgICAgICAgcmlnaHRJdGVtID0gYXJy
YW5nZWRDb250ZW50Lm9iamVjdEF0KG9sZEluZGV4ICsgMSksCisgICAgICAgIGxlZnRSZXN1bHQg
PSBsZWZ0SXRlbSAmJiB0aGlzLm9yZGVyQnkoaXRlbSwgbGVmdEl0ZW0pLAorICAgICAgICByaWdo
dFJlc3VsdCA9IHJpZ2h0SXRlbSAmJiB0aGlzLm9yZGVyQnkoaXRlbSwgcmlnaHRJdGVtKTsKKwor
ICAgIGlmIChsZWZ0UmVzdWx0IDwgMCB8fCByaWdodFJlc3VsdCA+IDApIHsKKyAgICAgIGFycmFu
Z2VkQ29udGVudC5yZW1vdmVPYmplY3QoaXRlbSk7CisgICAgICB0aGlzLmluc2VydEl0ZW1Tb3J0
ZWQoaXRlbSk7CisgICAgfQorICB9LAorCisgIF9iaW5hcnlTZWFyY2g6IGZ1bmN0aW9uKGl0ZW0s
IGxvdywgaGlnaCkgeworICAgIHZhciBtaWQsIG1pZEl0ZW0sIHJlcywgYXJyYW5nZWRDb250ZW50
OworCisgICAgaWYgKGxvdyA9PT0gaGlnaCkgeworICAgICAgcmV0dXJuIGxvdzsKKyAgICB9CisK
KyAgICBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOworCisg
ICAgbWlkID0gbG93ICsgTWF0aC5mbG9vcigoaGlnaCAtIGxvdykgLyAyKTsKKyAgICBtaWRJdGVt
ID0gYXJyYW5nZWRDb250ZW50Lm9iamVjdEF0KG1pZCk7CisKKyAgICByZXMgPSB0aGlzLm9yZGVy
QnkobWlkSXRlbSwgaXRlbSk7CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgcmV0dXJuIHRo
aXMuX2JpbmFyeVNlYXJjaChpdGVtLCBtaWQrMSwgaGlnaCk7CisgICAgfSBlbHNlIGlmIChyZXMg
PiAwKSB7CisgICAgICByZXR1cm4gdGhpcy5fYmluYXJ5U2VhcmNoKGl0ZW0sIGxvdywgbWlkKTsK
KyAgICB9CisKKyAgICByZXR1cm4gbWlkOworICB9Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5j
dGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisq
LworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGlzR2xvYmFsUGF0aCA9
IEVtYmVyLmlzR2xvYmFsUGF0aCwKKyAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2gsIHJlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZTsKKworLyoq
CisgIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gcHVi
bGlzaCBhIGNvbGxlY3Rpb24gb2YKKyAgb2JqZWN0cyBzbyB0aGF0IHlvdSBjYW4gZWFzaWx5IGJp
bmQgdG8gdGhlIGNvbGxlY3Rpb24gZnJvbSBhIEhhbmRsZWJhcnMKKyAgYCNlYWNoYCBoZWxwZXIs
IGFuIGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIG9yIG90aGVyIGNvbnRyb2xsZXJzLgorCisgIFRo
ZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgYW4gYEFycmF5Q29udHJvbGxlcmAgaXMgdGhhdCB5b3Ugb25s
eSBoYXZlIHRvIHNldCB1cAorICB5b3VyIHZpZXcgYmluZGluZ3Mgb25jZTsgdG8gY2hhbmdlIHdo
YXQncyBkaXNwbGF5ZWQsIHNpbXBseSBzd2FwIG91dCB0aGUKKyAgYGNvbnRlbnRgIHByb3BlcnR5
IG9uIHRoZSBjb250cm9sbGVyLgorCisgIEZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSB3YW50ZWQg
dG8gZGlzcGxheSBhIGxpc3Qgb2YgaXRlbXMgZmV0Y2hlZCB2aWEgYW4gWEhSCisgIHJlcXVlc3Qu
IENyZWF0ZSBhbiBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCBhbmQgc2V0IGl0cyBgY29udGVudGAg
cHJvcGVydHk6CisKKyAgYGBgamF2YXNjcmlwdAorICBNeUFwcC5saXN0Q29udHJvbGxlciA9IEVt
YmVyLkFycmF5Q29udHJvbGxlci5jcmVhdGUoKTsKKworICAkLmdldCgncGVvcGxlLmpzb24nLCBm
dW5jdGlvbihkYXRhKSB7CisgICAgTXlBcHAubGlzdENvbnRyb2xsZXIuc2V0KCdjb250ZW50Jywg
ZGF0YSk7CisgIH0pOworICBgYGAKKworICBUaGVuLCBjcmVhdGUgYSB2aWV3IHRoYXQgYmluZHMg
dG8geW91ciBuZXcgY29udHJvbGxlcjoKKworICBgYGBoYW5kbGViYXJzCisgIHt7I2VhY2ggTXlB
cHAubGlzdENvbnRyb2xsZXJ9fQorICAgIHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19CisgIHt7
L2VhY2h9fQorICBgYGAKKworICBBbHRob3VnaCB5b3UgYXJlIGJpbmRpbmcgdG8gdGhlIGNvbnRy
b2xsZXIsIHRoZSBiZWhhdmlvciBvZiB0aGlzIGNvbnRyb2xsZXIKKyAgaXMgdG8gcGFzcyB0aHJv
dWdoIGFueSBtZXRob2RzIG9yIHByb3BlcnRpZXMgdG8gdGhlIHVuZGVybHlpbmcgYXJyYXkuIFRo
aXMKKyAgY2FwYWJpbGl0eSBjb21lcyBmcm9tIGBFbWJlci5BcnJheVByb3h5YCwgd2hpY2ggdGhp
cyBjbGFzcyBpbmhlcml0cyBmcm9tLgorCisgIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBkaXNwbGF5
IGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aGluIHRoZSBib2R5IG9mIGFuCisgIGAjZWFjaGAgaGVs
cGVyIHRoYXQgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIGluIGBjb250ZW50YCwgYnV0
IGFyZSBub3QKKyAgcHJlc2VudCBvbiB0aG9zZSBpdGVtcy4gICBUbyBkbyB0aGlzLCBzZXQgYGl0
ZW1Db250cm9sbGVyYCB0byB0aGUgbmFtZSBvZiBhCisgIGNvbnRyb2xsZXIgKHByb2JhYmx5IGFu
IGBPYmplY3RDb250cm9sbGVyYCkgdGhhdCB3aWxsIHdyYXAgZWFjaCBpbmRpdmlkdWFsIGl0ZW0u
CisKKyAgRm9yIGV4YW1wbGU6CisKKyAgYGBgaGFuZGxlYmFycworICAgIHt7I2VhY2ggcG9zdCBp
biBjb250cm9sbGVyfX0KKyAgICAgIDxsaT57e3RpdGxlfX0gKHt7dGl0bGVMZW5ndGh9fSBjaGFy
YWN0ZXJzKTwvbGk+CisgICAge3svZWFjaH19CisgIGBgYAorCisgIGBgYGphdmFzY3JpcHQKKyAg
QXBwLlBvc3RzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoeworICAg
IGl0ZW1Db250cm9sbGVyOiAncG9zdCcKKyAgfSk7CisKKyAgQXBwLlBvc3RDb250cm9sbGVyID0g
RW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoeworICAgIC8vIHRoZSBgdGl0bGVgIHByb3Bl
cnR5IHdpbGwgYmUgcHJveGllZCB0byB0aGUgdW5kZXJseWluZyBwb3N0LgorCisgICAgdGl0bGVM
ZW5ndGg6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd0aXRsZScpLmxlbmd0
aDsKKyAgICB9LnByb3BlcnR5KCd0aXRsZScpCisgIH0pOworICBgYGAKKworICBJbiBzb21lIGNh
c2VzIGl0IGlzIGhlbHBmdWwgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGBpdGVtQ29udHJvbGxlcmAg
ZGVwZW5kaW5nCisgIG9uIHRoZSBwYXJ0aWN1bGFyIGl0ZW0uICBTdWJjbGFzc2VzIGNhbiBkbyB0
aGlzIGJ5IG92ZXJyaWRpbmcKKyAgYGxvb2t1cEl0ZW1Db250cm9sbGVyYC4KKworICBGb3IgZXhh
bXBsZToKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5NeUFycmF5Q29udHJvbGxlciA9IEVtYmVy
LkFycmF5Q29udHJvbGxlci5leHRlbmQoeworICAgIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5j
dGlvbiggb2JqZWN0ICkgeworICAgICAgaWYgKG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcpKSB7Cisg
ICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAuU3BlY2lhbENvbnRyb2xsZXIKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAicmVndWxhciI7IC8vIHVzZSBBcHAuUmVndWxh
ckNvbnRyb2xsZXIKKyAgICAgIH0KKyAgICB9CisgIH0pOworICBgYGAKKworICBAY2xhc3MgQXJy
YXlDb250cm9sbGVyCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuQXJyYXlQ
cm94eQorICBAdXNlcyBFbWJlci5Tb3J0YWJsZU1peGluCisgIEB1c2VzIEVtYmVyLkNvbnRyb2xs
ZXJNaXhpbgorKi8KKworRW1iZXIuQXJyYXlDb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5l
eHRlbmQoRW1iZXIuQ29udHJvbGxlck1peGluLAorICBFbWJlci5Tb3J0YWJsZU1peGluLCB7CisK
KyAgLyoqCisgICAgVGhlIGNvbnRyb2xsZXIgdXNlZCB0byB3cmFwIGl0ZW1zLCBpZiBhbnkuCisK
KyAgICBAcHJvcGVydHkgaXRlbUNvbnRyb2xsZXIKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVm
YXVsdCBudWxsCisgICovCisgIGl0ZW1Db250cm9sbGVyOiBudWxsLAorCisgIC8qKgorICAgIFJl
dHVybiB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxlciB0byB3cmFwIGl0ZW1zLCBvciBgbnVsbGAg
aWYgaXRlbXMgc2hvdWxkCisgICAgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBUaGUgZGVmYXVsdCBp
bXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUKKyAgICBgaXRlbUNvbnRyb2xsZXJgIHBy
b3BlcnR5LCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJu
CisgICAgZGlmZmVyZW50IGNvbnRyb2xsZXJzIGZvciBkaWZmZXJlbnQgb2JqZWN0cy4KKworICAg
IEZvciBleGFtcGxlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5NeUFycmF5Q29udHJv
bGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoeworICAgICAgbG9va3VwSXRlbUNv
bnRyb2xsZXI6IGZ1bmN0aW9uKCBvYmplY3QgKSB7CisgICAgICAgIGlmIChvYmplY3QuZ2V0KCdp
c1NwZWNpYWwnKSkgeworICAgICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAuU3Bl
Y2lhbENvbnRyb2xsZXIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gInJlZ3Vs
YXIiOyAvLyB1c2UgQXBwLlJlZ3VsYXJDb250cm9sbGVyCisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2QKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVm
YXVsdCBudWxsCisgICovCisgIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5jdGlvbihvYmplY3Qp
IHsKKyAgICByZXR1cm4gZ2V0KHRoaXMsICdpdGVtQ29udHJvbGxlcicpOworICB9LAorCisgIG9i
amVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7CisgICAgdmFyIGxlbmd0aCA9IGdldCh0aGlz
LCAnbGVuZ3RoJyksCisgICAgICAgIG9iamVjdCA9IGdldCh0aGlzLCdhcnJhbmdlZENvbnRlbnQn
KS5vYmplY3RBdChpZHgpOworCisgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGxlbmd0aCkgewor
ICAgICAgdmFyIGNvbnRyb2xsZXJDbGFzcyA9IHRoaXMubG9va3VwSXRlbUNvbnRyb2xsZXIob2Jq
ZWN0KTsKKyAgICAgIGlmIChjb250cm9sbGVyQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
Y29udHJvbGxlckF0KGlkeCwgb2JqZWN0LCBjb250cm9sbGVyQ2xhc3MpOworICAgICAgfQorICAg
IH0KKworICAgIC8vIFdoZW4gYGNvbnRyb2xsZXJDbGFzc2AgaXMgZmFsc3ksIHdlIGhhdmUgbm90
IG9wdGVkIGluIHRvIHVzaW5nIGl0ZW0KKyAgICAvLyBjb250cm9sbGVycywgc28gcmV0dXJuIHRo
ZSBvYmplY3QgZGlyZWN0bHkuCisKKyAgICAvLyBXaGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFu
Z2UsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSAib3V0IG9mIHJhbmdlIgorICAgIC8vIHZhbHVlLCB3
aGF0ZXZlciB0aGF0IG1pZ2h0IGJlLiAgUmF0aGVyIHRoYW4gbWFrZSBhc3N1bXB0aW9ucworICAg
IC8vIChlLmcuIGd1ZXNzaW5nIGBudWxsYCBvciBgdW5kZWZpbmVkYCkgd2UgZGVmZXIgdGhpcyB0
byBgYXJyYW5nZWRDb250ZW50YC4KKyAgICByZXR1cm4gb2JqZWN0OworICB9LAorCisgIGFycmFu
Z2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKyAg
ICB0aGlzLl9yZXNldFN1YkNvbnRhaW5lcnMoKTsKKyAgfSwKKworICBhcnJheUNvbnRlbnREaWRD
aGFuZ2U6IGZ1bmN0aW9uKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKKyAgICB2YXIgc3Vi
Q29udGFpbmVycyA9IGdldCh0aGlzLCAnc3ViQ29udGFpbmVycycpLAorICAgICAgICBzdWJDb250
YWluZXJzVG9SZW1vdmUgPSBzdWJDb250YWluZXJzLnNsaWNlKGlkeCwgaWR4K3JlbW92ZWRDbnQp
OworCisgICAgZm9yRWFjaChzdWJDb250YWluZXJzVG9SZW1vdmUsIGZ1bmN0aW9uKHN1YkNvbnRh
aW5lcikgeworICAgICAgaWYgKHN1YkNvbnRhaW5lcikgeyBzdWJDb250YWluZXIuZGVzdHJveSgp
OyB9CisgICAgfSk7CisKKyAgICByZXBsYWNlKHN1YkNvbnRhaW5lcnMsIGlkeCwgcmVtb3ZlZENu
dCwgbmV3IEFycmF5KGFkZGVkQ250KSk7CisKKyAgICAvLyBUaGUgc2hhZG93IGFycmF5IG9mIHN1
YmNvbnRhaW5lcnMgbXVzdCBiZSB1cGRhdGVkIGJlZm9yZSB3ZSB0cmlnZ2VyCisgICAgLy8gb2Jz
ZXJ2ZXJzLCBvdGhlcndpc2Ugb2JzZXJ2ZXJzIHdpbGwgZ2V0IHRoZSB3cm9uZyBzdWJjb250YWlu
ZXIgd2hlbgorICAgIC8vIGNhbGxpbmcgYG9iamVjdEF0YAorICAgIHRoaXMuX3N1cGVyKGlkeCwg
cmVtb3ZlZENudCwgYWRkZWRDbnQpOworICB9LAorCisgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAg
IHRoaXMuX3N1cGVyKCk7CisgICAgaWYgKCF0aGlzLmdldCgnY29udGVudCcpKSB7IHRoaXMuc2V0
KCdjb250ZW50JywgRW1iZXIuQSgpKTsgfQorICAgIHRoaXMuX3Jlc2V0U3ViQ29udGFpbmVycygp
OworICB9LAorCisgIGNvbnRyb2xsZXJBdDogZnVuY3Rpb24oaWR4LCBvYmplY3QsIGNvbnRyb2xs
ZXJDbGFzcykgeworICAgIHZhciBjb250YWluZXIgPSBnZXQodGhpcywgJ2NvbnRhaW5lcicpLAor
ICAgICAgICBzdWJDb250YWluZXJzID0gZ2V0KHRoaXMsICdzdWJDb250YWluZXJzJyksCisgICAg
ICAgIHN1YkNvbnRhaW5lciA9IHN1YkNvbnRhaW5lcnNbaWR4XSwKKyAgICAgICAgY29udHJvbGxl
cjsKKworICAgIGlmICghc3ViQ29udGFpbmVyKSB7CisgICAgICBzdWJDb250YWluZXIgPSBzdWJD
b250YWluZXJzW2lkeF0gPSBjb250YWluZXIuY2hpbGQoKTsKKyAgICB9CisKKyAgICBjb250cm9s
bGVyID0gc3ViQ29udGFpbmVyLmxvb2t1cCgiY29udHJvbGxlcjoiICsgY29udHJvbGxlckNsYXNz
KTsKKyAgICBpZiAoIWNvbnRyb2xsZXIpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQg
bm90IHJlc29sdmUgaXRlbUNvbnRyb2xsZXI6ICInICsgY29udHJvbGxlckNsYXNzICsgJyInKTsK
KyAgICB9CisKKyAgICBjb250cm9sbGVyLnNldCgndGFyZ2V0JywgdGhpcyk7CisgICAgY29udHJv
bGxlci5zZXQoJ2NvbnRlbnQnLCBvYmplY3QpOworCisgICAgcmV0dXJuIGNvbnRyb2xsZXI7Cisg
IH0sCisKKyAgc3ViQ29udGFpbmVyczogbnVsbCwKKworICBfcmVzZXRTdWJDb250YWluZXJzOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgc3ViQ29udGFpbmVycyA9IGdldCh0aGlzLCAnc3ViQ29udGFp
bmVycycpOworCisgICAgaWYgKHN1YkNvbnRhaW5lcnMpIHsKKyAgICAgIGZvckVhY2goc3ViQ29u
dGFpbmVycywgZnVuY3Rpb24oc3ViQ29udGFpbmVyKSB7CisgICAgICAgIGlmIChzdWJDb250YWlu
ZXIpIHsgc3ViQ29udGFpbmVyLmRlc3Ryb3koKTsgfQorICAgICAgfSk7CisgICAgfQorCisgICAg
dGhpcy5zZXQoJ3N1YkNvbnRhaW5lcnMnLCBFbWJlci5BKCkpOworICB9Cit9KTsKKworfSkoKTsK
KworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJl
ci1ydW50aW1lCisqLworCisvKioKKyAgYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIGlzIHBhcnQg
b2YgRW1iZXIncyBDb250cm9sbGVyIGxheWVyLiBBIHNpbmdsZSBzaGFyZWQKKyAgaW5zdGFuY2Ug
b2YgZWFjaCBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAgc3ViY2xhc3MgaW4geW91ciBhcHBsaWNh
dGlvbidzCisgIG5hbWVzcGFjZSB3aWxsIGJlIGNyZWF0ZWQgYXQgYXBwbGljYXRpb24gaW5pdGlh
bGl6YXRpb24gYW5kIGJlIHN0b3JlZCBvbiB5b3VyCisgIGFwcGxpY2F0aW9uJ3MgYEVtYmVyLlJv
dXRlcmAgaW5zdGFuY2UuCisKKyAgYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIGRlcml2ZXMgaXRz
IGZ1bmN0aW9uYWxpdHkgZnJvbSBpdHMgc3VwZXJjbGFzcworICBgRW1iZXIuT2JqZWN0UHJveHlg
IGFuZCB0aGUgYEVtYmVyLkNvbnRyb2xsZXJNaXhpbmAgbWl4aW4uCisKKyAgQGNsYXNzIE9iamVj
dENvbnRyb2xsZXIKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5PYmplY3RQ
cm94eQorICBAdXNlcyBFbWJlci5Db250cm9sbGVyTWl4aW4KKyoqLworRW1iZXIuT2JqZWN0Q29u
dHJvbGxlciA9IEVtYmVyLk9iamVjdFByb3h5LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4p
OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworCit9KSgpOworCisKKworKGZ1bmN0aW9u
KCkgeworLyoqCitFbWJlciBSdW50aW1lCisKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQorQHJlcXVpcmVzIGVtYmVyLW1ldGFsCisqLworCit9KSgpOworCisoZnVuY3Rp
b24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisK
K3ZhciBqUXVlcnkgPSBFbWJlci5pbXBvcnRzLmpRdWVyeTsKK0VtYmVyLmFzc2VydCgiRW1iZXIg
Vmlld3MgcmVxdWlyZSBqUXVlcnkgMS44IG9yIDEuOSIsIGpRdWVyeSAmJiAoalF1ZXJ5KCkuanF1
ZXJ5Lm1hdGNoKC9eMVwuKDh8OSkoXC5cZCspPyhwcmV8cmNcZD8pPy8pIHx8IEVtYmVyLkVOVi5G
T1JDRV9KUVVFUlkpKTsKKworLyoqCisgIEFsaWFzIGZvciBqUXVlcnkKKworICBAbWV0aG9kICQK
KyAgQGZvciBFbWJlcgorKi8KK0VtYmVyLiQgPSBqUXVlcnk7CisKK30pKCk7CisKKworCisoZnVu
Y3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyov
CisKKy8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsv
bXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cwordmFyIGRyYWdFdmVudHMgPSBFbWJlci5TdHJp
bmcudygnZHJhZ3N0YXJ0IGRyYWcgZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wIGRy
YWdlbmQnKTsKKworLy8gQ29waWVzIHRoZSBgZGF0YVRyYW5zZmVyYCBwcm9wZXJ0eSBmcm9tIGEg
YnJvd3NlciBldmVudCBvYmplY3Qgb250byB0aGUKKy8vIGpRdWVyeSBldmVudCBvYmplY3QgZm9y
IHRoZSBzcGVjaWZpZWQgZXZlbnRzCitFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaChkcmFn
RXZlbnRzLCBmdW5jdGlvbihldmVudE5hbWUpIHsKKyAgRW1iZXIuJC5ldmVudC5maXhIb29rc1tl
dmVudE5hbWVdID0geyBwcm9wczogWydkYXRhVHJhbnNmZXInXSB9OworfSk7CisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyovCisKKy8qKiogQkVHSU4gTUVUQU1PUlBIIEhFTFBFUlMgKioqLworCisvLyBJbnRl
cm5ldCBFeHBsb3JlciBwcmlvciB0byA5IGRvZXMgbm90IGFsbG93IHNldHRpbmcgaW5uZXJIVE1M
IGlmIHRoZSBmaXJzdCBlbGVtZW50CisvLyBpcyBhICJ6ZXJvLXNjb3BlIiBlbGVtZW50LiBUaGlz
IHByb2JsZW0gY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgbWFraW5nCisvLyB0aGUgZmlyc3Qgbm9k
ZSBhbiBpbnZpc2libGUgdGV4dCBub2RlLiBXZSwgbGlrZSBNb2Rlcm5penIsIHVzZSAmc2h5Owor
dmFyIG5lZWRzU2h5ID0gKGZ1bmN0aW9uKCl7CisgIHZhciB0ZXN0RWwgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdkaXYnKTsKKyAgdGVzdEVsLmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7Cisg
IHRlc3RFbC5maXJzdENoaWxkLmlubmVySFRNTCA9ICI8c2NyaXB0Pjwvc2NyaXB0PiI7CisgIHJl
dHVybiB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPT09ICcnOworfSkoKTsKKworLy8gSUUg
OCAoYW5kIGxpa2VseSBlYXJsaWVyKSBsaWtlcyB0byBtb3ZlIHdoaXRlc3BhY2UgcHJlY2VlZGlu
ZworLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0aGF0IHdl
IGNhbgorLy8gYWNjaWRlbnRhbGx5IHJlbW92ZSB3aGl0ZXNwYWNlIHdoZW4gdXBkYXRpbmcgYSBt
b3JwaC4KK3ZhciBtb3Zlc1doaXRlc3BhY2UgPSAoZnVuY3Rpb24oKSB7CisgIHZhciB0ZXN0RWwg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgdGVzdEVsLmlubmVySFRNTCA9ICJU
ZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+PC9zY3JpcHQ+VmFsdWUiOwor
ICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYmCisg
ICAgICAgICAgdGVzdEVsLmNoaWxkTm9kZXNbMl0ubm9kZVZhbHVlID09PSAnIFZhbHVlJzsKK30p
KCk7CisKKy8vIFVzZSB0aGlzIHRvIGZpbmQgY2hpbGRyZW4gYnkgSUQgaW5zdGVhZCBvZiB1c2lu
ZyBqUXVlcnkKK3ZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rpb24oZWxlbWVudCwgaWQpIHsKKyAg
aWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBpZCkgeyByZXR1cm4gZWxlbWVudDsg
fQorCisgIHZhciBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoLCBpZHgsIG5vZGUsIGZv
dW5kOworICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykgeworICAgIG5vZGUgPSBlbGVtZW50
LmNoaWxkTm9kZXNbaWR4XTsKKyAgICBmb3VuZCA9IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgZmlu
ZENoaWxkQnlJZChub2RlLCBpZCk7CisgICAgaWYgKGZvdW5kKSB7IHJldHVybiBmb3VuZDsgfQor
ICB9Cit9OworCit2YXIgc2V0SW5uZXJIVE1MV2l0aG91dEZpeCA9IGZ1bmN0aW9uKGVsZW1lbnQs
IGh0bWwpIHsKKyAgaWYgKG5lZWRzU2h5KSB7CisgICAgaHRtbCA9ICcmc2h5OycgKyBodG1sOwor
ICB9CisKKyAgdmFyIG1hdGNoZXMgPSBbXTsKKyAgaWYgKG1vdmVzV2hpdGVzcGFjZSkgeworICAg
IC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IGNoZWNrIGZvciBzY3JpcHQgdGFncyB3aXRoIGlkcyB3aXRo
IHRoZQorICAgIC8vIGdvYWwgb2YgdGFyZ2V0aW5nIG1vcnBocy4KKyAgICBodG1sID0gaHRtbC5y
ZXBsYWNlKC8oXHMrKSg8c2NyaXB0IGlkPScoW14nXSspJykvZywgZnVuY3Rpb24obWF0Y2gsIHNw
YWNlcywgdGFnLCBpZCkgeworICAgICAgbWF0Y2hlcy5wdXNoKFtpZCwgc3BhY2VzXSk7CisgICAg
ICByZXR1cm4gdGFnOworICAgIH0pOworICB9CisKKyAgZWxlbWVudC5pbm5lckhUTUwgPSBodG1s
OworCisgIC8vIElmIHdlIGhhdmUgdG8gZG8gYW55IHdoaXRlc3BhY2UgYWRqdXN0bWVudHMgZG8g
dGhlbSBub3cKKyAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkgeworICAgIHZhciBsZW4gPSBtYXRj
aGVzLmxlbmd0aCwgaWR4OworICAgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsrKSB7CisgICAg
ICB2YXIgc2NyaXB0ID0gZmluZENoaWxkQnlJZChlbGVtZW50LCBtYXRjaGVzW2lkeF1bMF0pLAor
ICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtYXRjaGVzW2lkeF1bMV0p
OworICAgICAgc2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHNjcmlwdCk7Cisg
ICAgfQorICB9CisKKyAgaWYgKG5lZWRzU2h5KSB7CisgICAgdmFyIHNoeUVsZW1lbnQgPSBlbGVt
ZW50LmZpcnN0Q2hpbGQ7CisgICAgd2hpbGUgKHNoeUVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYg
IXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKKyAgICAgIHNoeUVsZW1lbnQgPSBzaHlFbGVtZW50LmZp
cnN0Q2hpbGQ7CisgICAgfQorICAgIGlmIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAzICYmIHNo
eUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIpIHsKKyAgICAgIHNoeUVs
ZW1lbnQubm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFsdWUuc2xpY2UoMSk7CisgICAgfQor
ICB9Cit9OworCisvKioqIEVORCBNRVRBTU9SUEggSEVMUEVSUyAqLworCisKK3ZhciBpbm5lckhU
TUxUYWdzID0ge307Cit2YXIgY2FuU2V0SW5uZXJIVE1MID0gZnVuY3Rpb24odGFnTmFtZSkgewor
ICBpZiAoaW5uZXJIVE1MVGFnc1t0YWdOYW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJu
IGlubmVySFRNTFRhZ3NbdGFnTmFtZV07CisgIH0KKworICB2YXIgY2FuU2V0ID0gdHJ1ZTsKKwor
ICAvLyBJRSA4IGFuZCBlYXJsaWVyIGRvbid0IGFsbG93IHVzIHRvIGRvIGlubmVySFRNTCBvbiBz
ZWxlY3QKKyAgaWYgKHRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NlbGVjdCcpIHsKKyAgICB2
YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTsKKyAgICBzZXRJbm5lckhU
TUxXaXRob3V0Rml4KGVsLCAnPG9wdGlvbiB2YWx1ZT0idGVzdCI+VGVzdDwvb3B0aW9uPicpOwor
ICAgIGNhblNldCA9IGVsLm9wdGlvbnMubGVuZ3RoID09PSAxOworICB9CisKKyAgaW5uZXJIVE1M
VGFnc1t0YWdOYW1lXSA9IGNhblNldDsKKworICByZXR1cm4gY2FuU2V0OworfTsKKwordmFyIHNl
dElubmVySFRNTCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKKyAgdmFyIHRhZ05hbWUgPSBl
bGVtZW50LnRhZ05hbWU7CisKKyAgaWYgKGNhblNldElubmVySFRNTCh0YWdOYW1lKSkgeworICAg
IHNldElubmVySFRNTFdpdGhvdXRGaXgoZWxlbWVudCwgaHRtbCk7CisgIH0gZWxzZSB7CisgICAg
RW1iZXIuYXNzZXJ0KCJDYW4ndCBzZXQgaW5uZXJIVE1MIG9uICIrZWxlbWVudC50YWdOYW1lKyIg
aW4gdGhpcyBicm93c2VyIiwgZWxlbWVudC5vdXRlckhUTUwpOworCisgICAgdmFyIHN0YXJ0VGFn
ID0gZWxlbWVudC5vdXRlckhUTUwubWF0Y2gobmV3IFJlZ0V4cCgiPCIrdGFnTmFtZSsiKFtePl0q
KT4iLCAnaScpKVswXSwKKyAgICAgICAgZW5kVGFnID0gJzwvJyt0YWdOYW1lKyc+JzsKKworICAg
IHZhciB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgc2V0SW5u
ZXJIVE1MV2l0aG91dEZpeCh3cmFwcGVyLCBzdGFydFRhZyArIGh0bWwgKyBlbmRUYWcpOworICAg
IGVsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7CisgICAgd2hpbGUgKGVsZW1lbnQudGFnTmFt
ZSAhPT0gdGFnTmFtZSkgeworICAgICAgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Cisg
ICAgfQorICB9CisKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9OworCitmdW5jdGlvbiBpc1NpbXBsZUNs
aWNrKGV2ZW50KSB7CisgIHZhciBtb2RpZmllciA9IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1l
dGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXksCisgICAgICBzZWNvbmRhcnlD
bGljayA9IGV2ZW50LndoaWNoID4gMTsgLy8gSUU5IG1heSByZXR1cm4gdW5kZWZpbmVkCisKKyAg
cmV0dXJuICFtb2RpZmllciAmJiAhc2Vjb25kYXJ5Q2xpY2s7Cit9CisKK0VtYmVyLlZpZXdVdGls
cyA9IHsKKyAgc2V0SW5uZXJIVE1MOiBzZXRJbm5lckhUTUwsCisgIGlzU2ltcGxlQ2xpY2s6IGlz
U2ltcGxlQ2xpY2sKK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldDsKK3ZhciBpbmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMu
aW5kZXhPZjsKKworCisKKworCit2YXIgQ2xhc3NTZXQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5z
ZWVuID0ge307CisgIHRoaXMubGlzdCA9IFtdOworfTsKKworQ2xhc3NTZXQucHJvdG90eXBlID0g
eworICBhZGQ6IGZ1bmN0aW9uKHN0cmluZykgeworICAgIGlmIChzdHJpbmcgaW4gdGhpcy5zZWVu
KSB7IHJldHVybjsgfQorICAgIHRoaXMuc2VlbltzdHJpbmddID0gdHJ1ZTsKKworICAgIHRoaXMu
bGlzdC5wdXNoKHN0cmluZyk7CisgIH0sCisKKyAgdG9ET006IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzLmxpc3Quam9pbigiICIpOworICB9Cit9OworCisvKioKKyAgYEVtYmVyLlJlbmRl
ckJ1ZmZlcmAgZ2F0aGVycyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGEgdmlldyBhbmQgZ2Vu
ZXJhdGVzIHRoZQorICBmaW5hbCByZXByZXNlbnRhdGlvbi4gYEVtYmVyLlJlbmRlckJ1ZmZlcmAg
d2lsbCBnZW5lcmF0ZSBIVE1MIHdoaWNoIGNhbiBiZSBwdXNoZWQKKyAgdG8gdGhlIERPTS4KKwor
ICBAY2xhc3MgUmVuZGVyQnVmZmVyCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGNvbnN0cnVjdG9y
CisqLworRW1iZXIuUmVuZGVyQnVmZmVyID0gZnVuY3Rpb24odGFnTmFtZSkgeworICByZXR1cm4g
bmV3IEVtYmVyLl9SZW5kZXJCdWZmZXIodGFnTmFtZSk7Cit9OworCitFbWJlci5fUmVuZGVyQnVm
ZmVyID0gZnVuY3Rpb24odGFnTmFtZSkgeworICB0aGlzLnRhZ05hbWVzID0gW3RhZ05hbWUgfHwg
bnVsbF07CisgIHRoaXMuYnVmZmVyID0gW107Cit9OworCitFbWJlci5fUmVuZGVyQnVmZmVyLnBy
b3RvdHlwZSA9CisvKiogQHNjb3BlIEVtYmVyLlJlbmRlckJ1ZmZlci5wcm90b3R5cGUgKi8gewor
CisgIC8vIFRoZSByb290IHZpZXcncyBlbGVtZW50CisgIF9lbGVtZW50OiBudWxsLAorCisgIC8q
KgorICAgIEBwcml2YXRlCisKKyAgICBBbiBpbnRlcm5hbCBzZXQgdXNlZCB0byBkZS1kdXBlIGNs
YXNzIG5hbWVzIHdoZW4gYGFkZENsYXNzKClgIGlzCisgICAgdXNlZC4gQWZ0ZXIgZWFjaCBjYWxs
IHRvIGBhZGRDbGFzcygpYCwgdGhlIGBjbGFzc2VzYCBwcm9wZXJ0eQorICAgIHdpbGwgYmUgdXBk
YXRlZC4KKworICAgIEBwcm9wZXJ0eSBlbGVtZW50Q2xhc3NlcworICAgIEB0eXBlIEFycmF5Cisg
ICAgQGRlZmF1bHQgW10KKyAgKi8KKyAgZWxlbWVudENsYXNzZXM6IG51bGwsCisKKyAgLyoqCisg
ICAgQXJyYXkgb2YgY2xhc3MgbmFtZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGluIHRoZSBjbGFz
cyBhdHRyaWJ1dGUuCisKKyAgICBZb3UgY2FuIHVzZSBgc2V0Q2xhc3NlcygpYCB0byBzZXQgdGhp
cyBwcm9wZXJ0eSBkaXJlY3RseS4gSWYgeW91CisgICAgdXNlIGBhZGRDbGFzcygpYCwgaXQgd2ls
bCBiZSBtYWludGFpbmVkIGZvciB5b3UuCisKKyAgICBAcHJvcGVydHkgY2xhc3NlcworICAgIEB0
eXBlIEFycmF5CisgICAgQGRlZmF1bHQgW10KKyAgKi8KKyAgY2xhc3NlczogbnVsbCwKKworICAv
KioKKyAgICBUaGUgaWQgaW4gb2YgdGhlIGVsZW1lbnQsIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGlk
IGF0dHJpYnV0ZS4KKworICAgIFlvdSBzaG91bGQgbm90IHNldCB0aGlzIHByb3BlcnR5IHlvdXJz
ZWxmLCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCisgICAgdGhlIGBpZCgpYCBtZXRob2Qgb2YgYEVt
YmVyLlJlbmRlckJ1ZmZlcmAuCisKKyAgICBAcHJvcGVydHkgZWxlbWVudElkCisgICAgQHR5cGUg
U3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBlbGVtZW50SWQ6IG51bGwsCisKKyAg
LyoqCisgICAgQSBoYXNoIGtleWVkIG9uIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIHdo
b3NlIHZhbHVlIHdpbGwgYmUKKyAgICBhcHBsaWVkIHRvIHRoYXQgYXR0cmlidXRlLiBGb3IgZXhh
bXBsZSwgaWYgeW91IHdhbnRlZCB0byBhcHBseSBhCisgICAgYGRhdGEtdmlldz0iRm9vLmJhciJg
IHByb3BlcnR5IHRvIGFuIGVsZW1lbnQsIHlvdSB3b3VsZCBzZXQgdGhlCisgICAgZWxlbWVudEF0
dHJpYnV0ZXMgaGFzaCB0byBgeydkYXRhLXZpZXcnOidGb28uYmFyJ31gLgorCisgICAgWW91IHNo
b3VsZCBub3QgbWFpbnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxmLCByYXRoZXIsIHlvdSBzaG91bGQg
dXNlCisgICAgdGhlIGBhdHRyKClgIG1ldGhvZCBvZiBgRW1iZXIuUmVuZGVyQnVmZmVyYC4KKwor
ICAgIEBwcm9wZXJ0eSBlbGVtZW50QXR0cmlidXRlcworICAgIEB0eXBlIEhhc2gKKyAgICBAZGVm
YXVsdCB7fQorICAqLworICBlbGVtZW50QXR0cmlidXRlczogbnVsbCwKKworICAvKioKKyAgICBB
IGhhc2gga2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnRpZXMgYW5kIHdob3NlIHZhbHVl
IHdpbGwgYmUKKyAgICBhcHBsaWVkIHRvIHRoYXQgcHJvcGVydHkuIEZvciBleGFtcGxlLCBpZiB5
b3Ugd2FudGVkIHRvIGFwcGx5IGEKKyAgICBgY2hlY2tlZD10cnVlYCBwcm9wZXJ0eSB0byBhbiBl
bGVtZW50LCB5b3Ugd291bGQgc2V0IHRoZQorICAgIGVsZW1lbnRQcm9wZXJ0aWVzIGhhc2ggdG8g
YHsnY2hlY2tlZCc6dHJ1ZX1gLgorCisgICAgWW91IHNob3VsZCBub3QgbWFpbnRhaW4gdGhpcyBo
YXNoIHlvdXJzZWxmLCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCisgICAgdGhlIGBwcm9wKClgIG1l
dGhvZCBvZiBgRW1iZXIuUmVuZGVyQnVmZmVyYC4KKworICAgIEBwcm9wZXJ0eSBlbGVtZW50UHJv
cGVydGllcworICAgIEB0eXBlIEhhc2gKKyAgICBAZGVmYXVsdCB7fQorICAqLworICBlbGVtZW50
UHJvcGVydGllczogbnVsbCwKKworICAvKioKKyAgICBUaGUgdGFnbmFtZSBvZiB0aGUgZWxlbWVu
dCBhbiBpbnN0YW5jZSBvZiBgRW1iZXIuUmVuZGVyQnVmZmVyYCByZXByZXNlbnRzLgorCisgICAg
VXN1YWxseSwgdGhpcyBnZXRzIHNldCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIGBFbWJlci5S
ZW5kZXJCdWZmZXJgLiBGb3IKKyAgICBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGNyZWF0ZSBh
IGBwYCB0YWcsIHRoZW4geW91IHdvdWxkIGNhbGwKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBF
bWJlci5SZW5kZXJCdWZmZXIoJ3AnKQorICAgIGBgYAorCisgICAgQHByb3BlcnR5IGVsZW1lbnRU
YWcKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCBudWxsCisgICovCisgIGVsZW1lbnRU
YWc6IG51bGwsCisKKyAgLyoqCisgICAgQSBoYXNoIGtleWVkIG9uIHRoZSBuYW1lIG9mIHRoZSBz
dHlsZSBhdHRyaWJ1dGUgYW5kIHdob3NlIHZhbHVlIHdpbGwKKyAgICBiZSBhcHBsaWVkIHRvIHRo
YXQgYXR0cmlidXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBhcHBseSBhCisgICAg
YGJhY2tncm91bmQtY29sb3I6YmxhY2s7YCBzdHlsZSB0byBhbiBlbGVtZW50LCB5b3Ugd291bGQg
c2V0IHRoZQorICAgIGVsZW1lbnRTdHlsZSBoYXNoIHRvIGB7J2JhY2tncm91bmQtY29sb3InOidi
bGFjayd9YC4KKworICAgIFlvdSBzaG91bGQgbm90IG1haW50YWluIHRoaXMgaGFzaCB5b3Vyc2Vs
ZiwgcmF0aGVyLCB5b3Ugc2hvdWxkIHVzZQorICAgIHRoZSBgc3R5bGUoKWAgbWV0aG9kIG9mIGBF
bWJlci5SZW5kZXJCdWZmZXJgLgorCisgICAgQHByb3BlcnR5IGVsZW1lbnRTdHlsZQorICAgIEB0
eXBlIEhhc2gKKyAgICBAZGVmYXVsdCB7fQorICAqLworICBlbGVtZW50U3R5bGU6IG51bGwsCisK
KyAgLyoqCisgICAgTmVzdGVkIGBSZW5kZXJCdWZmZXJzYCB3aWxsIHNldCB0aGlzIHRvIHRoZWly
IHBhcmVudCBgUmVuZGVyQnVmZmVyYAorICAgIGluc3RhbmNlLgorCisgICAgQHByb3BlcnR5IHBh
cmVudEJ1ZmZlcgorICAgIEB0eXBlIEVtYmVyLl9SZW5kZXJCdWZmZXIKKyAgKi8KKyAgcGFyZW50
QnVmZmVyOiBudWxsLAorCisgIC8qKgorICAgIEFkZHMgYSBzdHJpbmcgb2YgSFRNTCB0byB0aGUg
YFJlbmRlckJ1ZmZlcmAuCisKKyAgICBAbWV0aG9kIHB1c2gKKyAgICBAcGFyYW0ge1N0cmluZ30g
c3RyaW5nIEhUTUwgdG8gcHVzaCBpbnRvIHRoZSBidWZmZXIKKyAgICBAY2hhaW5hYmxlCisgICov
CisgIHB1c2g6IGZ1bmN0aW9uKHN0cmluZykgeworICAgIHRoaXMuYnVmZmVyLnB1c2goc3RyaW5n
KTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBBZGRzIGEgY2xhc3MgdG8g
dGhlIGJ1ZmZlciwgd2hpY2ggd2lsbCBiZSByZW5kZXJlZCB0byB0aGUgY2xhc3MgYXR0cmlidXRl
LgorCisgICAgQG1ldGhvZCBhZGRDbGFzcworICAgIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUg
Q2xhc3MgbmFtZSB0byBhZGQgdG8gdGhlIGJ1ZmZlcgorICAgIEBjaGFpbmFibGUKKyAgKi8KKyAg
YWRkQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSkgeworICAgIC8vIGxhemlseSBjcmVhdGUgZWxl
bWVudENsYXNzZXMKKyAgICB2YXIgZWxlbWVudENsYXNzZXMgPSB0aGlzLmVsZW1lbnRDbGFzc2Vz
ID0gKHRoaXMuZWxlbWVudENsYXNzZXMgfHwgbmV3IENsYXNzU2V0KCkpOworICAgIHRoaXMuZWxl
bWVudENsYXNzZXMuYWRkKGNsYXNzTmFtZSk7CisgICAgdGhpcy5jbGFzc2VzID0gdGhpcy5lbGVt
ZW50Q2xhc3Nlcy5saXN0OworCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgc2V0Q2xhc3Nl
czogZnVuY3Rpb24oY2xhc3NOYW1lcykgeworICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzTmFtZXM7
CisgIH0sCisKKyAgLyoqCisgICAgU2V0cyB0aGUgZWxlbWVudElEIHRvIGJlIHVzZWQgZm9yIHRo
ZSBlbGVtZW50LgorCisgICAgQG1ldGhvZCBpZAorICAgIEBwYXJhbSB7U3RyaW5nfSBpZAorICAg
IEBjaGFpbmFibGUKKyAgKi8KKyAgaWQ6IGZ1bmN0aW9uKGlkKSB7CisgICAgdGhpcy5lbGVtZW50
SWQgPSBpZDsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvLyBkdWNrIHR5cGUgYXR0cmli
dXRlIGZ1bmN0aW9uYWxpdHkgbGlrZSBqUXVlcnkgc28gYSByZW5kZXIgYnVmZmVyCisgIC8vIGNh
biBiZSB1c2VkIGxpa2UgYSBqUXVlcnkgb2JqZWN0IGluIGF0dHJpYnV0ZSBiaW5kaW5nIHNjZW5h
cmlvcy4KKworICAvKioKKyAgICBBZGRzIGFuIGF0dHJpYnV0ZSB3aGljaCB3aWxsIGJlIHJlbmRl
cmVkIHRvIHRoZSBlbGVtZW50LgorCisgICAgQG1ldGhvZCBhdHRyCisgICAgQHBhcmFtIHtTdHJp
bmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgIEBwYXJhbSB7U3RyaW5nfSB2
YWx1ZSBUaGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBhdHRyaWJ1dGUKKyAgICBAY2hhaW5hYmxlCisg
ICAgQHJldHVybiB7RW1iZXIuUmVuZGVyQnVmZmVyfFN0cmluZ30gdGhpcyBvciB0aGUgY3VycmVu
dCBhdHRyaWJ1dGUgdmFsdWUKKyAgKi8KKyAgYXR0cjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsK
KyAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSAodGhpcy5lbGVt
ZW50QXR0cmlidXRlcyB8fCB7fSk7CisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkg
eworICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNbbmFtZV07CisgICAgfSBlbHNlIHsKKyAgICAgIGF0
dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwK
KworICAvKioKKyAgICBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmli
dXRlcyB0byByZW5kZXIuCisKKyAgICBAbWV0aG9kIHJlbW92ZUF0dHIKKyAgICBAcGFyYW0ge1N0
cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgQGNoYWluYWJsZQorICAq
LworICByZW1vdmVBdHRyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIGF0dHJpYnV0ZXMgPSB0
aGlzLmVsZW1lbnRBdHRyaWJ1dGVzOworICAgIGlmIChhdHRyaWJ1dGVzKSB7IGRlbGV0ZSBhdHRy
aWJ1dGVzW25hbWVdOyB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBB
ZGRzIGFuIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCisK
KyAgICBAbWV0aG9kIHByb3AKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0
aGUgcHJvcGVydHkKKyAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCB0
byB0aGUgcHJvcGVydHkKKyAgICBAY2hhaW5hYmxlCisgICAgQHJldHVybiB7RW1iZXIuUmVuZGVy
QnVmZmVyfFN0cmluZ30gdGhpcyBvciB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZQorICAqLwor
ICBwcm9wOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgeworICAgIHZhciBwcm9wZXJ0aWVzID0gdGhp
cy5lbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzIHx8IHt9KTsKKwor
ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICByZXR1cm4gcHJvcGVydGll
c1tuYW1lXTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvcGVydGllc1tuYW1lXSA9IHZhbHVlOwor
ICAgIH0KKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIFJlbW92ZSBhbiBw
cm9wZXJ0eSBmcm9tIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgdG8gcmVuZGVyLgorCisgICAgQG1l
dGhvZCByZW1vdmVQcm9wCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhl
IHByb3BlcnR5CisgICAgQGNoYWluYWJsZQorICAqLworICByZW1vdmVQcm9wOiBmdW5jdGlvbihu
YW1lKSB7CisgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzOworICAg
IGlmIChwcm9wZXJ0aWVzKSB7IGRlbGV0ZSBwcm9wZXJ0aWVzW25hbWVdOyB9CisKKyAgICByZXR1
cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBBZGRzIGEgc3R5bGUgdG8gdGhlIHN0eWxlIGF0
dHJpYnV0ZSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBlbGVtZW50LgorCisgICAgQG1l
dGhvZCBzdHlsZQorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHN0eWxlCisg
ICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlCisgICAgQGNoYWluYWJsZQorICAqLworICBzdHlsZTog
ZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKKyAgICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnRTdHls
ZSA9ICh0aGlzLmVsZW1lbnRTdHlsZSB8fCB7fSk7CisKKyAgICB0aGlzLmVsZW1lbnRTdHlsZVtu
YW1lXSA9IHZhbHVlOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIGJlZ2luOiBmdW5jdGlv
bih0YWdOYW1lKSB7CisgICAgdGhpcy50YWdOYW1lcy5wdXNoKHRhZ05hbWUgfHwgbnVsbCk7Cisg
ICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgcHVzaE9wZW5pbmdUYWc6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciB0YWdOYW1lID0gdGhpcy5jdXJyZW50VGFnTmFtZSgpOworICAgIGlmICghdGFnTmFt
ZSkgeyByZXR1cm47IH0KKworICAgIGlmICghdGhpcy5fZWxlbWVudCAmJiB0aGlzLmJ1ZmZlci5s
ZW5ndGggPT09IDApIHsKKyAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLmdlbmVyYXRlRWxlbWVu
dCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZl
ciwKKyAgICAgICAgaWQgPSB0aGlzLmVsZW1lbnRJZCwKKyAgICAgICAgY2xhc3NlcyA9IHRoaXMu
Y2xhc3NlcywKKyAgICAgICAgYXR0cnMgPSB0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzLAorICAgICAg
ICBwcm9wcyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXMsCisgICAgICAgIHN0eWxlID0gdGhpcy5l
bGVtZW50U3R5bGUsCisgICAgICAgIGF0dHIsIHByb3A7CisKKyAgICBidWZmZXIucHVzaCgnPCcg
KyB0YWdOYW1lKTsKKworICAgIGlmIChpZCkgeworICAgICAgYnVmZmVyLnB1c2goJyBpZD0iJyAr
IHRoaXMuX2VzY2FwZUF0dHJpYnV0ZShpZCkgKyAnIicpOworICAgICAgdGhpcy5lbGVtZW50SWQg
PSBudWxsOworICAgIH0KKyAgICBpZiAoY2xhc3NlcykgeworICAgICAgYnVmZmVyLnB1c2goJyBj
bGFzcz0iJyArIHRoaXMuX2VzY2FwZUF0dHJpYnV0ZShjbGFzc2VzLmpvaW4oJyAnKSkgKyAnIicp
OworICAgICAgdGhpcy5jbGFzc2VzID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoc3R5bGUpIHsK
KyAgICAgIGJ1ZmZlci5wdXNoKCcgc3R5bGU9IicpOworCisgICAgICBmb3IgKHByb3AgaW4gc3R5
bGUpIHsKKyAgICAgICAgaWYgKHN0eWxlLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICAg
ICAgYnVmZmVyLnB1c2gocHJvcCArICc6JyArIHRoaXMuX2VzY2FwZUF0dHJpYnV0ZShzdHlsZVtw
cm9wXSkgKyAnOycpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJ1ZmZlci5wdXNoKCci
Jyk7CisKKyAgICAgIHRoaXMuZWxlbWVudFN0eWxlID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAo
YXR0cnMpIHsKKyAgICAgIGZvciAoYXR0ciBpbiBhdHRycykgeworICAgICAgICBpZiAoYXR0cnMu
aGFzT3duUHJvcGVydHkoYXR0cikpIHsKKyAgICAgICAgICBidWZmZXIucHVzaCgnICcgKyBhdHRy
ICsgJz0iJyArIHRoaXMuX2VzY2FwZUF0dHJpYnV0ZShhdHRyc1thdHRyXSkgKyAnIicpOworICAg
ICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwor
ICAgIH0KKworICAgIGlmIChwcm9wcykgeworICAgICAgZm9yIChwcm9wIGluIHByb3BzKSB7Cisg
ICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICAgIHZhciB2
YWx1ZSA9IHByb3BzW3Byb3BdOworICAgICAgICAgIGlmICh2YWx1ZSB8fCB0eXBlb2YodmFsdWUp
ID09PSAnbnVtYmVyJykgeworICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7CisgICAg
ICAgICAgICAgIGJ1ZmZlci5wdXNoKCcgJyArIHByb3AgKyAnPSInICsgcHJvcCArICciJyk7Cisg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBidWZmZXIucHVzaCgnICcgKyBwcm9w
ICsgJz0iJyArIHRoaXMuX2VzY2FwZUF0dHJpYnV0ZShwcm9wc1twcm9wXSkgKyAnIicpOworICAg
ICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlz
LmVsZW1lbnRQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICB9CisKKyAgICBidWZmZXIucHVzaCgnPicp
OworICB9LAorCisgIHB1c2hDbG9zaW5nVGFnOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdGFnTmFt
ZSA9IHRoaXMudGFnTmFtZXMucG9wKCk7CisgICAgaWYgKHRhZ05hbWUpIHsgdGhpcy5idWZmZXIu
cHVzaCgnPC8nICsgdGFnTmFtZSArICc+Jyk7IH0KKyAgfSwKKworICBjdXJyZW50VGFnTmFtZTog
ZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMudGFnTmFtZXNbdGhpcy50YWdOYW1lcy5sZW5n
dGgtMV07CisgIH0sCisKKyAgZ2VuZXJhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
dGFnTmFtZSA9IHRoaXMudGFnTmFtZXMucG9wKCksIC8vIHBvcCBzaW5jZSB3ZSBkb24ndCBuZWVk
IHRvIGNsb3NlCisgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05h
bWUpLAorICAgICAgICAkZWxlbWVudCA9IEVtYmVyLiQoZWxlbWVudCksCisgICAgICAgIGlkID0g
dGhpcy5lbGVtZW50SWQsCisgICAgICAgIGNsYXNzZXMgPSB0aGlzLmNsYXNzZXMsCisgICAgICAg
IGF0dHJzID0gdGhpcy5lbGVtZW50QXR0cmlidXRlcywKKyAgICAgICAgcHJvcHMgPSB0aGlzLmVs
ZW1lbnRQcm9wZXJ0aWVzLAorICAgICAgICBzdHlsZSA9IHRoaXMuZWxlbWVudFN0eWxlLAorICAg
ICAgICBzdHlsZUJ1ZmZlciA9ICcnLCBhdHRyLCBwcm9wOworCisgICAgaWYgKGlkKSB7CisgICAg
ICAkZWxlbWVudC5hdHRyKCdpZCcsIGlkKTsKKyAgICAgIHRoaXMuZWxlbWVudElkID0gbnVsbDsK
KyAgICB9CisgICAgaWYgKGNsYXNzZXMpIHsKKyAgICAgICRlbGVtZW50LmF0dHIoJ2NsYXNzJywg
Y2xhc3Nlcy5qb2luKCcgJykpOworICAgICAgdGhpcy5jbGFzc2VzID0gbnVsbDsKKyAgICB9CisK
KyAgICBpZiAoc3R5bGUpIHsKKyAgICAgIGZvciAocHJvcCBpbiBzdHlsZSkgeworICAgICAgICBp
ZiAoc3R5bGUuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgICAgICBzdHlsZUJ1ZmZlciAr
PSAocHJvcCArICc6JyArIHN0eWxlW3Byb3BdICsgJzsnKTsKKyAgICAgICAgfQorICAgICAgfQor
CisgICAgICAkZWxlbWVudC5hdHRyKCdzdHlsZScsIHN0eWxlQnVmZmVyKTsKKworICAgICAgdGhp
cy5lbGVtZW50U3R5bGUgPSBudWxsOworICAgIH0KKworICAgIGlmIChhdHRycykgeworICAgICAg
Zm9yIChhdHRyIGluIGF0dHJzKSB7CisgICAgICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShh
dHRyKSkgeworICAgICAgICAgICRlbGVtZW50LmF0dHIoYXR0ciwgYXR0cnNbYXR0cl0pOworICAg
ICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwor
ICAgIH0KKworICAgIGlmIChwcm9wcykgeworICAgICAgZm9yIChwcm9wIGluIHByb3BzKSB7Cisg
ICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICAgICRlbGVt
ZW50LnByb3AocHJvcCwgcHJvcHNbcHJvcF0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAg
IHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBlbGVt
ZW50OworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgZWxlbWVudAorICAgIEByZXR1cm4ge0RP
TUVsZW1lbnR9IFRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBIVE1M
CisgICAgICBvZiB0aGlzIGJ1ZmZlcgorICAqLworICBlbGVtZW50OiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgaHRtbCA9IHRoaXMuaW5uZXJTdHJpbmcoKTsKKworICAgIGlmIChodG1sKSB7CisgICAg
ICB0aGlzLl9lbGVtZW50ID0gRW1iZXIuVmlld1V0aWxzLnNldElubmVySFRNTCh0aGlzLl9lbGVt
ZW50LCBodG1sKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fZWxlbWVudDsKKyAgfSwKKwor
ICAvKioKKyAgICBHZW5lcmF0ZXMgdGhlIEhUTUwgY29udGVudCBmb3IgdGhpcyBidWZmZXIuCisK
KyAgICBAbWV0aG9kIHN0cmluZworICAgIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBI
VE1MCisgICovCisgIHN0cmluZzogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX2VsZW1lbnQp
IHsKKyAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQoKS5vdXRlckhUTUw7CisgICAgfSBlbHNlIHsK
KyAgICAgIHJldHVybiB0aGlzLmlubmVyU3RyaW5nKCk7CisgICAgfQorICB9LAorCisgIGlubmVy
U3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5idWZmZXIuam9pbignJyk7Cisg
IH0sCisKKyAgX2VzY2FwZUF0dHJpYnV0ZTogZnVuY3Rpb24odmFsdWUpIHsKKyAgICAvLyBTdG9s
ZW4gc2hhbWVsZXNzbHkgZnJvbSBIYW5kbGViYXJzCisKKyAgICB2YXIgZXNjYXBlID0geworICAg
ICAgIjwiOiAiJmx0OyIsCisgICAgICAiPiI6ICImZ3Q7IiwKKyAgICAgICciJzogIiZxdW90OyIs
CisgICAgICAiJyI6ICImI3gyNzsiLAorICAgICAgImAiOiAiJiN4NjA7IgorICAgIH07CisKKyAg
ICB2YXIgYmFkQ2hhcnMgPSAvJig/IVx3KzspfFs8PiInYF0vZzsKKyAgICB2YXIgcG9zc2libGUg
PSAvWyY8PiInYF0vOworCisgICAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihjaHIpIHsKKyAg
ICAgIHJldHVybiBlc2NhcGVbY2hyXSB8fCAiJmFtcDsiOworICAgIH07CisKKyAgICB2YXIgc3Ry
aW5nID0gdmFsdWUudG9TdHJpbmcoKTsKKworICAgIGlmKCFwb3NzaWJsZS50ZXN0KHN0cmluZykp
IHsgcmV0dXJuIHN0cmluZzsgfQorICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywg
ZXNjYXBlQ2hhcik7CisgIH0KKworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8q
KgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci12aWV3cworKi8KKwordmFyIGdldCA9
IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OworCisv
KioKKyAgYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgaGFuZGxlcyBkZWxlZ2F0aW5nIGJyb3dzZXIg
ZXZlbnRzIHRvIHRoZWlyCisgIGNvcnJlc3BvbmRpbmcgYEVtYmVyLlZpZXdzLmAgRm9yIGV4YW1w
bGUsIHdoZW4geW91IGNsaWNrIG9uIGEgdmlldywKKyAgYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAg
ZW5zdXJlcyB0aGF0IHRoYXQgdmlldydzIGBtb3VzZURvd25gIG1ldGhvZCBnZXRzCisgIGNhbGxl
ZC4KKworICBAY2xhc3MgRXZlbnREaXNwYXRjaGVyCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQHBy
aXZhdGUKKyAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisqLworRW1iZXIuRXZlbnREaXNwYXRjaGVy
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCgKKy8qKiBAc2NvcGUgRW1iZXIuRXZlbnREaXNwYXRjaGVy
LnByb3RvdHlwZSAqL3sKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgVGhlIHJvb3QgRE9N
IGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNob3VsZCBiZSBhdHRhY2hlZC4gRXZl
bnQKKyAgICBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQgdW5sZXNz
IHRoaXMgaXMgb3ZlcnJpZGRlbi4KKworICAgIENhbiBiZSBzcGVjaWZpZWQgYXMgYSBET01FbGVt
ZW50IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgorCisgICAgVGhlIGRlZmF1bHQgYm9keSBpcyBhIHN0
cmluZyBzaW5jZSB0aGlzIG1heSBiZSBldmFsdWF0ZWQgYmVmb3JlIGRvY3VtZW50LmJvZHkKKyAg
ICBleGlzdHMgaW4gdGhlIERPTS4KKworICAgIEBwcm9wZXJ0eSByb290RWxlbWVudAorICAgIEB0
eXBlIERPTUVsZW1lbnQKKyAgICBAZGVmYXVsdCAnYm9keScKKyAgKi8KKyAgcm9vdEVsZW1lbnQ6
ICdib2R5JywKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgU2V0cyB1cCBldmVudCBsaXN0
ZW5lcnMgZm9yIHN0YW5kYXJkIGJyb3dzZXIgZXZlbnRzLgorCisgICAgVGhpcyB3aWxsIGJlIGNh
bGxlZCBhZnRlciB0aGUgYnJvd3NlciBzZW5kcyBhIGBET01Db250ZW50UmVhZHlgIGV2ZW50LiBC
eQorICAgIGRlZmF1bHQsIGl0IHdpbGwgc2V0IHVwIGFsbCBvZiB0aGUgbGlzdGVuZXJzIG9uIHRo
ZSBkb2N1bWVudCBib2R5LiBJZiB5b3UKKyAgICB3b3VsZCBsaWtlIHRvIHJlZ2lzdGVyIHRoZSBs
aXN0ZW5lcnMgb24gYSBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoZSBldmVudAorICAgIGRpc3Bh
dGNoZXIncyBgcm9vdGAgcHJvcGVydHkuCisKKyAgICBAbWV0aG9kIHNldHVwCisgICAgQHBhcmFt
IGFkZGVkRXZlbnRzIHtIYXNofQorICAqLworICBzZXR1cDogZnVuY3Rpb24oYWRkZWRFdmVudHMp
IHsKKyAgICB2YXIgZXZlbnQsIGV2ZW50cyA9IHsKKyAgICAgIHRvdWNoc3RhcnQgIDogJ3RvdWNo
U3RhcnQnLAorICAgICAgdG91Y2htb3ZlICAgOiAndG91Y2hNb3ZlJywKKyAgICAgIHRvdWNoZW5k
ICAgIDogJ3RvdWNoRW5kJywKKyAgICAgIHRvdWNoY2FuY2VsIDogJ3RvdWNoQ2FuY2VsJywKKyAg
ICAgIGtleWRvd24gICAgIDogJ2tleURvd24nLAorICAgICAga2V5dXAgICAgICAgOiAna2V5VXAn
LAorICAgICAga2V5cHJlc3MgICAgOiAna2V5UHJlc3MnLAorICAgICAgbW91c2Vkb3duICAgOiAn
bW91c2VEb3duJywKKyAgICAgIG1vdXNldXAgICAgIDogJ21vdXNlVXAnLAorICAgICAgY29udGV4
dG1lbnUgOiAnY29udGV4dE1lbnUnLAorICAgICAgY2xpY2sgICAgICAgOiAnY2xpY2snLAorICAg
ICAgZGJsY2xpY2sgICAgOiAnZG91YmxlQ2xpY2snLAorICAgICAgbW91c2Vtb3ZlICAgOiAnbW91
c2VNb3ZlJywKKyAgICAgIGZvY3VzaW4gICAgIDogJ2ZvY3VzSW4nLAorICAgICAgZm9jdXNvdXQg
ICAgOiAnZm9jdXNPdXQnLAorICAgICAgbW91c2VlbnRlciAgOiAnbW91c2VFbnRlcicsCisgICAg
ICBtb3VzZWxlYXZlICA6ICdtb3VzZUxlYXZlJywKKyAgICAgIHN1Ym1pdCAgICAgIDogJ3N1Ym1p
dCcsCisgICAgICBpbnB1dCAgICAgICA6ICdpbnB1dCcsCisgICAgICBjaGFuZ2UgICAgICA6ICdj
aGFuZ2UnLAorICAgICAgZHJhZ3N0YXJ0ICAgOiAnZHJhZ1N0YXJ0JywKKyAgICAgIGRyYWcgICAg
ICAgIDogJ2RyYWcnLAorICAgICAgZHJhZ2VudGVyICAgOiAnZHJhZ0VudGVyJywKKyAgICAgIGRy
YWdsZWF2ZSAgIDogJ2RyYWdMZWF2ZScsCisgICAgICBkcmFnb3ZlciAgICA6ICdkcmFnT3Zlcics
CisgICAgICBkcm9wICAgICAgICA6ICdkcm9wJywKKyAgICAgIGRyYWdlbmQgICAgIDogJ2RyYWdF
bmQnCisgICAgfTsKKworICAgIEVtYmVyLiQuZXh0ZW5kKGV2ZW50cywgYWRkZWRFdmVudHMgfHwg
e30pOworCisgICAgdmFyIHJvb3RFbGVtZW50ID0gRW1iZXIuJChnZXQodGhpcywgJ3Jvb3RFbGVt
ZW50JykpOworCisgICAgRW1iZXIuYXNzZXJ0KGZtdCgnWW91IGNhbm5vdCB1c2UgdGhlIHNhbWUg
cm9vdCBlbGVtZW50ICglQCkgbXVsdGlwbGUgdGltZXMgaW4gYW4gRW1iZXIuQXBwbGljYXRpb24n
LCBbcm9vdEVsZW1lbnQuc2VsZWN0b3IgfHwgcm9vdEVsZW1lbnRbMF0udGFnTmFtZV0pLCAhcm9v
dEVsZW1lbnQuaXMoJy5lbWJlci1hcHBsaWNhdGlvbicpKTsKKyAgICBFbWJlci5hc3NlcnQoJ1lv
dSBjYW5ub3QgbWFrZSBhIG5ldyBFbWJlci5BcHBsaWNhdGlvbiB1c2luZyBhIHJvb3QgZWxlbWVu
dCB0aGF0IGlzIGEgZGVzY2VuZGVudCBvZiBhbiBleGlzdGluZyBFbWJlci5BcHBsaWNhdGlvbics
ICFyb290RWxlbWVudC5jbG9zZXN0KCcuZW1iZXItYXBwbGljYXRpb24nKS5sZW5ndGgpOworICAg
IEVtYmVyLmFzc2VydCgnWW91IGNhbm5vdCBtYWtlIGEgbmV3IEVtYmVyLkFwcGxpY2F0aW9uIHVz
aW5nIGEgcm9vdCBlbGVtZW50IHRoYXQgaXMgYW4gYW5jZXN0b3Igb2YgYW4gZXhpc3RpbmcgRW1i
ZXIuQXBwbGljYXRpb24nLCAhcm9vdEVsZW1lbnQuZmluZCgnLmVtYmVyLWFwcGxpY2F0aW9uJyku
bGVuZ3RoKTsKKworICAgIHJvb3RFbGVtZW50LmFkZENsYXNzKCdlbWJlci1hcHBsaWNhdGlvbicp
OworCisgICAgRW1iZXIuYXNzZXJ0KCdVbmFibGUgdG8gYWRkICJlbWJlci1hcHBsaWNhdGlvbiIg
Y2xhc3MgdG8gcm9vdEVsZW1lbnQuIE1ha2Ugc3VyZSB5b3Ugc2V0IHJvb3RFbGVtZW50IHRvIHRo
ZSBib2R5IG9yIGFuIGVsZW1lbnQgaW4gdGhlIGJvZHkuJywgcm9vdEVsZW1lbnQuaXMoJy5lbWJl
ci1hcHBsaWNhdGlvbicpKTsKKworICAgIGZvciAoZXZlbnQgaW4gZXZlbnRzKSB7CisgICAgICBp
ZiAoZXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkgeworICAgICAgICB0aGlzLnNldHVwSGFu
ZGxlcihyb290RWxlbWVudCwgZXZlbnQsIGV2ZW50c1tldmVudF0pOworICAgICAgfQorICAgIH0K
KyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgUmVnaXN0ZXJzIGFuIGV2ZW50IGxp
c3RlbmVyIG9uIHRoZSBkb2N1bWVudC4gSWYgdGhlIGdpdmVuIGV2ZW50IGlzCisgICAgdHJpZ2dl
cmVkLCB0aGUgcHJvdmlkZWQgZXZlbnQgaGFuZGxlciB3aWxsIGJlIHRyaWdnZXJlZCBvbiB0aGUg
dGFyZ2V0IHZpZXcuCisKKyAgICBJZiB0aGUgdGFyZ2V0IHZpZXcgZG9lcyBub3QgaW1wbGVtZW50
IHRoZSBldmVudCBoYW5kbGVyLCBvciBpZiB0aGUgaGFuZGxlcgorICAgIHJldHVybnMgYGZhbHNl
YCwgdGhlIHBhcmVudCB2aWV3IHdpbGwgYmUgY2FsbGVkLiBUaGUgZXZlbnQgd2lsbCBjb250aW51
ZSB0bworICAgIGJ1YmJsZSB0byBlYWNoIHN1Y2Nlc3NpdmUgcGFyZW50IHZpZXcgdW50aWwgaXQg
cmVhY2hlcyB0aGUgdG9wLgorCisgICAgRm9yIGV4YW1wbGUsIHRvIGhhdmUgdGhlIGBtb3VzZURv
d25gIG1ldGhvZCBjYWxsZWQgb24gdGhlIHRhcmdldCB2aWV3IHdoZW4KKyAgICBhIGBtb3VzZWRv
d25gIGV2ZW50IGlzIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dzZXIsIGRvIHRoZSBmb2xsb3dpbmc6
CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgc2V0dXBIYW5kbGVyKCdtb3VzZWRvd24nLCAnbW91
c2VEb3duJyk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIHNldHVwSGFuZGxlcgorICAgIEBwYXJh
bSB7RWxlbWVudH0gcm9vdEVsZW1lbnQKKyAgICBAcGFyYW0ge1N0cmluZ30gZXZlbnQgdGhlIGJy
b3dzZXItb3JpZ2luYXRlZCBldmVudCB0byBsaXN0ZW4gdG8KKyAgICBAcGFyYW0ge1N0cmluZ30g
ZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdmlldworICAq
LworICBzZXR1cEhhbmRsZXI6IGZ1bmN0aW9uKHJvb3RFbGVtZW50LCBldmVudCwgZXZlbnROYW1l
KSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworCisgICAgcm9vdEVsZW1lbnQuZGVsZWdhdGUoJy5l
bWJlci12aWV3JywgZXZlbnQgKyAnLmVtYmVyJywgZnVuY3Rpb24oZXZ0LCB0cmlnZ2VyaW5nTWFu
YWdlcikgeworICAgICAgcmV0dXJuIEVtYmVyLmhhbmRsZUVycm9ycyhmdW5jdGlvbigpIHsKKyAg
ICAgICAgdmFyIHZpZXcgPSBFbWJlci5WaWV3LnZpZXdzW3RoaXMuaWRdLAorICAgICAgICAgICAg
cmVzdWx0ID0gdHJ1ZSwgbWFuYWdlciA9IG51bGw7CisKKyAgICAgICAgbWFuYWdlciA9IHNlbGYu
X2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyKHZpZXcsZXZlbnROYW1lKTsKKworICAgICAgICBpZiAo
bWFuYWdlciAmJiBtYW5hZ2VyICE9PSB0cmlnZ2VyaW5nTWFuYWdlcikgeworICAgICAgICAgIHJl
c3VsdCA9IHNlbGYuX2Rpc3BhdGNoRXZlbnQobWFuYWdlciwgZXZ0LCBldmVudE5hbWUsIHZpZXcp
OworICAgICAgICB9IGVsc2UgaWYgKHZpZXcpIHsKKyAgICAgICAgICByZXN1bHQgPSBzZWxmLl9i
dWJibGVFdmVudCh2aWV3LGV2dCxldmVudE5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgICB9LCB0aGlzKTsKKyAgICB9KTsKKworICAgIHJvb3RFbGVtZW50LmRlbGVn
YXRlKCdbZGF0YS1lbWJlci1hY3Rpb25dJywgZXZlbnQgKyAnLmVtYmVyJywgZnVuY3Rpb24oZXZ0
KSB7CisgICAgICByZXR1cm4gRW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uKCkgeworICAgICAg
ICB2YXIgYWN0aW9uSWQgPSBFbWJlci4kKGV2dC5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWVt
YmVyLWFjdGlvbicpLAorICAgICAgICAgICAgYWN0aW9uICAgPSBFbWJlci5IYW5kbGViYXJzLkFj
dGlvbkhlbHBlci5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF07CisKKyAgICAgICAgLy8gV2Ug
aGF2ZSB0byBjaGVjayBmb3IgYWN0aW9uIGhlcmUgc2luY2UgaW4gc29tZSBjYXNlcywgalF1ZXJ5
IHdpbGwgdHJpZ2dlcgorICAgICAgICAvLyBhbiBldmVudCBvbiBgcmVtb3ZlQ2hpbGRgIChpLmUu
IGZvY3Vzb3V0KSBhZnRlciB3ZSd2ZSBhbHJlYWR5IHRvcm4gZG93biB0aGUKKyAgICAgICAgLy8g
YWN0aW9uIGhhbmRsZXJzIGZvciB0aGUgdmlldy4KKyAgICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rp
b24uZXZlbnROYW1lID09PSBldmVudE5hbWUpIHsKKyAgICAgICAgICByZXR1cm4gYWN0aW9uLmhh
bmRsZXIoZXZ0KTsKKyAgICAgICAgfQorICAgICAgfSwgdGhpcyk7CisgICAgfSk7CisgIH0sCisK
KyAgX2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyOiBmdW5jdGlvbih2aWV3LCBldmVudE5hbWUpIHsK
KyAgICB2YXIgbWFuYWdlciA9IG51bGw7CisKKyAgICB3aGlsZSAodmlldykgeworICAgICAgbWFu
YWdlciA9IGdldCh2aWV3LCAnZXZlbnRNYW5hZ2VyJyk7CisgICAgICBpZiAobWFuYWdlciAmJiBt
YW5hZ2VyW2V2ZW50TmFtZV0pIHsgYnJlYWs7IH0KKworICAgICAgdmlldyA9IGdldCh2aWV3LCAn
cGFyZW50VmlldycpOworICAgIH0KKworICAgIHJldHVybiBtYW5hZ2VyOworICB9LAorCisgIF9k
aXNwYXRjaEV2ZW50OiBmdW5jdGlvbihvYmplY3QsIGV2dCwgZXZlbnROYW1lLCB2aWV3KSB7Cisg
ICAgdmFyIHJlc3VsdCA9IHRydWU7CisKKyAgICB2YXIgaGFuZGxlciA9IG9iamVjdFtldmVudE5h
bWVdOworICAgIGlmIChFbWJlci50eXBlT2YoaGFuZGxlcikgPT09ICdmdW5jdGlvbicpIHsKKyAg
ICAgIHJlc3VsdCA9IGhhbmRsZXIuY2FsbChvYmplY3QsIGV2dCwgdmlldyk7CisgICAgICAvLyBE
byBub3QgcHJldmVudERlZmF1bHQgaW4gZXZlbnRNYW5hZ2Vycy4KKyAgICAgIGV2dC5zdG9wUHJv
cGFnYXRpb24oKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQgPSB0aGlzLl9idWJi
bGVFdmVudCh2aWV3LCBldnQsIGV2ZW50TmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgfSwKKworICBfYnViYmxlRXZlbnQ6IGZ1bmN0aW9uKHZpZXcsIGV2dCwgZXZlbnROYW1l
KSB7CisgICAgcmV0dXJuIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB2aWV3
LmhhbmRsZUV2ZW50KGV2ZW50TmFtZSwgZXZ0KTsKKyAgICB9KTsKKyAgfSwKKworICBkZXN0cm95
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcm9vdEVsZW1lbnQgPSBnZXQodGhpcywgJ3Jvb3RFbGVt
ZW50Jyk7CisgICAgRW1iZXIuJChyb290RWxlbWVudCkudW5kZWxlZ2F0ZSgnLmVtYmVyJykucmVt
b3ZlQ2xhc3MoJ2VtYmVyLWFwcGxpY2F0aW9uJyk7CisgICAgcmV0dXJuIHRoaXMuX3N1cGVyKCk7
CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVt
YmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisqLworCisvLyBBZGQgYSBuZXcgbmFtZWQgcXVl
dWUgZm9yIHJlbmRlcmluZyB2aWV3cyB0aGF0IGhhcHBlbnMKKy8vIGFmdGVyIGJpbmRpbmdzIGhh
dmUgc3luY2VkLCBhbmQgYSBxdWV1ZSBmb3Igc2NoZWR1bGluZyBhY3Rpb25zCisvLyB0aGF0IHRo
YXQgc2hvdWxkIG9jY3VyIGFmdGVyIHZpZXcgcmVuZGVyaW5nLgordmFyIHF1ZXVlcyA9IEVtYmVy
LnJ1bi5xdWV1ZXM7CitxdWV1ZXMuc3BsaWNlKEVtYmVyLiQuaW5BcnJheSgnYWN0aW9ucycsIHF1
ZXVlcykrMSwgMCwgJ3JlbmRlcicsICdhZnRlclJlbmRlcicpOworCit9KSgpOworCisKKworKGZ1
bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisq
LworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKKy8vIE9yaWdpbmFs
IGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBkb2N1bWVudGF0aW9uIGluIHJ1bnRpbWUvbGliL2NvbnRy
b2xsZXJzL2NvbnRyb2xsZXIuanMKKy8vIE5PVEU6IEl0IG1heSBiZSBwb3NzaWJsZSB3aXRoIFlV
SURvYyB0byBjb21iaW5lIGRvY3MgaW4gdHdvIGxvY2F0aW9ucworCisvKioKK0FkZGl0aW9uYWwg
bWV0aG9kcyBmb3IgdGhlIENvbnRyb2xsZXJNaXhpbgorCitAY2xhc3MgQ29udHJvbGxlck1peGlu
CitAbmFtZXNwYWNlIEVtYmVyCisqLworRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7Cisg
IHRhcmdldDogbnVsbCwKKyAgbmFtZXNwYWNlOiBudWxsLAorICB2aWV3OiBudWxsLAorICBjb250
YWluZXI6IG51bGwsCisgIF9jaGlsZENvbnRhaW5lcnM6IG51bGwsCisKKyAgaW5pdDogZnVuY3Rp
b24oKSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKyAgICBzZXQodGhpcywgJ19jaGlsZENvbnRhaW5l
cnMnLCB7fSk7CisgIH0sCisKKyAgX21vZGVsRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5j
dGlvbigpIHsKKyAgICB2YXIgY29udGFpbmVycyA9IGdldCh0aGlzLCAnX2NoaWxkQ29udGFpbmVy
cycpLAorICAgICAgICBjb250YWluZXI7CisKKyAgICBmb3IgKHZhciBwcm9wIGluIGNvbnRhaW5l
cnMpIHsKKyAgICAgIGlmICghY29udGFpbmVycy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250
aW51ZTsgfQorICAgICAgY29udGFpbmVyc1twcm9wXS5kZXN0cm95KCk7CisgICAgfQorCisgICAg
c2V0KHRoaXMsICdfY2hpbGRDb250YWluZXJzJywge30pOworICB9LCAnbW9kZWwnKQorfSk7CisK
K30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7
Cit2YXIgc3RhdGVzID0ge307CisKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJl
ci12aWV3cworKi8KKwordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBhZGRP
YnNlcnZlciA9IEVtYmVyLmFkZE9ic2VydmVyLCByZW1vdmVPYnNlcnZlciA9IEVtYmVyLnJlbW92
ZU9ic2VydmVyOwordmFyIG1ldGEgPSBFbWJlci5tZXRhLCBndWlkRm9yID0gRW1iZXIuZ3VpZEZv
ciwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKK3ZhciBhX3NsaWNlID0gW10uc2xpY2U7Cit2YXIg
YV9mb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Cit2YXIgYV9hZGRPYmpl
Y3QgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuYWRkT2JqZWN0OworCit2YXIgY2hpbGRWaWV3c1By
b3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgIHZhciBjaGlsZFZpZXdzID0g
dGhpcy5fY2hpbGRWaWV3cywgcmV0ID0gRW1iZXIuQSgpLCB2aWV3ID0gdGhpczsKKworICBhX2Zv
ckVhY2goY2hpbGRWaWV3cywgZnVuY3Rpb24odmlldykgeworICAgIGlmICh2aWV3LmlzVmlydHVh
bCkgeworICAgICAgcmV0LnB1c2hPYmplY3RzKGdldCh2aWV3LCAnY2hpbGRWaWV3cycpKTsKKyAg
ICB9IGVsc2UgeworICAgICAgcmV0LnB1c2godmlldyk7CisgICAgfQorICB9KTsKKworICByZXQu
cmVwbGFjZSA9IGZ1bmN0aW9uIChpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cykgeworICAg
IGlmICh2aWV3IGluc3RhbmNlb2YgRW1iZXIuQ29udGFpbmVyVmlldykgeworICAgICAgRW1iZXIu
ZGVwcmVjYXRlKCJNYW5pcHVsYXRpbmcgYSBFbWJlci5Db250YWluZXJWaWV3IHRocm91Z2ggaXRz
IGNoaWxkVmlld3MgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgQ29udGFp
bmVyVmlldyBpbnN0YW5jZSBpdHNlbGYgYXMgYW4gRW1iZXIuTXV0YWJsZUFycmF5LiIpOworICAg
ICAgcmV0dXJuIHZpZXcucmVwbGFjZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cyk7Cisg
ICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiY2hpbGRWaWV3cyBpcyBpbW11dGFibGUiKTsKKyAg
fTsKKworICByZXR1cm4gcmV0OworfSk7CisKK0VtYmVyLndhcm4oIlRoZSBWSUVXX1BSRVNFUlZF
U19DT05URVhUIGZsYWcgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgdGhlIGZ1bmN0aW9uYWxpdHkgY2Fu
IG5vIGxvbmdlciBiZSBkaXNhYmxlZC4iLCBFbWJlci5FTlYuVklFV19QUkVTRVJWRVNfQ09OVEVY
VCAhPT0gZmFsc2UpOworCisvKioKKyAgR2xvYmFsIGhhc2ggb2Ygc2hhcmVkIHRlbXBsYXRlcy4g
VGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcG9wdWxhdGVkCisgIGJ5IHRoZSBidWlsZCB0b29s
cyBzbyB0aGF0IHlvdSBjYW4gc3RvcmUgeW91ciBIYW5kbGViYXJzIHRlbXBsYXRlcyBpbgorICBz
ZXBhcmF0ZSBmaWxlcyB0aGF0IGdldCBsb2FkZWQgaW50byBKYXZhU2NyaXB0IGF0IGJ1aWxkdGlt
ZS4KKworICBAcHJvcGVydHkgVEVNUExBVEVTCisgIEBmb3IgRW1iZXIKKyAgQHR5cGUgSGFzaAor
Ki8KK0VtYmVyLlRFTVBMQVRFUyA9IHt9OworCitFbWJlci5Db3JlVmlldyA9IEVtYmVyLk9iamVj
dC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgeworICBpc1ZpZXc6IHRydWUsCisKKyAgc3RhdGVzOiBz
dGF0ZXMsCisKKyAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKworICAg
IC8vIFJlZ2lzdGVyIHRoZSB2aWV3IGZvciBldmVudCBoYW5kbGluZy4gVGhpcyBoYXNoIGlzIHVz
ZWQgYnkKKyAgICAvLyBFbWJlci5FdmVudERpc3BhdGNoZXIgdG8gZGlzcGF0Y2ggaW5jb21pbmcg
ZXZlbnRzLgorICAgIGlmICghdGhpcy5pc1ZpcnR1YWwpIHsKKyAgICAgIEVtYmVyLmFzc2VydCgi
QXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGEgdmlldyB3aXRoIGFuIGlkIGFscmVhZHkgaW4gdXNlOiAi
K3RoaXMuZWxlbWVudElkLCAhRW1iZXIuVmlldy52aWV3c1t0aGlzLmVsZW1lbnRJZF0pOworICAg
ICAgRW1iZXIuVmlldy52aWV3c1t0aGlzLmVsZW1lbnRJZF0gPSB0aGlzOworICAgIH0KKworICAg
IHRoaXMuYWRkQmVmb3JlT2JzZXJ2ZXIoJ2VsZW1lbnRJZCcsIGZ1bmN0aW9uKCkgeworICAgICAg
dGhyb3cgbmV3IEVycm9yKCJDaGFuZ2luZyBhIHZpZXcncyBlbGVtZW50SWQgYWZ0ZXIgY3JlYXRp
b24gaXMgbm90IGFsbG93ZWQiKTsKKyAgICB9KTsKKworICAgIHRoaXMudHJhbnNpdGlvblRvKCdw
cmVSZW5kZXInKTsKKyAgfSwKKworICAvKioKKyAgICBJZiB0aGUgdmlldyBpcyBjdXJyZW50bHkg
aW5zZXJ0ZWQgaW50byB0aGUgRE9NIG9mIGEgcGFyZW50IHZpZXcsIHRoaXMKKyAgICBwcm9wZXJ0
eSB3aWxsIHBvaW50IHRvIHRoZSBwYXJlbnQgb2YgdGhlIHZpZXcuCisKKyAgICBAcHJvcGVydHkg
cGFyZW50VmlldworICAgIEB0eXBlIEVtYmVyLlZpZXcKKyAgICBAZGVmYXVsdCBudWxsCisgICov
CisgIHBhcmVudFZpZXc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJl
bnQgPSB0aGlzLl9wYXJlbnRWaWV3OworCisgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuaXNWaXJ0
dWFsKSB7CisgICAgICByZXR1cm4gZ2V0KHBhcmVudCwgJ3BhcmVudFZpZXcnKTsKKyAgICB9IGVs
c2UgeworICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisgIH0pLnByb3BlcnR5KCdfcGFyZW50
VmlldycpLAorCisgIHN0YXRlOiBudWxsLAorCisgIF9wYXJlbnRWaWV3OiBudWxsLAorCisgIC8v
IHJldHVybiB0aGUgY3VycmVudCB2aWV3LCBub3QgaW5jbHVkaW5nIHZpcnR1YWwgdmlld3MKKyAg
Y29uY3JldGVWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICBpZiAoIXRoaXMu
aXNWaXJ0dWFsKSB7IHJldHVybiB0aGlzOyB9CisgICAgZWxzZSB7IHJldHVybiBnZXQodGhpcywg
J3BhcmVudFZpZXcnKTsgfQorICB9KS5wcm9wZXJ0eSgncGFyZW50VmlldycpLnZvbGF0aWxlKCks
CisKKyAgaW5zdHJ1bWVudE5hbWU6ICdjb3JlX3ZpZXcnLAorCisgIGluc3RydW1lbnREZXRhaWxz
OiBmdW5jdGlvbihoYXNoKSB7CisgICAgaGFzaC5vYmplY3QgPSB0aGlzLnRvU3RyaW5nKCk7Cisg
IH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIEludm9rZWQgYnkgdGhlIHZpZXcgc3lz
dGVtIHdoZW4gdGhpcyB2aWV3IG5lZWRzIHRvIHByb2R1Y2UgYW4gSFRNTAorICAgIHJlcHJlc2Vu
dGF0aW9uLiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIG5ldyByZW5kZXIgYnVmZmVyLCBpZiBu
ZWVkZWQsCisgICAgdGhlbiBhcHBseSBhbnkgZGVmYXVsdCBhdHRyaWJ1dGVzLCBzdWNoIGFzIGNs
YXNzIG5hbWVzIGFuZCB2aXNpYmlsaXR5LgorICAgIEZpbmFsbHksIHRoZSBgcmVuZGVyKClgIG1l
dGhvZCBpcyBpbnZva2VkLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IKKyAgICBkb2luZyB0aGUg
YnVsayBvZiB0aGUgcmVuZGVyaW5nLgorCisgICAgWW91IHNob3VsZCBub3QgbmVlZCB0byBvdmVy
cmlkZSB0aGlzIG1ldGhvZDsgaW5zdGVhZCwgaW1wbGVtZW50IHRoZQorICAgIGB0ZW1wbGF0ZWAg
cHJvcGVydHksIG9yIGlmIHlvdSBuZWVkIG1vcmUgY29udHJvbCwgb3ZlcnJpZGUgdGhlIGByZW5k
ZXJgCisgICAgbWV0aG9kLgorCisgICAgQG1ldGhvZCByZW5kZXJUb0J1ZmZlcgorICAgIEBwYXJh
bSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgdGhlIHJlbmRlciBidWZmZXIuIElmIG5vIGJ1
ZmZlciBpcworICAgICAgcGFzc2VkLCBhIGRlZmF1bHQgYnVmZmVyLCB1c2luZyB0aGUgY3VycmVu
dCB2aWV3J3MgYHRhZ05hbWVgLCB3aWxsCisgICAgICBiZSB1c2VkLgorICAqLworICByZW5kZXJU
b0J1ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKKyAgICB2
YXIgbmFtZSA9ICdyZW5kZXIuJyArIHRoaXMuaW5zdHJ1bWVudE5hbWUsCisgICAgICAgIGRldGFp
bHMgPSB7fTsKKworICAgIHRoaXMuaW5zdHJ1bWVudERldGFpbHMoZGV0YWlscyk7CisKKyAgICBy
ZXR1cm4gRW1iZXIuaW5zdHJ1bWVudChuYW1lLCBkZXRhaWxzLCBmdW5jdGlvbigpIHsKKyAgICAg
IHJldHVybiB0aGlzLl9yZW5kZXJUb0J1ZmZlcihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlv
bik7CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgX3JlbmRlclRvQnVmZmVyOiBmdW5jdGlvbihw
YXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgeworICAgIEVtYmVyLnJ1bi5zeW5jKCk7CisK
KyAgICAvLyBJZiB0aGlzIGlzIHRoZSB0b3AtbW9zdCB2aWV3LCBzdGFydCBhIG5ldyBidWZmZXIu
IE90aGVyd2lzZSwKKyAgICAvLyBjcmVhdGUgYSBuZXcgYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBv
cmlnaW5hbCB1c2luZyB0aGUKKyAgICAvLyBwcm92aWRlZCBidWZmZXIgb3BlcmF0aW9uIChmb3Ig
ZXhhbXBsZSwgYGluc2VydEFmdGVyYCB3aWxsCisgICAgLy8gaW5zZXJ0IGEgbmV3IGJ1ZmZlciBh
ZnRlciB0aGUgInBhcmVudCBidWZmZXIiKS4KKyAgICB2YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFt
ZTsKKworICAgIGlmICh0YWdOYW1lID09PSBudWxsIHx8IHRhZ05hbWUgPT09IHVuZGVmaW5lZCkg
eworICAgICAgdGFnTmFtZSA9ICdkaXYnOworICAgIH0KKworICAgIHZhciBidWZmZXIgPSB0aGlz
LmJ1ZmZlciA9IHBhcmVudEJ1ZmZlciAmJiBwYXJlbnRCdWZmZXIuYmVnaW4odGFnTmFtZSkgfHwg
RW1iZXIuUmVuZGVyQnVmZmVyKHRhZ05hbWUpOworICAgIHRoaXMudHJhbnNpdGlvblRvKCdpbkJ1
ZmZlcicsIGZhbHNlKTsKKworICAgIHRoaXMuYmVmb3JlUmVuZGVyKGJ1ZmZlcik7CisgICAgdGhp
cy5yZW5kZXIoYnVmZmVyKTsKKyAgICB0aGlzLmFmdGVyUmVuZGVyKGJ1ZmZlcik7CisKKyAgICBy
ZXR1cm4gYnVmZmVyOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBPdmVycmlk
ZSB0aGUgZGVmYXVsdCBldmVudCBmaXJpbmcgZnJvbSBgRW1iZXIuRXZlbnRlZGAgdG8KKyAgICBh
bHNvIGNhbGwgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCisgICAgQG1ldGhvZCB0cmln
Z2VyCisgICAgQHBhcmFtIG5hbWUge1N0cmluZ30KKyAgKi8KKyAgdHJpZ2dlcjogZnVuY3Rpb24o
bmFtZSkgeworICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgdmFy
IG1ldGhvZCA9IHRoaXNbbmFtZV07CisgICAgaWYgKG1ldGhvZCkgeworICAgICAgdmFyIGFyZ3Mg
PSBbXSwgaSwgbDsKKyAgICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOworICAgICAgfQorICAg
ICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICB9CisgIH0sCisKKyAgaGFz
OiBmdW5jdGlvbihuYW1lKSB7CisgICAgcmV0dXJuIEVtYmVyLnR5cGVPZih0aGlzW25hbWVdKSA9
PT0gJ2Z1bmN0aW9uJyB8fCB0aGlzLl9zdXBlcihuYW1lKTsKKyAgfSwKKworICB3aWxsRGVzdHJv
eTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFZpZXc7CisKKyAg
ICAvLyBkZXN0cm95IHRoZSBlbGVtZW50IC0tIHRoaXMgd2lsbCBhdm9pZCBlYWNoIGNoaWxkIHZp
ZXcgZGVzdHJveWluZworICAgIC8vIHRoZSBlbGVtZW50IG92ZXIgYW5kIG92ZXIgYWdhaW4uLi4K
KyAgICBpZiAoIXRoaXMucmVtb3ZlZEZyb21ET00pIHsgdGhpcy5kZXN0cm95RWxlbWVudCgpOyB9
CisKKyAgICAvLyByZW1vdmUgZnJvbSBwYXJlbnQgaWYgZm91bmQuIERvbid0IGNhbGwgcmVtb3Zl
RnJvbVBhcmVudCwKKyAgICAvLyBhcyByZW1vdmVGcm9tUGFyZW50IHdpbGwgdHJ5IHRvIHJlbW92
ZSB0aGUgZWxlbWVudCBmcm9tCisgICAgLy8gdGhlIERPTSBhZ2Fpbi4KKyAgICBpZiAocGFyZW50
KSB7IHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsgfQorCisgICAgdGhpcy50cmFuc2l0aW9uVG8o
J2Rlc3Ryb3llZCcpOworCisgICAgLy8gbmV4dCByZW1vdmUgdmlldyBmcm9tIGdsb2JhbCBoYXNo
CisgICAgaWYgKCF0aGlzLmlzVmlydHVhbCkgZGVsZXRlIEVtYmVyLlZpZXcudmlld3NbdGhpcy5l
bGVtZW50SWRdOworICB9LAorCisgIGNsZWFyUmVuZGVyZWRDaGlsZHJlbjogRW1iZXIuSywKKyAg
dHJpZ2dlclJlY3Vyc2l2ZWx5OiBFbWJlci5LLAorICBpbnZva2VSZWN1cnNpdmVseTogRW1iZXIu
SywKKyAgdHJhbnNpdGlvblRvOiBFbWJlci5LLAorICBkZXN0cm95RWxlbWVudDogRW1iZXIuSwor
fSk7CisKKy8qKgorICBgRW1iZXIuVmlld2AgaXMgdGhlIGNsYXNzIGluIEVtYmVyIHJlc3BvbnNp
YmxlIGZvciBlbmNhcHN1bGF0aW5nIHRlbXBsYXRlcyBvZgorICBIVE1MIGNvbnRlbnQsIGNvbWJp
bmluZyB0ZW1wbGF0ZXMgd2l0aCBkYXRhIHRvIHJlbmRlciBhcyBzZWN0aW9ucyBvZiBhIHBhZ2Un
cworICBET00sIGFuZCByZWdpc3RlcmluZyBhbmQgcmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRl
ZCBldmVudHMuCisKKyAgIyMgSFRNTCBUYWcKKworICBUaGUgZGVmYXVsdCBIVE1MIHRhZyBuYW1l
IHVzZWQgZm9yIGEgdmlldydzIERPTSByZXByZXNlbnRhdGlvbiBpcyBgZGl2YC4gVGhpcworICBj
YW4gYmUgY3VzdG9taXplZCBieSBzZXR0aW5nIHRoZSBgdGFnTmFtZWAgcHJvcGVydHkuIFRoZSBm
b2xsb3dpbmcgdmlldworY2xhc3M6CisKKyAgYGBgamF2YXNjcmlwdAorICBQYXJhZ3JhcGhWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIHRhZ05hbWU6ICdlbScKKyAgfSk7CisgIGBgYAor
CisgIFdvdWxkIHJlc3VsdCBpbiBpbnN0YW5jZXMgd2l0aCB0aGUgZm9sbG93aW5nIEhUTUw6CisK
KyAgYGBgaHRtbAorICA8ZW0gaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPjwvZW0+Cisg
IGBgYAorCisgICMjIEhUTUwgYGNsYXNzYCBBdHRyaWJ1dGUKKworICBUaGUgSFRNTCBgY2xhc3Ng
IGF0dHJpYnV0ZSBvZiBhIHZpZXcncyB0YWcgY2FuIGJlIHNldCBieSBwcm92aWRpbmcgYQorICBg
Y2xhc3NOYW1lc2AgcHJvcGVydHkgdGhhdCBpcyBzZXQgdG8gYW4gYXJyYXkgb2Ygc3RyaW5nczoK
KworICBgYGBqYXZhc2NyaXB0CisgIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBj
bGFzc05hbWVzOiBbJ215LWNsYXNzJywgJ215LW90aGVyLWNsYXNzJ10KKyAgfSk7CisgIGBgYAor
CisgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRh
dGlvbiBvZjoKKworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZp
ZXcgbXktY2xhc3MgbXktb3RoZXItY2xhc3MiPjwvZGl2PgorICBgYGAKKworICBgY2xhc3NgIGF0
dHJpYnV0ZSB2YWx1ZXMgY2FuIGFsc28gYmUgc2V0IGJ5IHByb3ZpZGluZyBhIGBjbGFzc05hbWVC
aW5kaW5nc2AKKyAgcHJvcGVydHkgc2V0IHRvIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgbmFtZXMg
Zm9yIHRoZSB2aWV3LiBUaGUgcmV0dXJuIHZhbHVlCisgIG9mIHRoZXNlIHByb3BlcnRpZXMgd2ls
bCBiZSBhZGRlZCBhcyBwYXJ0IG9mIHRoZSB2YWx1ZSBmb3IgdGhlIHZpZXcncyBgY2xhc3NgCisg
IGF0dHJpYnV0ZS4gVGhlc2UgcHJvcGVydGllcyBjYW4gYmUgY29tcHV0ZWQgcHJvcGVydGllczoK
KworICBgYGBqYXZhc2NyaXB0CisgIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBj
bGFzc05hbWVCaW5kaW5nczogWydwcm9wZXJ0eUEnLCAncHJvcGVydHlCJ10sCisgICAgcHJvcGVy
dHlBOiAnZnJvbS1hJywKKyAgICBwcm9wZXJ0eUI6IGZ1bmN0aW9uKCl7CisgICAgICBpZihzb21l
TG9naWMpeyByZXR1cm4gJ2Zyb20tYic7IH0KKyAgICB9LnByb3BlcnR5KCkKKyAgfSk7CisgIGBg
YAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNl
bnRhdGlvbiBvZjoKKworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXcgZnJvbS1hIGZyb20tYiI+PC9kaXY+CisgIGBgYAorCisgIElmIHRoZSB2YWx1ZSBvZiBh
IGNsYXNzIG5hbWUgYmluZGluZyByZXR1cm5zIGEgYm9vbGVhbiB0aGUgcHJvcGVydHkgbmFtZQor
ICBpdHNlbGYgd2lsbCBiZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBp
cyB0cnVlLiBUaGUgY2xhc3MgbmFtZQorICB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGUgdmFsdWUg
aXMgYGZhbHNlYCBvciBgdW5kZWZpbmVkYC4KKworICBgYGBqYXZhc2NyaXB0CisgIE15VmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBjbGFzc05hbWVCaW5kaW5nczogWydob3ZlcmVkJ10s
CisgICAgaG92ZXJlZDogdHJ1ZQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0bWwK
KyAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBob3ZlcmVkIj48L2Rpdj4KKyAg
YGBgCisKKyAgV2hlbiB1c2luZyBib29sZWFuIGNsYXNzIG5hbWUgYmluZGluZ3MgeW91IGNhbiBz
dXBwbHkgYSBzdHJpbmcgdmFsdWUgb3RoZXIKKyAgdGhhbiB0aGUgcHJvcGVydHkgbmFtZSBmb3Ig
dXNlIGFzIHRoZSBgY2xhc3NgIEhUTUwgYXR0cmlidXRlIGJ5IGFwcGVuZGluZyB0aGUKKyAgcHJl
ZmVycmVkIHZhbHVlIGFmdGVyIGEgIjoiIGNoYXJhY3RlciB3aGVuIGRlZmluaW5nIHRoZSBiaW5k
aW5nOgorCisgIGBgYGphdmFzY3JpcHQKKyAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewor
ICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2F3ZXNvbWU6c28tdmVyeS1jb29sJ10sCisgICAgYXdl
c29tZTogdHJ1ZQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5j
ZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0bWwKKyAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBzby12ZXJ5LWNvb2wiPjwvZGl2PgorICBgYGAK
KworICBCb29sZWFuIHZhbHVlIGNsYXNzIG5hbWUgYmluZGluZ3Mgd2hvc2UgcHJvcGVydHkgbmFt
ZXMgYXJlIGluIGEKKyAgY2FtZWxDYXNlLXN0eWxlIGZvcm1hdCB3aWxsIGJlIGNvbnZlcnRlZCB0
byBhIGRhc2hlcml6ZWQgZm9ybWF0OgorCisgIGBgYGphdmFzY3JpcHQKKyAgTXlWaWV3ID0gRW1i
ZXIuVmlldy5leHRlbmQoeworICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50J10sCisg
ICAgaXNVcmdlbnQ6IHRydWUKKyAgfSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcg
aW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKworICBgYGBodG1sCisg
IDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgaXMtdXJnZW50Ij48L2Rpdj4KKyAg
YGBgCisKKyAgQ2xhc3MgbmFtZSBiaW5kaW5ncyBjYW4gYWxzbyByZWZlciB0byBvYmplY3QgdmFs
dWVzIHRoYXQgYXJlIGZvdW5kIGJ5CisgIHRyYXZlcnNpbmcgYSBwYXRoIHJlbGF0aXZlIHRvIHRo
ZSB2aWV3IGl0c2VsZjoKKworICBgYGBqYXZhc2NyaXB0CisgIE15VmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKKyAgICBjbGFzc05hbWVCaW5kaW5nczogWydtZXNzYWdlcy5lbXB0eSddCisgICAg
bWVzc2FnZXM6IEVtYmVyLk9iamVjdC5jcmVhdGUoeworICAgICAgZW1wdHk6IHRydWUKKyAgICB9
KQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBh
biBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0bWwKKyAgPGRpdiBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyBlbXB0eSI+PC9kaXY+CisgIGBgYAorCisgIElmIHlvdSB3YW50
IHRvIGFkZCBhIGNsYXNzIG5hbWUgZm9yIGEgcHJvcGVydHkgd2hpY2ggZXZhbHVhdGVzIHRvIHRy
dWUgYW5kCisgIGFuZCBhIGRpZmZlcmVudCBjbGFzcyBuYW1lIGlmIGl0IGV2YWx1YXRlcyB0byBm
YWxzZSwgeW91IGNhbiBwYXNzIGEgYmluZGluZworICBsaWtlIHRoaXM6CisKKyAgYGBgamF2YXNj
cmlwdAorICAvLyBBcHBsaWVzICdlbmFibGVkJyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBpcyB0cnVl
IGFuZCAnZGlzYWJsZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCisgIEVtYmVyLlZpZXcuY3Jl
YXRlKHsKKyAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc0VuYWJsZWQ6ZW5hYmxlZDpkaXNhYmxl
ZCddCisgICAgaXNFbmFibGVkOiB0cnVlCisgIH0pOworICBgYGAKKworICBXaWxsIHJlc3VsdCBp
biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBg
aHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGVuYWJsZWQiPjwvZGl2
PgorICBgYGAKKworICBXaGVuIGlzRW5hYmxlZCBpcyBgZmFsc2VgLCB0aGUgcmVzdWx0aW5nIEhU
TUwgcmVwcmVuc2VudGF0aW9uIGxvb2tzIGxpa2UKKyAgdGhpczoKKworICBgYGBodG1sCisgIDxk
aXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZGlzYWJsZWQiPjwvZGl2PgorICBgYGAK
KworICBUaGlzIHN5bnRheCBvZmZlcnMgdGhlIGNvbnZlbmllbmNlIHRvIGFkZCBhIGNsYXNzIGlm
IGEgcHJvcGVydHkgaXMgYGZhbHNlYDoKKworICBgYGBqYXZhc2NyaXB0CisgIC8vIEFwcGxpZXMg
bm8gY2xhc3Mgd2hlbiBpc0VuYWJsZWQgaXMgdHJ1ZSBhbmQgY2xhc3MgJ2Rpc2FibGVkJyB3aGVu
IGlzRW5hYmxlZCBpcyBmYWxzZQorICBFbWJlci5WaWV3LmNyZWF0ZSh7CisgICAgY2xhc3NOYW1l
QmluZGluZ3M6IFsnaXNFbmFibGVkOjpkaXNhYmxlZCddCisgICAgaXNFbmFibGVkOiB0cnVlCisg
IH0pOworICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhU
TUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNs
YXNzPSJlbWJlci12aWV3Ij48L2Rpdj4KKyAgYGBgCisKKyAgV2hlbiB0aGUgYGlzRW5hYmxlZGAg
cHJvcGVydHkgb24gdGhlIHZpZXcgaXMgc2V0IHRvIGBmYWxzZWAsIGl0IHdpbGwgcmVzdWx0Cisg
IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKworICBg
YGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZGlzYWJsZWQiPjwv
ZGl2PgorICBgYGAKKworICBVcGRhdGVzIHRvIHRoZSB0aGUgdmFsdWUgb2YgYSBjbGFzcyBuYW1l
IGJpbmRpbmcgd2lsbCByZXN1bHQgaW4gYXV0b21hdGljCisgIHVwZGF0ZSBvZiB0aGUgIEhUTUwg
YGNsYXNzYCBhdHRyaWJ1dGUgaW4gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1MCisgIHJlcHJlc2Vu
dGF0aW9uLiBJZiB0aGUgdmFsdWUgYmVjb21lcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRgIHRoZSBj
bGFzcyBuYW1lCisgIHdpbGwgYmUgcmVtb3ZlZC4KKworICBCb3RoIGBjbGFzc05hbWVzYCBhbmQg
YGNsYXNzTmFtZUJpbmRpbmdzYCBhcmUgY29uY2F0ZW5hdGVkIHByb3BlcnRpZXMuIFNlZQorICBg
RW1iZXIuT2JqZWN0YCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNv
bmNhdGVuYXRlZAorICBwcm9wZXJ0aWVzLgorCisgICMjIEhUTUwgQXR0cmlidXRlcworCisgIFRo
ZSBIVE1MIGF0dHJpYnV0ZSBzZWN0aW9uIG9mIGEgdmlldydzIHRhZyBjYW4gYmUgc2V0IGJ5IHBy
b3ZpZGluZyBhbgorICBgYXR0cmlidXRlQmluZGluZ3NgIHByb3BlcnR5IHNldCB0byBhbiBhcnJh
eSBvZiBwcm9wZXJ0eSBuYW1lcyBvbiB0aGUgdmlldy4KKyAgVGhlIHJldHVybiB2YWx1ZSBvZiB0
aGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHZpZXcncwor
ICBIVE1MIGFzc29jaWF0ZWQgYXR0cmlidXRlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQW5jaG9y
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0YWdOYW1lOiAnYScsCisgICAgYXR0cmli
dXRlQmluZGluZ3M6IFsnaHJlZiddLAorICAgIGhyZWY6ICdodHRwOi8vZ29vZ2xlLmNvbScKKyAg
fSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRN
TCByZXByZXNlbnRhdGlvbiBvZjoKKworICBgYGBodG1sCisgIDxhIGlkPSJlbWJlcjEiIGNsYXNz
PSJlbWJlci12aWV3IiBocmVmPSJodHRwOi8vZ29vZ2xlLmNvbSI+PC9hPgorICBgYGAKKworICBJ
ZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuIGBhdHRyaWJ1dGVCaW5kaW5nc2AgbW9uaXRvcmVkIHBy
b3BlcnR5IGlzIGEgYm9vbGVhbgorICB0aGUgcHJvcGVydHkgd2lsbCBmb2xsb3cgSFRNTCdzIHBh
dHRlcm4gb2YgcmVwZWF0aW5nIHRoZSBhdHRyaWJ1dGUncyBuYW1lIGFzCisgIGl0cyB2YWx1ZToK
KworICBgYGBqYXZhc2NyaXB0CisgIE15VGV4dElucHV0ID0gRW1iZXIuVmlldy5leHRlbmQoewor
ICAgIHRhZ05hbWU6ICdpbnB1dCcsCisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsnZGlzYWJsZWQn
XSwKKyAgICBkaXNhYmxlZDogdHJ1ZQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4g
dmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0
bWwKKyAgPGlucHV0IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IiBkaXNhYmxlZD0iZGlz
YWJsZWQiIC8+CisgIGBgYAorCisgIGBhdHRyaWJ1dGVCaW5kaW5nc2AgY2FuIHJlZmVyIHRvIGNv
bXB1dGVkIHByb3BlcnRpZXM6CisKKyAgYGBgamF2YXNjcmlwdAorICBNeVRleHRJbnB1dCA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0YWdOYW1lOiAnaW5wdXQnLAorICAgIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbJ2Rpc2FibGVkJ10sCisgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCl7CisgICAgICBp
ZiAoc29tZUxvZ2ljKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0ucHJvcGVydHkoKQorICB9KTsKKyAg
YGBgCisKKyAgVXBkYXRlcyB0byB0aGUgdGhlIHByb3BlcnR5IG9mIGFuIGF0dHJpYnV0ZSBiaW5k
aW5nIHdpbGwgcmVzdWx0IGluIGF1dG9tYXRpYworICB1cGRhdGUgb2YgdGhlICBIVE1MIGF0dHJp
YnV0ZSBpbiB0aGUgdmlldydzIHJlbmRlcmVkIEhUTUwgcmVwcmVzZW50YXRpb24uCisKKyAgYGF0
dHJpYnV0ZUJpbmRpbmdzYCBpcyBhIGNvbmNhdGVuYXRlZCBwcm9wZXJ0eS4gU2VlIGBFbWJlci5P
YmplY3RgCisgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uY2F0
ZW5hdGVkIHByb3BlcnRpZXMuCisKKyAgIyMgVGVtcGxhdGVzCisKKyAgVGhlIEhUTUwgY29udGVu
dHMgb2YgYSB2aWV3J3MgcmVuZGVyZWQgcmVwcmVzZW50YXRpb24gYXJlIGRldGVybWluZWQgYnkg
aXRzCisgIHRlbXBsYXRlLiBUZW1wbGF0ZXMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0IGFjY2Vw
dHMgYW4gb3B0aW9uYWwgY29udGV4dAorICBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcg
b2YgSFRNTCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgd2l0aGluIHRoZQorICB2aWV3J3MgdGFnLiBN
b3N0IHR5cGljYWxseSBpbiBFbWJlciB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBjb21waWxlZAor
ICBgRW1iZXIuSGFuZGxlYmFyc2AgdGVtcGxhdGUuCisKKyAgYGBgamF2YXNjcmlwdAorICBBVmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCdJIGFtIHRoZSB0ZW1wbGF0ZScpCisgIH0pOworICBgYGAKKworICBXaWxsIHJlc3Vs
dCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAg
YGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIGFtIHRoZSB0
ZW1wbGF0ZTwvZGl2PgorICBgYGAKKworICBXaXRoaW4gYW4gRW1iZXIgYXBwbGljYXRpb24gaXMg
bW9yZSBjb21tb24gdG8gZGVmaW5lIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgYXMKKyAgcGFydCBv
ZiBhIHBhZ2U6CisKKyAgYGBgaHRtbAorICA8c2NyaXB0IHR5cGU9J3RleHQveC1oYW5kbGViYXJz
JyBkYXRhLXRlbXBsYXRlLW5hbWU9J3NvbWUtdGVtcGxhdGUnPgorICAgIEhlbGxvCisgIDwvc2Ny
aXB0PgorICBgYGAKKworICBBbmQgYXNzb2NpYXRlIGl0IGJ5IG5hbWUgdXNpbmcgYSB2aWV3J3Mg
YHRlbXBsYXRlTmFtZWAgcHJvcGVydHk6CisKKyAgYGBgamF2YXNjcmlwdAorICBBVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0ZW1wbGF0ZU5hbWU6ICdzb21lLXRlbXBsYXRlJworICB9
KTsKKyAgYGBgCisKKyAgVXNpbmcgYSB2YWx1ZSBmb3IgYHRlbXBsYXRlTmFtZWAgdGhhdCBkb2Vz
IG5vdCBoYXZlIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZQorICB3aXRoIGEgbWF0Y2hpbmcgYGRhdGEt
dGVtcGxhdGUtbmFtZWAgYXR0cmlidXRlIHdpbGwgdGhyb3cgYW4gZXJyb3IuCisKKyAgQXNzaWdu
aW5nIGEgdmFsdWUgdG8gYm90aCBgdGVtcGxhdGVgIGFuZCBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0
aWVzIHdpbGwgdGhyb3cKKyAgYW4gZXJyb3IuCisKKyAgRm9yIHZpZXdzIGNsYXNzZXMgdGhhdCBt
YXkgaGF2ZSBhIHRlbXBsYXRlIGxhdGVyIGRlZmluZWQgKGUuZy4gYXMgdGhlIGJsb2NrCisgIHBv
cnRpb24gb2YgYSBge3t2aWV3fX1gIEhhbmRsZWJhcnMgaGVscGVyIGNhbGwgaW4gYW5vdGhlciB0
ZW1wbGF0ZSBvciBpbgorICBhIHN1YmNsYXNzKSwgeW91IGNhbiBwcm92aWRlIGEgYGRlZmF1bHRU
ZW1wbGF0ZWAgcHJvcGVydHkgc2V0IHRvIGNvbXBpbGVkCisgIHRlbXBsYXRlIGZ1bmN0aW9uLiBJ
ZiBhIHRlbXBsYXRlIGlzIG5vdCBsYXRlciBwcm92aWRlZCBmb3IgdGhlIHZpZXcgaW5zdGFuY2UK
KyAgdGhlIGBkZWZhdWx0VGVtcGxhdGVgIHZhbHVlIHdpbGwgYmUgdXNlZDoKKworICBgYGBqYXZh
c2NyaXB0CisgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIGRlZmF1bHRUZW1wbGF0
ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdJIHdhcyB0aGUgZGVmYXVsdCcpLAorICAgIHRl
bXBsYXRlOiBudWxsLAorICAgIHRlbXBsYXRlTmFtZTogbnVsbAorICB9KTsKKyAgYGBgCisKKyAg
V2lsbCByZXN1bHQgaW4gaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoK
KworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPkkgd2Fz
IHRoZSBkZWZhdWx0PC9kaXY+CisgIGBgYAorCisgIElmIGEgYHRlbXBsYXRlYCBvciBgdGVtcGxh
dGVOYW1lYCBpcyBwcm92aWRlZCBpdCB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyCisgIGBkZWZh
dWx0VGVtcGxhdGVgOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQVZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZCh7CisgICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ0kg
d2FzIHRoZSBkZWZhdWx0JykKKyAgfSk7CisKKyAgYVZpZXcgPSBBVmlldy5jcmVhdGUoeworICAg
IHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ0kgd2FzIHRoZSB0ZW1wbGF0ZSwg
bm90IGRlZmF1bHQnKQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxv
d2luZyBIVE1MIHJlcHJlc2VudGF0aW9uIHdoZW4gcmVuZGVyZWQ6CisKKyAgYGBgaHRtbAorICA8
ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIHdhcyB0aGUgdGVtcGxhdGUsIG5v
dCBkZWZhdWx0PC9kaXY+CisgIGBgYAorCisgICMjIFZpZXcgQ29udGV4dAorCisgIFRoZSBkZWZh
dWx0IGNvbnRleHQgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGlzIHRoZSB2aWV3J3MgY29udHJv
bGxlcjoKKworICBgYGBqYXZhc2NyaXB0CisgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewor
ICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ0hlbGxvIHt7ZXhjaXRlZEdy
ZWV0aW5nfX0nKQorICB9KTsKKworICBhQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdC5jcmVhdGUo
eworICAgIGZpcnN0TmFtZTogJ0JhcnJ5JywKKyAgICBleGNpdGVkR3JlZXRpbmc6IGZ1bmN0aW9u
KCl7CisgICAgICByZXR1cm4gdGhpcy5nZXQoImNvbnRlbnQuZmlyc3ROYW1lIikgKyAiISEhIgor
ICAgIH0ucHJvcGVydHkoKQorICB9KTsKKworICBhVmlldyA9IEFWaWV3LmNyZWF0ZSh7CisgICAg
Y29udHJvbGxlcjogYUNvbnRyb2xsZXIsCisgIH0pOworICBgYGAKKworICBXaWxsIHJlc3VsdCBp
biBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0bWwKKyAgPGRpdiBpZD0iZW1i
ZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SGVsbG8gQmFycnkhISE8L2Rpdj4KKyAgYGBgCisKKyAg
QSBjb250ZXh0IGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgc3VwcGxpZWQgdGhyb3VnaCB0aGUgdmll
dydzIGBjb250ZXh0YAorICBwcm9wZXJ0eS4gSWYgdGhlIHZpZXcgaGFzIG5laXRoZXIgYGNvbnRl
eHRgIG5vciBgY29udHJvbGxlcmAgcHJvcGVydGllcywgdGhlCisgIGBwYXJlbnRWaWV3YCdzIGNv
bnRleHQgd2lsbCBiZSB1c2VkLgorCisgICMjIExheW91dHMKKworICBWaWV3cyBjYW4gaGF2ZSBh
IHNlY29uZGFyeSB0ZW1wbGF0ZSB0aGF0IHdyYXBzIHRoZWlyIG1haW4gdGVtcGxhdGUuIExpa2UK
KyAgcHJpbWFyeSB0ZW1wbGF0ZXMsIGxheW91dHMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0ICBh
Y2NlcHRzIGFuIG9wdGlvbmFsCisgIGNvbnRleHQgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3Ry
aW5nIG9mIEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluc2lkZQorICB2aWV3J3MgdGFnLiBW
aWV3cyB3aG9zZSBIVE1MIGVsZW1lbnQgaXMgc2VsZiBjbG9zaW5nIChlLmcuIGA8aW5wdXQgLz5g
KQorICBjYW5ub3QgaGF2ZSBhIGxheW91dCBhbmQgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9y
ZWQuCisKKyAgTW9zdCB0eXBpY2FsbHkgaW4gRW1iZXIgYSBsYXlvdXQgd2lsbCBiZSBhIGNvbXBp
bGVkIGBFbWJlci5IYW5kbGViYXJzYAorICB0ZW1wbGF0ZS4KKworICBBIHZpZXcncyBsYXlvdXQg
Y2FuIGJlIHNldCBkaXJlY3RseSB3aXRoIHRoZSBgbGF5b3V0YCBwcm9wZXJ0eSBvciByZWZlcmVu
Y2UKKyAgYW4gZXhpc3RpbmcgSGFuZGxlYmFycyB0ZW1wbGF0ZSBieSBuYW1lIHdpdGggdGhlIGBs
YXlvdXROYW1lYCBwcm9wZXJ0eS4KKworICBBIHRlbXBsYXRlIHVzZWQgYXMgYSBsYXlvdXQgbXVz
dCBjb250YWluIGEgc2luZ2xlIHVzZSBvZiB0aGUgSGFuZGxlYmFycworICBge3t5aWVsZH19YCBo
ZWxwZXIuIFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgdmlldydzIHJlbmRlcmVkIGB0ZW1wbGF0ZWAg
d2lsbCBiZQorICBpbnNlcnRlZCBhdCB0aGlzIGxvY2F0aW9uOgorCisgIGBgYGphdmFzY3JpcHQK
KyAgQVZpZXdXaXRoTGF5b3V0ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIGxheW91dDogRW1i
ZXIuSGFuZGxlYmFycy5jb21waWxlKCI8ZGl2IGNsYXNzPSdteS1kZWNvcmF0aXZlLWNsYXNzJz57
e3lpZWxkfX08L2Rpdj4iKQorICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUo
IkkgZ290IHdyYXBwZWQiKSwKKyAgfSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcg
aW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKworICBgYGBodG1sCisg
IDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgIDxkaXYgY2xhc3M9Im15
LWRlY29yYXRpdmUtY2xhc3MiPgorICAgICAgSSBnb3Qgd3JhcHBlZAorICAgIDwvZGl2PgorICA8
L2Rpdj4KKyAgYGBgCisKKyAgU2VlIGBIYW5kbGViYXJzLmhlbHBlcnMueWllbGRgIGZvciBtb3Jl
IGluZm9ybWF0aW9uLgorCisgICMjIFJlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMKKworICBW
aWV3cyBjYW4gcmVzcG9uZCB0byB1c2VyLWluaXRpYXRlZCBldmVudHMgaW4gb25lIG9mIHRocmVl
IHdheXM6IG1ldGhvZAorICBpbXBsZW1lbnRhdGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5hZ2Vy
LCBhbmQgdGhyb3VnaCBge3thY3Rpb259fWAgaGVscGVyIHVzZQorICBpbiB0aGVpciB0ZW1wbGF0
ZSBvciBsYXlvdXQuCisKKyAgIyMjIE1ldGhvZCBJbXBsZW1lbnRhdGlvbgorCisgIFZpZXdzIGNh
biByZXNwb25kIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cyBieSBpbXBsZW1lbnRpbmcgYSBtZXRo
b2QgdGhhdAorICBtYXRjaGVzIHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVj
dCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUKKyAgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QuCisKKyAg
YGBgamF2YXNjcmlwdAorICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBjbGljazog
ZnVuY3Rpb24oZXZlbnQpeworICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVuIGFuIGlu
c3RhbmNlJ3MKKyAgICAgIC8vIHJlbmRlcmVkIGVsZW1lbnQgaXMgY2xpY2tlZAorICAgIH0KKyAg
fSk7CisgIGBgYAorCisgICMjIyBFdmVudCBNYW5hZ2VycworCisgIFZpZXdzIGNhbiBkZWZpbmUg
YW4gb2JqZWN0IGFzIHRoZWlyIGBldmVudE1hbmFnZXJgIHByb3BlcnR5LiBUaGlzIG9iamVjdCBj
YW4KKyAgdGhlbiBpbXBsZW1lbnQgbWV0aG9kcyB0aGF0IG1hdGNoIHRoZSBkZXNpcmVkIGV2ZW50
IG5hbWVzLiBNYXRjaGluZyBldmVudHMKKyAgdGhhdCBvY2N1ciBvbiB0aGUgdmlldydzIHJlbmRl
cmVkIEhUTUwgb3IgdGhlIHJlbmRlcmVkIEhUTUwgb2YgYW55IG9mIGl0cyBET00KKyAgZGVzY2Vu
ZGFudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbWV0aG9kLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3
aWxsIGJlIHBhc3NlZAorICBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG1ldGhvZCBhbmQg
YW4gIGBFbWJlci5WaWV3YCBvYmplY3QgYXMgdGhlCisgIHNlY29uZC4gVGhlIGBFbWJlci5WaWV3
YCB3aWxsIGJlIHRoZSB2aWV3IHdob3NlIHJlbmRlcmVkIEhUTUwgd2FzIGludGVyYWN0ZWQKKyAg
d2l0aC4gVGhpcyBtYXkgYmUgdGhlIHZpZXcgd2l0aCB0aGUgYGV2ZW50TWFuYWdlcmAgcHJvcGVy
dHkgb3Igb25lIG9mIGl0cworICBkZXNjZW5kZW50IHZpZXdzLgorCisgIGBgYGphdmFzY3JpcHQK
KyAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgZXZlbnRNYW5hZ2VyOiBFbWJlci5P
YmplY3QuY3JlYXRlKHsKKyAgICAgIGRvdWJsZUNsaWNrOiBmdW5jdGlvbihldmVudCwgdmlldyl7
CisgICAgICAgIC8vIHdpbGwgYmUgY2FsbGVkIHdoZW4gd2hlbiBhbiBpbnN0YW5jZSdzCisgICAg
ICAgIC8vIHJlbmRlcmVkIGVsZW1lbnQgb3IgYW55IHJlbmRlcmluZworICAgICAgICAvLyBvZiB0
aGlzIHZpZXdzJ3MgZGVzY2VuZGVudAorICAgICAgICAvLyBlbGVtZW50cyBpcyBjbGlja2VkCisg
ICAgICB9CisgICAgfSkKKyAgfSk7CisgIGBgYAorCisgIEFuIGV2ZW50IGRlZmluZWQgZm9yIGFu
IGV2ZW50IG1hbmFnZXIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZW50cyBvZiB0aGUKKyAgc2Ft
ZSBuYW1lIGhhbmRsZWQgdGhyb3VnaCBtZXRob2RzIG9uIHRoZSB2aWV3LgorCisgIGBgYGphdmFz
Y3JpcHQKKyAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgbW91c2VFbnRlcjogZnVu
Y3Rpb24oZXZlbnQpeworICAgICAgLy8gd2lsbCBuZXZlciB0cmlnZ2VyLgorICAgIH0sCisgICAg
ZXZlbnRNYW5hZ2VyOiBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIG1vdXNlRW50ZXI6IGZ1
bmN0aW9uKGV2ZW50LCB2aWV3KXsKKyAgICAgICAgLy8gdGFrZXMgcHJlc2VkZW5jZSBvdmVyIEFW
aWV3I21vdXNlRW50ZXIKKyAgICAgIH0KKyAgICB9KQorICB9KTsKKyAgYGBgCisKKyAgU2ltaWxh
cmx5IGEgdmlldydzIGV2ZW50IG1hbmFnZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UgZm9yIGV2ZW50
cyBvZiBhbnkgdmlld3MKKyAgcmVuZGVyZWQgYXMgYSBkZXNjZW5kZW50LiBBIG1ldGhvZCBuYW1l
IHRoYXQgbWF0Y2hlcyBhbiBldmVudCBuYW1lIHdpbGwgbm90CisgIGJlIGNhbGxlZCBpZiB0aGUg
dmlldyBpbnN0YW5jZSB3YXMgcmVuZGVyZWQgaW5zaWRlIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9u
IG9mCisgIGEgdmlldyB0aGF0IGhhcyBhbiBgZXZlbnRNYW5hZ2VyYCBwcm9wZXJ0eSBkZWZpbmVk
IHRoYXQgaGFuZGxlcyBldmVudHMgb2YgdGhlCisgIG5hbWUuIEV2ZW50cyBub3QgaGFuZGxlZCBi
eSB0aGUgZXZlbnQgbWFuYWdlciB3aWxsIHN0aWxsIHRyaWdnZXIgbWV0aG9kIGNhbGxzCisgIG9u
IHRoZSBkZXNjZW5kZW50LgorCisgIGBgYGphdmFzY3JpcHQKKyAgT3V0ZXJWaWV3ID0gRW1iZXIu
Vmlldy5leHRlbmQoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIm91
dGVyIHt7I3ZpZXcgSW5uZXJWaWV3fX1pbm5lcnt7L3ZpZXd9fSBvdXRlciIpLAorICAgIGV2ZW50
TWFuYWdlcjogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgICBtb3VzZUVudGVyOiBmdW5jdGlv
bihldmVudCwgdmlldyl7CisgICAgICAgIC8vIHZpZXcgbWlnaHQgYmUgaW5zdGFuY2Ugb2YgZWl0
aGVyCisgICAgICAgIC8vIE91dHNpZGVWaWV3IG9yIElubmVyVmlldyBkZXBlbmRpbmcgb24KKyAg
ICAgICAgLy8gd2hlcmUgb24gdGhlIHBhZ2UgdGhlIHVzZXIgaW50ZXJhY3Rpb24gb2NjdXJlZAor
ICAgICAgfQorICAgIH0pCisgIH0pOworCisgIElubmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KHsKKyAgICBjbGljazogZnVuY3Rpb24oZXZlbnQpeworICAgICAgLy8gd2lsbCBiZSBjYWxsZWQg
aWYgcmVuZGVyZWQgaW5zaWRlCisgICAgICAvLyBhbiBPdXRlclZpZXcgYmVjYXVzZSBPdXRlclZp
ZXcncworICAgICAgLy8gZXZlbnRNYW5hZ2VyIGRvZXNuJ3QgaGFuZGxlIGNsaWNrIGV2ZW50cwor
ICAgIH0sCisgICAgbW91c2VFbnRlcjogZnVuY3Rpb24oZXZlbnQpeworICAgICAgLy8gd2lsbCBu
ZXZlciBiZSBjYWxsZWQgaWYgcmVuZGVyZWQgaW5zaWRlCisgICAgICAvLyBhbiBPdXRlclZpZXcu
CisgICAgfQorICB9KTsKKyAgYGBgCisKKyAgIyMjIEhhbmRsZWJhcnMgYHt7YWN0aW9ufX1gIEhl
bHBlcgorCisgIFNlZSBgSGFuZGxlYmFycy5oZWxwZXJzLmFjdGlvbmAuCisKKyAgIyMjIEV2ZW50
IE5hbWVzCisKKyAgUG9zc2libGUgZXZlbnRzIG5hbWVzIGZvciBhbnkgb2YgdGhlIHJlc3BvbmRp
bmcgYXBwcm9hY2hlcyBkZXNjcmliZWQgYWJvdmUKKyAgYXJlOgorCisgIFRvdWNoIGV2ZW50czoK
KworICAqIGB0b3VjaFN0YXJ0YAorICAqIGB0b3VjaE1vdmVgCisgICogYHRvdWNoRW5kYAorICAq
IGB0b3VjaENhbmNlbGAKKworICBLZXlib2FyZCBldmVudHMKKworICAqIGBrZXlEb3duYAorICAq
IGBrZXlVcGAKKyAgKiBga2V5UHJlc3NgCisKKyAgTW91c2UgZXZlbnRzCisKKyAgKiBgbW91c2VE
b3duYAorICAqIGBtb3VzZVVwYAorICAqIGBjb250ZXh0TWVudWAKKyAgKiBgY2xpY2tgCisgICog
YGRvdWJsZUNsaWNrYAorICAqIGBtb3VzZU1vdmVgCisgICogYGZvY3VzSW5gCisgICogYGZvY3Vz
T3V0YAorICAqIGBtb3VzZUVudGVyYAorICAqIGBtb3VzZUxlYXZlYAorCisgIEZvcm0gZXZlbnRz
OiAKKworICAqIGBzdWJtaXRgCisgICogYGNoYW5nZWAKKyAgKiBgZm9jdXNJbmAKKyAgKiBgZm9j
dXNPdXRgCisgICogYGlucHV0YAorCisgIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZlbnRzOiAKKwor
ICAqIGBkcmFnU3RhcnRgCisgICogYGRyYWdgCisgICogYGRyYWdFbnRlcmAKKyAgKiBgZHJhZ0xl
YXZlYAorICAqIGBkcm9wYAorICAqIGBkcmFnRW5kYAorCisgICMjIEhhbmRsZWJhcnMgYHt7dmll
d319YCBIZWxwZXIKKworICBPdGhlciBgRW1iZXIuVmlld2AgaW5zdGFuY2VzIGNhbiBiZSBpbmNs
dWRlZCBhcyBwYXJ0IG9mIGEgdmlldydzIHRlbXBsYXRlIGJ5CisgIHVzaW5nIHRoZSBge3t2aWV3
fX1gIEhhbmRsZWJhcnMgaGVscGVyLiBTZWUgYEhhbmRsZWJhcnMuaGVscGVycy52aWV3YCBmb3IK
KyAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKworICBAY2xhc3MgVmlldworICBAbmFtZXNwYWNl
IEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICBAdXNlcyBFbWJlci5FdmVudGVkCisq
LworRW1iZXIuVmlldyA9IEVtYmVyLkNvcmVWaWV3LmV4dGVuZCgKKy8qKiBAc2NvcGUgRW1iZXIu
Vmlldy5wcm90b3R5cGUgKi8geworCisgIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IFsnY2xhc3NO
YW1lcycsICdjbGFzc05hbWVCaW5kaW5ncycsICdhdHRyaWJ1dGVCaW5kaW5ncyddLAorCisgIC8q
KgorICAgIEBwcm9wZXJ0eSBpc1ZpZXcKKyAgICBAdHlwZSBCb29sZWFuCisgICAgQGRlZmF1bHQg
dHJ1ZQorICAgIEBmaW5hbAorICAqLworICBpc1ZpZXc6IHRydWUsCisKKyAgLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBU
RU1QTEFURSBTVVBQT1JUCisgIC8vCisKKyAgLyoqCisgICAgVGhlIG5hbWUgb2YgdGhlIHRlbXBs
YXRlIHRvIGxvb2t1cCBpZiBubyB0ZW1wbGF0ZSBpcyBwcm92aWRlZC4KKworICAgIGBFbWJlci5W
aWV3YCB3aWxsIGxvb2sgZm9yIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUgaW4gdGhpcyB2aWV3
J3MKKyAgICBgdGVtcGxhdGVzYCBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBiZSBhIGds
b2JhbCBvYmplY3QKKyAgICBzaGFyZWQgaW4gYEVtYmVyLlRFTVBMQVRFU2AuCisKKyAgICBAcHJv
cGVydHkgdGVtcGxhdGVOYW1lCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAor
ICAqLworICB0ZW1wbGF0ZU5hbWU6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIG5hbWUgb2YgdGhl
IGxheW91dCB0byBsb29rdXAgaWYgbm8gbGF5b3V0IGlzIHByb3ZpZGVkLgorCisgICAgYEVtYmVy
LlZpZXdgIHdpbGwgbG9vayBmb3IgYSB0ZW1wbGF0ZSB3aXRoIHRoaXMgbmFtZSBpbiB0aGlzIHZp
ZXcncworICAgIGB0ZW1wbGF0ZXNgIG9iamVjdC4gQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIGEg
Z2xvYmFsIG9iamVjdAorICAgIHNoYXJlZCBpbiBgRW1iZXIuVEVNUExBVEVTYC4KKworICAgIEBw
cm9wZXJ0eSBsYXlvdXROYW1lCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAor
ICAqLworICBsYXlvdXROYW1lOiBudWxsLAorCisgIC8qKgorICAgIFRoZSBoYXNoIGluIHdoaWNo
IHRvIGxvb2sgZm9yIGB0ZW1wbGF0ZU5hbWVgLgorCisgICAgQHByb3BlcnR5IHRlbXBsYXRlcwor
ICAgIEB0eXBlIEVtYmVyLk9iamVjdAorICAgIEBkZWZhdWx0IEVtYmVyLlRFTVBMQVRFUworICAq
LworICB0ZW1wbGF0ZXM6IEVtYmVyLlRFTVBMQVRFUywKKworICAvKioKKyAgICBUaGUgdGVtcGxh
dGUgdXNlZCB0byByZW5kZXIgdGhlIHZpZXcuIFRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhh
dAorICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMg
YSBzdHJpbmcgb2YgSFRNTCB0aGF0CisgICAgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00g
cmVsYXRpdmUgdG8gaXRzIHBhcmVudCB2aWV3LgorCisgICAgSW4gZ2VuZXJhbCwgeW91IHNob3Vs
ZCBzZXQgdGhlIGB0ZW1wbGF0ZU5hbWVgIHByb3BlcnR5IGluc3RlYWQgb2Ygc2V0dGluZworICAg
IHRoZSB0ZW1wbGF0ZSB5b3Vyc2VsZi4KKworICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZQorICAgIEB0
eXBlIEZ1bmN0aW9uCisgICovCisgIHRlbXBsYXRlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXksIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgcmV0dXJuIHZhbHVl
OyB9CisKKyAgICB2YXIgdGVtcGxhdGVOYW1lID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKSwK
KyAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZSh0ZW1wbGF0ZU5hbWUsICd0
ZW1wbGF0ZScpOworCisgICAgRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIHRoZSB0ZW1wbGF0
ZU5hbWUgIiArIHRlbXBsYXRlTmFtZSArICIgZm9yICIgKyB0aGlzICsgIiwgYnV0IGl0IGRpZCBu
b3QgZXhpc3QuIiwgIXRlbXBsYXRlTmFtZSB8fCB0ZW1wbGF0ZSk7CisKKyAgICByZXR1cm4gdGVt
cGxhdGUgfHwgZ2V0KHRoaXMsICdkZWZhdWx0VGVtcGxhdGUnKTsKKyAgfSkucHJvcGVydHkoJ3Rl
bXBsYXRlTmFtZScpLAorCisgIGNvbnRhaW5lcjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7
CisgICAgdmFyIHBhcmVudFZpZXcgPSBnZXQodGhpcywgJ19wYXJlbnRWaWV3Jyk7CisKKyAgICBp
ZiAocGFyZW50VmlldykgeyByZXR1cm4gZ2V0KHBhcmVudFZpZXcsICdjb250YWluZXInKTsgfQor
CisgICAgcmV0dXJuIEVtYmVyLkNvbnRhaW5lciAmJiBFbWJlci5Db250YWluZXIuZGVmYXVsdENv
bnRhaW5lcjsKKyAgfSksCisKKyAgLyoqCisgICAgVGhlIGNvbnRyb2xsZXIgbWFuYWdpbmcgdGhp
cyB2aWV3LiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCwgaXQgd2lsbCBiZQorICAgIG1hZGUgYXZh
aWxhYmxlIGZvciB1c2UgYnkgdGhlIHRlbXBsYXRlLgorCisgICAgQHByb3BlcnR5IGNvbnRyb2xs
ZXIKKyAgICBAdHlwZSBPYmplY3QKKyAgKi8KKyAgY29udHJvbGxlcjogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIHBhcmVudFZpZXcgPSBnZXQodGhpcywgJ19wYXJlbnRW
aWV3Jyk7CisgICAgcmV0dXJuIHBhcmVudFZpZXcgPyBnZXQocGFyZW50VmlldywgJ2NvbnRyb2xs
ZXInKSA6IG51bGw7CisgIH0pLnByb3BlcnR5KCdfcGFyZW50VmlldycpLAorCisgIC8qKgorICAg
IEEgdmlldyBtYXkgY29udGFpbiBhIGxheW91dC4gQSBsYXlvdXQgaXMgYSByZWd1bGFyIHRlbXBs
YXRlIGJ1dAorICAgIHN1cGVyc2VkZXMgdGhlIGB0ZW1wbGF0ZWAgcHJvcGVydHkgZHVyaW5nIHJl
bmRlcmluZy4gSXQgaXMgdGhlCisgICAgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGxheW91dCB0ZW1w
bGF0ZSB0byByZXRyaWV2ZSB0aGUgYHRlbXBsYXRlYAorICAgIHByb3BlcnR5IGZyb20gdGhlIHZp
ZXcgKG9yIGFsdGVybmF0aXZlbHksIGNhbGwgYEhhbmRsZWJhcnMuaGVscGVycy55aWVsZGAsCisg
ICAgYHt7eWllbGR9fWApIHRvIHJlbmRlciBpdCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4KKwor
ICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhIHZpZXcgdGhhdCBoYXMgYSBzaGFyZWQgd3JhcHBlciwg
YnV0IHdoaWNoIGRlbGVnYXRlcworICAgIHRoZSByZW5kZXJpbmcgb2YgdGhlIGNvbnRlbnRzIG9m
IHRoZSB3cmFwcGVyIHRvIHRoZSBgdGVtcGxhdGVgIHByb3BlcnR5CisgICAgb24gYSBzdWJjbGFz
cy4KKworICAgIEBwcm9wZXJ0eSBsYXlvdXQKKyAgICBAdHlwZSBGdW5jdGlvbgorICAqLworICBs
YXlvdXQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkgeworICAgIHZhciBsYXlvdXROYW1l
ID0gZ2V0KHRoaXMsICdsYXlvdXROYW1lJyksCisgICAgICAgIGxheW91dCA9IHRoaXMudGVtcGxh
dGVGb3JOYW1lKGxheW91dE5hbWUsICdsYXlvdXQnKTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91
IHNwZWNpZmllZCB0aGUgbGF5b3V0TmFtZSAiICsgbGF5b3V0TmFtZSArICIgZm9yICIgKyB0aGlz
ICsgIiwgYnV0IGl0IGRpZCBub3QgZXhpc3QuIiwgIWxheW91dE5hbWUgfHwgbGF5b3V0KTsKKwor
ICAgIHJldHVybiBsYXlvdXQgfHwgZ2V0KHRoaXMsICdkZWZhdWx0TGF5b3V0Jyk7CisgIH0pLnBy
b3BlcnR5KCdsYXlvdXROYW1lJyksCisKKyAgdGVtcGxhdGVGb3JOYW1lOiBmdW5jdGlvbihuYW1l
LCB0eXBlKSB7CisgICAgaWYgKCFuYW1lKSB7IHJldHVybjsgfQorCisgICAgRW1iZXIuYXNzZXJ0
KCJ0ZW1wbGF0ZU5hbWVzIGFyZSBub3QgYWxsb3dlZCB0byBjb250YWluIHBlcmlvZHM6ICIrbmFt
ZSwgbmFtZS5pbmRleE9mKCcuJykgPT09IC0xKTsKKworICAgIHZhciBjb250YWluZXIgPSBnZXQo
dGhpcywgJ2NvbnRhaW5lcicpOworCisgICAgaWYgKGNvbnRhaW5lcikgeworICAgICAgcmV0dXJu
IGNvbnRhaW5lci5sb29rdXAoJ3RlbXBsYXRlOicgKyBuYW1lKTsKKyAgICB9CisgIH0sCisKKyAg
LyoqCisgICAgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQgYWNjZXNzIHBy
b3BlcnRpZXMuCisKKyAgICBUaGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxh
dGUgZnVuY3Rpb24gZWFjaCB0aW1lIHRoZSByZW5kZXIKKyAgICBtZXRob2QgaXMgY2FsbGVkLCBi
dXQgaXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQKKyAg
ICB0byBkbyB3aXRoIGl0LgorCisgICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSB2aWV3
J3MgY29udHJvbGxlci4KKworICAgIEBwcm9wZXJ0eSBjb250ZXh0CisgICAgQHR5cGUgT2JqZWN0
CisgICovCisgIGNvbnRleHQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
KyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgc2V0KHRoaXMsICdfY29u
dGV4dCcsIHZhbHVlKTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAg
cmV0dXJuIGdldCh0aGlzLCAnX2NvbnRleHQnKTsKKyAgICB9CisgIH0pLnZvbGF0aWxlKCksCisK
KyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFByaXZhdGUgY29weSBvZiB0aGUgdmlldydzIHRl
bXBsYXRlIGNvbnRleHQuIFRoaXMgY2FuIGJlIHNldCBkaXJlY3RseQorICAgIGJ5IEhhbmRsZWJh
cnMgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSBvYnNlcnZlciB0aGF0IGNhdXNlcyB0aGUgdmlldwor
ICAgIHRvIGJlIHJlLXJlbmRlcmVkLgorCisgICAgVGhlIGNvbnRleHQgb2YgYSB2aWV3IGlzIGxv
b2tlZCB1cCBhcyBmb2xsb3dzOgorCisgICAgMS4gU3VwcGxpZWQgY29udGV4dCAodXN1YWxseSBi
eSBIYW5kbGViYXJzKQorICAgIDIuIFNwZWNpZmllZCBjb250cm9sbGVyCisgICAgMy4gYHBhcmVu
dFZpZXdgJ3MgY29udGV4dCAoZm9yIGEgY2hpbGQgb2YgYSBDb250YWluZXJWaWV3KQorCisgICAg
VGhlIGNvZGUgaW4gSGFuZGxlYmFycyB0aGF0IG92ZXJyaWRlcyB0aGUgYF9jb250ZXh0YCBwcm9w
ZXJ0eSBmaXJzdAorICAgIGNoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgdmlldyBoYXMgYSBzcGVj
aWZpZWQgY29udHJvbGxlci4gVGhpcyBpcworICAgIHNvbWV0aGluZyBvZiBhIGhhY2sgYW5kIHNo
b3VsZCBiZSByZXZpc2l0ZWQuCisKKyAgICBAcHJvcGVydHkgX2NvbnRleHQKKyAgKi8KKyAgX2Nv
bnRleHQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkgeworICAgIHZhciBwYXJlbnRWaWV3
LCBjb250cm9sbGVyOworCisgICAgaWYgKGNvbnRyb2xsZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xs
ZXInKSkgeworICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcGFyZW50Vmll
dyA9IHRoaXMuX3BhcmVudFZpZXc7CisgICAgaWYgKHBhcmVudFZpZXcpIHsKKyAgICAgIHJldHVy
biBnZXQocGFyZW50VmlldywgJ19jb250ZXh0Jyk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7
CisgIH0pLAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBJZiBhIHZhbHVlIHRoYXQgYWZm
ZWN0cyB0ZW1wbGF0ZSByZW5kZXJpbmcgY2hhbmdlcywgdGhlIHZpZXcgc2hvdWxkIGJlCisgICAg
cmUtcmVuZGVyZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVlLgorCisgICAgQG1ldGhvZCBfZGlz
cGxheVByb3BlcnR5RGlkQ2hhbmdlCisgICovCisgIF9jb250ZXh0RGlkQ2hhbmdlOiBFbWJlci5v
YnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICB0aGlzLnJlcmVuZGVyKCk7CisgIH0sICdjb250ZXh0
JyksCisKKyAgLyoqCisgICAgSWYgYGZhbHNlYCwgdGhlIHZpZXcgd2lsbCBhcHBlYXIgaGlkZGVu
IGluIERPTS4KKworICAgIEBwcm9wZXJ0eSBpc1Zpc2libGUKKyAgICBAdHlwZSBCb29sZWFuCisg
ICAgQGRlZmF1bHQgbnVsbAorICAqLworICBpc1Zpc2libGU6IHRydWUsCisKKyAgLyoqCisgICAg
QHByaXZhdGUKKworICAgIEFycmF5IG9mIGNoaWxkIHZpZXdzLiBZb3Ugc2hvdWxkIG5ldmVyIGVk
aXQgdGhpcyBhcnJheSBkaXJlY3RseS4KKyAgICBJbnN0ZWFkLCB1c2UgYGFwcGVuZENoaWxkYCBh
bmQgYHJlbW92ZUZyb21QYXJlbnRgLgorCisgICAgQHByb3BlcnR5IGNoaWxkVmlld3MKKyAgICBA
dHlwZSBBcnJheQorICAgIEBkZWZhdWx0IFtdCisgICovCisgIGNoaWxkVmlld3M6IGNoaWxkVmll
d3NQcm9wZXJ0eSwKKworICBfY2hpbGRWaWV3czogW10sCisKKyAgLy8gV2hlbiBpdCdzIGEgdmly
dHVhbCB2aWV3LCB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlaXIKKyAgLy8g
Y2hpbGRWaWV3cyB3aWxsIGNoYW5nZS4KKyAgX2NoaWxkVmlld3NXaWxsQ2hhbmdlOiBFbWJlci5i
ZWZvcmVPYnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKKyAg
ICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisgICAgICBpZiAo
cGFyZW50VmlldykgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UocGFyZW50VmlldywgJ2NoaWxk
Vmlld3MnKTsgfQorICAgIH0KKyAgfSwgJ2NoaWxkVmlld3MnKSwKKworICAvLyBXaGVuIGl0J3Mg
YSB2aXJ0dWFsIHZpZXcsIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBwYXJlbnQgdGhhdCB0aGVpcgor
ICAvLyBjaGlsZFZpZXdzIGRpZCBjaGFuZ2UuCisgIF9jaGlsZFZpZXdzRGlkQ2hhbmdlOiBFbWJl
ci5vYnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKKyAgICAg
IHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisgICAgICBpZiAocGFy
ZW50VmlldykgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3
cycpOyB9CisgICAgfQorICB9LCAnY2hpbGRWaWV3cycpLAorCisgIC8qKgorICAgIFJldHVybiB0
aGUgbmVhcmVzdCBhbmNlc3RvciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZAor
ICAgIGNsYXNzLgorCisgICAgQHByb3BlcnR5IG5lYXJlc3RJbnN0YW5jZU9mCisgICAgQHBhcmFt
IHtDbGFzc30ga2xhc3MgU3ViY2xhc3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNl
bGYpCisgICAgQHJldHVybiBFbWJlci5WaWV3CisgICAgQGRlcHJlY2F0ZWQKKyAgKi8KKyAgbmVh
cmVzdEluc3RhbmNlT2Y6IGZ1bmN0aW9uKGtsYXNzKSB7CisgICAgRW1iZXIuZGVwcmVjYXRlKCJu
ZWFyZXN0SW5zdGFuY2VPZiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBm
dXR1cmUgcmVsZWFzZXMuIFVzZSBuZWFyZXN0T2ZUeXBlLiIpOworICAgIHZhciB2aWV3ID0gZ2V0
KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisKKyAgICB3aGlsZSAodmlldykgeworICAgICAgaWYodmll
dyBpbnN0YW5jZW9mIGtsYXNzKSB7IHJldHVybiB2aWV3OyB9CisgICAgICB2aWV3ID0gZ2V0KHZp
ZXcsICdwYXJlbnRWaWV3Jyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIFJldHVybiB0aGUg
bmVhcmVzdCBhbmNlc3RvciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZAorICAg
IGNsYXNzIG9yIG1peGluLgorCisgICAgQHByb3BlcnR5IG5lYXJlc3RPZlR5cGUKKyAgICBAcGFy
YW0ge0NsYXNzLE1peGlufSBrbGFzcyBTdWJjbGFzcyBvZiBFbWJlci5WaWV3IChvciBFbWJlci5W
aWV3IGl0c2VsZiksCisgICAgICAgICAgIG9yIGFuIGluc3RhbmNlIG9mIEVtYmVyLk1peGluLgor
ICAgIEByZXR1cm4gRW1iZXIuVmlldworICAqLworICBuZWFyZXN0T2ZUeXBlOiBmdW5jdGlvbihr
bGFzcykgeworICAgIHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3JyksCisgICAgICAg
IGlzT2ZUeXBlID0ga2xhc3MgaW5zdGFuY2VvZiBFbWJlci5NaXhpbiA/CisgICAgICAgICAgICAg
ICAgICAgZnVuY3Rpb24odmlldykgeyByZXR1cm4ga2xhc3MuZGV0ZWN0KHZpZXcpOyB9IDoKKyAg
ICAgICAgICAgICAgICAgICBmdW5jdGlvbih2aWV3KSB7IHJldHVybiBrbGFzcy5kZXRlY3Qodmll
dy5jb25zdHJ1Y3Rvcik7IH07CisKKyAgICB3aGlsZSAodmlldykgeworICAgICAgaWYoIGlzT2ZU
eXBlKHZpZXcpICkgeyByZXR1cm4gdmlldzsgfQorICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFy
ZW50VmlldycpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBSZXR1cm4gdGhlIG5lYXJlc3Qg
YW5jZXN0b3IgdGhhdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eS4KKworICAgIEBwcm9wZXJ0eSBuZWFy
ZXN0V2l0aFByb3BlcnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IEEgcHJvcGVydHkg
bmFtZQorICAgIEByZXR1cm4gRW1iZXIuVmlldworICAqLworICBuZWFyZXN0V2l0aFByb3BlcnR5
OiBmdW5jdGlvbihwcm9wZXJ0eSkgeworICAgIHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRW
aWV3Jyk7CisKKyAgICB3aGlsZSAodmlldykgeworICAgICAgaWYgKHByb3BlcnR5IGluIHZpZXcp
IHsgcmV0dXJuIHZpZXc7IH0KKyAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsK
KyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHdo
b3NlIHBhcmVudCBpcyBhbiBpbnN0YW5jZSBvZgorICAgIGBrbGFzc2AuCisKKyAgICBAcHJvcGVy
dHkgbmVhcmVzdENoaWxkT2YKKyAgICBAcGFyYW0ge0NsYXNzfSBrbGFzcyBTdWJjbGFzcyBvZiBF
bWJlci5WaWV3IChvciBFbWJlci5WaWV3IGl0c2VsZikKKyAgICBAcmV0dXJuIEVtYmVyLlZpZXcK
KyAgKi8KKyAgbmVhcmVzdENoaWxkT2Y6IGZ1bmN0aW9uKGtsYXNzKSB7CisgICAgdmFyIHZpZXcg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKworICAgIHdoaWxlICh2aWV3KSB7CisgICAgICBp
ZihnZXQodmlldywgJ3BhcmVudFZpZXcnKSBpbnN0YW5jZW9mIGtsYXNzKSB7IHJldHVybiB2aWV3
OyB9CisgICAgICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7CisgICAgfQorICB9LAor
CisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBXaGVuIHRoZSBwYXJlbnQgdmlldyBjaGFuZ2Vz
LCByZWN1cnNpdmVseSBpbnZhbGlkYXRlIGBjb250cm9sbGVyYAorCisgICAgQG1ldGhvZCBfcGFy
ZW50Vmlld0RpZENoYW5nZQorICAqLworICBfcGFyZW50Vmlld0RpZENoYW5nZTogRW1iZXIub2Jz
ZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuaXNEZXN0cm95aW5nKSB7IHJldHVybjsg
fQorCisgICAgaWYgKGdldCh0aGlzLCAncGFyZW50Vmlldy5jb250cm9sbGVyJykgJiYgIWdldCh0
aGlzLCAnY29udHJvbGxlcicpKSB7CisgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdj
b250cm9sbGVyJyk7CisgICAgfQorICB9LCAnX3BhcmVudFZpZXcnKSwKKworICBfY29udHJvbGxl
ckRpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuaXNE
ZXN0cm95aW5nKSB7IHJldHVybjsgfQorCisgICAgdGhpcy5yZXJlbmRlcigpOworCisgICAgdGhp
cy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKKyAgICAgIHZpZXcucHJvcGVydHlE
aWRDaGFuZ2UoJ2NvbnRyb2xsZXInKTsKKyAgICB9KTsKKyAgfSwgJ2NvbnRyb2xsZXInKSwKKwor
ICBjbG9uZUtleXdvcmRzOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdGVtcGxhdGVEYXRhID0gZ2V0
KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKKworICAgIHZhciBrZXl3b3JkcyA9IHRlbXBsYXRlRGF0
YSA/IEVtYmVyLmNvcHkodGVtcGxhdGVEYXRhLmtleXdvcmRzKSA6IHt9OworICAgIHNldChrZXl3
b3JkcywgJ3ZpZXcnLCBnZXQodGhpcywgJ2NvbmNyZXRlVmlldycpKTsKKyAgICBzZXQoa2V5d29y
ZHMsICdfdmlldycsIHRoaXMpOworICAgIHNldChrZXl3b3JkcywgJ2NvbnRyb2xsZXInLCBnZXQo
dGhpcywgJ2NvbnRyb2xsZXInKSk7CisKKyAgICByZXR1cm4ga2V5d29yZHM7CisgIH0sCisKKyAg
LyoqCisgICAgQ2FsbGVkIG9uIHlvdXIgdmlldyB3aGVuIGl0IHNob3VsZCBwdXNoIHN0cmluZ3Mg
b2YgSFRNTCBpbnRvIGEKKyAgICBgRW1iZXIuUmVuZGVyQnVmZmVyYC4gTW9zdCB1c2VycyB3aWxs
IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGB0ZW1wbGF0ZWAKKyAgICBvciBgdGVtcGxhdGVOYW1lYCBw
cm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCisKKyAgICBCeSBkZWZhdWx0LCBgRW1i
ZXIuVmlld2Agd2lsbCBsb29rIGZvciBhIGZ1bmN0aW9uIGluIHRoZSBgdGVtcGxhdGVgCisgICAg
cHJvcGVydHkgYW5kIGludm9rZSBpdCB3aXRoIHRoZSB2YWx1ZSBvZiBgY29udGV4dGAuIFRoZSB2
YWx1ZSBvZgorICAgIGBjb250ZXh0YCB3aWxsIGJlIHRoZSB2aWV3J3MgY29udHJvbGxlciB1bmxl
c3MgeW91IG92ZXJyaWRlIGl0LgorCisgICAgQG1ldGhvZCByZW5kZXIKKyAgICBAcGFyYW0ge0Vt
YmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyIFRoZSByZW5kZXIgYnVmZmVyCisgICovCisgIHJlbmRl
cjogZnVuY3Rpb24oYnVmZmVyKSB7CisgICAgLy8gSWYgdGhpcyB2aWV3IGhhcyBhIGxheW91dCwg
aXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQorICAgIC8vIHRoZSBsYXlvdXQgdG8gcmVu
ZGVyIHRoZSB2aWV3J3MgdGVtcGxhdGUuIE90aGVyd2lzZSwgcmVuZGVyIHRoZSB0ZW1wbGF0ZQor
ICAgIC8vIGRpcmVjdGx5LgorICAgIHZhciB0ZW1wbGF0ZSA9IGdldCh0aGlzLCAnbGF5b3V0Jykg
fHwgZ2V0KHRoaXMsICd0ZW1wbGF0ZScpOworCisgICAgaWYgKHRlbXBsYXRlKSB7CisgICAgICB2
YXIgY29udGV4dCA9IGdldCh0aGlzLCAnY29udGV4dCcpOworICAgICAgdmFyIGtleXdvcmRzID0g
dGhpcy5jbG9uZUtleXdvcmRzKCk7CisgICAgICB2YXIgb3V0cHV0OworCisgICAgICB2YXIgZGF0
YSA9IHsKKyAgICAgICAgdmlldzogdGhpcywKKyAgICAgICAgYnVmZmVyOiBidWZmZXIsCisgICAg
ICAgIGlzUmVuZGVyRGF0YTogdHJ1ZSwKKyAgICAgICAga2V5d29yZHM6IGtleXdvcmRzLAorICAg
ICAgICBpbnNpZGVHcm91cDogZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEuaW5zaWRlR3JvdXAnKQor
ICAgICAgfTsKKworICAgICAgLy8gSW52b2tlIHRoZSB0ZW1wbGF0ZSB3aXRoIHRoZSBwcm92aWRl
ZCB0ZW1wbGF0ZSBjb250ZXh0LCB3aGljaAorICAgICAgLy8gaXMgdGhlIHZpZXcncyBjb250cm9s
bGVyIGJ5IGRlZmF1bHQuIEEgaGFzaCBvZiBkYXRhIGlzIGFsc28gcGFzc2VkIHRoYXQgcHJvdmlk
ZXMKKyAgICAgIC8vIHRoZSB0ZW1wbGF0ZSB3aXRoIGFjY2VzcyB0byB0aGUgdmlldyBhbmQgcmVu
ZGVyIGJ1ZmZlci4KKworICAgICAgRW1iZXIuYXNzZXJ0KCd0ZW1wbGF0ZSBtdXN0IGJlIGEgZnVu
Y3Rpb24uIERpZCB5b3UgbWVhbiB0byBjYWxsIEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiLi4u
Iikgb3Igc3BlY2lmeSB0ZW1wbGF0ZU5hbWUgaW5zdGVhZD8nLCB0eXBlb2YgdGVtcGxhdGUgPT09
ICdmdW5jdGlvbicpOworICAgICAgLy8gVGhlIHRlbXBsYXRlIHNob3VsZCB3cml0ZSBkaXJlY3Rs
eSB0byB0aGUgcmVuZGVyIGJ1ZmZlciBpbnN0ZWFkCisgICAgICAvLyBvZiByZXR1cm5pbmcgYSBz
dHJpbmcuCisgICAgICBvdXRwdXQgPSB0ZW1wbGF0ZShjb250ZXh0LCB7IGRhdGE6IGRhdGEgfSk7
CisKKyAgICAgIC8vIElmIHRoZSB0ZW1wbGF0ZSByZXR1cm5lZCBhIHN0cmluZyBpbnN0ZWFkIG9m
IHdyaXRpbmcgdG8gdGhlIGJ1ZmZlciwKKyAgICAgIC8vIHB1c2ggdGhlIHN0cmluZyBvbnRvIHRo
ZSBidWZmZXIuCisgICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmluZWQpIHsgYnVmZmVyLnB1c2go
b3V0cHV0KTsgfQorICAgIH0KKyAgfSwKKworICAvKioKKyAgICBSZW5kZXJzIHRoZSB2aWV3IGFn
YWluLiBUaGlzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCisgICAgdmlldyBp
cyBhbHJlYWR5IGluIHRoZSBET00gb3Igbm90LiBJZiB0aGUgdmlldyBpcyBpbiB0aGUgRE9NLCB0
aGUKKyAgICByZW5kZXJpbmcgcHJvY2VzcyB3aWxsIGJlIGRlZmVycmVkIHRvIGdpdmUgYmluZGlu
Z3MgYSBjaGFuY2UKKyAgICB0byBzeW5jaHJvbml6ZS4KKworICAgIElmIGNoaWxkcmVuIHdlcmUg
YWRkZWQgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2VzcyB1c2luZyBgYXBwZW5kQ2hpbGRgLAor
ICAgIGByZXJlbmRlcmAgd2lsbCByZW1vdmUgdGhlbSwgYmVjYXVzZSB0aGV5IHdpbGwgYmUgYWRk
ZWQgYWdhaW4KKyAgICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJlbmRlcmAuCisKKyAgICBJbiBn
ZW5lcmFsLCBpZiB0aGUgZGlzcGxheSBvZiB5b3VyIHZpZXcgY2hhbmdlcywgeW91IHNob3VsZCBt
b2RpZnkKKyAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5zdGVhZCBvZiBtYW51YWxseSBj
YWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgorICAgIGJlIHNsb3cuCisKKyAgICBAbWV0aG9k
IHJlcmVuZGVyCisgICovCisgIHJlcmVuZGVyOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhp
cy5jdXJyZW50U3RhdGUucmVyZW5kZXIodGhpcyk7CisgIH0sCisKKyAgY2xlYXJSZW5kZXJlZENo
aWxkcmVuOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbGVuZ3RoQmVmb3JlID0gdGhpcy5sZW5ndGhC
ZWZvcmVSZW5kZXIsCisgICAgICAgIGxlbmd0aEFmdGVyICA9IHRoaXMubGVuZ3RoQWZ0ZXJSZW5k
ZXI7CisKKyAgICAvLyBJZiB0aGVyZSB3ZXJlIGNoaWxkIHZpZXdzIGNyZWF0ZWQgZHVyaW5nIHRo
ZSBsYXN0IGNhbGwgdG8gcmVuZGVyKCksCisgICAgLy8gcmVtb3ZlIHRoZW0gdW5kZXIgdGhlIGFz
c3VtcHRpb24gdGhhdCB0aGV5IHdpbGwgYmUgcmUtY3JlYXRlZCB3aGVuCisgICAgLy8gd2UgcmUt
cmVuZGVyLgorCisgICAgLy8gVklFVy1UT0RPOiBVbml0IHRlc3QgdGhpcyBwYXRoLgorICAgIHZh
ciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKKyAgICBmb3IgKHZhciBpPWxlbmd0aEFm
dGVyLTE7IGk+PWxlbmd0aEJlZm9yZTsgaS0tKSB7CisgICAgICBpZiAoY2hpbGRWaWV3c1tpXSkg
eyBjaGlsZFZpZXdzW2ldLmRlc3Ryb3koKTsgfQorICAgIH0KKyAgfSwKKworICAvKioKKyAgICBA
cHJpdmF0ZQorCisgICAgSXRlcmF0ZXMgb3ZlciB0aGUgdmlldydzIGBjbGFzc05hbWVCaW5kaW5n
c2AgYXJyYXksIGluc2VydHMgdGhlIHZhbHVlCisgICAgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0
eSBpbnRvIHRoZSBgY2xhc3NOYW1lc2AgYXJyYXksIHRoZW4gY3JlYXRlcyBhbgorICAgIG9ic2Vy
dmVyIHRvIHVwZGF0ZSB0aGUgdmlldydzIGVsZW1lbnQgaWYgdGhlIGJvdW5kIHByb3BlcnR5IGV2
ZXIgY2hhbmdlcworICAgIGluIHRoZSBmdXR1cmUuCisKKyAgICBAbWV0aG9kIF9hcHBseUNsYXNz
TmFtZUJpbmRpbmdzCisgICovCisgIF9hcHBseUNsYXNzTmFtZUJpbmRpbmdzOiBmdW5jdGlvbihj
bGFzc0JpbmRpbmdzKSB7CisgICAgdmFyIGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMsCisg
ICAgZWxlbSwgbmV3Q2xhc3MsIGRhc2hlcml6ZWRDbGFzczsKKworICAgIC8vIExvb3AgdGhyb3Vn
aCBhbGwgb2YgdGhlIGNvbmZpZ3VyZWQgYmluZGluZ3MuIFRoZXNlIHdpbGwgYmUgZWl0aGVyCisg
ICAgLy8gcHJvcGVydHkgbmFtZXMgKCdpc1VyZ2VudCcpIG9yIHByb3BlcnR5IHBhdGhzIHJlbGF0
aXZlIHRvIHRoZSB2aWV3CisgICAgLy8gKCdjb250ZW50LmlzVXJnZW50JykKKyAgICBhX2ZvckVh
Y2goY2xhc3NCaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgeworCisgICAgICAvLyBWYXJpYWJs
ZSBpbiB3aGljaCB0aGUgb2xkIGNsYXNzIHZhbHVlIGlzIHNhdmVkLiBUaGUgb2JzZXJ2ZXIgZnVu
Y3Rpb24KKyAgICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFibGUsIHNvIGl0IGtub3dzIHdo
aWNoIHN0cmluZyB0byByZW1vdmUgd2hlbgorICAgICAgLy8gdGhlIHByb3BlcnR5IGNoYW5nZXMu
CisgICAgICB2YXIgb2xkQ2xhc3M7CisgICAgICAvLyBFeHRyYWN0IGp1c3QgdGhlIHByb3BlcnR5
IG5hbWUgZnJvbSBiaW5kaW5ncyBsaWtlICdmb286YmFyJworICAgICAgdmFyIHBhcnNlZFBhdGgg
PSBFbWJlci5WaWV3Ll9wYXJzZVByb3BlcnR5UGF0aChiaW5kaW5nKTsKKworICAgICAgLy8gU2V0
IHVwIGFuIG9ic2VydmVyIG9uIHRoZSBjb250ZXh0LiBJZiB0aGUgcHJvcGVydHkgY2hhbmdlcywg
dG9nZ2xlIHRoZQorICAgICAgLy8gY2xhc3MgbmFtZS4KKyAgICAgIHZhciBvYnNlcnZlciA9IGZ1
bmN0aW9uKCkgeworICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3Bl
cnR5CisgICAgICAgIG5ld0NsYXNzID0gdGhpcy5fY2xhc3NTdHJpbmdGb3JQcm9wZXJ0eShiaW5k
aW5nKTsKKyAgICAgICAgZWxlbSA9IHRoaXMuJCgpOworCisgICAgICAgIC8vIElmIHdlIGhhZCBw
cmV2aW91c2x5IGFkZGVkIGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQsIHJlbW92ZSBpdC4KKyAgICAg
ICAgaWYgKG9sZENsYXNzKSB7CisgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7
CisgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBjbGFzc05hbWVzIHNvIHRoYXQgaWYgdGhl
IHZpZXcgZ2V0cyByZXJlbmRlcmVkLAorICAgICAgICAgIC8vIHRoZSBjbGFzcyBkb2Vzbid0IGdl
dCBhZGRlZCBiYWNrIHRvIHRoZSBET00uCisgICAgICAgICAgY2xhc3NOYW1lcy5yZW1vdmVPYmpl
Y3Qob2xkQ2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCBhZGQg
YSBuZXcgY2xhc3MuIE1ha2Ugc3VyZSB3ZSBrZWVwIHRyYWNrIG9mIGl0IHNvCisgICAgICAgIC8v
IGl0IGNhbiBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgICAgICAgIGlmIChuZXdDbGFzcykg
eworICAgICAgICAgIGVsZW0uYWRkQ2xhc3MobmV3Q2xhc3MpOworICAgICAgICAgIG9sZENsYXNz
ID0gbmV3Q2xhc3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2xkQ2xhc3MgPSBudWxs
OworICAgICAgICB9CisgICAgICB9OworCisgICAgICAvLyBHZXQgdGhlIGNsYXNzIG5hbWUgZm9y
IHRoZSBwcm9wZXJ0eSBhdCBpdHMgY3VycmVudCB2YWx1ZQorICAgICAgZGFzaGVyaXplZENsYXNz
ID0gdGhpcy5fY2xhc3NTdHJpbmdGb3JQcm9wZXJ0eShiaW5kaW5nKTsKKworICAgICAgaWYgKGRh
c2hlcml6ZWRDbGFzcykgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCBpdCBnZXRzIGludG8gdGhl
IGNsYXNzTmFtZXMgYXJyYXkKKyAgICAgICAgLy8gc28gaXQgaXMgZGlzcGxheWVkIHdoZW4gd2Ug
cmVuZGVyLgorICAgICAgICBhX2FkZE9iamVjdChjbGFzc05hbWVzLCBkYXNoZXJpemVkQ2xhc3Mp
OworCisgICAgICAgIC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzIG5hbWUgc28gd2Ug
Y2FuIHJlbW92ZSBpdAorICAgICAgICAvLyBpZiB0aGUgb2JzZXJ2ZXIgZmlyZXMuIFJlbWVtYmVy
IHRoYXQgdGhpcyB2YXJpYWJsZSBoYXMKKyAgICAgICAgLy8gYmVlbiBjbG9zZWQgb3ZlciBieSB0
aGUgb2JzZXJ2ZXIuCisgICAgICAgIG9sZENsYXNzID0gZGFzaGVyaXplZENsYXNzOworICAgICAg
fQorCisgICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIodGhpcywgcGFyc2VkUGF0aC5wYXRoLCBv
YnNlcnZlcik7CisgICAgICAvLyBSZW1vdmUgY2xhc3NOYW1lIHNvIHdoZW4gdGhlIHZpZXcgaXMg
cmVyZW5kZXJlZCwKKyAgICAgIC8vIHRoZSBjbGFzc05hbWUgaXMgYWRkZWQgYmFzZWQgb24gYmlu
ZGluZyByZWV2YWx1YXRpb24KKyAgICAgIHRoaXMub25lKCd3aWxsQ2xlYXJSZW5kZXInLCBmdW5j
dGlvbigpIHsKKyAgICAgICAgaWYgKG9sZENsYXNzKSB7CisgICAgICAgICAgY2xhc3NOYW1lcy5y
ZW1vdmVPYmplY3Qob2xkQ2xhc3MpOworICAgICAgICAgIG9sZENsYXNzID0gbnVsbDsKKyAgICAg
ICAgfQorICAgICAgfSk7CisKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJp
dmF0ZQorCisgICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgdmlldydzIGF0dHJpYnV0ZSBiaW5kaW5n
cywgc2V0cyB1cCBvYnNlcnZlcnMgZm9yIGVhY2gsCisgICAgdGhlbiBhcHBsaWVzIHRoZSBjdXJy
ZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBwYXNzZWQgcmVuZGVyIGJ1ZmZlci4K
KworICAgIEBtZXRob2QgX2FwcGx5QXR0cmlidXRlQmluZGluZ3MKKyAgICBAcGFyYW0ge0VtYmVy
LlJlbmRlckJ1ZmZlcn0gYnVmZmVyCisgICovCisgIF9hcHBseUF0dHJpYnV0ZUJpbmRpbmdzOiBm
dW5jdGlvbihidWZmZXIsIGF0dHJpYnV0ZUJpbmRpbmdzKSB7CisgICAgdmFyIGF0dHJpYnV0ZVZh
bHVlLCBlbGVtLCB0eXBlOworCisgICAgYV9mb3JFYWNoKGF0dHJpYnV0ZUJpbmRpbmdzLCBmdW5j
dGlvbihiaW5kaW5nKSB7CisgICAgICB2YXIgc3BsaXQgPSBiaW5kaW5nLnNwbGl0KCc6JyksCisg
ICAgICAgICAgcHJvcGVydHkgPSBzcGxpdFswXSwKKyAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0g
c3BsaXRbMV0gfHwgcHJvcGVydHk7CisKKyAgICAgIC8vIENyZWF0ZSBhbiBvYnNlcnZlciB0byBh
ZGQvcmVtb3ZlL2NoYW5nZSB0aGUgYXR0cmlidXRlIGlmIHRoZQorICAgICAgLy8gSmF2YVNjcmlw
dCBwcm9wZXJ0eSBjaGFuZ2VzLgorICAgICAgdmFyIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Cisg
ICAgICAgIGVsZW0gPSB0aGlzLiQoKTsKKyAgICAgICAgaWYgKCFlbGVtKSB7IHJldHVybjsgfQor
CisgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gZ2V0KHRoaXMsIHByb3BlcnR5KTsKKworICAgICAg
ICBFbWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MoZWxlbSwgYXR0cmlidXRlTmFtZSwg
YXR0cmlidXRlVmFsdWUpOworICAgICAgfTsKKworICAgICAgdGhpcy5yZWdpc3Rlck9ic2VydmVy
KHRoaXMsIHByb3BlcnR5LCBvYnNlcnZlcik7CisKKyAgICAgIC8vIERldGVybWluZSB0aGUgY3Vy
cmVudCB2YWx1ZSBhbmQgYWRkIGl0IHRvIHRoZSByZW5kZXIgYnVmZmVyCisgICAgICAvLyBpZiBu
ZWNlc3NhcnkuCisgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGdldCh0aGlzLCBwcm9wZXJ0eSk7Cisg
ICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MoYnVmZmVyLCBhdHRyaWJ1dGVO
YW1lLCBhdHRyaWJ1dGVWYWx1ZSk7CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAg
QHByaXZhdGUKKworICAgIEdpdmVuIGEgcHJvcGVydHkgbmFtZSwgcmV0dXJucyBhIGRhc2hlcml6
ZWQgdmVyc2lvbiBvZiB0aGF0CisgICAgcHJvcGVydHkgbmFtZSBpZiB0aGUgcHJvcGVydHkgZXZh
bHVhdGVzIHRvIGEgbm9uLWZhbHN5IHZhbHVlLgorCisgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2
aWV3IGhhcyBwcm9wZXJ0eSBgaXNVcmdlbnRgIHRoYXQgZXZhbHVhdGVzIHRvIHRydWUsCisgICAg
cGFzc2luZyBgaXNVcmdlbnRgIHRvIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGAiaXMtdXJnZW50
ImAuCisKKyAgICBAbWV0aG9kIF9jbGFzc1N0cmluZ0ZvclByb3BlcnR5CisgICAgQHBhcmFtIHBy
b3BlcnR5CisgICovCisgIF9jbGFzc1N0cmluZ0ZvclByb3BlcnR5OiBmdW5jdGlvbihwcm9wZXJ0
eSkgeworICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgo
cHJvcGVydHkpOworICAgIHZhciBwYXRoID0gcGFyc2VkUGF0aC5wYXRoOworCisgICAgdmFyIHZh
bCA9IGdldCh0aGlzLCBwYXRoKTsKKyAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgRW1iZXIu
aXNHbG9iYWxQYXRoKHBhdGgpKSB7CisgICAgICB2YWwgPSBnZXQoRW1iZXIubG9va3VwLCBwYXRo
KTsKKyAgICB9CisKKyAgICByZXR1cm4gRW1iZXIuVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShw
YXRoLCB2YWwsIHBhcnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1l
KTsKKyAgfSwKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIEVMRU1FTlQgU1VQUE9SVAorICAvLworCisgIC8qKgor
ICAgIFJldHVybnMgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQgZm9yIHRoZSB2aWV3LgorCisgICAg
QHByb3BlcnR5IGVsZW1lbnQKKyAgICBAdHlwZSBET01FbGVtZW50CisgICovCisgIGVsZW1lbnQ6
IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgIT09
IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnNldEVsZW1lbnQo
dGhpcywgdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3Rh
dGUuZ2V0RWxlbWVudCh0aGlzKTsKKyAgICB9CisgIH0pLnByb3BlcnR5KCdfcGFyZW50Vmlldycp
LAorCisgIC8qKgorICAgIFJldHVybnMgYSBqUXVlcnkgb2JqZWN0IGZvciB0aGlzIHZpZXcncyBl
bGVtZW50LiBJZiB5b3UgcGFzcyBpbiBhIHNlbGVjdG9yCisgICAgc3RyaW5nLCB0aGlzIG1ldGhv
ZCB3aWxsIHJldHVybiBhIGpRdWVyeSBvYmplY3QsIHVzaW5nIHRoZSBjdXJyZW50IGVsZW1lbnQK
KyAgICBhcyBpdHMgYnVmZmVyLgorCisgICAgRm9yIGV4YW1wbGUsIGNhbGxpbmcgYHZpZXcuJCgn
bGknKWAgd2lsbCByZXR1cm4gYSBqUXVlcnkgb2JqZWN0IGNvbnRhaW5pbmcKKyAgICBhbGwgb2Yg
dGhlIGBsaWAgZWxlbWVudHMgaW5zaWRlIHRoZSBET00gZWxlbWVudCBvZiB0aGlzIHZpZXcuCisK
KyAgICBAcHJvcGVydHkgJAorICAgIEBwYXJhbSB7U3RyaW5nfSBbc2VsZWN0b3JdIGEgalF1ZXJ5
LWNvbXBhdGlibGUgc2VsZWN0b3Igc3RyaW5nCisgICAgQHJldHVybiB7alF1ZXJ5fSB0aGUgQ29y
ZVF1ZXJ5IG9iamVjdCBmb3IgdGhlIERPTSBub2RlCisgICovCisgICQ6IGZ1bmN0aW9uKHNlbCkg
eworICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS4kKHRoaXMsIHNlbCk7CisgIH0sCisKKyAg
bXV0YXRlQ2hpbGRWaWV3czogZnVuY3Rpb24oY2FsbGJhY2spIHsKKyAgICB2YXIgY2hpbGRWaWV3
cyA9IHRoaXMuX2NoaWxkVmlld3MsCisgICAgICAgIGlkeCA9IGNoaWxkVmlld3MubGVuZ3RoLAor
ICAgICAgICB2aWV3OworCisgICAgd2hpbGUoLS1pZHggPj0gMCkgeworICAgICAgdmlldyA9IGNo
aWxkVmlld3NbaWR4XTsKKyAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgdmlldywgaWR4KTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICBmb3JFYWNoQ2hpbGRWaWV3OiBmdW5j
dGlvbihjYWxsYmFjaykgeworICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsK
KworICAgIGlmICghY2hpbGRWaWV3cykgeyByZXR1cm4gdGhpczsgfQorCisgICAgdmFyIGxlbiA9
IGNoaWxkVmlld3MubGVuZ3RoLAorICAgICAgICB2aWV3LCBpZHg7CisKKyAgICBmb3IoaWR4ID0g
MDsgaWR4IDwgbGVuOyBpZHgrKykgeworICAgICAgdmlldyA9IGNoaWxkVmlld3NbaWR4XTsKKyAg
ICAgIGNhbGxiYWNrLmNhbGwodGhpcywgdmlldyk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7
CisgIH0sCisKKyAgLyoqCisgICAgQXBwZW5kcyB0aGUgdmlldydzIGVsZW1lbnQgdG8gdGhlIHNw
ZWNpZmllZCBwYXJlbnQgZWxlbWVudC4KKworICAgIElmIHRoZSB2aWV3IGRvZXMgbm90IGhhdmUg
YW4gSFRNTCByZXByZXNlbnRhdGlvbiB5ZXQsIGBjcmVhdGVFbGVtZW50KClgCisgICAgd2lsbCBi
ZSBjYWxsZWQgYXV0b21hdGljYWxseS4KKworICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBqdXN0
IHNjaGVkdWxlcyB0aGUgdmlldyB0byBiZSBhcHBlbmRlZDsgdGhlIERPTQorICAgIGVsZW1lbnQg
d2lsbCBub3QgYmUgYXBwZW5kZWQgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdW50aWwgYWxsIGJpbmRp
bmdzIGhhdmUKKyAgICBmaW5pc2hlZCBzeW5jaHJvbml6aW5nLgorCisgICAgVGhpcyBpcyBub3Qg
dHlwaWNhbGx5IGEgZnVuY3Rpb24gdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgZGlyZWN0bHkg
d2hlbgorICAgIGJ1aWxkaW5nIHlvdXIgYXBwbGljYXRpb24uIFlvdSBtaWdodCBjb25zaWRlciB1
c2luZyBgRW1iZXIuQ29udGFpbmVyVmlld2AKKyAgICBpbnN0ZWFkLiBJZiB5b3UgZG8gbmVlZCB0
byB1c2UgYGFwcGVuZFRvYCwgYmUgc3VyZSB0aGF0IHRoZSB0YXJnZXQgZWxlbWVudAorICAgIHlv
dSBhcmUgcHJvdmlkaW5nIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBgRW1iZXIuQXBwbGljYXRpb25g
IGFuZCBkb2VzIG5vdAorICAgIGhhdmUgYW4gYW5jZXN0b3IgZWxlbWVudCB0aGF0IGlzIGFzc29j
aWF0ZWQgd2l0aCBhbiBFbWJlciB2aWV3LgorCisgICAgQG1ldGhvZCBhcHBlbmRUbworICAgIEBw
YXJhbSB7U3RyaW5nfERPTUVsZW1lbnR8alF1ZXJ5fSBBIHNlbGVjdG9yLCBlbGVtZW50LCBIVE1M
IHN0cmluZywgb3IgalF1ZXJ5IG9iamVjdAorICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2Vp
dmVyCisgICovCisgIGFwcGVuZFRvOiBmdW5jdGlvbih0YXJnZXQpIHsKKyAgICAvLyBTY2hlZHVs
ZSB0aGUgRE9NIGVsZW1lbnQgdG8gYmUgY3JlYXRlZCBhbmQgYXBwZW5kZWQgdG8gdGhlIGdpdmVu
CisgICAgLy8gZWxlbWVudCBhZnRlciBiaW5kaW5ncyBoYXZlIHN5bmNocm9uaXplZC4KKyAgICB0
aGlzLl9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rpb24oKSB7CisgICAgICBFbWJlci5hc3NlcnQo
IllvdSBjYW5ub3QgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIEVtYmVyLlZpZXcuIENvbnNpZGVyIHVz
aW5nIEVtYmVyLkNvbnRhaW5lclZpZXcgaW5zdGVhZC4iLCAhRW1iZXIuJCh0YXJnZXQpLmlzKCcu
ZW1iZXItdmlldycpICYmICFFbWJlci4kKHRhcmdldCkucGFyZW50cygpLmlzKCcuZW1iZXItdmll
dycpKTsKKyAgICAgIHRoaXMuJCgpLmFwcGVuZFRvKHRhcmdldCk7CisgICAgfSk7CisKKyAgICBy
ZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBSZXBsYWNlcyB0aGUgY29udGVudCBvZiB0
aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50IHdpdGggdGhpcyB2aWV3J3MKKyAgICBlbGVtZW50
LiBJZiB0aGUgdmlldyBkb2VzIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVzZW50YXRpb24geWV0LAor
ICAgIGBjcmVhdGVFbGVtZW50KClgIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuCisKKyAg
ICBOb3RlIHRoYXQgdGhpcyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhlIHZpZXcgdG8gYmUgYXBw
ZW5kZWQ7IHRoZSBET00KKyAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFwcGVuZGVkIHRvIHRoZSBn
aXZlbiBlbGVtZW50IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlCisgICAgZmluaXNoZWQgc3luY2hy
b25pemluZworCisgICAgQG1ldGhvZCByZXBsYWNlSW4KKyAgICBAcGFyYW0ge1N0cmluZ3xET01F
bGVtZW50fGpRdWVyeX0gQSBzZWxlY3RvciwgZWxlbWVudCwgSFRNTCBzdHJpbmcsIG9yIGpRdWVy
eSBvYmplY3QKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlZAorICAqLworICByZXBs
YWNlSW46IGZ1bmN0aW9uKHRhcmdldCkgeworICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBy
ZXBsYWNlIGFuIGV4aXN0aW5nIEVtYmVyLlZpZXcuIENvbnNpZGVyIHVzaW5nIEVtYmVyLkNvbnRh
aW5lclZpZXcgaW5zdGVhZC4iLCAhRW1iZXIuJCh0YXJnZXQpLmlzKCcuZW1iZXItdmlldycpICYm
ICFFbWJlci4kKHRhcmdldCkucGFyZW50cygpLmlzKCcuZW1iZXItdmlldycpKTsKKworICAgIHRo
aXMuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKKyAgICAgIEVtYmVyLiQodGFyZ2V0
KS5lbXB0eSgpOworICAgICAgdGhpcy4kKCkuYXBwZW5kVG8odGFyZ2V0KTsKKyAgICB9KTsKKwor
ICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBTY2hl
ZHVsZXMgYSBET00gb3BlcmF0aW9uIHRvIG9jY3VyIGR1cmluZyB0aGUgbmV4dCByZW5kZXIgcGhh
c2UuIFRoaXMKKyAgICBlbnN1cmVzIHRoYXQgYWxsIGJpbmRpbmdzIGhhdmUgZmluaXNoZWQgc3lu
Y2hyb25pemluZyBiZWZvcmUgdGhlIHZpZXcgaXMKKyAgICByZW5kZXJlZC4KKworICAgIFRvIHVz
ZSwgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBET00gb3BlcmF0aW9uLgorCisgICAg
QmVmb3JlIHlvdXIgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGlzIHZpZXcgYW5kIGFsbCBjaGlsZCB2
aWV3cyB3aWxsIHJlY2VpdmUKKyAgICB0aGUgYHdpbGxJbnNlcnRFbGVtZW50YCBldmVudC4gQWZ0
ZXIgeW91ciBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGlzIHZpZXcKKyAgICBhbmQgYWxsIG9mIGl0
cyBjaGlsZCB2aWV3cyB3aWxsIHJlY2VpdmUgdGhlIGBkaWRJbnNlcnRFbGVtZW50YCBldmVudC4K
KworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2aWV3Ll9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rp
b24oKSB7CisgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoKTsKKyAgICAgIHRoaXMuJCgpLmFwcGVu
ZFRvKCdib2R5Jyk7CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIF9pbnNlcnRFbGVt
ZW50TGF0ZXIKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdGhhdCBpbnNl
cnRzIHRoZSBlbGVtZW50IGludG8gdGhlIERPTQorICAqLworICBfaW5zZXJ0RWxlbWVudExhdGVy
OiBmdW5jdGlvbihmbikgeworICAgIHRoaXMuX3NjaGVkdWxlZEluc2VydCA9IEVtYmVyLnJ1bi5z
Y2hlZHVsZU9uY2UoJ3JlbmRlcicsIHRoaXMsICdfaW5zZXJ0RWxlbWVudCcsIGZuKTsKKyAgfSwK
KworICBfaW5zZXJ0RWxlbWVudDogZnVuY3Rpb24gKGZuKSB7CisgICAgdGhpcy5fc2NoZWR1bGVk
SW5zZXJ0ID0gbnVsbDsKKyAgICB0aGlzLmN1cnJlbnRTdGF0ZS5pbnNlcnRFbGVtZW50KHRoaXMs
IGZuKTsKKyAgfSwKKworICAvKioKKyAgICBBcHBlbmRzIHRoZSB2aWV3J3MgZWxlbWVudCB0byB0
aGUgZG9jdW1lbnQgYm9keS4gSWYgdGhlIHZpZXcgZG9lcworICAgIG5vdCBoYXZlIGFuIEhUTUwg
cmVwcmVzZW50YXRpb24geWV0LCBgY3JlYXRlRWxlbWVudCgpYCB3aWxsIGJlIGNhbGxlZAorICAg
IGF1dG9tYXRpY2FsbHkuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QganVzdCBzY2hlZHVs
ZXMgdGhlIHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00KKyAgICBlbGVtZW50IHdpbGwgbm90
IGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZl
CisgICAgZmluaXNoZWQgc3luY2hyb25pemluZy4KKworICAgIEBtZXRob2QgYXBwZW5kCisgICAg
QHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAgKi8KKyAgYXBwZW5kOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKKyAgfSwKKworICAv
KioKKyAgICBSZW1vdmVzIHRoZSB2aWV3J3MgZWxlbWVudCBmcm9tIHRoZSBlbGVtZW50IHRvIHdo
aWNoIGl0IGlzIGF0dGFjaGVkLgorCisgICAgQG1ldGhvZCByZW1vdmUKKyAgICBAcmV0dXJuIHtF
bWJlci5WaWV3fSByZWNlaXZlcgorICAqLworICByZW1vdmU6IGZ1bmN0aW9uKCkgeworICAgIC8v
IFdoYXQgd2Ugc2hvdWxkIHJlYWxseSBkbyBoZXJlIGlzIHdhaXQgdW50aWwgdGhlIGVuZCBvZiB0
aGUgcnVuIGxvb3AKKyAgICAvLyB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4g
cmUtYXBwZW5kZWQgdG8gYSBkaWZmZXJlbnQKKyAgICAvLyBlbGVtZW50LgorICAgIC8vIEluIHRo
ZSBpbnRlcmltLCB3ZSB3aWxsIGp1c3QgcmUtcmVuZGVyIGlmIHRoYXQgaGFwcGVucy4gSXQgaXMg
bW9yZQorICAgIC8vIGltcG9ydGFudCB0aGFuIGVsZW1lbnRzIGdldCBnYXJiYWdlIGNvbGxlY3Rl
ZC4KKyAgICBpZiAoIXRoaXMucmVtb3ZlZEZyb21ET00pIHsgdGhpcy5kZXN0cm95RWxlbWVudCgp
OyB9CisgICAgdGhpcy5pbnZva2VSZWN1cnNpdmVseShmdW5jdGlvbih2aWV3KSB7CisgICAgICBp
ZiAodmlldy5jbGVhclJlbmRlcmVkQ2hpbGRyZW4pIHsgdmlldy5jbGVhclJlbmRlcmVkQ2hpbGRy
ZW4oKTsgfQorICAgIH0pOworICB9LAorCisgIGVsZW1lbnRJZDogbnVsbCwKKworICAvKioKKyAg
ICBBdHRlbXB0cyB0byBkaXNjb3ZlciB0aGUgZWxlbWVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQu
IFRoZSBkZWZhdWx0CisgICAgaW1wbGVtZW50YXRpb24gbG9va3MgZm9yIGFuIGVsZW1lbnQgd2l0
aCBhbiBJRCBvZiBgZWxlbWVudElkYCAob3IgdGhlCisgICAgdmlldydzIGd1aWQgaWYgYGVsZW1l
bnRJZGAgaXMgbnVsbCkuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KKyAgICBwcm92
aWRlIHlvdXIgb3duIGZvcm0gb2YgbG9va3VwLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8g
ZGlzY292ZXIgeW91cgorICAgIGVsZW1lbnQgdXNpbmcgYSBDU1MgY2xhc3MgbmFtZSBpbnN0ZWFk
IG9mIGFuIElELgorCisgICAgQG1ldGhvZCBmaW5kRWxlbWVudEluUGFyZW50RWxlbWVudAorICAg
IEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50RWxlbWVudCBUaGUgcGFyZW50J3MgRE9NIGVsZW1l
bnQKKyAgICBAcmV0dXJuIHtET01FbGVtZW50fSBUaGUgZGlzY292ZXJlZCBlbGVtZW50CisgICov
CisgIGZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50OiBmdW5jdGlvbihwYXJlbnRFbGVtKSB7Cisg
ICAgdmFyIGlkID0gIiMiICsgdGhpcy5lbGVtZW50SWQ7CisgICAgcmV0dXJuIEVtYmVyLiQoaWQp
WzBdIHx8IEVtYmVyLiQoaWQsIHBhcmVudEVsZW0pWzBdOworICB9LAorCisgIC8qKgorICAgIENy
ZWF0ZXMgYSBET00gcmVwcmVzZW50YXRpb24gb2YgdGhlIHZpZXcgYW5kIGFsbCBvZiBpdHMKKyAg
ICBjaGlsZCB2aWV3cyBieSByZWN1cnNpdmVseSBjYWxsaW5nIHRoZSBgcmVuZGVyKClgIG1ldGhv
ZC4KKworICAgIEFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNyZWF0ZWQsIGBkaWRJbnNlcnRF
bGVtZW50YCB3aWxsCisgICAgYmUgY2FsbGVkIG9uIHRoaXMgdmlldyBhbmQgYWxsIG9mIGl0cyBj
aGlsZCB2aWV3cy4KKworICAgIEBtZXRob2QgY3JlYXRlRWxlbWVudAorICAgIEByZXR1cm4ge0Vt
YmVyLlZpZXd9IHJlY2VpdmVyCisgICovCisgIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewor
ICAgIGlmIChnZXQodGhpcywgJ2VsZW1lbnQnKSkgeyByZXR1cm4gdGhpczsgfQorCisgICAgdmFy
IGJ1ZmZlciA9IHRoaXMucmVuZGVyVG9CdWZmZXIoKTsKKyAgICBzZXQodGhpcywgJ2VsZW1lbnQn
LCBidWZmZXIuZWxlbWVudCgpKTsKKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgor
ICAgIENhbGxlZCB3aGVuIGEgdmlldyBpcyBnb2luZyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRv
IHRoZSBET00uCisKKyAgICBAZXZlbnQgd2lsbEluc2VydEVsZW1lbnQKKyAgKi8KKyAgd2lsbElu
c2VydEVsZW1lbnQ6IEVtYmVyLkssCisKKyAgLyoqCisgICAgQ2FsbGVkIHdoZW4gdGhlIGVsZW1l
bnQgb2YgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLgorICAgIE92ZXJy
aWRlIHRoaXMgZnVuY3Rpb24gdG8gZG8gYW55IHNldCB1cCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1l
bnQgaW4gdGhlCisgICAgZG9jdW1lbnQgYm9keS4KKworICAgIEBldmVudCBkaWRJbnNlcnRFbGVt
ZW50CisgICovCisgIGRpZEluc2VydEVsZW1lbnQ6IEVtYmVyLkssCisKKyAgLyoqCisgICAgQ2Fs
bGVkIHdoZW4gdGhlIHZpZXcgaXMgYWJvdXQgdG8gcmVyZW5kZXIsIGJ1dCBiZWZvcmUgYW55dGhp
bmcgaGFzCisgICAgYmVlbiB0b3JuIGRvd24uIFRoaXMgaXMgYSBnb29kIG9wcG9ydHVuaXR5IHRv
IHRlYXIgZG93biBhbnkgbWFudWFsCisgICAgb2JzZXJ2ZXJzIHlvdSBoYXZlIGluc3RhbGxlZCBi
YXNlZCBvbiB0aGUgRE9NIHN0YXRlCisKKyAgICBAZXZlbnQgd2lsbENsZWFyUmVuZGVyCisgICov
CisgIHdpbGxDbGVhclJlbmRlcjogRW1iZXIuSywKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisg
ICAgUnVuIHRoaXMgY2FsbGJhY2sgb24gdGhlIGN1cnJlbnQgdmlldyBhbmQgcmVjdXJzaXZlbHkg
b24gY2hpbGQgdmlld3MuCisKKyAgICBAbWV0aG9kIGludm9rZVJlY3Vyc2l2ZWx5CisgICAgQHBh
cmFtIGZuIHtGdW5jdGlvbn0KKyAgKi8KKyAgaW52b2tlUmVjdXJzaXZlbHk6IGZ1bmN0aW9uKGZu
KSB7CisgICAgdmFyIGNoaWxkVmlld3MgPSBbdGhpc10sIGN1cnJlbnRWaWV3cywgdmlldzsKKwor
ICAgIHdoaWxlIChjaGlsZFZpZXdzLmxlbmd0aCkgeworICAgICAgY3VycmVudFZpZXdzID0gY2hp
bGRWaWV3cy5zbGljZSgpOworICAgICAgY2hpbGRWaWV3cyA9IFtdOworCisgICAgICBmb3IgKHZh
ciBpPTAsIGw9Y3VycmVudFZpZXdzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgdmlldyA9
IGN1cnJlbnRWaWV3c1tpXTsKKyAgICAgICAgZm4uY2FsbCh2aWV3LCB2aWV3KTsKKyAgICAgICAg
aWYgKHZpZXcuX2NoaWxkVmlld3MpIHsKKyAgICAgICAgICBjaGlsZFZpZXdzLnB1c2guYXBwbHko
Y2hpbGRWaWV3cywgdmlldy5fY2hpbGRWaWV3cyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9
CisgIH0sCisKKyAgdHJpZ2dlclJlY3Vyc2l2ZWx5OiBmdW5jdGlvbihldmVudE5hbWUpIHsKKyAg
ICB2YXIgY2hpbGRWaWV3cyA9IFt0aGlzXSwgY3VycmVudFZpZXdzLCB2aWV3OworCisgICAgd2hp
bGUgKGNoaWxkVmlld3MubGVuZ3RoKSB7CisgICAgICBjdXJyZW50Vmlld3MgPSBjaGlsZFZpZXdz
LnNsaWNlKCk7CisgICAgICBjaGlsZFZpZXdzID0gW107CisKKyAgICAgIGZvciAodmFyIGk9MCwg
bD1jdXJyZW50Vmlld3MubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICB2aWV3ID0gY3VycmVu
dFZpZXdzW2ldOworICAgICAgICBpZiAodmlldy50cmlnZ2VyKSB7IHZpZXcudHJpZ2dlcihldmVu
dE5hbWUpOyB9CisgICAgICAgIGlmICh2aWV3Ll9jaGlsZFZpZXdzKSB7CisgICAgICAgICAgY2hp
bGRWaWV3cy5wdXNoLmFwcGx5KGNoaWxkVmlld3MsIHZpZXcuX2NoaWxkVmlld3MpOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIC8qKgorICAgIERlc3Ryb3lzIGFueSBleGlz
dGluZyBlbGVtZW50IGFsb25nIHdpdGggdGhlIGVsZW1lbnQgZm9yIGFueSBjaGlsZCB2aWV3cwor
ICAgIGFzIHdlbGwuIElmIHRoZSB2aWV3IGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIGEgZWxlbWVu
dCwgdGhlbiB0aGlzIG1ldGhvZAorICAgIHdpbGwgZG8gbm90aGluZy4KKworICAgIElmIHlvdSBp
bXBsZW1lbnQgYHdpbGxEZXN0cm95RWxlbWVudCgpYCBvbiB5b3VyIHZpZXcsIHRoZW4gdGhpcyBt
ZXRob2Qgd2lsbAorICAgIGJlIGludm9rZWQgb24geW91ciB2aWV3IGJlZm9yZSB5b3VyIGVsZW1l
bnQgaXMgZGVzdHJveWVkIHRvIGdpdmUgeW91IGEKKyAgICBjaGFuY2UgdG8gY2xlYW4gdXAgYW55
IGV2ZW50IGhhbmRsZXJzLCBldGMuCisKKyAgICBJZiB5b3Ugd3JpdGUgYSBgd2lsbERlc3Ryb3lF
bGVtZW50KClgIGhhbmRsZXIsIHlvdSBjYW4gYXNzdW1lIHRoYXQgeW91cgorICAgIGBkaWRJbnNl
cnRFbGVtZW50KClgIGhhbmRsZXIgd2FzIGNhbGxlZCBlYXJsaWVyIGZvciB0aGUgc2FtZSBlbGVt
ZW50LgorCisgICAgTm9ybWFsbHkgeW91IHdpbGwgbm90IGNhbGwgb3Igb3ZlcnJpZGUgdGhpcyBt
ZXRob2QgeW91cnNlbGYsIGJ1dCB5b3UgbWF5CisgICAgd2FudCB0byBpbXBsZW1lbnQgdGhlIGFi
b3ZlIGNhbGxiYWNrcyB3aGVuIGl0IGlzIHJ1bi4KKworICAgIEBtZXRob2QgZGVzdHJveUVsZW1l
bnQKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgorICAqLworICBkZXN0cm95RWxl
bWVudDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmRlc3Ryb3lF
bGVtZW50KHRoaXMpOworICB9LAorCisgIC8qKgorICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50
IG9mIHRoZSB2aWV3IGlzIGdvaW5nIHRvIGJlIGRlc3Ryb3llZC4gT3ZlcnJpZGUKKyAgICB0aGlz
IGZ1bmN0aW9uIHRvIGRvIGFueSB0ZWFyZG93biB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQsIGxp
a2UgcmVtb3ZpbmcKKyAgICBldmVudCBsaXN0ZW5lcnMuCisKKyAgICBAZXZlbnQgd2lsbERlc3Ry
b3lFbGVtZW50CisgICovCisgIHdpbGxEZXN0cm95RWxlbWVudDogZnVuY3Rpb24oKSB7fSwKKwor
ICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgVHJpZ2dlcnMgdGhlIGB3aWxsRGVzdHJveUVsZW1l
bnRgIGV2ZW50ICh3aGljaCBpbnZva2VzIHRoZQorICAgIGB3aWxsRGVzdHJveUVsZW1lbnQoKWAg
bWV0aG9kIGlmIGl0IGV4aXN0cykgb24gdGhpcyB2aWV3IGFuZCBhbGwgY2hpbGQKKyAgICB2aWV3
cy4KKworICAgIEJlZm9yZSB0cmlnZ2VyaW5nIGB3aWxsRGVzdHJveUVsZW1lbnRgLCBpdCBmaXJz
dCB0cmlnZ2VycyB0aGUKKyAgICBgd2lsbENsZWFyUmVuZGVyYCBldmVudCByZWN1cnNpdmVseS4K
KworICAgIEBtZXRob2QgX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudAorICAqLworICBfbm90aWZ5
V2lsbERlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnRyaWdnZXJSZWN1cnNp
dmVseSgnd2lsbENsZWFyUmVuZGVyJyk7CisgICAgdGhpcy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dp
bGxEZXN0cm95RWxlbWVudCcpOworICB9LAorCisgIF9lbGVtZW50V2lsbENoYW5nZTogRW1iZXIu
YmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1
bmN0aW9uKHZpZXcpIHsKKyAgICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh2aWV3LCAnZWxl
bWVudCcpOworICAgIH0pOworICB9LCAnZWxlbWVudCcpLAorCisgIC8qKgorICAgIEBwcml2YXRl
CisKKyAgICBJZiB0aGlzIHZpZXcncyBlbGVtZW50IGNoYW5nZXMsIHdlIG5lZWQgdG8gaW52YWxp
ZGF0ZSB0aGUgY2FjaGVzIG9mIG91cgorICAgIGNoaWxkIHZpZXdzIHNvIHRoYXQgd2UgZG8gbm90
IHJldGFpbiByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50cyB0aGF0IGFyZQorICAgIG5vIGxvbmdl
ciBuZWVkZWQuCisKKyAgICBAbWV0aG9kIF9lbGVtZW50RGlkQ2hhbmdlCisgICovCisgIF9lbGVt
ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICB0aGlzLmZvckVh
Y2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgeworICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFu
Z2UodmlldywgJ2VsZW1lbnQnKTsKKyAgICB9KTsKKyAgfSwgJ2VsZW1lbnQnKSwKKworICAvKioK
KyAgICBDYWxsZWQgd2hlbiB0aGUgcGFyZW50VmlldyBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KKwor
ICAgIEBldmVudCBwYXJlbnRWaWV3RGlkQ2hhbmdlCisgICovCisgIHBhcmVudFZpZXdEaWRDaGFu
Z2U6IEVtYmVyLkssCisKKyAgaW5zdHJ1bWVudE5hbWU6ICd2aWV3JywKKworICBpbnN0cnVtZW50
RGV0YWlsczogZnVuY3Rpb24oaGFzaCkgeworICAgIGhhc2gudGVtcGxhdGUgPSBnZXQodGhpcywg
J3RlbXBsYXRlTmFtZScpOworICAgIHRoaXMuX3N1cGVyKGhhc2gpOworICB9LAorCisgIF9yZW5k
ZXJUb0J1ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKKyAg
ICB0aGlzLmxlbmd0aEJlZm9yZVJlbmRlciA9IHRoaXMuX2NoaWxkVmlld3MubGVuZ3RoOworICAg
IHZhciBidWZmZXIgPSB0aGlzLl9zdXBlcihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbik7
CisgICAgdGhpcy5sZW5ndGhBZnRlclJlbmRlciA9IHRoaXMuX2NoaWxkVmlld3MubGVuZ3RoOwor
CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSwKKworICByZW5kZXJUb0J1ZmZlcklmTmVlZGVkOiBm
dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnJlbmRlclRvQnVmZmVy
SWZOZWVkZWQodGhpcywgdGhpcyk7CisgIH0sCisKKyAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbihi
dWZmZXIpIHsKKyAgICB0aGlzLmFwcGx5QXR0cmlidXRlc1RvQnVmZmVyKGJ1ZmZlcik7CisgICAg
YnVmZmVyLnB1c2hPcGVuaW5nVGFnKCk7CisgIH0sCisKKyAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9u
KGJ1ZmZlcikgeworICAgIGJ1ZmZlci5wdXNoQ2xvc2luZ1RhZygpOworICB9LAorCisgIGFwcGx5
QXR0cmlidXRlc1RvQnVmZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKKyAgICAvLyBDcmVhdGVzIG9i
c2VydmVycyBmb3IgYWxsIHJlZ2lzdGVyZWQgY2xhc3MgbmFtZSBhbmQgYXR0cmlidXRlIGJpbmRp
bmdzLAorICAgIC8vIHRoZW4gYWRkcyB0aGVtIHRvIHRoZSBlbGVtZW50LgorICAgIHZhciBjbGFz
c05hbWVCaW5kaW5ncyA9IGdldCh0aGlzLCAnY2xhc3NOYW1lQmluZGluZ3MnKTsKKyAgICBpZiAo
Y2xhc3NOYW1lQmluZGluZ3MubGVuZ3RoKSB7CisgICAgICB0aGlzLl9hcHBseUNsYXNzTmFtZUJp
bmRpbmdzKGNsYXNzTmFtZUJpbmRpbmdzKTsKKyAgICB9CisKKyAgICAvLyBQYXNzIHRoZSByZW5k
ZXIgYnVmZmVyIHNvIHRoZSBtZXRob2QgY2FuIGFwcGx5IGF0dHJpYnV0ZXMgZGlyZWN0bHkuCisg
ICAgLy8gVGhpcyBpc24ndCBuZWVkZWQgZm9yIGNsYXNzIG5hbWUgYmluZGluZ3MgYmVjYXVzZSB0
aGV5IHVzZSB0aGUKKyAgICAvLyBleGlzdGluZyBjbGFzc05hbWVzIGluZnJhc3RydWN0dXJlLgor
ICAgIHZhciBhdHRyaWJ1dGVCaW5kaW5ncyA9IGdldCh0aGlzLCAnYXR0cmlidXRlQmluZGluZ3Mn
KTsKKyAgICBpZiAoYXR0cmlidXRlQmluZGluZ3MubGVuZ3RoKSB7CisgICAgICB0aGlzLl9hcHBs
eUF0dHJpYnV0ZUJpbmRpbmdzKGJ1ZmZlciwgYXR0cmlidXRlQmluZGluZ3MpOworICAgIH0KKwor
ICAgIGJ1ZmZlci5zZXRDbGFzc2VzKHRoaXMuY2xhc3NOYW1lcyk7CisgICAgYnVmZmVyLmlkKHRo
aXMuZWxlbWVudElkKTsKKworICAgIHZhciByb2xlID0gZ2V0KHRoaXMsICdhcmlhUm9sZScpOwor
ICAgIGlmIChyb2xlKSB7CisgICAgICBidWZmZXIuYXR0cigncm9sZScsIHJvbGUpOworICAgIH0K
KworICAgIGlmIChnZXQodGhpcywgJ2lzVmlzaWJsZScpID09PSBmYWxzZSkgeworICAgICAgYnVm
ZmVyLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTsKKyAgICB9CisgIH0sCisKKyAgLy8gLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAv
LyBTVEFOREFSRCBSRU5ERVIgUFJPUEVSVElFUworICAvLworCisgIC8qKgorICAgIFRhZyBuYW1l
IGZvciB0aGUgdmlldydzIG91dGVyIGVsZW1lbnQuIFRoZSB0YWcgbmFtZSBpcyBvbmx5IHVzZWQg
d2hlbiBhbgorICAgIGVsZW1lbnQgaXMgZmlyc3QgY3JlYXRlZC4gSWYgeW91IGNoYW5nZSB0aGUg
YHRhZ05hbWVgIGZvciBhbiBlbGVtZW50LCB5b3UKKyAgICBtdXN0IGRlc3Ryb3kgYW5kIHJlY3Jl
YXRlIHRoZSB2aWV3IGVsZW1lbnQuCisKKyAgICBCeSBkZWZhdWx0LCB0aGUgcmVuZGVyIGJ1ZmZl
ciB3aWxsIHVzZSBhIGA8ZGl2PmAgdGFnIGZvciB2aWV3cy4KKworICAgIEBwcm9wZXJ0eSB0YWdO
YW1lCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworCisgIC8vIFdl
IGxlYXZlIHRoaXMgbnVsbCBieSBkZWZhdWx0IHNvIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNl
IGJldHdlZW4KKyAgLy8gdGhlIGRlZmF1bHQgY2FzZSBhbmQgYSB1c2VyLXNwZWNpZmllZCB0YWcu
CisgIHRhZ05hbWU6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIFdBSS1BUklBIHJvbGUgb2YgdGhl
IGNvbnRyb2wgcmVwcmVzZW50ZWQgYnkgdGhpcyB2aWV3LiBGb3IgZXhhbXBsZSwgYQorICAgIGJ1
dHRvbiBtYXkgaGF2ZSBhIHJvbGUgb2YgdHlwZSAnYnV0dG9uJywgb3IgYSBwYW5lIG1heSBoYXZl
IGEgcm9sZSBvZgorICAgIHR5cGUgJ2FsZXJ0ZGlhbG9nJy4gVGhpcyBwcm9wZXJ0eSBpcyB1c2Vk
IGJ5IGFzc2lzdGl2ZSBzb2Z0d2FyZSB0byBoZWxwCisgICAgdmlzdWFsbHkgY2hhbGxlbmdlZCB1
c2VycyBuYXZpZ2F0ZSByaWNoIHdlYiBhcHBsaWNhdGlvbnMuCisKKyAgICBUaGUgZnVsbCBsaXN0
IG9mIHZhbGlkIFdBSS1BUklBIHJvbGVzIGlzIGF2YWlsYWJsZSBhdDoKKyAgICBodHRwOi8vd3d3
LnczLm9yZy9UUi93YWktYXJpYS9yb2xlcyNyb2xlc19jYXRlZ29yaXphdGlvbgorCisgICAgQHBy
b3BlcnR5IGFyaWFSb2xlCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAq
LworICBhcmlhUm9sZTogbnVsbCwKKworICAvKioKKyAgICBTdGFuZGFyZCBDU1MgY2xhc3MgbmFt
ZXMgdG8gYXBwbHkgdG8gdGhlIHZpZXcncyBvdXRlciBlbGVtZW50LiBUaGlzCisgICAgcHJvcGVy
dHkgYXV0b21hdGljYWxseSBpbmhlcml0cyBhbnkgY2xhc3MgbmFtZXMgZGVmaW5lZCBieSB0aGUg
dmlldydzCisgICAgc3VwZXJjbGFzc2VzIGFzIHdlbGwuCisKKyAgICBAcHJvcGVydHkgY2xhc3NO
YW1lcworICAgIEB0eXBlIEFycmF5CisgICAgQGRlZmF1bHQgWydlbWJlci12aWV3J10KKyAgKi8K
KyAgY2xhc3NOYW1lczogWydlbWJlci12aWV3J10sCisKKyAgLyoqCisgICAgQSBsaXN0IG9mIHBy
b3BlcnRpZXMgb2YgdGhlIHZpZXcgdG8gYXBwbHkgYXMgY2xhc3MgbmFtZXMuIElmIHRoZSBwcm9w
ZXJ0eQorICAgIGlzIGEgc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhhdCBzdHJpbmcgd2ls
bCBiZSBhcHBsaWVkIGFzIGEgY2xhc3MKKyAgICBuYW1lLgorCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIC8vIEFwcGxpZXMgdGhlICdoaWdoJyBjbGFzcyB0byB0aGUgdmlldyBlbGVtZW50CisgICAg
RW1iZXIuVmlldy5jcmVhdGUoeworICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsncHJpb3JpdHkn
XQorICAgICAgcHJpb3JpdHk6ICdoaWdoJworICAgIH0pOworICAgIGBgYAorCisgICAgSWYgdGhl
IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhIEJvb2xlYW4sIHRoZSBuYW1lIG9mIHRoYXQgcHJv
cGVydHkgaXMKKyAgICBhZGRlZCBhcyBhIGRhc2hlcml6ZWQgY2xhc3MgbmFtZS4KKworICAgIGBg
YGphdmFzY3JpcHQKKyAgICAvLyBBcHBsaWVzIHRoZSAnaXMtdXJnZW50JyBjbGFzcyB0byB0aGUg
dmlldyBlbGVtZW50CisgICAgRW1iZXIuVmlldy5jcmVhdGUoeworICAgICAgY2xhc3NOYW1lQmlu
ZGluZ3M6IFsnaXNVcmdlbnQnXQorICAgICAgaXNVcmdlbnQ6IHRydWUKKyAgICB9KTsKKyAgICBg
YGAKKworICAgIElmIHlvdSB3b3VsZCBwcmVmZXIgdG8gdXNlIGEgY3VzdG9tIHZhbHVlIGluc3Rl
YWQgb2YgdGhlIGRhc2hlcml6ZWQKKyAgICBwcm9wZXJ0eSBuYW1lLCB5b3UgY2FuIHBhc3MgYSBi
aW5kaW5nIGxpa2UgdGhpczoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICAvLyBBcHBsaWVzIHRo
ZSAndXJnZW50JyBjbGFzcyB0byB0aGUgdmlldyBlbGVtZW50CisgICAgRW1iZXIuVmlldy5jcmVh
dGUoeworICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNVcmdlbnQ6dXJnZW50J10KKyAgICAg
IGlzVXJnZW50OiB0cnVlCisgICAgfSk7CisgICAgYGBgCisKKyAgICBUaGlzIGxpc3Qgb2YgcHJv
cGVydGllcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgdmlldydzIHN1cGVyY2xhc3NlcyBhcyB3ZWxs
LgorCisgICAgQHByb3BlcnR5IGNsYXNzTmFtZUJpbmRpbmdzCisgICAgQHR5cGUgQXJyYXkKKyAg
ICBAZGVmYXVsdCBbXQorICAqLworICBjbGFzc05hbWVCaW5kaW5nczogW10sCisKKyAgLyoqCisg
ICAgQSBsaXN0IG9mIHByb3BlcnRpZXMgb2YgdGhlIHZpZXcgdG8gYXBwbHkgYXMgYXR0cmlidXRl
cy4gSWYgdGhlIHByb3BlcnR5IGlzCisgICAgYSBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSBvZiB0
aGF0IHN0cmluZyB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIGF0dHJpYnV0ZS4KKworICAgIGBgYGph
dmFzY3JpcHQKKyAgICAvLyBBcHBsaWVzIHRoZSB0eXBlIGF0dHJpYnV0ZSB0byB0aGUgZWxlbWVu
dAorICAgIC8vIHdpdGggdGhlIHZhbHVlICJidXR0b24iLCBsaWtlIDxkaXYgdHlwZT0iYnV0dG9u
Ij4KKyAgICBFbWJlci5WaWV3LmNyZWF0ZSh7CisgICAgICBhdHRyaWJ1dGVCaW5kaW5nczogWyd0
eXBlJ10sCisgICAgICB0eXBlOiAnYnV0dG9uJworICAgIH0pOworICAgIGBgYAorCisgICAgSWYg
dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhIEJvb2xlYW4sIHRoZSBuYW1lIG9mIHRoYXQg
cHJvcGVydHkgaXMKKyAgICBhZGRlZCBhcyBhbiBhdHRyaWJ1dGUuCisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgLy8gUmVuZGVycyBzb21ldGhpbmcgbGlrZSA8ZGl2IGVuYWJsZWQ9ImVuYWJsZWQi
PgorICAgIEVtYmVyLlZpZXcuY3JlYXRlKHsKKyAgICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2Vu
YWJsZWQnXSwKKyAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBw
cm9wZXJ0eSBhdHRyaWJ1dGVCaW5kaW5ncworICAqLworICBhdHRyaWJ1dGVCaW5kaW5nczogW10s
CisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLgorICAvLyBDT1JFIERJU1BMQVkgTUVUSE9EUworICAvLworCisgIC8qKgorICAgIEBw
cml2YXRlCisKKyAgICBTZXR1cCBhIHZpZXcsIGJ1dCBkbyBub3QgZmluaXNoIHdha2luZyBpdCB1
cC4KKyAgICAtIGNvbmZpZ3VyZSBgY2hpbGRWaWV3c2AKKyAgICAtIHJlZ2lzdGVyIHRoZSB2aWV3
IHdpdGggdGhlIGdsb2JhbCB2aWV3cyBoYXNoLCB3aGljaCBpcyB1c2VkIGZvciBldmVudAorICAg
ICAgZGlzcGF0Y2gKKworICAgIEBtZXRob2QgaW5pdAorICAqLworICBpbml0OiBmdW5jdGlvbigp
IHsKKyAgICB0aGlzLmVsZW1lbnRJZCA9IHRoaXMuZWxlbWVudElkIHx8IGd1aWRGb3IodGhpcyk7
CisKKyAgICB0aGlzLl9zdXBlcigpOworCisgICAgLy8gc2V0dXAgY2hpbGQgdmlld3MuIGJlIHN1
cmUgdG8gY2xvbmUgdGhlIGNoaWxkIHZpZXdzIGFycmF5IGZpcnN0CisgICAgdGhpcy5fY2hpbGRW
aWV3cyA9IHRoaXMuX2NoaWxkVmlld3Muc2xpY2UoKTsKKworICAgIEVtYmVyLmFzc2VydCgiT25s
eSBhcnJheXMgYXJlIGFsbG93ZWQgZm9yICdjbGFzc05hbWVCaW5kaW5ncyciLCBFbWJlci50eXBl
T2YodGhpcy5jbGFzc05hbWVCaW5kaW5ncykgPT09ICdhcnJheScpOworICAgIHRoaXMuY2xhc3NO
YW1lQmluZGluZ3MgPSBFbWJlci5BKHRoaXMuY2xhc3NOYW1lQmluZGluZ3Muc2xpY2UoKSk7CisK
KyAgICBFbWJlci5hc3NlcnQoIk9ubHkgYXJyYXlzIGFyZSBhbGxvd2VkIGZvciAnY2xhc3NOYW1l
cyciLCBFbWJlci50eXBlT2YodGhpcy5jbGFzc05hbWVzKSA9PT0gJ2FycmF5Jyk7CisgICAgdGhp
cy5jbGFzc05hbWVzID0gRW1iZXIuQSh0aGlzLmNsYXNzTmFtZXMuc2xpY2UoKSk7CisKKyAgICB2
YXIgdmlld0NvbnRyb2xsZXIgPSBnZXQodGhpcywgJ3ZpZXdDb250cm9sbGVyJyk7CisgICAgaWYg
KHZpZXdDb250cm9sbGVyKSB7CisgICAgICB2aWV3Q29udHJvbGxlciA9IGdldCh2aWV3Q29udHJv
bGxlcik7CisgICAgICBpZiAodmlld0NvbnRyb2xsZXIpIHsKKyAgICAgICAgc2V0KHZpZXdDb250
cm9sbGVyLCAndmlldycsIHRoaXMpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICBhcHBlbmRD
aGlsZDogZnVuY3Rpb24odmlldywgb3B0aW9ucykgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnRT
dGF0ZS5hcHBlbmRDaGlsZCh0aGlzLCB2aWV3LCBvcHRpb25zKTsKKyAgfSwKKworICAvKioKKyAg
ICBSZW1vdmVzIHRoZSBjaGlsZCB2aWV3IGZyb20gdGhlIHBhcmVudCB2aWV3LgorCisgICAgQG1l
dGhvZCByZW1vdmVDaGlsZAorICAgIEBwYXJhbSB7RW1iZXIuVmlld30gdmlldworICAgIEByZXR1
cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCisgICovCisgIHJlbW92ZUNoaWxkOiBmdW5jdGlvbih2
aWV3KSB7CisgICAgLy8gSWYgd2UncmUgZGVzdHJveWluZywgdGhlIGVudGlyZSBzdWJ0cmVlIHdp
bGwgYmUKKyAgICAvLyBmcmVlZCwgYW5kIHRoZSBET00gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRl
bHksCisgICAgLy8gc28gbm8gbmVlZCB0byBtZXNzIHdpdGggY2hpbGRWaWV3cy4KKyAgICBpZiAo
dGhpcy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9CisKKyAgICAvLyB1cGRhdGUgcGFyZW50IG5v
ZGUKKyAgICBzZXQodmlldywgJ19wYXJlbnRWaWV3JywgbnVsbCk7CisKKyAgICAvLyByZW1vdmUg
dmlldyBmcm9tIGNoaWxkVmlld3MgYXJyYXkuCisgICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9j
aGlsZFZpZXdzOworCisgICAgRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlbW92ZU9iamVjdChjaGls
ZFZpZXdzLCB2aWV3KTsKKworICAgIHRoaXMucHJvcGVydHlEaWRDaGFuZ2UoJ2NoaWxkVmlld3Mn
KTsgLy8gSFVIPyEgd2hhdCBoYXBwZW5lZCB0byB3aWxsIGNoYW5nZT8KKworICAgIHJldHVybiB0
aGlzOworICB9LAorCisgIC8qKgorICAgIFJlbW92ZXMgYWxsIGNoaWxkcmVuIGZyb20gdGhlIGBw
YXJlbnRWaWV3YC4KKworICAgIEBtZXRob2QgcmVtb3ZlQWxsQ2hpbGRyZW4KKyAgICBAcmV0dXJu
IHtFbWJlci5WaWV3fSByZWNlaXZlcgorICAqLworICByZW1vdmVBbGxDaGlsZHJlbjogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMubXV0YXRlQ2hpbGRWaWV3cyhmdW5jdGlvbih2aWV3KSB7
CisgICAgICB0aGlzLnJlbW92ZUNoaWxkKHZpZXcpOworICAgIH0pOworICB9LAorCisgIGRlc3Ry
b3lBbGxDaGlsZHJlbjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubXV0YXRlQ2hpbGRW
aWV3cyhmdW5jdGlvbih2aWV3KSB7CisgICAgICB2aWV3LmRlc3Ryb3koKTsKKyAgICB9KTsKKyAg
fSwKKworICAvKioKKyAgICBSZW1vdmVzIHRoZSB2aWV3IGZyb20gaXRzIGBwYXJlbnRWaWV3YCwg
aWYgb25lIGlzIGZvdW5kLiBPdGhlcndpc2UKKyAgICBkb2VzIG5vdGhpbmcuCisKKyAgICBAbWV0
aG9kIHJlbW92ZUZyb21QYXJlbnQKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgor
ICAqLworICByZW1vdmVGcm9tUGFyZW50OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcGFyZW50ID0g
dGhpcy5fcGFyZW50VmlldzsKKworICAgIC8vIFJlbW92ZSBET00gZWxlbWVudCBmcm9tIHBhcmVu
dAorICAgIHRoaXMucmVtb3ZlKCk7CisKKyAgICBpZiAocGFyZW50KSB7IHBhcmVudC5yZW1vdmVD
aGlsZCh0aGlzKTsgfQorICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIFlvdSBt
dXN0IGNhbGwgYGRlc3Ryb3lgIG9uIGEgdmlldyB0byBkZXN0cm95IHRoZSB2aWV3IChhbmQgYWxs
IG9mIGl0cworICAgIGNoaWxkIHZpZXdzKS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgdmlldyBmcm9t
IGFueSBwYXJlbnQgbm9kZSwgdGhlbiBtYWtlCisgICAgc3VyZSB0aGF0IHRoZSBET00gZWxlbWVu
dCBtYW5hZ2VkIGJ5IHRoZSB2aWV3IGNhbiBiZSByZWxlYXNlZCBieSB0aGUKKyAgICBtZW1vcnkg
bWFuYWdlci4KKworICAgIEBtZXRob2Qgd2lsbERlc3Ryb3kKKyAgKi8KKyAgd2lsbERlc3Ryb3k6
IGZ1bmN0aW9uKCkgeworICAgIC8vIGNhbGxpbmcgdGhpcy5fc3VwZXIoKSB3aWxsIG51a2UgY29t
cHV0ZWQgcHJvcGVydGllcyBhbmQgb2JzZXJ2ZXJzLAorICAgIC8vIHNvIGNvbGxlY3QgYW55IGlu
Zm9ybWF0aW9uIHdlIG5lZWQgYmVmb3JlIGNhbGxpbmcgc3VwZXIuCisgICAgdmFyIGNoaWxkVmll
d3MgPSB0aGlzLl9jaGlsZFZpZXdzLAorICAgICAgICBwYXJlbnQgPSB0aGlzLl9wYXJlbnRWaWV3
LAorICAgICAgICBjaGlsZExlbiwgaTsKKworICAgIC8vIGRlc3Ryb3kgdGhlIGVsZW1lbnQgLS0g
dGhpcyB3aWxsIGF2b2lkIGVhY2ggY2hpbGQgdmlldyBkZXN0cm95aW5nCisgICAgLy8gdGhlIGVs
ZW1lbnQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4uLgorICAgIGlmICghdGhpcy5yZW1vdmVkRnJvbURP
TSkgeyB0aGlzLmRlc3Ryb3lFbGVtZW50KCk7IH0KKworICAgIGNoaWxkTGVuID0gY2hpbGRWaWV3
cy5sZW5ndGg7CisgICAgZm9yIChpPWNoaWxkTGVuLTE7IGk+PTA7IGktLSkgeworICAgICAgY2hp
bGRWaWV3c1tpXS5yZW1vdmVkRnJvbURPTSA9IHRydWU7CisgICAgfQorCisgICAgLy8gcmVtb3Zl
IGZyb20gbm9uLXZpcnR1YWwgcGFyZW50IHZpZXcgaWYgdmlld05hbWUgd2FzIHNwZWNpZmllZAor
ICAgIGlmICh0aGlzLnZpZXdOYW1lKSB7CisgICAgICB2YXIgbm9uVmlydHVhbFBhcmVudFZpZXcg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIGlmIChub25WaXJ0dWFsUGFyZW50Vmll
dykgeworICAgICAgICBzZXQobm9uVmlydHVhbFBhcmVudFZpZXcsIHRoaXMudmlld05hbWUsIG51
bGwpOworICAgICAgfQorICAgIH0KKworICAgIC8vIHJlbW92ZSBmcm9tIHBhcmVudCBpZiBmb3Vu
ZC4gRG9uJ3QgY2FsbCByZW1vdmVGcm9tUGFyZW50LAorICAgIC8vIGFzIHJlbW92ZUZyb21QYXJl
bnQgd2lsbCB0cnkgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20KKyAgICAvLyB0aGUgRE9NIGFn
YWluLgorICAgIGlmIChwYXJlbnQpIHsgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOyB9CisKKyAg
ICB0aGlzLnRyYW5zaXRpb25UbygnZGVzdHJveWVkJyk7CisKKyAgICBjaGlsZExlbiA9IGNoaWxk
Vmlld3MubGVuZ3RoOworICAgIGZvciAoaT1jaGlsZExlbi0xOyBpPj0wOyBpLS0pIHsKKyAgICAg
IGNoaWxkVmlld3NbaV0uZGVzdHJveSgpOworICAgIH0KKworICAgIC8vIG5leHQgcmVtb3ZlIHZp
ZXcgZnJvbSBnbG9iYWwgaGFzaAorICAgIGlmICghdGhpcy5pc1ZpcnR1YWwpIGRlbGV0ZSBFbWJl
ci5WaWV3LnZpZXdzW2dldCh0aGlzLCAnZWxlbWVudElkJyldOworICB9LAorCisgIC8qKgorICAg
IEluc3RhbnRpYXRlcyBhIHZpZXcgdG8gYmUgYWRkZWQgdG8gdGhlIGNoaWxkVmlld3MgYXJyYXkg
ZHVyaW5nIHZpZXcKKyAgICBpbml0aWFsaXphdGlvbi4gWW91IGdlbmVyYWxseSB3aWxsIG5vdCBj
YWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IHVubGVzcworICAgIHlvdSBhcmUgb3ZlcnJpZGluZyBg
Y3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwKKyAgICBhdXRv
bWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGUgY29ycmVjdCBzZXR0aW5ncyBvbiB0aGUgbmV3IHZpZXcg
aW5zdGFuY2UgdG8KKyAgICBhY3QgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50LgorCisgICAgQG1l
dGhvZCBjcmVhdGVDaGlsZFZpZXcKKyAgICBAcGFyYW0ge0NsYXNzfSB2aWV3Q2xhc3MKKyAgICBA
cGFyYW0ge0hhc2h9IFthdHRyc10gQXR0cmlidXRlcyB0byBhZGQKKyAgICBAcmV0dXJuIHtFbWJl
ci5WaWV3fSBuZXcgaW5zdGFuY2UKKyAgKi8KKyAgY3JlYXRlQ2hpbGRWaWV3OiBmdW5jdGlvbih2
aWV3LCBhdHRycykgeworICAgIGlmICh2aWV3LmlzVmlldyAmJiB2aWV3Ll9wYXJlbnRWaWV3ID09
PSB0aGlzKSB7IHJldHVybiB2aWV3OyB9CisKKyAgICBpZiAoRW1iZXIuQ29yZVZpZXcuZGV0ZWN0
KHZpZXcpKSB7CisgICAgICBhdHRycyA9IGF0dHJzIHx8IHt9OworICAgICAgYXR0cnMuX3BhcmVu
dFZpZXcgPSB0aGlzOworICAgICAgYXR0cnMudGVtcGxhdGVEYXRhID0gYXR0cnMudGVtcGxhdGVE
YXRhIHx8IGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJyk7CisKKyAgICAgIHZpZXcgPSB2aWV3LmNy
ZWF0ZShhdHRycyk7CisKKyAgICAgIC8vIGRvbid0IHNldCB0aGUgcHJvcGVydHkgb24gYSB2aXJ0
dWFsIHZpZXcsIGFzIHRoZXkgYXJlIGludmlzaWJsZSB0bworICAgICAgLy8gY29uc3VtZXJzIG9m
IHRoZSB2aWV3IEFQSQorICAgICAgaWYgKHZpZXcudmlld05hbWUpIHsgc2V0KGdldCh0aGlzLCAn
Y29uY3JldGVWaWV3JyksIHZpZXcudmlld05hbWUsIHZpZXcpOyB9CisgICAgfSBlbHNlIHsKKyAg
ICAgIEVtYmVyLmFzc2VydCgnWW91IG11c3QgcGFzcyBpbnN0YW5jZSBvciBzdWJjbGFzcyBvZiBW
aWV3Jywgdmlldy5pc1ZpZXcpOworCisgICAgICBpZiAoYXR0cnMpIHsKKyAgICAgICAgdmlldy5z
ZXRQcm9wZXJ0aWVzKGF0dHJzKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFnZXQodmlldywgJ3Rl
bXBsYXRlRGF0YScpKSB7CisgICAgICAgIHNldCh2aWV3LCAndGVtcGxhdGVEYXRhJywgZ2V0KHRo
aXMsICd0ZW1wbGF0ZURhdGEnKSk7CisgICAgICB9CisKKyAgICAgIHNldCh2aWV3LCAnX3BhcmVu
dFZpZXcnLCB0aGlzKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmlldzsKKyAgfSwKKworICBiZWNh
bWVWaXNpYmxlOiBFbWJlci5LLAorICBiZWNhbWVIaWRkZW46IEVtYmVyLkssCisKKyAgLyoqCisg
ICAgQHByaXZhdGUKKworICAgIFdoZW4gdGhlIHZpZXcncyBgaXNWaXNpYmxlYCBwcm9wZXJ0eSBj
aGFuZ2VzLCB0b2dnbGUgdGhlIHZpc2liaWxpdHkKKyAgICBlbGVtZW50IG9mIHRoZSBhY3R1YWwg
RE9NIGVsZW1lbnQuCisKKyAgICBAbWV0aG9kIF9pc1Zpc2libGVEaWRDaGFuZ2UKKyAgKi8KKyAg
X2lzVmlzaWJsZURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdmFy
ICRlbCA9IHRoaXMuJCgpOworICAgIGlmICghJGVsKSB7IHJldHVybjsgfQorCisgICAgdmFyIGlz
VmlzaWJsZSA9IGdldCh0aGlzLCAnaXNWaXNpYmxlJyk7CisKKyAgICAkZWwudG9nZ2xlKGlzVmlz
aWJsZSk7CisKKyAgICBpZiAodGhpcy5faXNBbmNlc3RvckhpZGRlbigpKSB7IHJldHVybjsgfQor
CisgICAgaWYgKGlzVmlzaWJsZSkgeworICAgICAgdGhpcy5fbm90aWZ5QmVjYW1lVmlzaWJsZSgp
OworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9ub3RpZnlCZWNhbWVIaWRkZW4oKTsKKyAgICB9
CisgIH0sICdpc1Zpc2libGUnKSwKKworICBfbm90aWZ5QmVjYW1lVmlzaWJsZTogZnVuY3Rpb24o
KSB7CisgICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVWaXNpYmxlJyk7CisKKyAgICB0aGlzLmZvckVh
Y2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgeworICAgICAgdmFyIGlzVmlzaWJsZSA9IGdldCh2
aWV3LCAnaXNWaXNpYmxlJyk7CisKKyAgICAgIGlmIChpc1Zpc2libGUgfHwgaXNWaXNpYmxlID09
PSBudWxsKSB7CisgICAgICAgIHZpZXcuX25vdGlmeUJlY2FtZVZpc2libGUoKTsKKyAgICAgIH0K
KyAgICB9KTsKKyAgfSwKKworICBfbm90aWZ5QmVjYW1lSGlkZGVuOiBmdW5jdGlvbigpIHsKKyAg
ICB0aGlzLnRyaWdnZXIoJ2JlY2FtZUhpZGRlbicpOworICAgIHRoaXMuZm9yRWFjaENoaWxkVmll
dyhmdW5jdGlvbih2aWV3KSB7CisgICAgICB2YXIgaXNWaXNpYmxlID0gZ2V0KHZpZXcsICdpc1Zp
c2libGUnKTsKKworICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpc1Zpc2libGUgPT09IG51bGwpIHsK
KyAgICAgICAgdmlldy5fbm90aWZ5QmVjYW1lSGlkZGVuKCk7CisgICAgICB9CisgICAgfSk7Cisg
IH0sCisKKyAgX2lzQW5jZXN0b3JIaWRkZW46IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJlbnQg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKworICAgIHdoaWxlIChwYXJlbnQpIHsKKyAgICAg
IGlmIChnZXQocGFyZW50LCAnaXNWaXNpYmxlJykgPT09IGZhbHNlKSB7IHJldHVybiB0cnVlOyB9
CisKKyAgICAgIHBhcmVudCA9IGdldChwYXJlbnQsICdwYXJlbnRWaWV3Jyk7CisgICAgfQorCisg
ICAgcmV0dXJuIGZhbHNlOworICB9LAorCisgIGNsZWFyQnVmZmVyOiBmdW5jdGlvbigpIHsKKyAg
ICB0aGlzLmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZpZXcpIHsKKyAgICAgIHZpZXcuYnVm
ZmVyID0gbnVsbDsKKyAgICB9KTsKKyAgfSwKKworICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0
YXRlLCBjaGlsZHJlbikgeworICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZXNbc3Rh
dGVdOworICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKworICAgIGlmIChjaGlsZHJlbiAhPT0gZmFs
c2UpIHsKKyAgICAgIHRoaXMuZm9yRWFjaENoaWxkVmlldyhmdW5jdGlvbih2aWV3KSB7CisgICAg
ICAgIHZpZXcudHJhbnNpdGlvblRvKHN0YXRlKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKwor
ICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCisgIC8vIEVWRU5UIEhBTkRMSU5HCisgIC8vCisKKyAgLyoqCisgICAgQHByaXZhdGUKKwor
ICAgIEhhbmRsZSBldmVudHMgZnJvbSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYAorCisgICAgQG1l
dGhvZCBoYW5kbGVFdmVudAorICAgIEBwYXJhbSBldmVudE5hbWUge1N0cmluZ30KKyAgICBAcGFy
YW0gZXZ0IHtFdmVudH0KKyAgKi8KKyAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSwg
ZXZ0KSB7CisgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmhhbmRsZUV2ZW50KHRoaXMsIGV2
ZW50TmFtZSwgZXZ0KTsKKyAgfSwKKworICByZWdpc3Rlck9ic2VydmVyOiBmdW5jdGlvbihyb290
LCBwYXRoLCB0YXJnZXQsIG9ic2VydmVyKSB7CisgICAgRW1iZXIuYWRkT2JzZXJ2ZXIocm9vdCwg
cGF0aCwgdGFyZ2V0LCBvYnNlcnZlcik7CisKKyAgICB0aGlzLm9uZSgnd2lsbENsZWFyUmVuZGVy
JywgZnVuY3Rpb24oKSB7CisgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihyb290LCBwYXRoLCB0
YXJnZXQsIG9ic2VydmVyKTsKKyAgICB9KTsKKyAgfQorCit9KTsKKworLyoKKyAgRGVzY3JpYmUg
aG93IHRoZSBzcGVjaWZpZWQgYWN0aW9ucyBzaG91bGQgYmVoYXZlIGluIHRoZSB2YXJpb3VzCisg
IHN0YXRlcyB0aGF0IGEgdmlldyBjYW4gZXhpc3QgaW4uIFBvc3NpYmxlIHN0YXRlczoKKworICAq
IHByZVJlbmRlcjogd2hlbiBhIHZpZXcgaXMgZmlyc3QgaW5zdGFudGlhdGVkLCBhbmQgYWZ0ZXIg
aXRzCisgICAgZWxlbWVudCB3YXMgZGVzdHJveWVkLCBpdCBpcyBpbiB0aGUgcHJlUmVuZGVyIHN0
YXRlCisgICogaW5CdWZmZXI6IG9uY2UgYSB2aWV3IGhhcyBiZWVuIHJlbmRlcmVkLCBidXQgYmVm
b3JlIGl0IGhhcworICAgIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCBpdCBpcyBpbiB0aGUg
aW5CdWZmZXIgc3RhdGUKKyAgKiBpbkRPTTogb25jZSBhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQg
aW50byB0aGUgRE9NIGl0IGlzIGluCisgICAgdGhlIGluRE9NIHN0YXRlLiBBIHZpZXcgc3BlbmRz
IHRoZSB2YXN0IG1ham9yaXR5IG9mIGl0cworICAgIGV4aXN0ZW5jZSBpbiB0aGlzIHN0YXRlLgor
ICAqIGRlc3Ryb3llZDogb25jZSBhIHZpZXcgaGFzIGJlZW4gZGVzdHJveWVkICh1c2luZyB0aGUg
ZGVzdHJveQorICAgIG1ldGhvZCksIGl0IGlzIGluIHRoaXMgc3RhdGUuIE5vIGZ1cnRoZXIgYWN0
aW9ucyBjYW4gYmUgaW52b2tlZAorICAgIG9uIGEgZGVzdHJveWVkIHZpZXcuCisqLworCisgIC8v
IGluIHRoZSBkZXN0cm95ZWQgc3RhdGUsIGV2ZXJ5dGhpbmcgaXMgaWxsZWdhbAorCisgIC8vIGJl
Zm9yZSByZW5kZXJpbmcgaGFzIGJlZ3VuLCBhbGwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgbm9v
cHMuCisKKyAgLy8gaW5zaWRlIHRoZSBidWZmZXIsIGxlZ2FsIG1hbmlwdWxhdGlvbnMgYXJlIGRv
bmUgb24gdGhlIGJ1ZmZlcgorCisgIC8vIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQg
aW50byB0aGUgRE9NLCBsZWdhbCBtYW5pcHVsYXRpb25zCisgIC8vIGFyZSBkb25lIG9uIHRoZSBE
T00gZWxlbWVudC4KKwordmFyIERPTU1hbmFnZXIgPSB7CisgIHByZXBlbmQ6IGZ1bmN0aW9uKHZp
ZXcsIGh0bWwpIHsKKyAgICB2aWV3LiQoKS5wcmVwZW5kKGh0bWwpOworICB9LAorCisgIGFmdGVy
OiBmdW5jdGlvbih2aWV3LCBodG1sKSB7CisgICAgdmlldy4kKCkuYWZ0ZXIoaHRtbCk7CisgIH0s
CisKKyAgaHRtbDogZnVuY3Rpb24odmlldywgaHRtbCkgeworICAgIHZpZXcuJCgpLmh0bWwoaHRt
bCk7CisgIH0sCisKKyAgcmVwbGFjZTogZnVuY3Rpb24odmlldykgeworICAgIHZhciBlbGVtZW50
ID0gZ2V0KHZpZXcsICdlbGVtZW50Jyk7CisKKyAgICBzZXQodmlldywgJ2VsZW1lbnQnLCBudWxs
KTsKKworICAgIHZpZXcuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKKyAgICAgIEVt
YmVyLiQoZWxlbWVudCkucmVwbGFjZVdpdGgoZ2V0KHZpZXcsICdlbGVtZW50JykpOworICAgIH0p
OworICB9LAorCisgIHJlbW92ZTogZnVuY3Rpb24odmlldykgeworICAgIHZpZXcuJCgpLnJlbW92
ZSgpOworICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7CisgICAgdmlldy4kKCkuZW1w
dHkoKTsKKyAgfQorfTsKKworRW1iZXIuVmlldy5yZW9wZW4oeworICBkb21NYW5hZ2VyOiBET01N
YW5hZ2VyCit9KTsKKworRW1iZXIuVmlldy5yZW9wZW5DbGFzcyh7CisKKyAgLyoqCisgICAgQHBy
aXZhdGUKKworICAgIFBhcnNlIGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBob2xk
cyB0aGUgcGFyc2VkIHByb3BlcnRpZXMuCisKKyAgICBGb3IgZXhhbXBsZSBhIHBhdGggbGlrZSAi
Y29udGVudC5pc0VuYWJsZWQ6ZW5hYmxlZDpkaXNhYmxlZCIgd2lsIHJldHVybiB0aGUKKyAgICBm
b2xsb3dpbmcgb2JqZWN0OgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHsKKyAgICAgIHBhdGg6
ICJjb250ZW50LmlzRW5hYmxlZCIsCisgICAgICBjbGFzc05hbWU6ICJlbmFibGVkIiwKKyAgICAg
IGZhbHN5Q2xhc3NOYW1lOiAiZGlzYWJsZWQiLAorICAgICAgY2xhc3NOYW1lczogIjplbmFibGVk
OmRpc2FibGVkIgorICAgIH0KKyAgICBgYGAKKworICAgIEBtZXRob2QgX3BhcnNlUHJvcGVydHlQ
YXRoCisgICAgQHN0YXRpYworICAqLworICBfcGFyc2VQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uKHBh
dGgpIHsKKyAgICB2YXIgc3BsaXQgPSBwYXRoLnNwbGl0KCc6JyksCisgICAgICAgIHByb3BlcnR5
UGF0aCA9IHNwbGl0WzBdLAorICAgICAgICBjbGFzc05hbWVzID0gIiIsCisgICAgICAgIGNsYXNz
TmFtZSwKKyAgICAgICAgZmFsc3lDbGFzc05hbWU7CisKKyAgICAvLyBjaGVjayBpZiB0aGUgcHJv
cGVydHkgaXMgZGVmaW5lZCBhcyBwcm9wOmNsYXNzIG9yIHByb3A6dHJ1ZUNsYXNzOmZhbHNlQ2xh
c3MKKyAgICBpZiAoc3BsaXQubGVuZ3RoID4gMSkgeworICAgICAgY2xhc3NOYW1lID0gc3BsaXRb
MV07CisgICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAzKSB7IGZhbHN5Q2xhc3NOYW1lID0gc3Bs
aXRbMl07IH0KKworICAgICAgY2xhc3NOYW1lcyA9ICc6JyArIGNsYXNzTmFtZTsKKyAgICAgIGlm
IChmYWxzeUNsYXNzTmFtZSkgeyBjbGFzc05hbWVzICs9ICI6IiArIGZhbHN5Q2xhc3NOYW1lOyB9
CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHBhdGg6IHByb3BlcnR5UGF0aCwKKyAgICAg
IGNsYXNzTmFtZXM6IGNsYXNzTmFtZXMsCisgICAgICBjbGFzc05hbWU6IChjbGFzc05hbWUgPT09
ICcnKSA/IHVuZGVmaW5lZCA6IGNsYXNzTmFtZSwKKyAgICAgIGZhbHN5Q2xhc3NOYW1lOiBmYWxz
eUNsYXNzTmFtZQorICAgIH07CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIEdl
dCB0aGUgY2xhc3MgbmFtZSBmb3IgYSBnaXZlbiB2YWx1ZSwgYmFzZWQgb24gdGhlIHBhdGgsIG9w
dGlvbmFsCisgICAgYGNsYXNzTmFtZWAgYW5kIG9wdGlvbmFsIGBmYWxzeUNsYXNzTmFtZWAuCisK
KyAgICAtIGlmIGEgYGNsYXNzTmFtZWAgb3IgYGZhbHN5Q2xhc3NOYW1lYCBoYXMgYmVlbiBzcGVj
aWZpZWQ6CisgICAgICAtIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIGBjbGFzc05hbWVgIGhh
cyBiZWVuIHNwZWNpZmllZCwgCisgICAgICAgIGBjbGFzc05hbWVgIGlzIHJldHVybmVkCisgICAg
ICAtIGlmIHRoZSB2YWx1ZSBpcyBmYWxzeSBhbmQgYGZhbHN5Q2xhc3NOYW1lYCBoYXMgYmVlbiBz
cGVjaWZpZWQsIAorICAgICAgICBgZmFsc3lDbGFzc05hbWVgIGlzIHJldHVybmVkCisgICAgICAt
IG90aGVyd2lzZSBgbnVsbGAgaXMgcmV0dXJuZWQKKyAgICAtIGlmIHRoZSB2YWx1ZSBpcyBgdHJ1
ZWAsIHRoZSBkYXNoZXJpemVkIGxhc3QgcGFydCBvZiB0aGUgc3VwcGxpZWQgcGF0aCAKKyAgICAg
IGlzIHJldHVybmVkCisgICAgLSBpZiB0aGUgdmFsdWUgaXMgbm90IGBmYWxzZWAsIGB1bmRlZmlu
ZWRgIG9yIGBudWxsYCwgdGhlIGB2YWx1ZWAgCisgICAgICBpcyByZXR1cm5lZAorICAgIC0gaWYg
bm9uZSBvZiB0aGUgYWJvdmUgcnVsZXMgYXBwbHksIGBudWxsYCBpcyByZXR1cm5lZAorCisgICAg
QG1ldGhvZCBfY2xhc3NTdHJpbmdGb3JWYWx1ZQorICAgIEBwYXJhbSBwYXRoCisgICAgQHBhcmFt
IHZhbAorICAgIEBwYXJhbSBjbGFzc05hbWUKKyAgICBAcGFyYW0gZmFsc3lDbGFzc05hbWUKKyAg
ICBAc3RhdGljCisgICovCisgIF9jbGFzc1N0cmluZ0ZvclZhbHVlOiBmdW5jdGlvbihwYXRoLCB2
YWwsIGNsYXNzTmFtZSwgZmFsc3lDbGFzc05hbWUpIHsKKyAgICAvLyBXaGVuIHVzaW5nIHRoZSBj
b2xvbiBzeW50YXgsIGV2YWx1YXRlIHRoZSB0cnV0aGluZXNzIG9yIGZhbHNpbmVzcworICAgIC8v
IG9mIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhc3NOYW1lIHRvIHJldHVybgorICAg
IGlmIChjbGFzc05hbWUgfHwgZmFsc3lDbGFzc05hbWUpIHsKKyAgICAgIGlmIChjbGFzc05hbWUg
JiYgISF2YWwpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKworICAgICAgfSBlbHNlIGlm
IChmYWxzeUNsYXNzTmFtZSAmJiAhdmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzeUNsYXNzTmFt
ZTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAg
ICAvLyBJZiB2YWx1ZSBpcyBhIEJvb2xlYW4gYW5kIHRydWUsIHJldHVybiB0aGUgZGFzaGVyaXpl
ZCBwcm9wZXJ0eQorICAgIC8vIG5hbWUuCisgICAgfSBlbHNlIGlmICh2YWwgPT09IHRydWUpIHsK
KyAgICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0eSBwYXRoIHRvIGJlIHN1aXRhYmxlIGZvciB1c2UK
KyAgICAgIC8vIGFzIGEgY2xhc3MgbmFtZS4gRm9yIGV4YXBsZSwgY29udGVudC5mb28uYmFyQmF6
CisgICAgICAvLyBiZWNvbWVzIGJhci1iYXouCisgICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0
KCcuJyk7CisgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZShwYXJ0c1twYXJ0cy5s
ZW5ndGgtMV0pOworCisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBmYWxzZSwgdW5kZWZpbmVk
LCBvciBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICAvLyB2YWx1ZSBvZiB0aGUgcHJvcGVy
dHkuCisgICAgfSBlbHNlIGlmICh2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gdW5kZWZpbmVkICYm
IHZhbCAhPT0gbnVsbCkgeworICAgICAgcmV0dXJuIHZhbDsKKworICAgIC8vIE5vdGhpbmcgdG8g
ZGlzcGxheS4gUmV0dXJuIG51bGwgc28gdGhhdCB0aGUgb2xkIGNsYXNzIGlzIHJlbW92ZWQKKyAg
ICAvLyBidXQgbm8gbmV3IGNsYXNzIGlzIGFkZGVkLgorICAgIH0gZWxzZSB7CisgICAgICByZXR1
cm4gbnVsbDsKKyAgICB9CisgIH0KK30pOworCisvKioKKyAgR2xvYmFsIHZpZXdzIGhhc2gKKwor
ICBAcHJvcGVydHkgdmlld3MKKyAgQHN0YXRpYworICBAdHlwZSBIYXNoCisqLworRW1iZXIuVmll
dy52aWV3cyA9IHt9OworCisvLyBJZiBzb21lb25lIG92ZXJyaWRlcyB0aGUgY2hpbGQgdmlld3Mg
Y29tcHV0ZWQgcHJvcGVydHkgd2hlbgorLy8gZGVmaW5pbmcgdGhlaXIgY2xhc3MsIHdlIHdhbnQg
dG8gYmUgYWJsZSB0byBwcm9jZXNzIHRoZSB1c2VyJ3MKKy8vIHN1cHBsaWVkIGNoaWxkVmlld3Mg
YW5kIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgY29tcHV0ZWQgcHJvcGVydHkKKy8vIGF0IHZp
ZXcgaW5pdGlhbGl6YXRpb24gdGltZS4gVGhpcyBoYXBwZW5zIGluIEVtYmVyLkNvbnRhaW5lclZp
ZXcncyBpbml0CisvLyBtZXRob2QuCitFbWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSA9IGNo
aWxkVmlld3NQcm9wZXJ0eTsKKworRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzID0g
ZnVuY3Rpb24oZWxlbSwgbmFtZSwgdmFsdWUpIHsKKyAgdmFyIHR5cGUgPSBFbWJlci50eXBlT2Yo
dmFsdWUpOworCisgIC8vIGlmIHRoaXMgY2hhbmdlcywgYWxzbyBjaGFuZ2UgdGhlIGxvZ2ljIGlu
IGVtYmVyLWhhbmRsZWJhcnMvbGliL2hlbHBlcnMvYmluZGluZy5qcworICBpZiAobmFtZSAhPT0g
J3ZhbHVlJyAmJiAodHlwZSA9PT0gJ3N0cmluZycgfHwgKHR5cGUgPT09ICdudW1iZXInICYmICFp
c05hTih2YWx1ZSkpKSkgeworICAgIGlmICh2YWx1ZSAhPT0gZWxlbS5hdHRyKG5hbWUpKSB7Cisg
ICAgICBlbGVtLmF0dHIobmFtZSwgdmFsdWUpOworICAgIH0KKyAgfSBlbHNlIGlmIChuYW1lID09
PSAndmFsdWUnIHx8IHR5cGUgPT09ICdib29sZWFuJykgeworICAgIGlmICh2YWx1ZSAhPT0gZWxl
bS5wcm9wKG5hbWUpKSB7CisgICAgICAvLyB2YWx1ZSBhbmQgYm9vbGVhbnMgc2hvdWxkIGFsd2F5
cyBiZSBwcm9wZXJ0aWVzCisgICAgICBlbGVtLnByb3AobmFtZSwgdmFsdWUpOworICAgIH0KKyAg
fSBlbHNlIGlmICghdmFsdWUpIHsKKyAgICBlbGVtLnJlbW92ZUF0dHIobmFtZSk7CisgIH0KK307
CisKK0VtYmVyLlZpZXcuc3RhdGVzID0gc3RhdGVzOworCit9KSgpOworCisKKworKGZ1bmN0aW9u
KCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisqLworCit2
YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKK0VtYmVyLlZpZXcuc3RhdGVz
Ll9kZWZhdWx0ID0geworICAvLyBhcHBlbmRDaGlsZCBpcyBvbmx5IGxlZ2FsIHdoaWxlIHJlbmRl
cmluZyB0aGUgYnVmZmVyLgorICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oKSB7CisgICAgdGhyb3cg
IllvdSBjYW4ndCB1c2UgYXBwZW5kQ2hpbGQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyaW5nIHByb2Nl
c3MiOworICB9LAorCisgICQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB1bmRlZmluZWQ7Cisg
IH0sCisKKyAgZ2V0RWxlbWVudDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0s
CisKKyAgLy8gSGFuZGxlIGV2ZW50cyBmcm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCisgIGhh
bmRsZUV2ZW50OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdHJ1ZTsgLy8gY29udGludWUgZXZl
bnQgcHJvcGFnYXRpb24KKyAgfSwKKworICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmlldykg
eworICAgIHNldCh2aWV3LCAnZWxlbWVudCcsIG51bGwpOworICAgIGlmICh2aWV3Ll9zY2hlZHVs
ZWRJbnNlcnQpIHsKKyAgICAgIEVtYmVyLnJ1bi5jYW5jZWwodmlldy5fc2NoZWR1bGVkSW5zZXJ0
KTsKKyAgICAgIHZpZXcuX3NjaGVkdWxlZEluc2VydCA9IG51bGw7CisgICAgfQorICAgIHJldHVy
biB2aWV3OworICB9LAorCisgIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uICgpIHsK
KyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgcmVyZW5kZXI6IEVtYmVyLksKK307CisKK30p
KCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUg
ZW1iZXItdmlld3MKKyovCisKK3ZhciBwcmVSZW5kZXIgPSBFbWJlci5WaWV3LnN0YXRlcy5wcmVS
ZW5kZXIgPSBFbWJlci5jcmVhdGUoRW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOworCitFbWJl
ci5tZXJnZShwcmVSZW5kZXIsIHsKKyAgLy8gYSB2aWV3IGxlYXZlcyB0aGUgcHJlUmVuZGVyIHN0
YXRlIG9uY2UgaXRzIGVsZW1lbnQgaGFzIGJlZW4KKyAgLy8gY3JlYXRlZCAoY3JlYXRlRWxlbWVu
dCkuCisgIGluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIGZuKSB7CisgICAgdmlldy5jcmVh
dGVFbGVtZW50KCk7CisgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJbnNlcnRFbGVt
ZW50Jyk7CisgICAgLy8gYWZ0ZXIgY3JlYXRlRWxlbWVudCwgdGhlIHZpZXcgd2lsbCBiZSBpbiB0
aGUgaGFzRWxlbWVudCBzdGF0ZS4KKyAgICBmbi5jYWxsKHZpZXcpOworICAgIHZpZXcudHJhbnNp
dGlvblRvKCdpbkRPTScpOworICAgIHZpZXcudHJpZ2dlclJlY3Vyc2l2ZWx5KCdkaWRJbnNlcnRF
bGVtZW50Jyk7CisgIH0sCisKKyAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24odmll
dykgeworICAgIHJldHVybiB2aWV3LnJlbmRlclRvQnVmZmVyKCk7CisgIH0sCisKKyAgZW1wdHk6
IEVtYmVyLkssCisKKyAgc2V0RWxlbWVudDogZnVuY3Rpb24odmlldywgdmFsdWUpIHsKKyAgICBp
ZiAodmFsdWUgIT09IG51bGwpIHsKKyAgICAgIHZpZXcudHJhbnNpdGlvblRvKCdoYXNFbGVtZW50
Jyk7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MK
KyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgbWV0YSA9IEVtYmVy
Lm1ldGE7CisKK3ZhciBpbkJ1ZmZlciA9IEVtYmVyLlZpZXcuc3RhdGVzLmluQnVmZmVyID0gRW1i
ZXIuY3JlYXRlKEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKKworRW1iZXIubWVyZ2UoaW5C
dWZmZXIsIHsKKyAgJDogZnVuY3Rpb24odmlldywgc2VsKSB7CisgICAgLy8gaWYgd2UgZG9uJ3Qg
aGF2ZSBhbiBlbGVtZW50IHlldCwgc29tZW9uZSBjYWxsaW5nIHRoaXMuJCgpIGlzCisgICAgLy8g
dHJ5aW5nIHRvIHVwZGF0ZSBhbiBlbGVtZW50IHRoYXQgaXNuJ3QgaW4gdGhlIERPTS4gSW5zdGVh
ZCwKKyAgICAvLyByZXJlbmRlciB0aGUgdmlldyB0byBhbGxvdyB0aGUgcmVuZGVyIG1ldGhvZCB0
byByZWZsZWN0IHRoZQorICAgIC8vIGNoYW5nZXMuCisgICAgdmlldy5yZXJlbmRlcigpOworICAg
IHJldHVybiBFbWJlci4kKCk7CisgIH0sCisKKyAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVyZWQg
aW4gYSBidWZmZXIsIHJlcmVuZGVyaW5nIGl0IHNpbXBseQorICAvLyByZXBsYWNlcyB0aGUgZXhp
c3RpbmcgYnVmZmVyIHdpdGggYSBuZXcgb25lCisgIHJlcmVuZGVyOiBmdW5jdGlvbih2aWV3KSB7
CisgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCBjYXVzZWQgYSB2
aWV3IHRvIHJlLXJlbmRlciBhZnRlciBpdCByZW5kZXJlZCBidXQgYmVmb3JlIGl0IHdhcyBpbnNl
cnRlZCBpbnRvIHRoZSBET00uIik7CisgIH0sCisKKyAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVy
ZWQgaW4gYSBidWZmZXIsIGFwcGVuZGluZyBhIGNoaWxkCisgIC8vIHZpZXcgd2lsbCByZW5kZXIg
dGhhdCB2aWV3IGFuZCBhcHBlbmQgdGhlIHJlc3VsdGluZworICAvLyBidWZmZXIgaW50byBpdHMg
YnVmZmVyLgorICBhcHBlbmRDaGlsZDogZnVuY3Rpb24odmlldywgY2hpbGRWaWV3LCBvcHRpb25z
KSB7CisgICAgdmFyIGJ1ZmZlciA9IHZpZXcuYnVmZmVyOworCisgICAgY2hpbGRWaWV3ID0gdmll
dy5jcmVhdGVDaGlsZFZpZXcoY2hpbGRWaWV3LCBvcHRpb25zKTsKKyAgICB2aWV3Ll9jaGlsZFZp
ZXdzLnB1c2goY2hpbGRWaWV3KTsKKworICAgIGNoaWxkVmlldy5yZW5kZXJUb0J1ZmZlcihidWZm
ZXIpOworCisgICAgdmlldy5wcm9wZXJ0eURpZENoYW5nZSgnY2hpbGRWaWV3cycpOworCisgICAg
cmV0dXJuIGNoaWxkVmlldzsKKyAgfSwKKworICAvLyB3aGVuIGEgdmlldyBpcyByZW5kZXJlZCBp
biBhIGJ1ZmZlciwgZGVzdHJveWluZyB0aGUKKyAgLy8gZWxlbWVudCB3aWxsIHNpbXBseSBkZXN0
cm95IHRoZSBidWZmZXIgYW5kIHB1dCB0aGUKKyAgLy8gc3RhdGUgYmFjayBpbnRvIHRoZSBwcmVS
ZW5kZXIgc3RhdGUuCisgIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbih2aWV3KSB7CisgICAgdmll
dy5jbGVhckJ1ZmZlcigpOworICAgIHZpZXcuX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudCgpOwor
ICAgIHZpZXcudHJhbnNpdGlvblRvKCdwcmVSZW5kZXInKTsKKworICAgIHJldHVybiB2aWV3Owor
ICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5hc3NlcnQoIkVtcHR5aW5n
IGEgdmlldyBpbiB0aGUgaW5CdWZmZXIgc3RhdGUgaXMgbm90IGFsbG93ZWQgYW5kIHNob3VsZCBu
b3QgaGFwcGVuIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBNb3N0IGxpa2VseSB0aGVyZSBp
cyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBUaGlzIG1heSBiZSBkdWUgdG8gZXhjZXNzaXZl
IHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb25zLiIpOworICB9LAorCisgIHJlbmRlclRvQnVm
ZmVySWZOZWVkZWQ6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgcmV0dXJuIHZpZXcuYnVmZmVyOwor
ICB9LAorCisgIC8vIEl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciBhIHJlbmRlcmVkIHZpZXcg
dG8gYmUgc2NoZWR1bGVkIGZvcgorICAvLyBpbnNlcnRpb24uCisgIGluc2VydEVsZW1lbnQ6IGZ1
bmN0aW9uKCkgeworICAgIHRocm93ICJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgdGhhdCBo
YXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIjsKKyAgfSwKKworICBzZXRFbGVtZW50OiBmdW5jdGlv
bih2aWV3LCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgeworICAgICAgdmlldy50
cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOworICAgIH0gZWxzZSB7CisgICAgICB2aWV3LmNsZWFy
QnVmZmVyKCk7CisgICAgICB2aWV3LnRyYW5zaXRpb25UbygnaGFzRWxlbWVudCcpOworICAgIH0K
KworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfSk7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlv
bigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci12aWV3cworKi8KKwor
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBtZXRhID0gRW1iZXIubWV0YTsK
KwordmFyIGhhc0VsZW1lbnQgPSBFbWJlci5WaWV3LnN0YXRlcy5oYXNFbGVtZW50ID0gRW1iZXIu
Y3JlYXRlKEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKKworRW1iZXIubWVyZ2UoaGFzRWxl
bWVudCwgeworICAkOiBmdW5jdGlvbih2aWV3LCBzZWwpIHsKKyAgICB2YXIgZWxlbSA9IGdldCh2
aWV3LCAnZWxlbWVudCcpOworICAgIHJldHVybiBzZWwgPyBFbWJlci4kKHNlbCwgZWxlbSkgOiBF
bWJlci4kKGVsZW0pOworICB9LAorCisgIGdldEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcpIHsKKyAg
ICB2YXIgcGFyZW50ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7CisgICAgaWYgKHBhcmVudCkg
eyBwYXJlbnQgPSBnZXQocGFyZW50LCAnZWxlbWVudCcpOyB9CisgICAgaWYgKHBhcmVudCkgeyBy
ZXR1cm4gdmlldy5maW5kRWxlbWVudEluUGFyZW50RWxlbWVudChwYXJlbnQpOyB9CisgICAgcmV0
dXJuIEVtYmVyLiQoIiMiICsgZ2V0KHZpZXcsICdlbGVtZW50SWQnKSlbMF07CisgIH0sCisKKyAg
c2V0RWxlbWVudDogZnVuY3Rpb24odmlldywgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPT09IG51
bGwpIHsKKyAgICAgIHZpZXcudHJhbnNpdGlvblRvKCdwcmVSZW5kZXInKTsKKyAgICB9IGVsc2Ug
eworICAgICAgdGhyb3cgIllvdSBjYW5ub3Qgc2V0IGFuIGVsZW1lbnQgdG8gYSBub24tbnVsbCB2
YWx1ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgaW4gdGhlIERPTS4iOworICAgIH0KKwor
ICAgIHJldHVybiB2YWx1ZTsKKyAgfSwKKworICAvLyBvbmNlIHRoZSB2aWV3IGhhcyBiZWVuIGlu
c2VydGVkIGludG8gdGhlIERPTSwgcmVyZW5kZXJpbmcgaXMKKyAgLy8gZGVmZXJyZWQgdG8gYWxs
b3cgYmluZGluZ3MgdG8gc3luY2hyb25pemUuCisgIHJlcmVuZGVyOiBmdW5jdGlvbih2aWV3KSB7
CisgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxDbGVhclJlbmRlcicpOworCisgICAg
dmlldy5jbGVhclJlbmRlcmVkQ2hpbGRyZW4oKTsKKworICAgIHZpZXcuZG9tTWFuYWdlci5yZXBs
YWNlKHZpZXcpOworICAgIHJldHVybiB2aWV3OworICB9LAorCisgIC8vIG9uY2UgdGhlIHZpZXcg
aXMgYWxyZWFkeSBpbiB0aGUgRE9NLCBkZXN0cm95aW5nIGl0IHJlbW92ZXMgaXQKKyAgLy8gZnJv
bSB0aGUgRE9NLCBudWtlcyBpdHMgZWxlbWVudCwgYW5kIHB1dHMgaXQgYmFjayBpbnRvIHRoZQor
ICAvLyBwcmVSZW5kZXIgc3RhdGUgaWYgaW5ET00uCisKKyAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0
aW9uKHZpZXcpIHsKKyAgICB2aWV3Ll9ub3RpZnlXaWxsRGVzdHJveUVsZW1lbnQoKTsKKyAgICB2
aWV3LmRvbU1hbmFnZXIucmVtb3ZlKHZpZXcpOworICAgIHNldCh2aWV3LCAnZWxlbWVudCcsIG51
bGwpOworICAgIGlmICh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQpIHsKKyAgICAgIEVtYmVyLnJ1bi5j
YW5jZWwodmlldy5fc2NoZWR1bGVkSW5zZXJ0KTsKKyAgICAgIHZpZXcuX3NjaGVkdWxlZEluc2Vy
dCA9IG51bGw7CisgICAgfQorICAgIHJldHVybiB2aWV3OworICB9LAorCisgIGVtcHR5OiBmdW5j
dGlvbih2aWV3KSB7CisgICAgdmFyIF9jaGlsZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cywgbGVu
LCBpZHg7CisgICAgaWYgKF9jaGlsZFZpZXdzKSB7CisgICAgICBsZW4gPSBfY2hpbGRWaWV3cy5s
ZW5ndGg7CisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAgICAgICAg
X2NoaWxkVmlld3NbaWR4XS5fbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50KCk7CisgICAgICB9Cisg
ICAgfQorICAgIHZpZXcuZG9tTWFuYWdlci5lbXB0eSh2aWV3KTsKKyAgfSwKKworICAvLyBIYW5k
bGUgZXZlbnRzIGZyb20gYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAKKyAgaGFuZGxlRXZlbnQ6IGZ1
bmN0aW9uKHZpZXcsIGV2ZW50TmFtZSwgZXZ0KSB7CisgICAgaWYgKHZpZXcuaGFzKGV2ZW50TmFt
ZSkpIHsKKyAgICAgIC8vIEhhbmRsZXIgc2hvdWxkIGJlIGFibGUgdG8gcmUtZGlzcGF0Y2ggZXZl
bnRzLCBzbyB3ZSBkb24ndAorICAgICAgLy8gcHJldmVudERlZmF1bHQgb3Igc3RvcFByb3BhZ2F0
aW9uLgorICAgICAgcmV0dXJuIHZpZXcudHJpZ2dlcihldmVudE5hbWUsIGV2dCk7CisgICAgfSBl
bHNlIHsKKyAgICAgIHJldHVybiB0cnVlOyAvLyBjb250aW51ZSBldmVudCBwcm9wYWdhdGlvbgor
ICAgIH0KKyAgfQorfSk7CisKK3ZhciBpbkRPTSA9IEVtYmVyLlZpZXcuc3RhdGVzLmluRE9NID0g
RW1iZXIuY3JlYXRlKGhhc0VsZW1lbnQpOworCitFbWJlci5tZXJnZShpbkRPTSwgeworICBpbnNl
cnRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCBmbikgeworICAgIHRocm93ICJZb3UgY2FuJ3QgaW5z
ZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbnNlcnRl
ZCI7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxl
IGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisqLworCit2YXIgZGVzdHJveWVkRXJyb3Ig
PSAiWW91IGNhbid0IGNhbGwgJUAgb24gYSBkZXN0cm95ZWQgdmlldyIsIGZtdCA9IEVtYmVyLlN0
cmluZy5mbXQ7CisKK3ZhciBkZXN0cm95ZWQgPSBFbWJlci5WaWV3LnN0YXRlcy5kZXN0cm95ZWQg
PSBFbWJlci5jcmVhdGUoRW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOworCitFbWJlci5tZXJn
ZShkZXN0cm95ZWQsIHsKKyAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKCkgeworICAgIHRocm93IGZt
dChkZXN0cm95ZWRFcnJvciwgWydhcHBlbmRDaGlsZCddKTsKKyAgfSwKKyAgcmVyZW5kZXI6IGZ1
bmN0aW9uKCkgeworICAgIHRocm93IGZtdChkZXN0cm95ZWRFcnJvciwgWydyZXJlbmRlciddKTsK
KyAgfSwKKyAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgIHRocm93IGZtdChkZXN0
cm95ZWRFcnJvciwgWydkZXN0cm95RWxlbWVudCddKTsKKyAgfSwKKyAgZW1wdHk6IGZ1bmN0aW9u
KCkgeworICAgIHRocm93IGZtdChkZXN0cm95ZWRFcnJvciwgWydlbXB0eSddKTsKKyAgfSwKKwor
ICBzZXRFbGVtZW50OiBmdW5jdGlvbigpIHsKKyAgICB0aHJvdyBmbXQoZGVzdHJveWVkRXJyb3Is
IFsic2V0KCdlbGVtZW50JywgLi4uKSJdKTsKKyAgfSwKKworICByZW5kZXJUb0J1ZmZlcklmTmVl
ZGVkOiBmdW5jdGlvbigpIHsKKyAgICB0aHJvdyBmbXQoZGVzdHJveWVkRXJyb3IsIFsicmVuZGVy
VG9CdWZmZXJJZk5lZWRlZCJdKTsKKyAgfSwKKworICAvLyBTaW5jZSBlbGVtZW50IGluc2VydGlv
biBpcyBzY2hlZHVsZWQsIGRvbid0IGRvIGFueXRoaW5nIGlmCisgIC8vIHRoZSB2aWV3IGhhcyBi
ZWVuIGRlc3Ryb3llZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGV4ZWN1dGlvbgorICBpbnNlcnRF
bGVtZW50OiBFbWJlci5LCit9KTsKKworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworRW1i
ZXIuVmlldy5jbG9uZVN0YXRlcyA9IGZ1bmN0aW9uKGZyb20pIHsKKyAgdmFyIGludG8gPSB7fTsK
KworICBpbnRvLl9kZWZhdWx0ID0ge307CisgIGludG8ucHJlUmVuZGVyID0gRW1iZXIuY3JlYXRl
KGludG8uX2RlZmF1bHQpOworICBpbnRvLmRlc3Ryb3llZCA9IEVtYmVyLmNyZWF0ZShpbnRvLl9k
ZWZhdWx0KTsKKyAgaW50by5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShpbnRvLl9kZWZhdWx0KTsK
KyAgaW50by5oYXNFbGVtZW50ID0gRW1iZXIuY3JlYXRlKGludG8uX2RlZmF1bHQpOworICBpbnRv
LmluRE9NID0gRW1iZXIuY3JlYXRlKGludG8uaGFzRWxlbWVudCk7CisKKyAgdmFyIHZpZXdTdGF0
ZTsKKworICBmb3IgKHZhciBzdGF0ZU5hbWUgaW4gZnJvbSkgeworICAgIGlmICghZnJvbS5oYXNP
d25Qcm9wZXJ0eShzdGF0ZU5hbWUpKSB7IGNvbnRpbnVlOyB9CisgICAgRW1iZXIubWVyZ2UoaW50
b1tzdGF0ZU5hbWVdLCBmcm9tW3N0YXRlTmFtZV0pOworICB9CisKKyAgcmV0dXJuIGludG87Cit9
OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIHN0YXRlcyA9IEVtYmVyLlZpZXcu
Y2xvbmVTdGF0ZXMoRW1iZXIuVmlldy5zdGF0ZXMpOworCisvKioKK0Btb2R1bGUgZW1iZXIKK0Bz
dWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVt
YmVyLnNldCwgbWV0YSA9IEVtYmVyLm1ldGE7Cit2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFi
bGVVdGlscy5mb3JFYWNoOworCisvKioKKyAgQSBgQ29udGFpbmVyVmlld2AgaXMgYW4gYEVtYmVy
LlZpZXdgIHN1YmNsYXNzIHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5YAorICBh
bGxvd2luZyBwcm9ncmFtYXRpYyBtYW5hZ2VtZW50IG9mIGl0cyBjaGlsZCB2aWV3cy4KKworICAj
IyBTZXR0aW5nIEluaXRpYWwgQ2hpbGQgVmlld3MKKworICBUaGUgaW5pdGlhbCBhcnJheSBvZiBj
aGlsZCB2aWV3cyBjYW4gYmUgc2V0IGluIG9uZSBvZiB0d28gd2F5cy4gWW91IGNhbgorICBwcm92
aWRlIGEgYGNoaWxkVmlld3NgIHByb3BlcnR5IGF0IGNyZWF0aW9uIHRpbWUgdGhhdCBjb250YWlu
cyBpbnN0YW5jZSBvZgorICBgRW1iZXIuVmlld2A6CisKKyAgYGBgamF2YXNjcmlwdAorICBhQ29u
dGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoeworICAgIGNoaWxkVmlld3M6IFtF
bWJlci5WaWV3LmNyZWF0ZSgpLCBFbWJlci5WaWV3LmNyZWF0ZSgpXQorICB9KTsKKyAgYGBgCisK
KyAgWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHdob3NlIHZh
bHVlcyBhcmUgaW5zdGFuY2VzIG9mCisgIGBFbWJlci5WaWV3YDoKKworICBgYGBqYXZhc2NyaXB0
CisgIGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7CisgICAgY2hpbGRW
aWV3czogWydhVmlldycsICdiVmlldycsICdjVmlldyddLAorICAgIGFWaWV3OiBFbWJlci5WaWV3
LmNyZWF0ZSgpLAorICAgIGJWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpLAorICAgIGNWaWV3OiBF
bWJlci5WaWV3LmNyZWF0ZSgpCisgIH0pOworICBgYGAKKworICBUaGUgdHdvIHN0cmF0ZWdpZXMg
Y2FuIGJlIGNvbWJpbmVkOgorCisgIGBgYGphdmFzY3JpcHQKKyAgYUNvbnRhaW5lciA9IEVtYmVy
LkNvbnRhaW5lclZpZXcuY3JlYXRlKHsKKyAgICBjaGlsZFZpZXdzOiBbJ2FWaWV3JywgRW1iZXIu
Vmlldy5jcmVhdGUoKV0sCisgICAgYVZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKCkKKyAgfSk7Cisg
IGBgYAorCisgIEVhY2ggY2hpbGQgdmlldydzIHJlbmRlcmluZyB3aWxsIGJlIGluc2VydGVkIGlu
dG8gdGhlIGNvbnRhaW5lcidzIHJlbmRlcmVkCisgIEhUTUwgaW4gdGhlIHNhbWUgb3JkZXIgYXMg
aXRzIHBvc2l0aW9uIGluIHRoZSBgY2hpbGRWaWV3c2AgcHJvcGVydHkuCisKKyAgIyMgQWRkaW5n
IGFuZCBSZW1vdmluZyBDaGlsZCBWaWV3cworCisgIFRoZSBjb250YWluZXIgdmlldyBpbXBsZW1l
bnRzIGBFbWJlci5NdXRhYmxlQXJyYXlgIGFsbG93aW5nIHByb2dyYW1hdGljIG1hbmFnZW1lbnQg
b2YgaXRzIGNoaWxkIHZpZXdzLgorCisgIFRvIHJlbW92ZSBhIHZpZXcsIHBhc3MgdGhhdCB2aWV3
IGludG8gYSBgcmVtb3ZlT2JqZWN0YCBjYWxsIG9uIHRoZSBjb250YWluZXIgdmlldy4KKworICBH
aXZlbiBhbiBlbXB0eSBgPGJvZHk+YCB0aGUgZm9sbG93aW5nIGNvZGUKKworICBgYGBqYXZhc2Ny
aXB0CisgIGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7CisgICAgY2xh
c3NOYW1lczogWyd0aGUtY29udGFpbmVyJ10sCisgICAgY2hpbGRWaWV3czogWydhVmlldycsICdi
VmlldyddLAorICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSh7CisgICAgICB0ZW1wbGF0ZTog
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJBIikKKyAgICB9KSwKKyAgICBiVmlldzogRW1iZXIu
Vmlldy5jcmVhdGUoeworICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgi
QiIpCisgICAgfSkKKyAgfSk7CisKKyAgYUNvbnRhaW5lci5hcHBlbmRUbygnYm9keScpOworICBg
YGAKKworICBSZXN1bHRzIGluIHRoZSBIVE1MCisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNzPSJl
bWJlci12aWV3IHRoZS1jb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkE8
L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5CPC9kaXY+CisgIDwvZGl2PgorICBg
YGAKKworICBSZW1vdmluZyBhIHZpZXcKKworICBgYGBqYXZhc2NyaXB0CisgIGFDb250YWluZXIu
dG9BcnJheSgpOyAgLy8gW2FDb250YWluZXIuYVZpZXcsIGFDb250YWluZXIuYlZpZXddCisgIGFD
b250YWluZXIucmVtb3ZlT2JqZWN0KGFDb250YWluZXIuZ2V0KCdiVmlldycpKTsKKyAgYUNvbnRh
aW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRhaW5lci5hVmlld10KKyAgYGBgCisKKyAgV2lsbCBy
ZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MCisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNzPSJl
bWJlci12aWV3IHRoZS1jb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkE8
L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorCisgIFNpbWlsYXJseSwgYWRkaW5nIGEgY2hpbGQgdmll
dyBpcyBhY2NvbXBsaXNoZWQgYnkgYWRkaW5nIGBFbWJlci5WaWV3YCBpbnN0YW5jZXMgdG8gdGhl
CisgIGNvbnRhaW5lciB2aWV3LgorCisgIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIHRoZSBmb2xs
b3dpbmcgY29kZQorCisgIGBgYGphdmFzY3JpcHQKKyAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRh
aW5lclZpZXcuY3JlYXRlKHsKKyAgICBjbGFzc05hbWVzOiBbJ3RoZS1jb250YWluZXInXSwKKyAg
ICBjaGlsZFZpZXdzOiBbJ2FWaWV3JywgJ2JWaWV3J10sCisgICAgYVZpZXc6IEVtYmVyLlZpZXcu
Y3JlYXRlKHsKKyAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkEiKQor
ICAgIH0pLAorICAgIGJWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSh7CisgICAgICB0ZW1wbGF0ZTog
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJCIikKKyAgICB9KQorICB9KTsKKworICBhQ29udGFp
bmVyLmFwcGVuZFRvKCdib2R5Jyk7CisgIGBgYAorCisgIFJlc3VsdHMgaW4gdGhlIEhUTUwKKwor
ICBgYGBodG1sCisgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+CisgICAg
PGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPkI8L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorCisgIEFkZGluZyBhIHZpZXcKKworICBgYGBq
YXZhc2NyaXB0CisgIEFub3RoZXJWaWV3Q2xhc3MgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQW5vdGhlciB2aWV3IikKKyAgfSk7
CisKKyAgYUNvbnRhaW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRh
aW5lci5iVmlld10KKyAgYUNvbnRhaW5lci5wdXNoT2JqZWN0KEFub3RoZXJWaWV3Q2xhc3MuY3Jl
YXRlKCkpOworICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgLy8gW2FDb250YWluZXIuYVZpZXcsIGFD
b250YWluZXIuYlZpZXcsIDxBbm90aGVyVmlld0NsYXNzIGluc3RhbmNlPl0KKyAgYGBgCisKKyAg
V2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MCisKKyAgYGBgaHRtbAorICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3IHRoZS1jb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPkE8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5CPC9kaXY+CisgICAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyI+QW5vdGhlciB2aWV3PC9kaXY+CisgIDwvZGl2PgorICBgYGAK
KworICAjIyBUZW1wbGF0ZXMgYW5kIExheW91dAorCisgIEEgYHRlbXBsYXRlYCwgYHRlbXBsYXRl
TmFtZWAsIGBkZWZhdWx0VGVtcGxhdGVgLCBgbGF5b3V0YCwgYGxheW91dE5hbWVgIG9yCisgIGBk
ZWZhdWx0TGF5b3V0YCBwcm9wZXJ0eSBvbiBhIGNvbnRhaW5lciB2aWV3IHdpbGwgbm90IHJlc3Vs
dCBpbiB0aGUgdGVtcGxhdGUKKyAgb3IgbGF5b3V0IGJlaW5nIHJlbmRlcmVkLiBUaGUgSFRNTCBj
b250ZW50cyBvZiBhIGBFbWJlci5Db250YWluZXJWaWV3YCdzIERPTQorICByZXByZXNlbnRhdGlv
biB3aWxsIG9ubHkgYmUgdGhlIHJlbmRlcmVkIEhUTUwgb2YgaXRzIGNoaWxkIHZpZXdzLgorCisg
ICMjIEJpbmRpbmcgYSBWaWV3IHRvIERpc3BsYXkKKworICBJZiB5b3Ugd291bGQgbGlrZSB0byBk
aXNwbGF5IGEgc2luZ2xlIHZpZXcgaW4geW91ciBDb250YWluZXJWaWV3LCB5b3UgY2FuIHNldAor
ICBpdHMgYGN1cnJlbnRWaWV3YCBwcm9wZXJ0eS4gV2hlbiB0aGUgYGN1cnJlbnRWaWV3YCBwcm9w
ZXJ0eSBpcyBzZXQgdG8gYSB2aWV3CisgIGluc3RhbmNlLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRo
ZSBDb250YWluZXJWaWV3LiBJZiB0aGUgYGN1cnJlbnRWaWV3YCBwcm9wZXJ0eQorICBpcyBsYXRl
ciBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IHZpZXcsIHRoZSBuZXcgdmlldyB3aWxsIHJlcGxhY2Ug
dGhlIG9sZCB2aWV3LgorICBJZiBgY3VycmVudFZpZXdgIGlzIHNldCB0byBgbnVsbGAsIHRoZSBs
YXN0IGBjdXJyZW50Vmlld2Agd2lsbCBiZSByZW1vdmVkLgorCisgIFRoaXMgZnVuY3Rpb25hbGl0
eSBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIGJpbmQgdGhlIGRpc3BsYXkg
b2YKKyAgYSBDb250YWluZXJWaWV3IHRvIGEgY29udHJvbGxlciBvciBzdGF0ZSBtYW5hZ2VyLiBG
b3IgZXhhbXBsZSwgeW91IGNhbiBiaW5kCisgIHRoZSBgY3VycmVudFZpZXdgIG9mIGEgY29udGFp
bmVyIHRvIGEgY29udHJvbGxlciBsaWtlIHRoaXM6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAu
YXBwQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdC5jcmVhdGUoeworICAgIHZpZXc6IEVtYmVyLlZp
ZXcuY3JlYXRlKHsKKyAgICAgIHRlbXBsYXRlTmFtZTogJ3BlcnNvbl90ZW1wbGF0ZScKKyAgICB9
KQorICB9KTsKKyAgYGBgCisKKyAgYGBgaGFuZGxlYmFycworICB7e3ZpZXcgRW1iZXIuQ29udGFp
bmVyVmlldyBjdXJyZW50Vmlld0JpbmRpbmc9IkFwcC5hcHBDb250cm9sbGVyLnZpZXcifX0KKyAg
YGBgCisKKyAgQGNsYXNzIENvbnRhaW5lclZpZXcKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0
ZW5kcyBFbWJlci5WaWV3CisqLworRW1iZXIuQ29udGFpbmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKEVtYmVyLk11dGFibGVBcnJheSwgeworICBzdGF0ZXM6IHN0YXRlcywKKworICBpbml0OiBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBlcigpOworCisgICAgdmFyIGNoaWxkVmlld3MgPSBn
ZXQodGhpcywgJ2NoaWxkVmlld3MnKTsKKworICAgIC8vIHJlZGVmaW5lIHZpZXcncyBjaGlsZFZp
ZXdzIHByb3BlcnR5IHRoYXQgd2FzIG9ibGl0ZXJhdGVkCisgICAgRW1iZXIuZGVmaW5lUHJvcGVy
dHkodGhpcywgJ2NoaWxkVmlld3MnLCBFbWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSk7CisK
KyAgICB2YXIgX2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOworCisgICAgZm9yRWFjaChj
aGlsZFZpZXdzLCBmdW5jdGlvbih2aWV3TmFtZSwgaWR4KSB7CisgICAgICB2YXIgdmlldzsKKwor
ICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Ygdmlld05hbWUpIHsKKyAgICAgICAgdmlldyA9
IGdldCh0aGlzLCB2aWV3TmFtZSk7CisgICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmll
dyh2aWV3KTsKKyAgICAgICAgc2V0KHRoaXMsIHZpZXdOYW1lLCB2aWV3KTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmlldyh2aWV3TmFtZSk7CisgICAg
ICB9CisKKyAgICAgIF9jaGlsZFZpZXdzW2lkeF0gPSB2aWV3OworICAgIH0sIHRoaXMpOworCisg
ICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50VmlldycpOworICAgIGlmIChj
dXJyZW50VmlldykgeworICAgICAgX2NoaWxkVmlld3MucHVzaCh0aGlzLmNyZWF0ZUNoaWxkVmll
dyhjdXJyZW50VmlldykpOworICAgIH0KKyAgfSwKKworICByZXBsYWNlOiBmdW5jdGlvbihpZHgs
IHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cykgeworICAgIHZhciBhZGRlZENvdW50ID0gYWRkZWRW
aWV3cyA/IGdldChhZGRlZFZpZXdzLCAnbGVuZ3RoJykgOiAwOworCisgICAgdGhpcy5hcnJheUNv
bnRlbnRXaWxsQ2hhbmdlKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsKKyAgICB0aGlz
LmNoaWxkVmlld3NXaWxsQ2hhbmdlKHRoaXMuX2NoaWxkVmlld3MsIGlkeCwgcmVtb3ZlZENvdW50
KTsKKworICAgIGlmIChhZGRlZENvdW50ID09PSAwKSB7CisgICAgICB0aGlzLl9jaGlsZFZpZXdz
LnNwbGljZShpZHgsIHJlbW92ZWRDb3VudCkgOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgYXJn
cyA9IFtpZHgsIHJlbW92ZWRDb3VudF0uY29uY2F0KGFkZGVkVmlld3MpOworICAgICAgdGhpcy5f
Y2hpbGRWaWV3cy5zcGxpY2UuYXBwbHkodGhpcy5fY2hpbGRWaWV3cywgYXJncyk7CisgICAgfQor
CisgICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVk
Q291bnQpOworICAgIHRoaXMuY2hpbGRWaWV3c0RpZENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBp
ZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwK
KworICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7CisgICAgcmV0dXJuIHRoaXMuX2NoaWxkVmll
d3NbaWR4XTsKKyAgfSwKKworICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsK
KyAgICByZXR1cm4gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7CisgIH0pLAorCisgIC8qKgorICAg
IEBwcml2YXRlCisKKyAgICBJbnN0cnVjdHMgZWFjaCBjaGlsZCB2aWV3IHRvIHJlbmRlciB0byB0
aGUgcGFzc2VkIHJlbmRlciBidWZmZXIuCisKKyAgICBAbWV0aG9kIHJlbmRlcgorICAgIEBwYXJh
bSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgdGhlIGJ1ZmZlciB0byByZW5kZXIgdG8KKyAg
Ki8KKyAgcmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKKyAgICB0aGlzLmZvckVhY2hDaGlsZFZp
ZXcoZnVuY3Rpb24odmlldykgeworICAgICAgdmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOwor
ICAgIH0pOworICB9LAorCisgIGluc3RydW1lbnROYW1lOiAncmVuZGVyLmNvbnRhaW5lcicsCisK
KyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFdoZW4gYSBjaGlsZCB2aWV3IGlzIHJlbW92ZWQs
IGRlc3Ryb3kgaXRzIGVsZW1lbnQgc28gdGhhdAorICAgIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUg
RE9NLgorCisgICAgVGhlIGFycmF5IG9ic2VydmVyIHRoYXQgdHJpZ2dlcnMgdGhpcyBhY3Rpb24g
aXMgc2V0IHVwIGluIHRoZQorICAgIGByZW5kZXJUb0J1ZmZlcmAgbWV0aG9kLgorCisgICAgQG1l
dGhvZCBjaGlsZFZpZXdzV2lsbENoYW5nZQorICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IHZpZXdz
IHRoZSBjaGlsZCB2aWV3cyBhcnJheSBiZWZvcmUgbXV0YXRpb24KKyAgICBAcGFyYW0ge051bWJl
cn0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgorICAgIEBwYXJhbSB7
TnVtYmVyfSByZW1vdmVkIHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAorICAqKi8K
KyAgY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3ZlZCkg
eworICAgIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKCdjaGlsZFZpZXdzJyk7CisKKyAgICBpZiAo
cmVtb3ZlZCA+IDApIHsKKyAgICAgIHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3cy5zbGljZShzdGFy
dCwgc3RhcnQrcmVtb3ZlZCk7CisgICAgICAvLyB0cmFuc2l0aW9uIHRvIHByZVJlbmRlciBiZWZv
cmUgY2xlYXJpbmcgcGFyZW50VmlldworICAgICAgdGhpcy5jdXJyZW50U3RhdGUuY2hpbGRWaWV3
c1dpbGxDaGFuZ2UodGhpcywgdmlld3MsIHN0YXJ0LCByZW1vdmVkKTsKKyAgICAgIHRoaXMuaW5p
dGlhbGl6ZVZpZXdzKGNoYW5nZWRWaWV3cywgbnVsbCwgbnVsbCk7CisgICAgfQorICB9LAorCisg
IHJlbW92ZUNoaWxkOiBmdW5jdGlvbihjaGlsZCkgeworICAgIHRoaXMucmVtb3ZlT2JqZWN0KGNo
aWxkKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisg
ICAgV2hlbiBhIGNoaWxkIHZpZXcgaXMgYWRkZWQsIG1ha2Ugc3VyZSB0aGUgRE9NIGdldHMgdXBk
YXRlZCBhcHByb3ByaWF0ZWx5LgorCisgICAgSWYgdGhlIHZpZXcgaGFzIGFscmVhZHkgcmVuZGVy
ZWQgYW4gZWxlbWVudCwgd2UgdGVsbCB0aGUgY2hpbGQgdmlldyB0bworICAgIGNyZWF0ZSBhbiBl
bGVtZW50IGFuZCBpbnNlcnQgaXQgaW50byB0aGUgRE9NLiBJZiB0aGUgZW5jbG9zaW5nIGNvbnRh
aW5lcgorICAgIHZpZXcgaGFzIGFscmVhZHkgd3JpdHRlbiB0byBhIGJ1ZmZlciwgYnV0IG5vdCB5
ZXQgY29udmVydGVkIHRoYXQgYnVmZmVyCisgICAgaW50byBhbiBlbGVtZW50LCB3ZSBpbnNlcnQg
dGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hpbGQgaW50byB0aGUKKyAgICBhcHBy
b3ByaWF0ZSBwbGFjZSBpbiB0aGUgYnVmZmVyLgorCisgICAgQG1ldGhvZCBjaGlsZFZpZXdzRGlk
Q2hhbmdlCisgICAgQHBhcmFtIHtFbWJlci5BcnJheX0gdmlld3MgdGhlIGFycmF5IG9mIGNoaWxk
IHZpZXdzIGFmdGUgdGhlIG11dGF0aW9uIGhhcyBvY2N1cnJlZAorICAgIEBwYXJhbSB7TnVtYmVy
fSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG11dGF0aW9uCisgICAgQHBhcmFtIHtO
dW1iZXJ9IHJlbW92ZWQgdGhlIG51bWJlciBvZiBjaGlsZCB2aWV3cyByZW1vdmVkCisgICAgQHBh
cmFtIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgYWRkZWQKKyAgKi8KKyAgY2hp
bGRWaWV3c0RpZENoYW5nZTogZnVuY3Rpb24odmlld3MsIHN0YXJ0LCByZW1vdmVkLCBhZGRlZCkg
eworICAgIGlmIChhZGRlZCA+IDApIHsKKyAgICAgIHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3cy5z
bGljZShzdGFydCwgc3RhcnQrYWRkZWQpOworICAgICAgdGhpcy5pbml0aWFsaXplVmlld3MoY2hh
bmdlZFZpZXdzLCB0aGlzLCBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpKTsKKyAgICAgIHRoaXMu
Y3VycmVudFN0YXRlLmNoaWxkVmlld3NEaWRDaGFuZ2UodGhpcywgdmlld3MsIHN0YXJ0LCBhZGRl
ZCk7CisgICAgfQorICAgIHRoaXMucHJvcGVydHlEaWRDaGFuZ2UoJ2NoaWxkVmlld3MnKTsKKyAg
fSwKKworICBpbml0aWFsaXplVmlld3M6IGZ1bmN0aW9uKHZpZXdzLCBwYXJlbnRWaWV3LCB0ZW1w
bGF0ZURhdGEpIHsKKyAgICBmb3JFYWNoKHZpZXdzLCBmdW5jdGlvbih2aWV3KSB7CisgICAgICBz
ZXQodmlldywgJ19wYXJlbnRWaWV3JywgcGFyZW50Vmlldyk7CisKKyAgICAgIGlmICghZ2V0KHZp
ZXcsICd0ZW1wbGF0ZURhdGEnKSkgeworICAgICAgICBzZXQodmlldywgJ3RlbXBsYXRlRGF0YScs
IHRlbXBsYXRlRGF0YSk7CisgICAgICB9CisgICAgfSk7CisgIH0sCisKKyAgY3VycmVudFZpZXc6
IG51bGwsCisKKyAgX2N1cnJlbnRWaWV3V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIo
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50Vmll
dycpOworICAgIGlmIChjdXJyZW50VmlldykgeworICAgICAgY3VycmVudFZpZXcuZGVzdHJveSgp
OworICAgIH0KKyAgfSwgJ2N1cnJlbnRWaWV3JyksCisKKyAgX2N1cnJlbnRWaWV3RGlkQ2hhbmdl
OiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICB2YXIgY3VycmVudFZpZXcgPSBnZXQo
dGhpcywgJ2N1cnJlbnRWaWV3Jyk7CisgICAgaWYgKGN1cnJlbnRWaWV3KSB7CisgICAgICB0aGlz
LnB1c2hPYmplY3QoY3VycmVudFZpZXcpOworICAgIH0KKyAgfSwgJ2N1cnJlbnRWaWV3JyksCisK
KyAgX2Vuc3VyZUNoaWxkcmVuQXJlSW5ET006IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmN1cnJl
bnRTdGF0ZS5lbnN1cmVDaGlsZHJlbkFyZUluRE9NKHRoaXMpOworICB9Cit9KTsKKworRW1iZXIu
bWVyZ2Uoc3RhdGVzLl9kZWZhdWx0LCB7CisgIGNoaWxkVmlld3NXaWxsQ2hhbmdlOiBFbWJlci5L
LAorICBjaGlsZFZpZXdzRGlkQ2hhbmdlOiBFbWJlci5LLAorICBlbnN1cmVDaGlsZHJlbkFyZUlu
RE9NOiBFbWJlci5LCit9KTsKKworRW1iZXIubWVyZ2Uoc3RhdGVzLmluQnVmZmVyLCB7CisgIGNo
aWxkVmlld3NEaWRDaGFuZ2U6IGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXdzLCBzdGFydCwgYWRk
ZWQpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGNoaWxkIHZpZXdz
IHdoaWxlIGluIHRoZSBpbkJ1ZmZlciBzdGF0ZScpOworICB9Cit9KTsKKworRW1iZXIubWVyZ2Uo
c3RhdGVzLmhhc0VsZW1lbnQsIHsKKyAgY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IGZ1bmN0aW9uKHZp
ZXcsIHZpZXdzLCBzdGFydCwgcmVtb3ZlZCkgeworICAgIGZvciAodmFyIGk9c3RhcnQ7IGk8c3Rh
cnQrcmVtb3ZlZDsgaSsrKSB7CisgICAgICB2aWV3c1tpXS5yZW1vdmUoKTsKKyAgICB9CisgIH0s
CisKKyAgY2hpbGRWaWV3c0RpZENoYW5nZTogZnVuY3Rpb24odmlldywgdmlld3MsIHN0YXJ0LCBh
ZGRlZCkgeworICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHZpZXcsICdfZW5z
dXJlQ2hpbGRyZW5BcmVJbkRPTScpOworICB9LAorCisgIGVuc3VyZUNoaWxkcmVuQXJlSW5ET006
IGZ1bmN0aW9uKHZpZXcpIHsKKyAgICB2YXIgY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3Ms
IGksIGxlbiwgY2hpbGRWaWV3LCBwcmV2aW91cywgYnVmZmVyOworICAgIGZvciAoaSA9IDAsIGxl
biA9IGNoaWxkVmlld3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGNoaWxkVmlldyA9
IGNoaWxkVmlld3NbaV07CisgICAgICBidWZmZXIgPSBjaGlsZFZpZXcucmVuZGVyVG9CdWZmZXJJ
Zk5lZWRlZCgpOworICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBjaGlsZFZpZXcudHJpZ2dl
clJlY3Vyc2l2ZWx5KCd3aWxsSW5zZXJ0RWxlbWVudCcpOworICAgICAgICBpZiAocHJldmlvdXMp
IHsKKyAgICAgICAgICBwcmV2aW91cy5kb21NYW5hZ2VyLmFmdGVyKHByZXZpb3VzLCBidWZmZXIu
c3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZpZXcuZG9tTWFuYWdlci5w
cmVwZW5kKHZpZXcsIGJ1ZmZlci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2hpbGRW
aWV3LnRyYW5zaXRpb25UbygnaW5ET00nKTsKKyAgICAgICAgY2hpbGRWaWV3LnByb3BlcnR5RGlk
Q2hhbmdlKCdlbGVtZW50Jyk7CisgICAgICAgIGNoaWxkVmlldy50cmlnZ2VyUmVjdXJzaXZlbHko
J2RpZEluc2VydEVsZW1lbnQnKTsKKyAgICAgIH0KKyAgICAgIHByZXZpb3VzID0gY2hpbGRWaWV3
OworICAgIH0KKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Bt
b2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKKworLyoqCisg
IGBFbWJlci5Db2xsZWN0aW9uVmlld2AgaXMgYW4gYEVtYmVyLlZpZXdgIGRlc2NlbmRlbnQgcmVz
cG9uc2libGUgZm9yIG1hbmFnaW5nCisgIGEgY29sbGVjdGlvbiAoYW4gYXJyYXkgb3IgYXJyYXkt
bGlrZSBvYmplY3QpIGJ5IG1haW50YWluZyBhIGNoaWxkIHZpZXcgb2JqZWN0CisgIGFuZCBhc3Nv
Y2lhdGVkIERPTSByZXByZXNlbnRhdGlvbiBmb3IgZWFjaCBpdGVtIGluIHRoZSBhcnJheSBhbmQg
ZW5zdXJpbmcKKyAgdGhhdCBjaGlsZCB2aWV3cyBhbmQgdGhlaXIgYXNzb2NpYXRlZCByZW5kZXJl
ZCBIVE1MIGFyZSB1cGRhdGVkIHdoZW4gaXRlbXMgaW4KKyAgdGhlIGFycmF5IGFyZSBhZGRlZCwg
cmVtb3ZlZCwgb3IgcmVwbGFjZWQuCisKKyAgIyMgU2V0dGluZyBjb250ZW50CisKKyAgVGhlIG1h
bmFnZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzIGlzIHJlZmVyZW5jZWQgYXMgdGhlIGBFbWJlci5D
b2xsZWN0aW9uVmlld2AKKyAgaW5zdGFuY2UncyBgY29udGVudGAgcHJvcGVydHkuCisKKyAgYGBg
amF2YXNjcmlwdAorICBzb21lSXRlbXNWaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRl
KHsKKyAgICBjb250ZW50OiBbJ0EnLCAnQicsJ0MnXQorICB9KQorICBgYGAKKworICBUaGUgdmll
dyBmb3IgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIHdpbGwgaGF2ZSBpdHMgYGNvbnRlbnRg
IHByb3BlcnR5IHNldAorICB0byB0aGUgaXRlbS4KKworICAjIyBTcGVjaWZ5aW5nIGl0ZW1WaWV3
Q2xhc3MKKworICBCeSBkZWZhdWx0IHRoZSB2aWV3IGNsYXNzIGZvciBlYWNoIGl0ZW0gaW4gdGhl
IG1hbmFnZWQgY29sbGVjdGlvbiB3aWxsIGJlIGFuCisgIGluc3RhbmNlIG9mIGBFbWJlci5WaWV3
YC4gWW91IGNhbiBzdXBwbHkgYSBkaWZmZXJlbnQgY2xhc3MgYnkgc2V0dGluZyB0aGUKKyAgYENv
bGxlY3Rpb25WaWV3YCdzIGBpdGVtVmlld0NsYXNzYCBwcm9wZXJ0eS4KKworICBHaXZlbiBhbiBl
bXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBjb2RlOgorCisgIGBgYGphdmFzY3JpcHQg
CisgIHNvbWVJdGVtc1ZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5jcmVhdGUoeworICAgIGNs
YXNzTmFtZXM6IFsnYS1jb2xsZWN0aW9uJ10sCisgICAgY29udGVudDogWydBJywnQicsJ0MnXSwK
KyAgICBpdGVtVmlld0NsYXNzOiBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZTog
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJ0aGUgbGV0dGVyOiB7e3ZpZXcuY29udGVudH19IikK
KyAgICB9KQorICB9KTsKKworICBzb21lSXRlbXNWaWV3LmFwcGVuZFRvKCdib2R5Jyk7CisgIGBg
YAorCisgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmUKKworICBg
YGBodG1sCisgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgYS1jb2xsZWN0aW9uIj4KKyAgICA8ZGl2
IGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBBPC9kaXY+CisgICAgPGRpdiBjbGFzcz0i
ZW1iZXItdmlldyI+dGhlIGxldHRlcjogQjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPnRoZSBsZXR0ZXI6IEM8L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorCisgICMjIEF1dG9tYXRp
YyBtYXRjaGluZyBvZiBwYXJlbnQvY2hpbGQgdGFnTmFtZXMKKworICBTZXR0aW5nIHRoZSBgdGFn
TmFtZWAgcHJvcGVydHkgb2YgYSBgQ29sbGVjdGlvblZpZXdgIHRvIGFueSBvZgorICAidWwiLCAi
b2wiLCAidGFibGUiLCAidGhlYWQiLCAidGJvZHkiLCAidGZvb3QiLCAidHIiLCBvciAic2VsZWN0
IiB3aWxsIHJlc3VsdAorICBpbiB0aGUgaXRlbSB2aWV3cyByZWNlaXZpbmcgYW4gYXBwcm9wcmlh
dGVseSBtYXRjaGVkIGB0YWdOYW1lYCBwcm9wZXJ0eS4KKworICBHaXZlbiBhbiBlbXB0eSBgPGJv
ZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBjb2RlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgYW5VbmRv
cmRlcmVkTGlzdFZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5jcmVhdGUoeworICAgIHRhZ05h
bWU6ICd1bCcsCisgICAgY29udGVudDogWydBJywnQicsJ0MnXSwKKyAgICBpdGVtVmlld0NsYXNz
OiBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCJ0aGUgbGV0dGVyOiB7e3ZpZXcuY29udGVudH19IikKKyAgICB9KQorICB9KTsKKwor
ICBhblVuZG9yZGVyZWRMaXN0Vmlldy5hcHBlbmRUbygnYm9keScpOworICBgYGAKKworICBXaWxs
IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3RydWN0dXJlCisKKyAgYGBgaHRtbAorICA8
dWwgY2xhc3M9ImVtYmVyLXZpZXcgYS1jb2xsZWN0aW9uIj4KKyAgICA8bGkgY2xhc3M9ImVtYmVy
LXZpZXciPnRoZSBsZXR0ZXI6IEE8L2xpPgorICAgIDxsaSBjbGFzcz0iZW1iZXItdmlldyI+dGhl
IGxldHRlcjogQjwvbGk+CisgICAgPGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBD
PC9saT4KKyAgPC91bD4KKyAgYGBgCisKKyAgQWRkaXRpb25hbCBgdGFnTmFtZWAgcGFpcnMgY2Fu
IGJlIHByb3ZpZGVkIGJ5IGFkZGluZyB0bworICBgRW1iZXIuQ29sbGVjdGlvblZpZXcuQ09OVEFJ
TkVSX01BUCBgCisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5Db2xsZWN0aW9uVmlldy5DT05U
QUlORVJfTUFQWydhcnRpY2xlJ10gPSAnc2VjdGlvbicKKyAgYGBgCisKKyAgIyMgUHJvZ3JhbWF0
aWMgY3JlYXRpb24gb2YgY2hpbGQgdmlld3MKKworICBGb3IgY2FzZXMgd2hlcmUgYWRkaXRpb25h
bCBjdXN0b21pemF0aW9uIGJleW9uZCB0aGUgdXNlIG9mIGEgc2luZ2xlCisgIGBpdGVtVmlld0Ns
YXNzYCBvciBgdGFnTmFtZWAgbWF0Y2hpbmcgaXMgcmVxdWlyZWQgQ29sbGVjdGlvblZpZXcncwor
ICBgY3JlYXRlQ2hpbGRWaWV3YCBtZXRob2QgY2FuIGJlIG92ZXJpZGRlbjoKKworICBgYGBqYXZh
c2NyaXB0CisgIEN1c3RvbUNvbGxlY3Rpb25WaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0
ZW5kKHsKKyAgICBjcmVhdGVDaGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXdDbGFzcywgYXR0cnMpIHsK
KyAgICAgIGlmIChhdHRycy5jb250ZW50LmtpbmQgPT0gJ2FsYnVtJykgeworICAgICAgICB2aWV3
Q2xhc3MgPSBBcHAuQWxidW1WaWV3OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmlld0NsYXNz
ID0gQXBwLlNvbmdWaWV3OworICAgICAgfQorICAgICAgdGhpcy5fc3VwZXIodmlld0NsYXNzLCBh
dHRycyk7CisgICAgfQorICB9KTsKKyAgYGBgCisKKyAgIyMgRW1wdHkgVmlldworCisgIFlvdSBj
YW4gcHJvdmlkZSBhbiBgRW1iZXIuVmlld2Agc3ViY2xhc3MgdG8gdGhlIGBFbWJlci5Db2xsZWN0
aW9uVmlld2AKKyAgaW5zdGFuY2UgYXMgaXRzIGBlbXB0eVZpZXdgIHByb3BlcnR5LiBJZiB0aGUg
YGNvbnRlbnRgIHByb3BlcnR5IG9mIGEKKyAgYENvbGxlY3Rpb25WaWV3YCBpcyBzZXQgdG8gYG51
bGxgIG9yIGFuIGVtcHR5IGFycmF5LCBhbiBpbnN0YW5jZSBvZiB0aGlzIHZpZXcKKyAgd2lsbCBi
ZSB0aGUgYENvbGxlY3Rpb25WaWV3YHMgb25seSBjaGlsZC4KKworICBgYGBqYXZhc2NyaXB0Cisg
IGFMaXN0V2l0aE5vdGhpbmcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5jcmVhdGUoeworICAgIGNs
YXNzTmFtZXM6IFsnbm90aGluZyddCisgICAgY29udGVudDogbnVsbCwKKyAgICBlbXB0eVZpZXc6
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNv
bXBpbGUoIlRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5IikKKyAgICB9KQorICB9KTsKKworICBhTGlz
dFdpdGhOb3RoaW5nLmFwcGVuZFRvKCdib2R5Jyk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGlu
IHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmUKKworICBgYGBodG1sCisgIDxkaXYgY2xhc3M9
ImVtYmVyLXZpZXcgbm90aGluZyI+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAg
ICBUaGUgY29sbGVjdGlvbiBpcyBlbXB0eQorICAgIDwvZGl2PgorICA8L2Rpdj4KKyAgYGBgCisK
KyAgIyMgQWRkaW5nIGFuZCBSZW1vdmluZyBpdGVtcworCisgIFRoZSBgY2hpbGRWaWV3c2AgcHJv
cGVydHkgb2YgYSBgQ29sbGVjdGlvblZpZXdgIHNob3VsZCBub3QgYmUgZGlyZWN0bHkKKyAgbWFu
aXB1bGF0ZWQuIEluc3RlYWQsIGFkZCwgcmVtb3ZlLCByZXBsYWNlIGl0ZW1zIGZyb20gaXRzIGBj
b250ZW50YCBwcm9wZXJ0eS4KKyAgVGhpcyB3aWxsIHRyaWdnZXIgYXBwcm9wcmlhdGUgY2hhbmdl
cyB0byBpdHMgcmVuZGVyZWQgSFRNTC4KKworICAjIyBVc2UgaW4gdGVtcGxhdGVzIHZpYSB0aGUg
YHt7Y29sbGVjdGlvbn19YCBgRW1iZXIuSGFuZGxlYmFyc2AgaGVscGVyCisKKyAgYEVtYmVyLkhh
bmRsZWJhcnNgIHByb3ZpZGVzIGEgaGVscGVyIHNwZWNpZmljYWxseSBmb3IgYWRkaW5nCisgIGBD
b2xsZWN0aW9uVmlld2BzIHRvIHRlbXBsYXRlcy4gU2VlIGBFbWJlci5IYW5kbGViYXJzLmNvbGxl
Y3Rpb25gIGZvciBtb3JlCisgIGRldGFpbHMKKworICBAY2xhc3MgQ29sbGVjdGlvblZpZXcKKyAg
QG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5Db250YWluZXJWaWV3CisgIEBzaW5j
ZSBFbWJlciAwLjkKKyovCitFbWJlci5Db2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbnRhaW5lclZp
ZXcuZXh0ZW5kKAorLyoqIEBzY29wZSBFbWJlci5Db2xsZWN0aW9uVmlldy5wcm90b3R5cGUgKi8g
eworCisgIC8qKgorICAgIEEgbGlzdCBvZiBpdGVtcyB0byBiZSBkaXNwbGF5ZWQgYnkgdGhlIGBF
bWJlci5Db2xsZWN0aW9uVmlld2AuCisKKyAgICBAcHJvcGVydHkgY29udGVudAorICAgIEB0eXBl
IEVtYmVyLkFycmF5CisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBjb250ZW50OiBudWxsLAor
CisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIHByb3ZpZGVzIG1ldGFkYXRhIGFib3V0
IHdoYXQga2luZCBvZiBlbXB0eSB2aWV3IGNsYXNzIHRoaXMKKyAgICBjb2xsZWN0aW9uIHdvdWxk
IGxpa2UgaWYgaXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkIGZyb20gYW5vdGhlcgorICAgIHN5c3Rl
bSAobGlrZSBIYW5kbGViYXJzKQorCisgICAgQHByb3BlcnR5IGVtcHR5Vmlld0NsYXNzCisgICov
CisgIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5WaWV3LAorCisgIC8qKgorICAgIEFuIG9wdGlvbmFs
IHZpZXcgdG8gZGlzcGxheSBpZiBjb250ZW50IGlzIHNldCB0byBhbiBlbXB0eSBhcnJheS4KKwor
ICAgIEBwcm9wZXJ0eSBlbXB0eVZpZXcKKyAgICBAdHlwZSBFbWJlci5WaWV3CisgICAgQGRlZmF1
bHQgbnVsbAorICAqLworICBlbXB0eVZpZXc6IG51bGwsCisKKyAgLyoqCisgICAgQHByb3BlcnR5
IGl0ZW1WaWV3Q2xhc3MKKyAgICBAdHlwZSBFbWJlci5WaWV3CisgICAgQGRlZmF1bHQgRW1iZXIu
VmlldworICAqLworICBpdGVtVmlld0NsYXNzOiBFbWJlci5WaWV3LAorCisgIGluaXQ6IGZ1bmN0
aW9uKCkgeworICAgIHZhciByZXQgPSB0aGlzLl9zdXBlcigpOworICAgIHRoaXMuX2NvbnRlbnRE
aWRDaGFuZ2UoKTsKKyAgICByZXR1cm4gcmV0OworICB9LAorCisgIF9jb250ZW50V2lsbENoYW5n
ZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRlbnQgPSB0
aGlzLmdldCgnY29udGVudCcpOworCisgICAgaWYgKGNvbnRlbnQpIHsgY29udGVudC5yZW1vdmVB
cnJheU9ic2VydmVyKHRoaXMpOyB9CisgICAgdmFyIGxlbiA9IGNvbnRlbnQgPyBnZXQoY29udGVu
dCwgJ2xlbmd0aCcpIDogMDsKKyAgICB0aGlzLmFycmF5V2lsbENoYW5nZShjb250ZW50LCAwLCBs
ZW4pOworICB9LCAnY29udGVudCcpLAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBDaGVj
ayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29udGVudCBoYXMgY2hhbmdlZCwgYW5kIGlmIHNvLAor
ICAgIHVwZGF0ZSB0aGUgY2hpbGRyZW4gZGlyZWN0bHkuIFRoaXMgaXMgYWx3YXlzIHNjaGVkdWxl
ZAorICAgIGFzeW5jaHJvbm91c2x5LCB0byBhbGxvdyB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVk
IGJlZm9yZQorICAgIGJpbmRpbmdzIGhhdmUgc3luY2hyb25pemVkIGFuZCB2aWNlIHZlcnNhLgor
CisgICAgQG1ldGhvZCBfY29udGVudERpZENoYW5nZQorICAqLworICBfY29udGVudERpZENoYW5n
ZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRlbnQgPSBnZXQodGhp
cywgJ2NvbnRlbnQnKTsKKworICAgIGlmIChjb250ZW50KSB7CisgICAgICBFbWJlci5hc3NlcnQo
Zm10KCJhbiBFbWJlci5Db2xsZWN0aW9uVmlldydzIGNvbnRlbnQgbXVzdCBpbXBsZW1lbnQgRW1i
ZXIuQXJyYXkuIFlvdSBwYXNzZWQgJUAiLCBbY29udGVudF0pLCBFbWJlci5BcnJheS5kZXRlY3Qo
Y29udGVudCkpOworICAgICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMpOworICAgIH0K
KworICAgIHZhciBsZW4gPSBjb250ZW50ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7Cisg
ICAgdGhpcy5hcnJheURpZENoYW5nZShjb250ZW50LCAwLCBudWxsLCBsZW4pOworICB9LCAnY29u
dGVudCcpLAorCisgIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgY29udGVudCA9
IGdldCh0aGlzLCAnY29udGVudCcpOworICAgIGlmIChjb250ZW50KSB7IGNvbnRlbnQucmVtb3Zl
QXJyYXlPYnNlcnZlcih0aGlzKTsgfQorCisgICAgdGhpcy5fc3VwZXIoKTsKKworICAgIGlmICh0
aGlzLl9jcmVhdGVkRW1wdHlWaWV3KSB7CisgICAgICB0aGlzLl9jcmVhdGVkRW1wdHlWaWV3LmRl
c3Ryb3koKTsKKyAgICB9CisgIH0sCisKKyAgYXJyYXlXaWxsQ2hhbmdlOiBmdW5jdGlvbihjb250
ZW50LCBzdGFydCwgcmVtb3ZlZENvdW50KSB7CisgICAgLy8gSWYgdGhlIGNvbnRlbnRzIHdlcmUg
ZW1wdHkgYmVmb3JlIGFuZCB0aGlzIHRlbXBsYXRlIGNvbGxlY3Rpb24gaGFzIGFuCisgICAgLy8g
ZW1wdHkgdmlldyByZW1vdmUgaXQgbm93LgorICAgIHZhciBlbXB0eVZpZXcgPSBnZXQodGhpcywg
J2VtcHR5VmlldycpOworICAgIGlmIChlbXB0eVZpZXcgJiYgZW1wdHlWaWV3IGluc3RhbmNlb2Yg
RW1iZXIuVmlldykgeworICAgICAgZW1wdHlWaWV3LnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICB9
CisKKyAgICAvLyBMb29wIHRocm91Z2ggY2hpbGQgdmlld3MgdGhhdCBjb3JyZXNwb25kIHdpdGgg
dGhlIHJlbW92ZWQgaXRlbXMuCisgICAgLy8gTm90ZSB0aGF0IHdlIGxvb3AgZnJvbSB0aGUgZW5k
IG9mIHRoZSBhcnJheSB0byB0aGUgYmVnaW5uaW5nIGJlY2F1c2UKKyAgICAvLyB3ZSBhcmUgbXV0
YXRpbmcgaXQgYXMgd2UgZ28uCisgICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdz
LCBjaGlsZFZpZXcsIGlkeCwgbGVuOworCisgICAgbGVuID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5n
dGg7CisKKyAgICB2YXIgcmVtb3ZpbmdBbGwgPSByZW1vdmVkQ291bnQgPT09IGxlbjsKKworICAg
IGlmIChyZW1vdmluZ0FsbCkgeworICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZW1wdHkodGhpcyk7
CisgICAgfQorCisgICAgZm9yIChpZHggPSBzdGFydCArIHJlbW92ZWRDb3VudCAtIDE7IGlkeCA+
PSBzdGFydDsgaWR4LS0pIHsKKyAgICAgIGNoaWxkVmlldyA9IGNoaWxkVmlld3NbaWR4XTsKKyAg
ICAgIGlmIChyZW1vdmluZ0FsbCkgeyBjaGlsZFZpZXcucmVtb3ZlZEZyb21ET00gPSB0cnVlOyB9
CisgICAgICBjaGlsZFZpZXcuZGVzdHJveSgpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBD
YWxsZWQgd2hlbiBhIG11dGF0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgYXJyYXkgb2Nj
dXJzLgorCisgICAgVGhpcyBtZXRob2Qgd2lsbCByZXBsYXkgdGhhdCBtdXRhdGlvbiBhZ2FpbnN0
IHRoZSB2aWV3cyB0aGF0IGNvbXBvc2UgdGhlCisgICAgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YCwg
ZW5zdXJpbmcgdGhhdCB0aGUgdmlldyByZWZsZWN0cyB0aGUgbW9kZWwuCisKKyAgICBUaGlzIGFy
cmF5IG9ic2VydmVyIGlzIGFkZGVkIGluIGBjb250ZW50RGlkQ2hhbmdlYC4KKworICAgIEBtZXRo
b2QgYXJyYXlEaWRDaGFuZ2UKKyAgICBAcGFyYW0ge0FycmF5fSBhZGRlZE9iamVjdHMgdGhlIG9i
amVjdHMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBjb250ZW50CisgICAgQHBhcmFtIHtBcnJheX0g
cmVtb3ZlZE9iamVjdHMgdGhlIG9iamVjdHMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgY29u
dGVudAorICAgIEBwYXJhbSB7TnVtYmVyfSBjaGFuZ2VJbmRleCB0aGUgaW5kZXggYXQgd2hpY2gg
dGhlIGNoYW5nZXMgb2NjdXJyZWQKKyAgKi8KKyAgYXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGNv
bnRlbnQsIHN0YXJ0LCByZW1vdmVkLCBhZGRlZCkgeworICAgIHZhciBpdGVtVmlld0NsYXNzID0g
Z2V0KHRoaXMsICdpdGVtVmlld0NsYXNzJyksCisgICAgICAgIGFkZGVkVmlld3MgPSBbXSwgdmll
dywgaXRlbSwgaWR4LCBsZW4sIGl0ZW1UYWdOYW1lOworCisgICAgaWYgKCdzdHJpbmcnID09PSB0
eXBlb2YgaXRlbVZpZXdDbGFzcykgeworICAgICAgaXRlbVZpZXdDbGFzcyA9IGdldChpdGVtVmll
d0NsYXNzKTsKKyAgICB9CisKKyAgICBFbWJlci5hc3NlcnQoZm10KCJpdGVtVmlld0NsYXNzIG11
c3QgYmUgYSBzdWJjbGFzcyBvZiBFbWJlci5WaWV3LCBub3QgJUAiLCBbaXRlbVZpZXdDbGFzc10p
LCBFbWJlci5WaWV3LmRldGVjdChpdGVtVmlld0NsYXNzKSk7CisKKyAgICBsZW4gPSBjb250ZW50
ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7CisgICAgaWYgKGxlbikgeworICAgICAgZm9y
IChpZHggPSBzdGFydDsgaWR4IDwgc3RhcnQrYWRkZWQ7IGlkeCsrKSB7CisgICAgICAgIGl0ZW0g
PSBjb250ZW50Lm9iamVjdEF0KGlkeCk7CisKKyAgICAgICAgdmlldyA9IHRoaXMuY3JlYXRlQ2hp
bGRWaWV3KGl0ZW1WaWV3Q2xhc3MsIHsKKyAgICAgICAgICBjb250ZW50OiBpdGVtLAorICAgICAg
ICAgIGNvbnRlbnRJbmRleDogaWR4CisgICAgICAgIH0pOworCisgICAgICAgIGFkZGVkVmlld3Mu
cHVzaCh2aWV3KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIGVtcHR5VmlldyA9
IGdldCh0aGlzLCAnZW1wdHlWaWV3Jyk7CisgICAgICBpZiAoIWVtcHR5VmlldykgeyByZXR1cm47
IH0KKworICAgICAgdmFyIGlzQ2xhc3MgPSBFbWJlci5Db3JlVmlldy5kZXRlY3QoZW1wdHlWaWV3
KTsKKworICAgICAgZW1wdHlWaWV3ID0gdGhpcy5jcmVhdGVDaGlsZFZpZXcoZW1wdHlWaWV3KTsK
KyAgICAgIGFkZGVkVmlld3MucHVzaChlbXB0eVZpZXcpOworICAgICAgc2V0KHRoaXMsICdlbXB0
eVZpZXcnLCBlbXB0eVZpZXcpOworCisgICAgICBpZiAoaXNDbGFzcykgeyB0aGlzLl9jcmVhdGVk
RW1wdHlWaWV3ID0gZW1wdHlWaWV3OyB9CisgICAgfQorICAgIHRoaXMucmVwbGFjZShzdGFydCwg
MCwgYWRkZWRWaWV3cyk7CisgIH0sCisKKyAgY3JlYXRlQ2hpbGRWaWV3OiBmdW5jdGlvbih2aWV3
LCBhdHRycykgeworICAgIHZpZXcgPSB0aGlzLl9zdXBlcih2aWV3LCBhdHRycyk7CisKKyAgICB2
YXIgaXRlbVRhZ05hbWUgPSBnZXQodmlldywgJ3RhZ05hbWUnKTsKKyAgICB2YXIgdGFnTmFtZSA9
IChpdGVtVGFnTmFtZSA9PT0gbnVsbCB8fCBpdGVtVGFnTmFtZSA9PT0gdW5kZWZpbmVkKSA/IEVt
YmVyLkNvbGxlY3Rpb25WaWV3LkNPTlRBSU5FUl9NQVBbZ2V0KHRoaXMsICd0YWdOYW1lJyldIDog
aXRlbVRhZ05hbWU7CisKKyAgICBzZXQodmlldywgJ3RhZ05hbWUnLCB0YWdOYW1lKTsKKworICAg
IHJldHVybiB2aWV3OworICB9Cit9KTsKKworLyoqCisgIEEgbWFwIG9mIHBhcmVudCB0YWdzIHRv
IHRoZWlyIGRlZmF1bHQgY2hpbGQgdGFncy4gWW91IGNhbiBhZGQKKyAgYWRkaXRpb25hbCBwYXJl
bnQgdGFncyBpZiB5b3Ugd2FudCBjb2xsZWN0aW9uIHZpZXdzIHRoYXQgdXNlCisgIGEgcGFydGlj
dWxhciBwYXJlbnQgdGFnIHRvIGRlZmF1bHQgdG8gYSBjaGlsZCB0YWcuCisKKyAgQHByb3BlcnR5
IENPTlRBSU5FUl9NQVAKKyAgQHR5cGUgSGFzaAorICBAc3RhdGljCisgIEBmaW5hbAorKi8KK0Vt
YmVyLkNvbGxlY3Rpb25WaWV3LkNPTlRBSU5FUl9NQVAgPSB7CisgIHVsOiAnbGknLAorICBvbDog
J2xpJywKKyAgdGFibGU6ICd0cicsCisgIHRoZWFkOiAndHInLAorICB0Ym9keTogJ3RyJywKKyAg
dGZvb3Q6ICd0cicsCisgIHRyOiAndGQnLAorICBzZWxlY3Q6ICdvcHRpb24nCit9OworCit9KSgp
OworCisKKworKGZ1bmN0aW9uKCkgeworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLypn
bG9iYWxzIGpRdWVyeSovCisvKioKK0VtYmVyIFZpZXdzCisKK0Btb2R1bGUgZW1iZXIKK0BzdWJt
b2R1bGUgZW1iZXItdmlld3MKK0ByZXF1aXJlcyBlbWJlci1ydW50aW1lCitAbWFpbiBlbWJlci12
aWV3cworKi8KKworfSkoKTsKKworKGZ1bmN0aW9uKCkgeworZGVmaW5lKCJtZXRhbW9ycGgiLAor
ICBbXSwKKyAgZnVuY3Rpb24oKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIC8vID09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09CisgICAgLy8gUHJvamVjdDogICBtZXRhbW9ycGgKKyAgICAvLyBDb3B5cmlnaHQ6
IMKpMjAxMSBNeSBDb21wYW55IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICAvLyA9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQorCisgICAgdmFyIEsgPSBmdW5jdGlvbigpe30sCisgICAgICAgIGd1aWQg
PSAwLAorICAgICAgICBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKKworICAgICAgICAvLyBG
ZWF0dXJlLWRldGVjdCB0aGUgVzNDIHJhbmdlIEFQSSwgdGhlIGV4dGVuZGVkIGNoZWNrIGlzIGZv
ciBJRTkgd2hpY2ggb25seSBwYXJ0aWFsbHkgc3VwcG9ydHMgcmFuZ2VzCisgICAgICAgIHN1cHBv
cnRzUmFuZ2UgPSAoJ2NyZWF0ZVJhbmdlJyBpbiBkb2N1bWVudCkgJiYgKHR5cGVvZiBSYW5nZSAh
PT0gJ3VuZGVmaW5lZCcpICYmIFJhbmdlLnByb3RvdHlwZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21l
bnQsCisKKyAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgcHJpb3IgdG8gOSBkb2VzIG5vdCBh
bGxvdyBzZXR0aW5nIGlubmVySFRNTCBpZiB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICAvLyBp
cyBhICJ6ZXJvLXNjb3BlIiBlbGVtZW50LiBUaGlzIHByb2JsZW0gY2FuIGJlIHdvcmtlZCBhcm91
bmQgYnkgbWFraW5nCisgICAgICAgIC8vIHRoZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0ZXh0
IG5vZGUuIFdlLCBsaWtlIE1vZGVybml6ciwgdXNlICZzaHk7CisgICAgICAgIG5lZWRzU2h5ID0g
KGZ1bmN0aW9uKCl7CisgICAgICAgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2RpdicpOworICAgICAgICAgIHRlc3RFbC5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4iOwor
ICAgICAgICAgIHRlc3RFbC5maXJzdENoaWxkLmlubmVySFRNTCA9ICI8c2NyaXB0Pjwvc2NyaXB0
PiI7CisgICAgICAgICAgcmV0dXJuIHRlc3RFbC5maXJzdENoaWxkLmlubmVySFRNTCA9PT0gJyc7
CisgICAgICAgIH0pKCksCisKKworICAgICAgICAvLyBJRSA4IChhbmQgbGlrZWx5IGVhcmxpZXIp
IGxpa2VzIHRvIG1vdmUgd2hpdGVzcGFjZSBwcmVjZWVkaW5nCisgICAgICAgIC8vIGEgc2NyaXB0
IHRhZyB0byBhcHBlYXIgYWZ0ZXIgaXQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4KKyAgICAgICAg
Ly8gYWNjaWRlbnRhbGx5IHJlbW92ZSB3aGl0ZXNwYWNlIHdoZW4gdXBkYXRpbmcgYSBtb3JwaC4K
KyAgICAgICAgbW92ZXNXaGl0ZXNwYWNlID0gKGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciB0
ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgICB0ZXN0RWwu
aW5uZXJIVE1MID0gIlRlc3Q6IDxzY3JpcHQgdHlwZT0ndGV4dC94LXBsYWNlaG9sZGVyJz48L3Nj
cmlwdD5WYWx1ZSI7CisgICAgICAgICAgcmV0dXJuIHRlc3RFbC5jaGlsZE5vZGVzWzBdLm5vZGVW
YWx1ZSA9PT0gJ1Rlc3Q6JyAmJgorICAgICAgICAgICAgICAgICAgdGVzdEVsLmNoaWxkTm9kZXNb
Ml0ubm9kZVZhbHVlID09PSAnIFZhbHVlJzsKKyAgICAgICAgfSkoKTsKKworICAgIC8vIENvbnN0
cnVjdG9yIHRoYXQgc3VwcG9ydHMgZWl0aGVyIE1ldGFtb3JwaCgnZm9vJykgb3IgbmV3CisgICAg
Ly8gTWV0YW1vcnBoKCdmb28nKTsKKyAgICAvLworICAgIC8vIFRha2VzIGEgc3RyaW5nIG9mIEhU
TUwgYXMgdGhlIGFyZ3VtZW50LgorCisgICAgdmFyIE1ldGFtb3JwaCA9IGZ1bmN0aW9uKGh0bWwp
IHsKKyAgICAgIHZhciBzZWxmOworCisgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE1ldGFtb3Jw
aCkgeworICAgICAgICBzZWxmID0gdGhpczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYg
PSBuZXcgSygpOworICAgICAgfQorCisgICAgICBzZWxmLmlubmVySFRNTCA9IGh0bWw7CisgICAg
ICB2YXIgbXlHdWlkID0gJ21ldGFtb3JwaC0nKyhndWlkKyspOworICAgICAgc2VsZi5zdGFydCA9
IG15R3VpZCArICctc3RhcnQnOworICAgICAgc2VsZi5lbmQgPSBteUd1aWQgKyAnLWVuZCc7CisK
KyAgICAgIHJldHVybiBzZWxmOworICAgIH07CisKKyAgICBLLnByb3RvdHlwZSA9IE1ldGFtb3Jw
aC5wcm90b3R5cGU7CisKKyAgICB2YXIgcmFuZ2VGb3IsIGh0bWxGdW5jLCByZW1vdmVGdW5jLCBv
dXRlckhUTUxGdW5jLCBhcHBlbmRUb0Z1bmMsIGFmdGVyRnVuYywgcHJlcGVuZEZ1bmMsIHN0YXJ0
VGFnRnVuYywgZW5kVGFnRnVuYzsKKworICAgIG91dGVySFRNTEZ1bmMgPSBmdW5jdGlvbigpIHsK
KyAgICAgIHJldHVybiB0aGlzLnN0YXJ0VGFnKCkgKyB0aGlzLmlubmVySFRNTCArIHRoaXMuZW5k
VGFnKCk7CisgICAgfTsKKworICAgIHN0YXJ0VGFnRnVuYyA9IGZ1bmN0aW9uKCkgeworICAgICAg
LyoKKyAgICAgICAqIFdlIHJlcGxhY2UgY2hldnJvbiBieSBpdHMgaGV4IGNvZGUgaW4gb3JkZXIg
dG8gcHJldmVudCBlc2NhcGluZyBwcm9ibGVtcy4KKyAgICAgICAqIENoZWNrIHRoaXMgdGhyZWFk
IGZvciBtb3JlIGV4cGxhaW5hdGlvbjoKKyAgICAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNv
bS9xdWVzdGlvbnMvODIzMTA0OC93aHktdXNlLXgzYy1pbnN0ZWFkLW9mLXdoZW4tZ2VuZXJhdGlu
Zy1odG1sLWZyb20tamF2YXNjcmlwdAorICAgICAgICovCisgICAgICByZXR1cm4gIjxzY3JpcHQg
aWQ9JyIgKyB0aGlzLnN0YXJ0ICsgIicgdHlwZT0ndGV4dC94LXBsYWNlaG9sZGVyJz5ceDNDL3Nj
cmlwdD4iOworICAgIH07CisKKyAgICBlbmRUYWdGdW5jID0gZnVuY3Rpb24oKSB7CisgICAgICAv
KgorICAgICAgICogV2UgcmVwbGFjZSBjaGV2cm9uIGJ5IGl0cyBoZXggY29kZSBpbiBvcmRlciB0
byBwcmV2ZW50IGVzY2FwaW5nIHByb2JsZW1zLgorICAgICAgICogQ2hlY2sgdGhpcyB0aHJlYWQg
Zm9yIG1vcmUgZXhwbGFpbmF0aW9uOgorICAgICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29t
L3F1ZXN0aW9ucy84MjMxMDQ4L3doeS11c2UteDNjLWluc3RlYWQtb2Ytd2hlbi1nZW5lcmF0aW5n
LWh0bWwtZnJvbS1qYXZhc2NyaXB0CisgICAgICAgKi8KKyAgICAgIHJldHVybiAiPHNjcmlwdCBp
ZD0nIiArIHRoaXMuZW5kICsgIicgdHlwZT0ndGV4dC94LXBsYWNlaG9sZGVyJz5ceDNDL3Njcmlw
dD4iOworICAgIH07CisKKyAgICAvLyBJZiB3ZSBoYXZlIHRoZSBXM0MgcmFuZ2UgQVBJLCB0aGlz
IHByb2Nlc3MgaXMgcmVsYXRpdmVseSBzdHJhaWdodCBmb3J3YXJkLgorICAgIGlmIChzdXBwb3J0
c1JhbmdlKSB7CisKKyAgICAgIC8vIEdldCBhIHJhbmdlIGZvciB0aGUgY3VycmVudCBtb3JwaC4g
T3B0aW9uYWxseSBpbmNsdWRlIHRoZSBzdGFydGluZyBhbmQKKyAgICAgIC8vIGVuZGluZyBwbGFj
ZWhvbGRlcnMuCisgICAgICByYW5nZUZvciA9IGZ1bmN0aW9uKG1vcnBoLCBvdXRlclRvbykgewor
ICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOworICAgICAgICB2YXIg
YmVmb3JlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9ycGguc3RhcnQpOworICAgICAgICB2
YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb3JwaC5lbmQpOworCisgICAgICAg
IGlmIChvdXRlclRvbykgeworICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGJlZm9yZSk7
CisgICAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIoYWZ0ZXIpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoYmVmb3JlKTsKKyAgICAgICAgICByYW5nZS5z
ZXRFbmRCZWZvcmUoYWZ0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJhbmdlOwor
ICAgICAgfTsKKworICAgICAgaHRtbEZ1bmMgPSBmdW5jdGlvbihodG1sLCBvdXRlclRvbykgewor
ICAgICAgICAvLyBnZXQgYSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgbWV0YW1vcnBoIG9iamVjdAor
ICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZUZvcih0aGlzLCBvdXRlclRvbyk7CisKKyAgICAgICAg
Ly8gZGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcmFuZ2UsIHdoaWNoIHdpbGwgYmUgdGhlCisg
ICAgICAgIC8vIG5vZGVzIGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcGxhY2Vob2xk
ZXIuCisgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CisKKyAgICAgICAgLy8gY3JlYXRl
IGEgbmV3IGRvY3VtZW50IGZyYWdtZW50IGZvciB0aGUgSFRNTAorICAgICAgICB2YXIgZnJhZ21l
bnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7CisKKyAgICAgICAgLy8g
aW5zZXJ0IHRoZSBmcmFnbWVudCBpbnRvIHRoZSByYW5nZQorICAgICAgICByYW5nZS5pbnNlcnRO
b2RlKGZyYWdtZW50KTsKKyAgICAgIH07CisKKyAgICAgIHJlbW92ZUZ1bmMgPSBmdW5jdGlvbigp
IHsKKyAgICAgICAgLy8gZ2V0IGEgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IG1ldGFtb3JwaCBvYmpl
Y3QgaW5jbHVkaW5nCisgICAgICAgIC8vIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9s
ZGVycy4KKyAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VGb3IodGhpcywgdHJ1ZSk7CisKKyAgICAg
ICAgLy8gZGVsZXRlIHRoZSBlbnRpcmUgcmFuZ2UuCisgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRl
bnRzKCk7CisgICAgICB9OworCisgICAgICBhcHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihub2RlKSB7
CisgICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAgICAgIHJh
bmdlLnNldFN0YXJ0KG5vZGUpOworICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7CisgICAg
ICAgIHZhciBmcmFnID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRoaXMub3V0ZXJI
VE1MKCkpOworICAgICAgICBub2RlLmFwcGVuZENoaWxkKGZyYWcpOworICAgICAgfTsKKworICAg
ICAgYWZ0ZXJGdW5jID0gZnVuY3Rpb24oaHRtbCkgeworICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1
bWVudC5jcmVhdGVSYW5nZSgpOworICAgICAgICB2YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCh0aGlzLmVuZCk7CisKKyAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihhZnRlcik7
CisgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKGFmdGVyKTsKKworICAgICAgICB2YXIgZnJhZ21l
bnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7CisgICAgICAgIHJhbmdl
Lmluc2VydE5vZGUoZnJhZ21lbnQpOworICAgICAgfTsKKworICAgICAgcHJlcGVuZEZ1bmMgPSBm
dW5jdGlvbihodG1sKSB7CisgICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdl
KCk7CisgICAgICAgIHZhciBzdGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3Rh
cnQpOworCisgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoc3RhcnQpOworICAgICAgICByYW5n
ZS5zZXRFbmRBZnRlcihzdGFydCk7CisKKyAgICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3Jl
YXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpOworICAgICAgICByYW5nZS5pbnNlcnROb2RlKGZy
YWdtZW50KTsKKyAgICAgIH07CisKKyAgICB9IGVsc2UgeworICAgICAgLyoqCisgICAgICAgKiBU
aGlzIGNvZGUgaXMgbW9zdGx5IHRha2VuIGZyb20galF1ZXJ5LCB3aXRoIG9uZSBleGNlcHRpb24u
IEluIGpRdWVyeSdzIGNhc2UsIHdlCisgICAgICAgKiBoYXZlIHNvbWUgSFRNTCBhbmQgd2UgbmVl
ZCB0byBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGl0IGludG8gc29tZSBub2Rlcy4KKyAgICAg
ICAqCisgICAgICAgKiBJbiB0aGlzIGNhc2UsIGpRdWVyeSBuZWVkcyB0byBzY2FuIHRoZSBIVE1M
IGxvb2tpbmcgZm9yIGFuIG9wZW5pbmcgdGFnIGFuZCB1c2UKKyAgICAgICAqIHRoYXQgYXMgdGhl
IGtleSBmb3IgdGhlIHdyYXAgbWFwLiBJbiBvdXIgY2FzZSwgd2Uga25vdyB0aGUgcGFyZW50IG5v
ZGUsIGFuZAorICAgICAgICogY2FuIHVzZSBpdHMgdHlwZSBhcyB0aGUga2V5IGZvciB0aGUgd3Jh
cCBtYXAuCisgICAgICAgKiovCisgICAgICB2YXIgd3JhcE1hcCA9IHsKKyAgICAgICAgc2VsZWN0
OiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKKyAg
ICAgICAgZmllbGRzZXQ6IFsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0sCisgICAg
ICAgIHRhYmxlOiBbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdLAorICAgICAgICB0Ym9keTog
WyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKyAgICAgICAgdHI6
IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCisg
ICAgICAgIGNvbGdyb3VwOiBbIDIsICI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIs
ICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAorICAgICAgICBtYXA6IFsgMSwgIjxtYXA+IiwgIjwv
bWFwPiIgXSwKKyAgICAgICAgX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0KKyAgICAgIH07CisKKyAg
ICAgIHZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rpb24oZWxlbWVudCwgaWQpIHsKKyAgICAgICAg
aWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBpZCkgeyByZXR1cm4gZWxlbWVudDsg
fQorCisgICAgICAgIHZhciBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoLCBpZHgsIG5v
ZGUsIGZvdW5kOworICAgICAgICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykgeworICAgICAg
ICAgIG5vZGUgPSBlbGVtZW50LmNoaWxkTm9kZXNbaWR4XTsKKyAgICAgICAgICBmb3VuZCA9IG5v
ZGUubm9kZVR5cGUgPT09IDEgJiYgZmluZENoaWxkQnlJZChub2RlLCBpZCk7CisgICAgICAgICAg
aWYgKGZvdW5kKSB7IHJldHVybiBmb3VuZDsgfQorICAgICAgICB9CisgICAgICB9OworCisgICAg
ICB2YXIgc2V0SW5uZXJIVE1MID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgeworICAgICAgICB2
YXIgbWF0Y2hlcyA9IFtdOworICAgICAgICBpZiAobW92ZXNXaGl0ZXNwYWNlKSB7CisgICAgICAg
ICAgLy8gUmlnaHQgbm93IHdlIG9ubHkgY2hlY2sgZm9yIHNjcmlwdCB0YWdzIHdpdGggaWRzIHdp
dGggdGhlCisgICAgICAgICAgLy8gZ29hbCBvZiB0YXJnZXRpbmcgbW9ycGhzLgorICAgICAgICAg
IGh0bWwgPSBodG1sLnJlcGxhY2UoLyhccyspKDxzY3JpcHQgaWQ9JyhbXiddKyknKS9nLCBmdW5j
dGlvbihtYXRjaCwgc3BhY2VzLCB0YWcsIGlkKSB7CisgICAgICAgICAgICBtYXRjaGVzLnB1c2go
W2lkLCBzcGFjZXNdKTsKKyAgICAgICAgICAgIHJldHVybiB0YWc7CisgICAgICAgICAgfSk7Cisg
ICAgICAgIH0KKworICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGh0bWw7CisKKyAgICAgICAg
Ly8gSWYgd2UgaGF2ZSB0byBkbyBhbnkgd2hpdGVzcGFjZSBhZGp1c3RtZW50cyBkbyB0aGVtIG5v
dworICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgdmFyIGxlbiA9
IG1hdGNoZXMubGVuZ3RoLCBpZHg7CisgICAgICAgICAgZm9yIChpZHg9MDsgaWR4PGxlbjsgaWR4
KyspIHsKKyAgICAgICAgICAgIHZhciBzY3JpcHQgPSBmaW5kQ2hpbGRCeUlkKGVsZW1lbnQsIG1h
dGNoZXNbaWR4XVswXSksCisgICAgICAgICAgICAgICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRl
eHROb2RlKG1hdGNoZXNbaWR4XVsxXSk7CisgICAgICAgICAgICBzY3JpcHQucGFyZW50Tm9kZS5p
bnNlcnRCZWZvcmUobm9kZSwgc2NyaXB0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH07CisKKyAgICAgIC8qKgorICAgICAgICogR2l2ZW4gYSBwYXJlbnQgbm9kZSBhbmQgc29tZSBI
VE1MLCBnZW5lcmF0ZSBhIHNldCBvZiBub2Rlcy4gUmV0dXJuIHRoZSBmaXJzdAorICAgICAgICog
bm9kZSwgd2hpY2ggd2lsbCBhbGxvdyB1cyB0byB0cmF2ZXJzZSB0aGUgcmVzdCB1c2luZyBuZXh0
U2libGluZy4KKyAgICAgICAqCisgICAgICAgKiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBp
bm5lckhUTUwgaW4gSUUgZG9lcyBub3QgcmVhbGx5IHBhcnNlIHRoZSBub2Rlcy4KKyAgICAgICAq
Ki8KKyAgICAgIHZhciBmaXJzdE5vZGVGb3IgPSBmdW5jdGlvbihwYXJlbnROb2RlLCBodG1sKSB7
CisgICAgICAgIHZhciBhcnIgPSB3cmFwTWFwW3BhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2Fz
ZSgpXSB8fCB3cmFwTWFwLl9kZWZhdWx0OworICAgICAgICB2YXIgZGVwdGggPSBhcnJbMF0sIHN0
YXJ0ID0gYXJyWzFdLCBlbmQgPSBhcnJbMl07CisKKyAgICAgICAgaWYgKG5lZWRzU2h5KSB7IGh0
bWwgPSAnJnNoeTsnK2h0bWw7IH0KKworICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ2RpdicpOworCisgICAgICAgIHNldElubmVySFRNTChlbGVtZW50LCBzdGFy
dCArIGh0bWwgKyBlbmQpOworCisgICAgICAgIGZvciAodmFyIGk9MDsgaTw9ZGVwdGg7IGkrKykg
eworICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBMb29rIGZvciAmc2h5OyB0byByZW1vdmUgaXQuCisgICAgICAgIGlmIChuZWVk
c1NoeSkgeworICAgICAgICAgIHZhciBzaHlFbGVtZW50ID0gZWxlbWVudDsKKworICAgICAgICAg
IC8vIFNvbWV0aW1lcyB3ZSBnZXQgbmFtZWxlc3MgZWxlbWVudHMgd2l0aCB0aGUgc2h5IGluc2lk
ZQorICAgICAgICAgIHdoaWxlIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAxICYmICFzaHlFbGVt
ZW50Lm5vZGVOYW1lKSB7CisgICAgICAgICAgICBzaHlFbGVtZW50ID0gc2h5RWxlbWVudC5maXJz
dENoaWxkOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyB0
aGUgYWN0dWFsIHVuaWNvZGUgY2hhcmFjdGVyLgorICAgICAgICAgIGlmIChzaHlFbGVtZW50Lm5v
ZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBB
RCIpIHsKKyAgICAgICAgICAgIHNoeUVsZW1lbnQubm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2Rl
VmFsdWUuc2xpY2UoMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IGVsZW1lbnQ7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEluIHNvbWUgY2FzZXMs
IEludGVybmV0IEV4cGxvcmVyIGNhbiBjcmVhdGUgYW4gYW5vbnltb3VzIG5vZGUgaW4KKyAgICAg
ICAqIHRoZSBoaWVyYXJjaHkgd2l0aCBubyB0YWdOYW1lLiBZb3UgY2FuIGNyZWF0ZSB0aGlzIHNj
ZW5hcmlvIHZpYToKKyAgICAgICAqCisgICAgICAgKiAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgiZGl2Iik7CisgICAgICAgKiAgICAgZGl2LmlubmVySFRNTCA9ICI8dGFibGU+JnNo
eTxzY3JpcHQ+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+PC90cj48L3RhYmxlPiI7CisgICAgICAg
KiAgICAgZGl2LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC50YWdOYW1lIC8vPT4gIiIKKyAgICAgICAq
CisgICAgICAgKiBJZiBvdXIgc2NyaXB0IG1hcmtlcnMgYXJlIGluc2lkZSBzdWNoIGEgbm9kZSwg
d2UgbmVlZCB0byBmaW5kIHRoYXQKKyAgICAgICAqIG5vZGUgYW5kIHVzZSAqaXQqIGFzIHRoZSBt
YXJrZXIuCisgICAgICAgKiovCisgICAgICB2YXIgcmVhbE5vZGUgPSBmdW5jdGlvbihzdGFydCkg
eworICAgICAgICB3aGlsZSAoc3RhcnQucGFyZW50Tm9kZS50YWdOYW1lID09PSAiIikgeworICAg
ICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50Tm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiBzdGFydDsKKyAgICAgIH07CisKKyAgICAgIC8qKgorICAgICAgICogV2hlbiBhdXRvbWF0
aWNhbGx5IGFkZGluZyBhIHRib2R5LCBJbnRlcm5ldCBFeHBsb3JlciBpbnNlcnRzIHRoZQorICAg
ICAgICogdGJvZHkgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCA8dHI+LiBPdGhlciBicm93
c2VycyBjcmVhdGUgaXQKKyAgICAgICAqIGJlZm9yZSB0aGUgZmlyc3Qgbm9kZSwgbm8gbWF0dGVy
IHdoYXQuCisgICAgICAgKgorICAgICAgICogVGhpcyBtZWFucyB0aGUgdGhlIGZvbGxvd2luZyBj
b2RlOgorICAgICAgICoKKyAgICAgICAqICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJkaXYiKTsKKyAgICAgICAqICAgICBkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48c2NyaXB0IGlk
PSdmaXJzdCc+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+PC90cj48c2NyaXB0IGlkPSdsYXN0Jz48
L3NjcmlwdD48L3RhYmxlPgorICAgICAgICoKKyAgICAgICAqIEdlbmVyYXRlcyB0aGUgZm9sbG93
aW5nIERPTSBpbiBJRToKKyAgICAgICAqCisgICAgICAgKiAgICAgKyBkaXYKKyAgICAgICAqICAg
ICAgICsgdGFibGUKKyAgICAgICAqICAgICAgICAgLSBzY3JpcHQgaWQ9J2ZpcnN0JworICAgICAg
ICogICAgICAgICArIHRib2R5CisgICAgICAgKiAgICAgICAgICAgKyB0cgorICAgICAgICogICAg
ICAgICAgICAgKyB0ZAorICAgICAgICogICAgICAgICAgICAgICAtICJoaSIKKyAgICAgICAqICAg
ICAgICAgICAtIHNjcmlwdCBpZD0nbGFzdCcKKyAgICAgICAqCisgICAgICAgKiBXaGljaCBtZWFu
cyB0aGF0IHRoZSB0d28gc2NyaXB0IHRhZ3MsIGV2ZW4gdGhvdWdoIHRoZXkgd2VyZQorICAgICAg
ICogaW5zZXJ0ZWQgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIGhpZXJhcmNoeSBpbiB0aGUgb3Jp
Z2luYWwKKyAgICAgICAqIEhUTUwsIG5vdyBoYXZlIGRpZmZlcmVudCBwYXJlbnRzLgorICAgICAg
ICoKKyAgICAgICAqIFRoaXMgY29kZSByZXBhcmVudHMgdGhlIGZpcnN0IHNjcmlwdCB0YWcgYnkg
bWFraW5nIGl0IHRoZSB0Ym9keSdzCisgICAgICAgKiBmaXJzdCBjaGlsZC4KKyAgICAgICAqKi8K
KyAgICAgIHZhciBmaXhQYXJlbnRhZ2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CisgICAgICAg
IGlmIChzdGFydC5wYXJlbnROb2RlICE9PSBlbmQucGFyZW50Tm9kZSkgeworICAgICAgICAgIGVu
ZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdGFydCwgZW5kLnBhcmVudE5vZGUuZmlyc3RDaGls
ZCk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGh0bWxGdW5jID0gZnVuY3Rpb24oaHRt
bCwgb3V0ZXJUb28pIHsKKyAgICAgICAgLy8gZ2V0IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNl
ZSByZWFsTm9kZSBmb3IgZGV0YWlscy4KKyAgICAgICAgdmFyIHN0YXJ0ID0gcmVhbE5vZGUoZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCkpOworICAgICAgICB2YXIgZW5kID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOworICAgICAgICB2YXIgcGFyZW50Tm9kZSA9
IGVuZC5wYXJlbnROb2RlOworICAgICAgICB2YXIgbm9kZSwgbmV4dFNpYmxpbmcsIGxhc3Q7CisK
KyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbm9kZXMgc2hhcmUg
dGhlIHNhbWUKKyAgICAgICAgLy8gcGFyZW50LiBJZiBub3QsIGZpeCBpdC4KKyAgICAgICAgZml4
UGFyZW50YWdlKHN0YXJ0LCBlbmQpOworCisgICAgICAgIC8vIHJlbW92ZSBhbGwgb2YgdGhlIG5v
ZGVzIGFmdGVyIHRoZSBzdGFydGluZyBwbGFjZWhvbGRlciBhbmQKKyAgICAgICAgLy8gYmVmb3Jl
IHRoZSBlbmRpbmcgcGxhY2Vob2xkZXIuCisgICAgICAgIG5vZGUgPSBzdGFydC5uZXh0U2libGlu
ZzsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUu
bmV4dFNpYmxpbmc7CisgICAgICAgICAgbGFzdCA9IG5vZGUgPT09IGVuZDsKKworICAgICAgICAg
IC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSwgYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGFz
IHdlbGwsCisgICAgICAgICAgLy8gc2V0IHRoZSBgZW5kYCBub2RlIHRvIHRoZSBuZXh0IHNpYmxp
bmcuIFRoaXMgaXMgYmVjYXVzZQorICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgZnVu
Y3Rpb24sIHdlIGluc2VydCB0aGUgbmV3IG5vZGVzCisgICAgICAgICAgLy8gYmVmb3JlIHRoZSBl
bmQgKG5vdGUgdGhhdCBpbnNlcnRCZWZvcmUobm9kZSwgbnVsbCkgaXMKKyAgICAgICAgICAvLyB0
aGUgc2FtZSBhcyBhcHBlbmRDaGlsZChub2RlKSkuCisgICAgICAgICAgLy8KKyAgICAgICAgICAv
LyBpZiB3ZSBkbyBub3Qgd2FudCB0byByZW1vdmUgaXQsIGp1c3QgYnJlYWsuCisgICAgICAgICAg
aWYgKGxhc3QpIHsKKyAgICAgICAgICAgIGlmIChvdXRlclRvbykgeyBlbmQgPSBub2RlLm5leHRT
aWJsaW5nOyB9IGVsc2UgeyBicmVhazsgfQorICAgICAgICAgIH0KKworICAgICAgICAgIG5vZGUu
cGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKKworICAgICAgICAgIC8vIGlmIHRoaXMgaXMg
dGhlIGxhc3Qgbm9kZSBhbmQgd2UgZGlkbid0IGJyZWFrIGJlZm9yZQorICAgICAgICAgIC8vIChi
ZWNhdXNlIHdlIHdhbnRlZCB0byByZW1vdmUgdGhlIG91dGVyIG5vZGVzKSwgYnJlYWsKKyAgICAg
ICAgICAvLyBub3cuCisgICAgICAgICAgaWYgKGxhc3QpIHsgYnJlYWs7IH0KKworICAgICAgICAg
IG5vZGUgPSBuZXh0U2libGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCB0aGUgZmly
c3Qgbm9kZSBmb3IgdGhlIEhUTUwgc3RyaW5nLCBldmVuIGluIGNhc2VzIGxpa2UKKyAgICAgICAg
Ly8gdGFibGVzIGFuZCBsaXN0cyB3aGVyZSBhIHNpbXBsZSBpbm5lckhUTUwgb24gYSBkaXYgd291
bGQKKyAgICAgICAgLy8gc3dhbGxvdyBzb21lIG9mIHRoZSBjb250ZW50LgorICAgICAgICBub2Rl
ID0gZmlyc3ROb2RlRm9yKHN0YXJ0LnBhcmVudE5vZGUsIGh0bWwpOworCisgICAgICAgIC8vIGNv
cHkgdGhlIG5vZGVzIGZvciB0aGUgSFRNTCBiZXR3ZWVuIHRoZSBzdGFydGluZyBhbmQgZW5kaW5n
CisgICAgICAgIC8vIHBsYWNlaG9sZGVyLgorICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAg
ICAgIG5leHRTaWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgICAgICBwYXJlbnROb2Rl
Lmluc2VydEJlZm9yZShub2RlLCBlbmQpOworICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsK
KyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgLy8gcmVtb3ZlIHRoZSBub2RlcyBpbiB0aGUg
RE9NIHJlcHJlc2VudGluZyB0aGlzIG1ldGFtb3JwaC4KKyAgICAgIC8vCisgICAgICAvLyB0aGlz
IGluY2x1ZGVzIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9sZGVycy4KKyAgICAgIHJl
bW92ZUZ1bmMgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHN0YXJ0ID0gcmVhbE5vZGUoZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCkpOworICAgICAgICB2YXIgZW5kID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOworCisgICAgICAgIHRoaXMuaHRtbCgnJyk7
CisgICAgICAgIHN0YXJ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3RhcnQpOworICAgICAgICBl
bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbmQpOworICAgICAgfTsKKworICAgICAgYXBwZW5k
VG9GdW5jID0gZnVuY3Rpb24ocGFyZW50Tm9kZSkgeworICAgICAgICB2YXIgbm9kZSA9IGZpcnN0
Tm9kZUZvcihwYXJlbnROb2RlLCB0aGlzLm91dGVySFRNTCgpKTsKKyAgICAgICAgdmFyIG5leHRT
aWJsaW5nOworCisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgbmV4dFNpYmxpbmcg
PSBub2RlLm5leHRTaWJsaW5nOworICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobm9k
ZSk7CisgICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nOworICAgICAgICB9CisgICAgICB9Owor
CisgICAgICBhZnRlckZ1bmMgPSBmdW5jdGlvbihodG1sKSB7CisgICAgICAgIC8vIGdldCB0aGUg
cmVhbCBzdGFydGluZyBub2RlLiBzZWUgcmVhbE5vZGUgZm9yIGRldGFpbHMuCisgICAgICAgIHZh
ciBlbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7CisgICAgICAgIHZhciBp
bnNlcnRCZWZvcmUgPSBlbmQubmV4dFNpYmxpbmc7CisgICAgICAgIHZhciBwYXJlbnROb2RlID0g
ZW5kLnBhcmVudE5vZGU7CisgICAgICAgIHZhciBuZXh0U2libGluZzsKKyAgICAgICAgdmFyIG5v
ZGU7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBub2RlIGZvciB0aGUgSFRNTCBzdHJpbmcs
IGV2ZW4gaW4gY2FzZXMgbGlrZQorICAgICAgICAvLyB0YWJsZXMgYW5kIGxpc3RzIHdoZXJlIGEg
c2ltcGxlIGlubmVySFRNTCBvbiBhIGRpdiB3b3VsZAorICAgICAgICAvLyBzd2FsbG93IHNvbWUg
b2YgdGhlIGNvbnRlbnQuCisgICAgICAgIG5vZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9kZSwg
aHRtbCk7CisKKyAgICAgICAgLy8gY29weSB0aGUgbm9kZXMgZm9yIHRoZSBIVE1MIGJldHdlZW4g
dGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcKKyAgICAgICAgLy8gcGxhY2Vob2xkZXIuCisgICAgICAg
IHdoaWxlIChub2RlKSB7CisgICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5n
OworICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGluc2VydEJlZm9yZSk7
CisgICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nOworICAgICAgICB9CisgICAgICB9OworCisg
ICAgICBwcmVwZW5kRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKKyAgICAgICAgdmFyIHN0YXJ0ID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCk7CisgICAgICAgIHZhciBwYXJlbnRO
b2RlID0gc3RhcnQucGFyZW50Tm9kZTsKKyAgICAgICAgdmFyIG5leHRTaWJsaW5nOworICAgICAg
ICB2YXIgbm9kZTsKKworICAgICAgICBub2RlID0gZmlyc3ROb2RlRm9yKHBhcmVudE5vZGUsIGh0
bWwpOworICAgICAgICB2YXIgaW5zZXJ0QmVmb3JlID0gc3RhcnQubmV4dFNpYmxpbmc7CisKKyAg
ICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNp
Ymxpbmc7CisgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgaW5zZXJ0QmVm
b3JlKTsKKyAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmc7CisgICAgICAgIH0KKyAgICAgIH07
CisgICAgfQorCisgICAgTWV0YW1vcnBoLnByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24oaHRtbCkg
eworICAgICAgdGhpcy5jaGVja1JlbW92ZWQoKTsKKyAgICAgIGlmIChodG1sID09PSB1bmRlZmlu
ZWQpIHsgcmV0dXJuIHRoaXMuaW5uZXJIVE1MOyB9CisKKyAgICAgIGh0bWxGdW5jLmNhbGwodGhp
cywgaHRtbCk7CisKKyAgICAgIHRoaXMuaW5uZXJIVE1MID0gaHRtbDsKKyAgICB9OworCisgICAg
TWV0YW1vcnBoLnByb3RvdHlwZS5yZXBsYWNlV2l0aCA9IGZ1bmN0aW9uKGh0bWwpIHsKKyAgICAg
IHRoaXMuY2hlY2tSZW1vdmVkKCk7CisgICAgICBodG1sRnVuYy5jYWxsKHRoaXMsIGh0bWwsIHRy
dWUpOworICAgIH07CisKKyAgICBNZXRhbW9ycGgucHJvdG90eXBlLnJlbW92ZSA9IHJlbW92ZUZ1
bmM7CisgICAgTWV0YW1vcnBoLnByb3RvdHlwZS5vdXRlckhUTUwgPSBvdXRlckhUTUxGdW5jOwor
ICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuYXBwZW5kVG8gPSBhcHBlbmRUb0Z1bmM7CisgICAgTWV0
YW1vcnBoLnByb3RvdHlwZS5hZnRlciA9IGFmdGVyRnVuYzsKKyAgICBNZXRhbW9ycGgucHJvdG90
eXBlLnByZXBlbmQgPSBwcmVwZW5kRnVuYzsKKyAgICBNZXRhbW9ycGgucHJvdG90eXBlLnN0YXJ0
VGFnID0gc3RhcnRUYWdGdW5jOworICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuZW5kVGFnID0gZW5k
VGFnRnVuYzsKKworICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuaXNSZW1vdmVkID0gZnVuY3Rpb24o
KSB7CisgICAgICB2YXIgYmVmb3JlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFy
dCk7CisgICAgICB2YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7
CisKKyAgICAgIHJldHVybiAhYmVmb3JlIHx8ICFhZnRlcjsKKyAgICB9OworCisgICAgTWV0YW1v
cnBoLnByb3RvdHlwZS5jaGVja1JlbW92ZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlz
LmlzUmVtb3ZlZCgpKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0g
b3BlcmF0aW9ucyBvbiBhIE1ldGFtb3JwaCB0aGF0IGlzIG5vdCBpbiB0aGUgRE9NLiIpOworICAg
ICAgfQorICAgIH07CisKKyAgICByZXR1cm4gTWV0YW1vcnBoOworICB9KTsKKworfSkoKTsKKwor
KGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRs
ZWJhcnMKKyovCisKKy8vIEVsaW1pbmF0ZSBkZXBlbmRlbmN5IG9uIGFueSBFbWJlciB0byBzaW1w
bGlmeSBwcmVjb21waWxhdGlvbiB3b3JrZmxvdwordmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5j
cmVhdGUgfHwgZnVuY3Rpb24ocGFyZW50KSB7CisgIGZ1bmN0aW9uIEYoKSB7fQorICBGLnByb3Rv
dHlwZSA9IHBhcmVudDsKKyAgcmV0dXJuIG5ldyBGKCk7Cit9OworCit2YXIgSGFuZGxlYmFycyA9
IHRoaXMuSGFuZGxlYmFycyB8fCBFbWJlci5pbXBvcnRzLkhhbmRsZWJhcnM7CitFbWJlci5hc3Nl
cnQoIkVtYmVyIEhhbmRsZWJhcnMgcmVxdWlyZXMgSGFuZGxlYmFycyAxLjAuMC1yYy4zIG9yIGdy
ZWF0ZXIiLCBIYW5kbGViYXJzICYmIEhhbmRsZWJhcnMuVkVSU0lPTi5tYXRjaCgvXjFcLjBcLlsw
LTldKFwucmNcLlsyMzQ1Njc4OV0rKT8vKSk7CisKKy8qKgorICBQcmVwYXJlcyB0aGUgSGFuZGxl
YmFycyB0ZW1wbGF0aW5nIGxpYnJhcnkgZm9yIHVzZSBpbnNpZGUgRW1iZXIncyB2aWV3CisgIHN5
c3RlbS4KKworICBUaGUgYEVtYmVyLkhhbmRsZWJhcnNgIG9iamVjdCBpcyB0aGUgc3RhbmRhcmQg
SGFuZGxlYmFycyBsaWJyYXJ5LCBleHRlbmRlZCB0bworICB1c2UgRW1iZXIncyBgZ2V0KClgIG1l
dGhvZCBpbnN0ZWFkIG9mIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIGFsbG93cworICBj
b21wdXRlZCBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlcy4KKworICBUbyBj
cmVhdGUgYW4gYEVtYmVyLkhhbmRsZWJhcnNgIHRlbXBsYXRlLCBjYWxsIGBFbWJlci5IYW5kbGVi
YXJzLmNvbXBpbGUoKWAuCisgIFRoaXMgd2lsbCByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBi
ZSB1c2VkIGJ5IGBFbWJlci5WaWV3YCBmb3IgcmVuZGVyaW5nLgorCisgIEBjbGFzcyBIYW5kbGVi
YXJzCisgIEBuYW1lc3BhY2UgRW1iZXIKKyovCitFbWJlci5IYW5kbGViYXJzID0gb2JqZWN0Q3Jl
YXRlKEhhbmRsZWJhcnMpOworCisvKioKK0BjbGFzcyBoZWxwZXJzCitAbmFtZXNwYWNlIEVtYmVy
LkhhbmRsZWJhcnMKKyovCitFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMgPSBvYmplY3RDcmVhdGUo
SGFuZGxlYmFycy5oZWxwZXJzKTsKKworLyoqCisgIE92ZXJyaWRlIHRoZSB0aGUgb3Bjb2RlIGNv
bXBpbGVyIGFuZCBKYXZhU2NyaXB0IGNvbXBpbGVyIGZvciBIYW5kbGViYXJzLgorCisgIEBjbGFz
cyBDb21waWxlcgorICBAbmFtZXNwYWNlIEVtYmVyLkhhbmRsZWJhcnMKKyAgQHByaXZhdGUKKyAg
QGNvbnN0cnVjdG9yCisqLworRW1iZXIuSGFuZGxlYmFycy5Db21waWxlciA9IGZ1bmN0aW9uKCkg
e307CisKKy8vIEhhbmRsZWJhcnMuQ29tcGlsZXIgZG9lc24ndCBleGlzdCBpbiBydW50aW1lLW9u
bHkKK2lmIChIYW5kbGViYXJzLkNvbXBpbGVyKSB7CisgIEVtYmVyLkhhbmRsZWJhcnMuQ29tcGls
ZXIucHJvdG90eXBlID0gb2JqZWN0Q3JlYXRlKEhhbmRsZWJhcnMuQ29tcGlsZXIucHJvdG90eXBl
KTsKK30KKworRW1iZXIuSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZXIgPSBF
bWJlci5IYW5kbGViYXJzLkNvbXBpbGVyOworCisvKioKKyAgQGNsYXNzIEphdmFTY3JpcHRDb21w
aWxlcgorICBAbmFtZXNwYWNlIEVtYmVyLkhhbmRsZWJhcnMKKyAgQHByaXZhdGUKKyAgQGNvbnN0
cnVjdG9yCisqLworRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlv
bigpIHt9OworCisvLyBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciBkb2Vzbid0IGV4aXN0
IGluIHJ1bnRpbWUtb25seQoraWYgKEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyKSB7Cisg
IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IG9iamVjdENy
ZWF0ZShIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUpOworICBFbWJlci5I
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuY29tcGlsZXIgPSBFbWJlci5I
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcjsKK30KKworCitFbWJlci5IYW5kbGViYXJzLkph
dmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUubmFtZXNwYWNlID0gIkVtYmVyLkhhbmRsZWJhcnMi
OworCisKK0VtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5pbml0
aWFsaXplQnVmZmVyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiAiJyciOworfTsKKworLyoqCisg
IEBwcml2YXRlCisKKyAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVmZmVyIGZvciBFbWJlciBIYW5k
bGViYXJzLiBCeSBkZWZhdWx0LCBIYW5kbGViYXJzCisgIGNyZWF0ZXMgYW4gZW1wdHkgU3RyaW5n
IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpbnZvY2F0aW9uIGFuZCBhcHBlbmRzIHRvCisgIGl0
LiBFbWJlcidzIEhhbmRsZWJhcnMgb3ZlcnJpZGVzIHRoaXMgdG8gYXBwZW5kIHRvIGEgc2luZ2xl
IHNoYXJlZCBidWZmZXIuCisKKyAgQG1ldGhvZCBhcHBlbmRUb0J1ZmZlcgorICBAcGFyYW0gc3Ry
aW5nIHtTdHJpbmd9CisqLworRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJv
dG90eXBlLmFwcGVuZFRvQnVmZmVyID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgIHJldHVybiAiZGF0
YS5idWZmZXIucHVzaCgiK3N0cmluZysiKTsiOworfTsKKwordmFyIHByZWZpeCA9ICJlbWJlciIg
KyAoK25ldyBEYXRlKCkpLCBpbmNyID0gMTsKKworLyoqCisgIEBwcml2YXRlCisKKyAgUmV3cml0
ZSBzaW1wbGUgbXVzdGFjaGVzIGZyb20gYHt7Zm9vfX1gIHRvIGB7e2JpbmQgImZvbyJ9fWAuIFRo
aXMgbWVhbnMgdGhhdAorICBhbGwgc2ltcGxlIG11c3RhY2hlcyBpbiBFbWJlcidzIEhhbmRsZWJh
cnMgd2lsbCBhbHNvIHNldCB1cCBhbiBvYnNlcnZlciB0bworICBrZWVwIHRoZSBET00gdXAgdG8g
ZGF0ZSB3aGVuIHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IGNoYW5nZXMuCisKKyAgQG1ldGhvZCBt
dXN0YWNoZQorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIKKyAgQHBhcmFtIG11c3Rh
Y2hlCisqLworRW1iZXIuSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUubXVzdGFjaGUgPSBm
dW5jdGlvbihtdXN0YWNoZSkgeworICBpZiAobXVzdGFjaGUuaXNIZWxwZXIgJiYgbXVzdGFjaGUu
aWQuc3RyaW5nID09PSAnY29udHJvbCcpIHsKKyAgICBtdXN0YWNoZS5oYXNoID0gbXVzdGFjaGUu
aGFzaCB8fCBuZXcgSGFuZGxlYmFycy5BU1QuSGFzaE5vZGUoW10pOworICAgIG11c3RhY2hlLmhh
c2gucGFpcnMucHVzaChbImNvbnRyb2xJRCIsIG5ldyBIYW5kbGViYXJzLkFTVC5TdHJpbmdOb2Rl
KHByZWZpeCArIGluY3IrKyldKTsKKyAgfSBlbHNlIGlmIChtdXN0YWNoZS5wYXJhbXMubGVuZ3Ro
IHx8IG11c3RhY2hlLmhhc2gpIHsKKyAgICAvLyBubyBjaGFuZ2VzIHJlcXVpcmVkCisgIH0gZWxz
ZSB7CisgICAgdmFyIGlkID0gbmV3IEhhbmRsZWJhcnMuQVNULklkTm9kZShbJ190cmlhZ2VNdXN0
YWNoZSddKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgbXVzdGFjaGUgbm9kZSB0byBpbmNsdWRlIGEg
aGFzaCB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9yaWdpbmFsIG5vZGUKKyAgICAvLyB3
YXMgZXNjYXBlZC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIHByb3Blcmx5IGVzY2FwZSB2YWx1ZXMg
d2hlbiB0aGUgdW5kZXJseWluZyB2YWx1ZQorICAgIC8vIGNoYW5nZXMgYW5kIHdlIG5lZWQgdG8g
cmUtcmVuZGVyIHRoZSB2YWx1ZS4KKyAgICBpZighbXVzdGFjaGUuZXNjYXBlZCkgeworICAgICAg
bXVzdGFjaGUuaGFzaCA9IG11c3RhY2hlLmhhc2ggfHwgbmV3IEhhbmRsZWJhcnMuQVNULkhhc2hO
b2RlKFtdKTsKKyAgICAgIG11c3RhY2hlLmhhc2gucGFpcnMucHVzaChbInVuZXNjYXBlZCIsIG5l
dyBIYW5kbGViYXJzLkFTVC5TdHJpbmdOb2RlKCJ0cnVlIildKTsKKyAgICB9CisgICAgbXVzdGFj
aGUgPSBuZXcgSGFuZGxlYmFycy5BU1QuTXVzdGFjaGVOb2RlKFtpZF0uY29uY2F0KFttdXN0YWNo
ZS5pZF0pLCBtdXN0YWNoZS5oYXNoLCAhbXVzdGFjaGUuZXNjYXBlZCk7CisgIH0KKworICByZXR1
cm4gSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUubXVzdGFjaGUuY2FsbCh0aGlzLCBtdXN0
YWNoZSk7Cit9OworCisvKioKKyAgVXNlZCBmb3IgcHJlY29tcGlsYXRpb24gb2YgRW1iZXIgSGFu
ZGxlYmFycyB0ZW1wbGF0ZXMuIFRoaXMgd2lsbCBub3QgYmUgdXNlZAorICBkdXJpbmcgbm9ybWFs
IGFwcCBleGVjdXRpb24uCisKKyAgQG1ldGhvZCBwcmVjb21waWxlCisgIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycworICBAc3RhdGljCisgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHRlbXBsYXRl
IHRvIHByZWNvbXBpbGUKKyovCitFbWJlci5IYW5kbGViYXJzLnByZWNvbXBpbGUgPSBmdW5jdGlv
bihzdHJpbmcpIHsKKyAgdmFyIGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3RyaW5nKTsKKworICB2
YXIgb3B0aW9ucyA9IHsKKyAgICBrbm93bkhlbHBlcnM6IHsKKyAgICAgIGFjdGlvbjogdHJ1ZSwK
KyAgICAgIHVuYm91bmQ6IHRydWUsCisgICAgICBiaW5kQXR0cjogdHJ1ZSwKKyAgICAgIHRlbXBs
YXRlOiB0cnVlLAorICAgICAgdmlldzogdHJ1ZSwKKyAgICAgIF90cmlhZ2VNdXN0YWNoZTogdHJ1
ZQorICAgIH0sCisgICAgZGF0YTogdHJ1ZSwKKyAgICBzdHJpbmdQYXJhbXM6IHRydWUKKyAgfTsK
KworICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgRW1iZXIuSGFuZGxlYmFycy5Db21waWxlcigpLmNv
bXBpbGUoYXN0LCBvcHRpb25zKTsKKyAgcmV0dXJuIG5ldyBFbWJlci5IYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwg
dHJ1ZSk7Cit9OworCisvLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgZm9yIEhhbmRsZWJhcnMgcnVu
dGltZS1vbmx5CitpZiAoSGFuZGxlYmFycy5jb21waWxlKSB7CisgIC8qKgorICAgIFRoZSBlbnRy
eSBwb2ludCBmb3IgRW1iZXIgSGFuZGxlYmFycy4gVGhpcyByZXBsYWNlcyB0aGUgZGVmYXVsdAor
ICAgIGBIYW5kbGViYXJzLmNvbXBpbGVgIGFuZCB0dXJucyBvbiB0ZW1wbGF0ZS1sb2NhbCBkYXRh
IGFuZCBTdHJpbmcKKyAgICBwYXJhbWV0ZXJzLgorCisgICAgQG1ldGhvZCBjb21waWxlCisgICAg
QGZvciBFbWJlci5IYW5kbGViYXJzCisgICAgQHN0YXRpYworICAgIEBwYXJhbSB7U3RyaW5nfSBz
dHJpbmcgVGhlIHRlbXBsYXRlIHRvIGNvbXBpbGUKKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0KKyAg
Ki8KKyAgRW1iZXIuSGFuZGxlYmFycy5jb21waWxlID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgICAg
dmFyIGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3RyaW5nKTsKKyAgICB2YXIgb3B0aW9ucyA9IHsg
ZGF0YTogdHJ1ZSwgc3RyaW5nUGFyYW1zOiB0cnVlIH07CisgICAgdmFyIGVudmlyb25tZW50ID0g
bmV3IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7Cisg
ICAgdmFyIHRlbXBsYXRlU3BlYyA9IG5ldyBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21w
aWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CisK
KyAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpOworICB9
OworfQorCisKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKK3ZhciBzbGljZSA9IEFycmF5LnByb3Rv
dHlwZS5zbGljZTsKKworLyoqCisgIEBwcml2YXRlCisKKyAgSWYgYSBwYXRoIHN0YXJ0cyB3aXRo
IGEgcmVzZXJ2ZWQga2V5d29yZCwgcmV0dXJucyB0aGUgcm9vdAorICB0aGF0IHNob3VsZCBiZSB1
c2VkLgorCisgIEBtZXRob2Qgbm9ybWFsaXplUGF0aAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSBy
b290IHtPYmplY3R9CisgIEBwYXJhbSBwYXRoIHtTdHJpbmd9CisgIEBwYXJhbSBkYXRhIHtIYXNo
fQorKi8KK3ZhciBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRo
ID0gZnVuY3Rpb24ocm9vdCwgcGF0aCwgZGF0YSkgeworICB2YXIga2V5d29yZHMgPSAoZGF0YSAm
JiBkYXRhLmtleXdvcmRzKSB8fCB7fSwKKyAgICAgIGtleXdvcmQsIGlzS2V5d29yZDsKKworICAv
LyBHZXQgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGguIEZvciBleGFtcGxlLCBpZiB0aGUK
KyAgLy8gcGF0aCBpcyAiZm9vLmJhci5iYXoiLCByZXR1cm5zICJmb28iLgorICBrZXl3b3JkID0g
cGF0aC5zcGxpdCgnLicsIDEpWzBdOworCisgIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBmaXJzdCBw
YXRoIGlzIGEga2V5d29yZCB0aGF0IGhhcyBiZWVuCisgIC8vIHBhc3NlZCBhbG9uZyBpbiB0aGUg
dmlldydzIGRhdGEgaGFzaC4gSWYgc28sIHdlIHdpbGwgdHJlYXQKKyAgLy8gdGhhdCBvYmplY3Qg
YXMgdGhlIG5ldyByb290LgorICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5d29yZCkp
IHsKKyAgICAvLyBMb29rIHVwIHRoZSB2YWx1ZSBpbiB0aGUgdGVtcGxhdGUncyBkYXRhIGhhc2gu
CisgICAgcm9vdCA9IGtleXdvcmRzW2tleXdvcmRdOworICAgIGlzS2V5d29yZCA9IHRydWU7CisK
KyAgICAvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGVudGlyZSBwYXRoIGlzIHRoZSByZXNlcnZl
ZAorICAgIC8vIHdvcmQuIEluIHRoYXQgY2FzZSwgcmV0dXJuIHRoZSBvYmplY3QgaXRzZWxmLgor
ICAgIGlmIChwYXRoID09PSBrZXl3b3JkKSB7CisgICAgICBwYXRoID0gJyc7CisgICAgfSBlbHNl
IHsKKyAgICAgIC8vIFN0cmlwIHRoZSBrZXl3b3JkIGZyb20gdGhlIHBhdGggYW5kIGxvb2sgdXAK
KyAgICAgIC8vIHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbmV3bHkgZm91bmQgcm9vdC4KKyAgICAg
IHBhdGggPSBwYXRoLnN1YnN0cihrZXl3b3JkLmxlbmd0aCsxKTsKKyAgICB9CisgIH0KKworICBy
ZXR1cm4geyByb290OiByb290LCBwYXRoOiBwYXRoLCBpc0tleXdvcmQ6IGlzS2V5d29yZCB9Owor
fTsKKworCisvKioKKyAgTG9va3VwIGJvdGggb24gcm9vdCBhbmQgb24gd2luZG93LiBJZiB0aGUg
cGF0aCBzdGFydHMgd2l0aAorICBhIGtleXdvcmQsIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCB3
aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUKKyAgdGVtcGxhdGUncyBkYXRhIGhhc2ggYW5kIHVzZWQg
dG8gcmVzb2x2ZSB0aGUgcGF0aC4KKworICBAbWV0aG9kIGdldAorICBAZm9yIEVtYmVyLkhhbmRs
ZWJhcnMKKyAgQHBhcmFtIHtPYmplY3R9IHJvb3QgVGhlIG9iamVjdCB0byBsb29rIHVwIHRoZSBw
cm9wZXJ0eSBvbgorICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBiZSBsb29rZWR1
cAorICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgdGVtcGxhdGUncyBvcHRpb24gaGFzaAor
Ki8KK3ZhciBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQgPSBmdW5jdGlvbihy
b290LCBwYXRoLCBvcHRpb25zKSB7CisgIHZhciBkYXRhID0gb3B0aW9ucyAmJiBvcHRpb25zLmRh
dGEsCisgICAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBhdGgocm9vdCwgcGF0aCwgZGF0
YSksCisgICAgICB2YWx1ZTsKKworICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGF0aCBiZWdpbnMg
d2l0aCBhIGtleXdvcmQsIGNoYW5nZSB0aGUKKyAgLy8gcm9vdCB0byB0aGUgdmFsdWUgcmVwcmVz
ZW50ZWQgYnkgdGhhdCBrZXl3b3JkLCBhbmQgZW5zdXJlCisgIC8vIHRoZSBwYXRoIGlzIHJlbGF0
aXZlIHRvIGl0LgorICByb290ID0gbm9ybWFsaXplZFBhdGgucm9vdDsKKyAgcGF0aCA9IG5vcm1h
bGl6ZWRQYXRoLnBhdGg7CisKKyAgdmFsdWUgPSBFbWJlci5nZXQocm9vdCwgcGF0aCk7CisKKyAg
Ly8gSWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlciwgbG9vayBpdCB1cCBv
biBFbWJlci5sb29rdXAsCisgIC8vIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBgd2luZG93YCBvYmpl
Y3QgaW4gYnJvd3NlcnMuCisgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHJvb3QgIT09IEVt
YmVyLmxvb2t1cCAmJiBFbWJlci5pc0dsb2JhbFBhdGgocGF0aCkpIHsKKyAgICB2YWx1ZSA9IEVt
YmVyLmdldChFbWJlci5sb29rdXAsIHBhdGgpOworICB9CisgIHJldHVybiB2YWx1ZTsKK307CitF
bWJlci5IYW5kbGViYXJzLmdldFBhdGggPSBFbWJlci5kZXByZWNhdGVGdW5jKCdgRW1iZXIuSGFu
ZGxlYmFycy5nZXRQYXRoYCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBFbWJlci5IYW5kbGViYXJzLmdl
dGAgZm9yIGNvbnNpc3RlbmN5LicsIEVtYmVyLkhhbmRsZWJhcnMuZ2V0KTsKKworRW1iZXIuSGFu
ZGxlYmFycy5yZXNvbHZlUGFyYW1zID0gZnVuY3Rpb24oY29udGV4dCwgcGFyYW1zLCBvcHRpb25z
KSB7CisgIHZhciByZXNvbHZlZFBhcmFtcyA9IFtdLCB0eXBlcyA9IG9wdGlvbnMudHlwZXMsIHBh
cmFtLCB0eXBlOworCisgIGZvciAodmFyIGk9MCwgbD1wYXJhbXMubGVuZ3RoOyBpPGw7IGkrKykg
eworICAgIHBhcmFtID0gcGFyYW1zW2ldOworICAgIHR5cGUgPSB0eXBlc1tpXTsKKworICAgIGlm
ICh0eXBlID09PSAnSUQnKSB7CisgICAgICByZXNvbHZlZFBhcmFtcy5wdXNoKGhhbmRsZWJhcnNH
ZXQoY29udGV4dCwgcGFyYW0sIG9wdGlvbnMpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzb2x2
ZWRQYXJhbXMucHVzaChwYXJhbSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc29sdmVkUGFy
YW1zOworfTsKKworRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGFzaCA9IGZ1bmN0aW9uKGNvbnRl
eHQsIGhhc2gsIG9wdGlvbnMpIHsKKyAgdmFyIHJlc29sdmVkSGFzaCA9IHt9LCB0eXBlcyA9IG9w
dGlvbnMuaGFzaFR5cGVzLCB0eXBlOworCisgIGZvciAodmFyIGtleSBpbiBoYXNoKSB7CisgICAg
aWYgKCFoYXNoLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KKworICAgIHR5cGUg
PSB0eXBlc1trZXldOworCisgICAgaWYgKHR5cGUgPT09ICdJRCcpIHsKKyAgICAgIHJlc29sdmVk
SGFzaFtrZXldID0gaGFuZGxlYmFyc0dldChjb250ZXh0LCBoYXNoW2tleV0sIG9wdGlvbnMpOwor
ICAgIH0gZWxzZSB7CisgICAgICByZXNvbHZlZEhhc2hba2V5XSA9IGhhc2hba2V5XTsKKyAgICB9
CisgIH0KKworICByZXR1cm4gcmVzb2x2ZWRIYXNoOworfTsKKworLyoqCisgIEBwcml2YXRlCisK
KyAgUmVnaXN0ZXJzIGEgaGVscGVyIGluIEhhbmRsZWJhcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBp
ZiBubyBwcm9wZXJ0eSB3aXRoIHRoZQorICBnaXZlbiBuYW1lIGNhbiBiZSBmb3VuZCBvbiB0aGUg
Y3VycmVudCBjb250ZXh0IG9iamVjdCwgYW5kIG5vIGhlbHBlciB3aXRoCisgIHRoYXQgbmFtZSBp
cyByZWdpc3RlcmVkLgorCisgIFRoaXMgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbW9yZSBo
ZWxwZnVsIGVycm9yIG1lc3NhZ2Ugc28gdGhlIHVzZXIgY2FuCisgIHRyYWNrIGRvd24gd2hlcmUg
dGhlIHByb2JsZW0gaXMgaGFwcGVuaW5nLgorCisgIEBtZXRob2QgaGVscGVyTWlzc2luZworICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAcGFyYW0ge1N0cmluZ30gcGF0aAorICBA
cGFyYW0ge0hhc2h9IG9wdGlvbnMKKyovCitFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCdoZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICB2YXIgZXJyb3Is
IHZpZXcgPSAiIjsKKworICBlcnJvciA9ICIlQCBIYW5kbGViYXJzIGVycm9yOiBDb3VsZCBub3Qg
ZmluZCBwcm9wZXJ0eSAnJUAnIG9uIG9iamVjdCAlQC4iOworICBpZiAob3B0aW9ucy5kYXRhKXsK
KyAgICB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7CisgIH0KKyAgdGhyb3cgbmV3IEVtYmVyLkVy
cm9yKEVtYmVyLlN0cmluZy5mbXQoZXJyb3IsIFt2aWV3LCBwYXRoLCB0aGlzXSkpOworfSk7CisK
Ky8qKgorICBSZWdpc3RlciBhIGJvdW5kIGhhbmRsZWJhcnMgaGVscGVyLiBCb3VuZCBoZWxwZXJz
IGJlaGF2ZSBzaW1pbGFybHkgdG8gcmVndWxhcgorICBoYW5kbGViYXJzIGhlbHBlcnMsIHdpdGgg
dGhlIGFkZGVkIGFiaWxpdHkgdG8gcmUtcmVuZGVyIHdoZW4gdGhlIHVuZGVybHlpbmcgZGF0YQor
ICBjaGFuZ2VzLgorCisgICMjIFNpbXBsZSBleGFtcGxlCisKKyAgYGBgamF2YXNjcmlwdAorICBF
bWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemUnLCBmdW5jdGlv
bih2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpOworICB9KTsKKyAgYGBg
CisKKyAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxh
dGVzIGFzIGZvbGxvd3M6CisKKyAgYGBgaGFuZGxlYmFycworICB7e2NhcGl0YWxpemUgbmFtZX19
CisgIGBgYAorCisgIEluIHRoaXMgY2FzZSwgd2hlbiB0aGUgYG5hbWVgIHByb3BlcnR5IG9mIHRo
ZSB0ZW1wbGF0ZSdzIGNvbnRleHQgY2hhbmdlcywKKyAgdGhlIHJlbmRlcmVkIHZhbHVlIG9mIHRo
ZSBoZWxwZXIgd2lsbCB1cGRhdGUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKworICAjIyBFeGFt
cGxlIHdpdGggb3B0aW9ucworCisgIExpa2Ugbm9ybWFsIGhhbmRsZWJhcnMgaGVscGVycywgYm91
bmQgaGVscGVycyBoYXZlIGFjY2VzcyB0byB0aGUgb3B0aW9ucworICBwYXNzZWQgaW50byB0aGUg
aGVscGVyIGNhbGwuCisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5IYW5kbGViYXJzLnJlZ2lz
dGVyQm91bmRIZWxwZXIoJ3JlcGVhdCcsIGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7CisgICAg
dmFyIGNvdW50ID0gb3B0aW9ucy5oYXNoLmNvdW50OworICAgIHZhciBhID0gW107CisgICAgd2hp
bGUoYS5sZW5ndGggPCBjb3VudCl7CisgICAgICAgIGEucHVzaCh2YWx1ZSk7CisgICAgfQorICAg
IHJldHVybiBhLmpvaW4oJycpOworICB9KTsKKyAgYGBgCisKKyAgVGhpcyBoZWxwZXIgY291bGQg
YmUgdXNlZCBpbiBhIHRlbXBsYXRlIGFzIGZvbGxvd3M6CisKKyAgYGBgaGFuZGxlYmFycworICB7
e3JlcGVhdCB0ZXh0IGNvdW50PTN9fQorICBgYGAKKworICAjIyBFeGFtcGxlIHdpdGggYm91bmQg
b3B0aW9ucworCisgIEJvdW5kIGhhc2ggb3B0aW9ucyBhcmUgYWxzbyBzdXBwb3J0ZWQuIEV4YW1w
bGU6IAorCisgIGBgYGhhbmRsZWJhcnMKKyAge3tyZXBlYXQgdGV4dCBjb3VudEJpbmRpbmc9Im51
bVJlcGVhdHMifX0KKyAgYGBgCisKKyAgSW4gdGhpcyBleGFtcGxlLCBjb3VudCB3aWxsIGJlIGJv
dW5kIHRvIHRoZSB2YWx1ZSBvZgorICB0aGUgYG51bVJlcGVhdHNgIHByb3BlcnR5IG9uIHRoZSBj
b250ZXh0LiBJZiB0aGF0IHByb3BlcnR5CisgIGNoYW5nZXMsIHRoZSBoZWxwZXIgd2lsbCBiZSBy
ZS1yZW5kZXJlZC4KKworICAjIyBFeGFtcGxlIHdpdGggZXh0cmEgZGVwZW5kZW5jaWVzCisKKyAg
VGhlIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgIG1ldGhvZCB0YWtlcyBh
IHZhcmlhYmxlIGxlbmd0aAorICB0aGlyZCBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIGV4dHJh
IGRlcGVuZGVuY2llcyBvbiB0aGUgcGFzc2VkIGluIHZhbHVlLgorICBUaGlzIGFsbG93cyB0aGUg
aGFuZGxlYmFycyBoZWxwZXIgdG8gdXBkYXRlIHdoZW4gdGhlc2UgZGVwZW5kZW5jaWVzIGNoYW5n
ZS4KKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhl
bHBlcignY2FwaXRhbGl6ZU5hbWUnLCBmdW5jdGlvbih2YWx1ZSkgeworICAgIHJldHVybiB2YWx1
ZS5nZXQoJ25hbWUnKS50b1VwcGVyQ2FzZSgpOworICB9LCAnbmFtZScpOworICBgYGAKKworICAj
IyBFeGFtcGxlIHdpdGggbXVsdGlwbGUgYm91bmQgcHJvcGVydGllcworCisgIGBFbWJlci5IYW5k
bGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgIHN1cHBvcnRzIGJpbmRpbmcgdG8KKyAgbXVsdGlw
bGUgcHJvcGVydGllcywgZS5nLjoKKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLkhhbmRsZWJh
cnMucmVnaXN0ZXJCb3VuZEhlbHBlcignY29uY2F0ZW5hdGUnLCBmdW5jdGlvbigpIHsKKyAgICB2
YXIgdmFsdWVzID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKKyAgICByZXR1cm4g
dmFsdWVzLmpvaW4oJ3x8Jyk7CisgIH0pOworICBgYGAKKworICBXaGljaCBhbGxvd3MgZm9yIHRl
bXBsYXRlIHN5bnRheCBzdWNoIGFzIHt7Y29uY2F0ZW5hdGUgcHJvcDEgcHJvcDJ9fSBvcgorICB7
e2NvbmNhdGVuYXRlIHByb3AxIHByb3AyIHByb3AzfX0uIElmIGFueSBvZiB0aGUgcHJvcGVydGll
cyBjaGFuZ2UsCisgIHRoZSBoZWxwciB3aWxsIHJlLXJlbmRlci4gIE5vdGUgdGhhdCBkZXBlbmRl
bmN5IGtleXMgY2Fubm90IGJlCisgIHVzaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggbXVsdGktcHJv
cGVydHkgaGVscGVycywgc2luY2UgaXQgaXMgYW1iaWd1b3VzCisgIHdoaWNoIHByb3BlcnR5IHRo
ZSBkZXBlbmRlbnQga2V5cyB3b3VsZCBiZWxvbmcgdG8uIAorICAKKyAgIyMgVXNlIHdpdGggdW5i
b3VuZCBoZWxwZXIKKworICBUaGUge3t1bmJvdW5kfX0gaGVscGVyIGNhbiBiZSB1c2VkIHdpdGgg
Ym91bmQgaGVscGVyIGludm9jYXRpb25zIAorICB0byByZW5kZXIgdGhlbSBpbiB0aGVpciB1bmJv
dW5kIGZvcm0sIGUuZy4KKworICBgYGBoYW5kbGViYXJzCisgIHt7dW5ib3VuZCBjYXBpdGFsaXpl
IG5hbWV9fSAKKyAgYGBgCisKKyAgSW4gdGhpcyBleGFtcGxlLCBpZiB0aGUgbmFtZSBwcm9wZXJ0
eSBjaGFuZ2VzLCB0aGUgaGVscGVyCisgIHdpbGwgbm90IHJlLXJlbmRlci4KKworCisgIEBtZXRo
b2QgcmVnaXN0ZXJCb3VuZEhlbHBlcgorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKKyAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUKKyAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb24KKyAgQHBhcmFtIHtT
dHJpbmd9IGRlcGVuZGVudEtleXMqCisqLworRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5k
SGVscGVyID0gZnVuY3Rpb24obmFtZSwgZm4pIHsKKyAgdmFyIGRlcGVuZGVudEtleXMgPSBzbGlj
ZS5jYWxsKGFyZ3VtZW50cywgMik7CisKKyAgZnVuY3Rpb24gaGVscGVyKCkgeworICAgIHZhciBw
cm9wZXJ0aWVzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSwKKyAgICAgIG51bVByb3Bl
cnRpZXMgPSBwcm9wZXJ0aWVzLmxlbmd0aCwKKyAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJn
dW1lbnRzLmxlbmd0aCAtIDFdLAorICAgICAgbm9ybWFsaXplZFByb3BlcnRpZXMgPSBbXSwKKyAg
ICAgIGRhdGEgPSBvcHRpb25zLmRhdGEsCisgICAgICBoYXNoID0gb3B0aW9ucy5oYXNoLAorICAg
ICAgdmlldyA9IGRhdGEudmlldywKKyAgICAgIGN1cnJlbnRDb250ZXh0ID0gKG9wdGlvbnMuY29u
dGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0c1swXSkgfHwgdGhpcywKKyAgICAgIG5vcm1hbGl6ZWQs
CisgICAgICBwYXRoUm9vdCwgcGF0aCwgCisgICAgICBsb2MsIGhhc2hPcHRpb247CisKKyAgICAv
LyBEZXRlY3QgYm91bmQgb3B0aW9ucyAoZS5nLiBjb3VudEJpbmRpbmc9Im90aGVyQ291bnQiKQor
ICAgIGhhc2guYm91bmRPcHRpb25zID0ge307CisgICAgZm9yIChoYXNoT3B0aW9uIGluIGhhc2gp
IHsKKyAgICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShoYXNoT3B0aW9uKSkgeyBjb250aW51
ZTsgfQorCisgICAgICBpZiAoRW1iZXIuSVNfQklORElORy50ZXN0KGhhc2hPcHRpb24pICYmIHR5
cGVvZiBoYXNoW2hhc2hPcHRpb25dID09PSAnc3RyaW5nJykgeworICAgICAgICAvLyBMb3Agb2Zm
ICdCaW5kaW5nJyBzdWZmaXguCisgICAgICAgIGhhc2guYm91bmRPcHRpb25zW2hhc2hPcHRpb24u
c2xpY2UoMCwgLTcpXSA9IGhhc2hbaGFzaE9wdGlvbl07CisgICAgICB9CisgICAgfQorCisgICAg
Ly8gRXhwb3NlIHByb3BlcnR5IG5hbWVzIG9uIGRhdGEucHJvcGVydGllcyBvYmplY3QuCisgICAg
ZGF0YS5wcm9wZXJ0aWVzID0gW107CisgICAgZm9yIChsb2MgPSAwOyBsb2MgPCBudW1Qcm9wZXJ0
aWVzOyArK2xvYykgeworICAgICAgZGF0YS5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydGllc1tsb2Nd
KTsKKyAgICAgIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLnB1c2gobm9ybWFsaXplUGF0aChjdXJyZW50
Q29udGV4dCwgcHJvcGVydGllc1tsb2NdLCBkYXRhKSk7CisgICAgfQorCisgICAgaWYgKGRhdGEu
aXNVbmJvdW5kKSB7CisgICAgICByZXR1cm4gZXZhbHVhdGVVbmJvdW5kSGVscGVyKHRoaXMsIGZu
LCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucyk7CisgICAgfQorCisgICAgaWYgKGRlcGVu
ZGVudEtleXMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm4gZXZhbHVhdGVNdWx0aVByb3Bl
cnR5Qm91bmRIZWxwZXIoY3VycmVudENvbnRleHQsIGZuLCBub3JtYWxpemVkUHJvcGVydGllcywg
b3B0aW9ucyk7CisgICAgfQorCisgICAgRW1iZXIuYXNzZXJ0KCJEZXBlbmRlbnQga2V5cyBjYW4g
b25seSBiZSB1c2VkIHdpdGggc2luZ2xlLXByb3BlcnR5IGhlbHBlcnMuIiwgcHJvcGVydGllcy5s
ZW5ndGggPT09IDEpOworCisgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzWzBd
OworCisgICAgcGF0aFJvb3QgPSBub3JtYWxpemVkLnJvb3Q7CisgICAgcGF0aCA9IG5vcm1hbGl6
ZWQucGF0aDsKKworICAgIHZhciBiaW5kVmlldyA9IG5ldyBFbWJlci5fU2ltcGxlSGFuZGxlYmFy
c1ZpZXcoCisgICAgICBwYXRoLCBwYXRoUm9vdCwgIW9wdGlvbnMuaGFzaC51bmVzY2FwZWQsIG9w
dGlvbnMuZGF0YQorICAgICk7CisKKyAgICBiaW5kVmlldy5ub3JtYWxpemVkVmFsdWUgPSBmdW5j
dGlvbigpIHsKKyAgICAgIHZhciB2YWx1ZSA9IEVtYmVyLl9TaW1wbGVIYW5kbGViYXJzVmlldy5w
cm90b3R5cGUubm9ybWFsaXplZFZhbHVlLmNhbGwoYmluZFZpZXcpOworICAgICAgcmV0dXJuIGZu
LmNhbGwodmlldywgdmFsdWUsIG9wdGlvbnMpOworICAgIH07CisKKyAgICB2aWV3LmFwcGVuZENo
aWxkKGJpbmRWaWV3KTsKKworICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihwYXRoUm9vdCwgcGF0
aCwgYmluZFZpZXcsIHJlcmVuZGVyQm91bmRIZWxwZXJWaWV3KTsKKworICAgIGZvciAodmFyIGk9
MCwgbD1kZXBlbmRlbnRLZXlzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIHZpZXcucmVnaXN0
ZXJPYnNlcnZlcihwYXRoUm9vdCwgcGF0aCArICcuJyArIGRlcGVuZGVudEtleXNbaV0sIGJpbmRW
aWV3LCByZXJlbmRlckJvdW5kSGVscGVyVmlldyk7CisgICAgfQorICB9CisKKyAgaGVscGVyLl9y
YXdGdW5jdGlvbiA9IGZuOworICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKG5hbWUs
IGhlbHBlcik7Cit9OworCisvKioKKyAgQHByaXZhdGUKKworICBSZW5kZXJzIHRoZSB1bmJvdW5k
IGZvcm0gb2YgYW4gb3RoZXJ3aXNlIGJvdW5kIGhlbHBlciBmdW5jdGlvbi4KKworICBAcGFyYW0g
e0Z1bmN0aW9ufSBmbgorICBAcGFyYW0ge09iamVjdH0gY29udGV4dAorICBAcGFyYW0ge0FycmF5
fSBub3JtYWxpemVkUHJvcGVydGllcworICBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucworKi8KK2Z1
bmN0aW9uIGV2YWx1YXRlTXVsdGlQcm9wZXJ0eUJvdW5kSGVscGVyKGNvbnRleHQsIGZuLCBub3Jt
YWxpemVkUHJvcGVydGllcywgb3B0aW9ucykgeworICB2YXIgbnVtUHJvcGVydGllcyA9IG5vcm1h
bGl6ZWRQcm9wZXJ0aWVzLmxlbmd0aCwKKyAgICAgIHNlbGYgPSB0aGlzLAorICAgICAgZGF0YSA9
IG9wdGlvbnMuZGF0YSwKKyAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCisgICAgICBoYXNoID0gb3B0
aW9ucy5oYXNoLAorICAgICAgYm91bmRPcHRpb25zID0gaGFzaC5ib3VuZE9wdGlvbnMsCisgICAg
ICB3YXRjaGVkUHJvcGVydGllcywKKyAgICAgIGJvdW5kT3B0aW9uLCBiaW5kVmlldywgbG9jLCBw
cm9wZXJ0eSwgbGVuOworCisgIGJpbmRWaWV3ID0gbmV3IEVtYmVyLl9TaW1wbGVIYW5kbGViYXJz
VmlldyhudWxsLCBudWxsLCAhaGFzaC51bmVzY2FwZWQsIGRhdGEpOworICBiaW5kVmlldy5ub3Jt
YWxpemVkVmFsdWUgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJncyA9IFtdLCB2YWx1ZSwgYm91
bmRPcHRpb247CisKKyAgICAvLyBDb3B5IG92ZXIgYm91bmQgb3B0aW9ucy4KKyAgICBmb3IgKGJv
dW5kT3B0aW9uIGluIGJvdW5kT3B0aW9ucykgeworICAgICAgaWYgKCFib3VuZE9wdGlvbnMuaGFz
T3duUHJvcGVydHkoYm91bmRPcHRpb24pKSB7IGNvbnRpbnVlOyB9CisgICAgICBwcm9wZXJ0eSA9
IG5vcm1hbGl6ZVBhdGgoY29udGV4dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwgZGF0YSk7
CisgICAgICBiaW5kVmlldy5wYXRoID0gcHJvcGVydHkucGF0aDsKKyAgICAgIGJpbmRWaWV3LnBh
dGhSb290ID0gcHJvcGVydHkucm9vdDsKKyAgICAgIGhhc2hbYm91bmRPcHRpb25dID0gRW1iZXIu
X1NpbXBsZUhhbmRsZWJhcnNWaWV3LnByb3RvdHlwZS5ub3JtYWxpemVkVmFsdWUuY2FsbChiaW5k
Vmlldyk7CisgICAgfQorCisgICAgZm9yIChsb2MgPSAwOyBsb2MgPCBudW1Qcm9wZXJ0aWVzOyAr
K2xvYykgeworICAgICAgcHJvcGVydHkgPSBub3JtYWxpemVkUHJvcGVydGllc1tsb2NdOworICAg
ICAgYmluZFZpZXcucGF0aCA9IHByb3BlcnR5LnBhdGg7CisgICAgICBiaW5kVmlldy5wYXRoUm9v
dCA9IHByb3BlcnR5LnJvb3Q7CisgICAgICBhcmdzLnB1c2goRW1iZXIuX1NpbXBsZUhhbmRsZWJh
cnNWaWV3LnByb3RvdHlwZS5ub3JtYWxpemVkVmFsdWUuY2FsbChiaW5kVmlldykpOworICAgIH0K
KyAgICBhcmdzLnB1c2gob3B0aW9ucyk7CisgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFy
Z3MpOworICB9OworCisgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcpOworCisgIC8vIEFzc2Vt
YmxlIGxpYXN0IG9mIHdhdGNoZWQgcHJvcGVydGllcyB0aGF0J2xsIHJlLXJlbmRlciB0aGlzIGhl
bHBlci4KKyAgd2F0Y2hlZFByb3BlcnRpZXMgPSBbXTsKKyAgZm9yIChib3VuZE9wdGlvbiBpbiBi
b3VuZE9wdGlvbnMpIHsKKyAgICBpZiAoYm91bmRPcHRpb25zLmhhc093blByb3BlcnR5KGJvdW5k
T3B0aW9uKSkgeyAKKyAgICAgIHdhdGNoZWRQcm9wZXJ0aWVzLnB1c2gobm9ybWFsaXplUGF0aChj
b250ZXh0LCBib3VuZE9wdGlvbnNbYm91bmRPcHRpb25dLCBkYXRhKSk7CisgICAgfQorICB9Cisg
IHdhdGNoZWRQcm9wZXJ0aWVzID0gd2F0Y2hlZFByb3BlcnRpZXMuY29uY2F0KG5vcm1hbGl6ZWRQ
cm9wZXJ0aWVzKTsKKworICAvLyBPYnNlcnZlIGVhY2ggcHJvcGVydHkuCisgIGZvciAobG9jID0g
MCwgbGVuID0gd2F0Y2hlZFByb3BlcnRpZXMubGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9jKSB7Cisg
ICAgcHJvcGVydHkgPSB3YXRjaGVkUHJvcGVydGllc1tsb2NdOworICAgIHZpZXcucmVnaXN0ZXJP
YnNlcnZlcihwcm9wZXJ0eS5yb290LCBwcm9wZXJ0eS5wYXRoLCBiaW5kVmlldywgcmVyZW5kZXJC
b3VuZEhlbHBlclZpZXcpOworICB9CisKK30KKworLyoqCisgIEBwcml2YXRlCisKKyAgQW4gb2Jz
ZXJ2ZXIgZnVuY3Rpb24gdXNlZCB3aXRoIGJvdW5kIGhlbHBlcnMgd2hpY2gKKyAgd2lsbCBzY2hl
ZHVsZSBhIHJlLXJlbmRlciBvZiB0aGUgX1NpbXBsZUhhbmRsZWJhcnNWaWV3CisgIGNvbm5lY3Rl
ZCB3aXRoIHRoZSBoZWxwZXIuCisqLworZnVuY3Rpb24gcmVyZW5kZXJCb3VuZEhlbHBlclZpZXco
KSB7CisgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHRoaXMsICdyZXJlbmRlcicp
OworfQorCisvKioKKyAgQHByaXZhdGUKKworICBSZW5kZXJzIHRoZSB1bmJvdW5kIGZvcm0gb2Yg
YW4gb3RoZXJ3aXNlIGJvdW5kIGhlbHBlciBmdW5jdGlvbi4KKworICBAcGFyYW0ge0Z1bmN0aW9u
fSBmbgorICBAcGFyYW0ge09iamVjdH0gY29udGV4dAorICBAcGFyYW0ge0FycmF5fSBub3JtYWxp
emVkUHJvcGVydGllcworICBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucworKi8KK2Z1bmN0aW9uIGV2
YWx1YXRlVW5ib3VuZEhlbHBlcihjb250ZXh0LCBmbiwgbm9ybWFsaXplZFByb3BlcnRpZXMsIG9w
dGlvbnMpIHsKKyAgdmFyIGFyZ3MgPSBbXSwgaGFzaCA9IG9wdGlvbnMuaGFzaCwgYm91bmRPcHRp
b25zID0gaGFzaC5ib3VuZE9wdGlvbnMsIGxvYywgbGVuLCBwcm9wZXJ0eSwgYm91bmRPcHRpb247
CisKKyAgZm9yIChib3VuZE9wdGlvbiBpbiBib3VuZE9wdGlvbnMpIHsKKyAgICBpZiAoIWJvdW5k
T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShib3VuZE9wdGlvbikpIHsgY29udGludWU7IH0KKyAgICBo
YXNoW2JvdW5kT3B0aW9uXSA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0KGNvbnRleHQsIGJvdW5kT3B0
aW9uc1tib3VuZE9wdGlvbl0sIG9wdGlvbnMpOworICB9CisKKyAgZm9yKGxvYyA9IDAsIGxlbiA9
IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLmxlbmd0aDsgbG9jIDwgbGVuOyArK2xvYykgeworICAgIHBy
b3BlcnR5ID0gbm9ybWFsaXplZFByb3BlcnRpZXNbbG9jXTsKKyAgICBhcmdzLnB1c2goRW1iZXIu
SGFuZGxlYmFycy5nZXQoY29udGV4dCwgcHJvcGVydHkucGF0aCwgb3B0aW9ucykpOworICB9Cisg
IGFyZ3MucHVzaChvcHRpb25zKTsKKyAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwor
fQorCisvKioKKyAgQHByaXZhdGUKKworICBPdmVycmlkZXMgSGFuZGxlYmFycy50ZW1wbGF0ZSBz
byB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaAorICB1c2VyLWNyZWF0ZWQsIHRvcC1sZXZlbCB0ZW1w
bGF0ZXMgZnJvbSBpbm5lciBjb250ZXh0cy4KKworICBAbWV0aG9kIHRlbXBsYXRlCisgIEBmb3Ig
RW1iZXIuSGFuZGxlYmFycworICBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGUgc3BlYworKi8KK0Vt
YmVyLkhhbmRsZWJhcnMudGVtcGxhdGUgPSBmdW5jdGlvbihzcGVjKXsKKyAgdmFyIHQgPSBIYW5k
bGViYXJzLnRlbXBsYXRlKHNwZWMpOworICB0LmlzVG9wID0gdHJ1ZTsKKyAgcmV0dXJuIHQ7Cit9
OworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1ldGhvZCBodG1sU2Fm
ZQorICBAZm9yIEVtYmVyLlN0cmluZworICBAc3RhdGljCisqLworRW1iZXIuU3RyaW5nLmh0bWxT
YWZlID0gZnVuY3Rpb24oc3RyKSB7CisgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5n
KHN0cik7Cit9OworCit2YXIgaHRtbFNhZmUgPSBFbWJlci5TdHJpbmcuaHRtbFNhZmU7CisKK2lm
IChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9U
WVBFUy5TdHJpbmcpIHsKKworICAvKioKKyAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJp
bmcvaHRtbFNhZmUifX17ey9jcm9zc0xpbmt9fQorCisgICAgQG1ldGhvZCBodG1sU2FmZQorICAg
IEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUuaHRtbFNhZmUgPSBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gaHRtbFNhZmUodGhpcyk7CisgIH07Cit9CisKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7CitFbWJlci5IYW5kbGViYXJzLnJlc29sdmVQYXRocyA9IGZ1bmN0aW9u
KG9wdGlvbnMpIHsKKyAgdmFyIHJldCA9IFtdLAorICAgICAgY29udGV4dHMgPSBvcHRpb25zLmNv
bnRleHRzLAorICAgICAgcm9vdHMgPSBvcHRpb25zLnJvb3RzLAorICAgICAgZGF0YSA9IG9wdGlv
bnMuZGF0YTsKKworICBmb3IgKHZhciBpPTAsIGw9Y29udGV4dHMubGVuZ3RoOyBpPGw7IGkrKykg
eworICAgIHJldC5wdXNoKCBFbWJlci5IYW5kbGViYXJzLmdldChyb290c1tpXSwgY29udGV4dHNb
aV0sIHsgZGF0YTogZGF0YSB9KSApOworICB9CisKKyAgcmV0dXJuIHJldDsKK307CisKK30pKCk7
CisKKworCisoZnVuY3Rpb24oKSB7CisvKmpzaGludCBuZXdjYXA6ZmFsc2UqLworLyoqCitAbW9k
dWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKK3ZhciBzZXQgPSBF
bWJlci5zZXQsIGdldCA9IEVtYmVyLmdldDsKK3ZhciBNZXRhbW9ycGggPSByZXF1aXJlTW9kdWxl
KCdtZXRhbW9ycGgnKTsKKworLy8gRE9NTWFuYWdlciBzaG91bGQganVzdCBhYnN0cmFjdCBkb20g
bWFuaXB1bGF0aW9uIGJldHdlZW4ganF1ZXJ5IGFuZCBtZXRhbW9ycGgKK3ZhciBET01NYW5hZ2Vy
ID0geworICByZW1vdmU6IGZ1bmN0aW9uKHZpZXcpIHsKKyAgICB2aWV3Lm1vcnBoLnJlbW92ZSgp
OworICB9LAorCisgIHByZXBlbmQ6IGZ1bmN0aW9uKHZpZXcsIGh0bWwpIHsKKyAgICB2aWV3Lm1v
cnBoLnByZXBlbmQoaHRtbCk7CisgIH0sCisKKyAgYWZ0ZXI6IGZ1bmN0aW9uKHZpZXcsIGh0bWwp
IHsKKyAgICB2aWV3Lm1vcnBoLmFmdGVyKGh0bWwpOworICB9LAorCisgIGh0bWw6IGZ1bmN0aW9u
KHZpZXcsIGh0bWwpIHsKKyAgICB2aWV3Lm1vcnBoLmh0bWwoaHRtbCk7CisgIH0sCisKKyAgLy8g
VGhpcyBpcyBtZXNzZWQgdXAuCisgIHJlcGxhY2U6IGZ1bmN0aW9uKHZpZXcpIHsKKyAgICB2YXIg
bW9ycGggPSB2aWV3Lm1vcnBoOworCisgICAgdmlldy50cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicp
OworCisgICAgRW1iZXIucnVuLnNjaGVkdWxlKCdyZW5kZXInLCB0aGlzLCBmdW5jdGlvbigpIHsK
KyAgICAgIGlmICh2aWV3LmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KKworICAgICAgdmlldy5j
bGVhclJlbmRlcmVkQ2hpbGRyZW4oKTsKKyAgICAgIHZhciBidWZmZXIgPSB2aWV3LnJlbmRlclRv
QnVmZmVyKCk7CisKKyAgICAgIHZpZXcuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24odmlldykg
eworICAgICAgICB2aWV3LnByb3BlcnR5RGlkQ2hhbmdlKCdlbGVtZW50Jyk7CisgICAgICB9KTsK
KworICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7Cisg
ICAgICBtb3JwaC5yZXBsYWNlV2l0aChidWZmZXIuc3RyaW5nKCkpOworICAgICAgdmlldy50cmFu
c2l0aW9uVG8oJ2luRE9NJyk7CisgICAgICB2aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnZGlkSW5z
ZXJ0RWxlbWVudCcpOworICAgIH0pOworICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7
CisgICAgdmlldy5tb3JwaC5odG1sKCIiKTsKKyAgfQorfTsKKworLy8gVGhlIGBtb3JwaGAgYW5k
IGBvdXRlckhUTUxgIHByb3BlcnRpZXMgYXJlIGludGVybmFsIG9ubHkKKy8vIGFuZCBub3Qgb2Jz
ZXJ2YWJsZS4KKworLyoqCisgIEBjbGFzcyBfTWV0YW1vcnBoCisgIEBuYW1lc3BhY2UgRW1iZXIK
KyAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyAgQHByaXZhdGUKKyovCitFbWJlci5fTWV0YW1vcnBo
ID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAgaXNWaXJ0dWFsOiB0cnVlLAorICB0YWdOYW1lOiAn
JywKKworICBpbnN0cnVtZW50TmFtZTogJ3JlbmRlci5tZXRhbW9ycGgnLAorCisgIGluaXQ6IGZ1
bmN0aW9uKCkgeworICAgIHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5tb3JwaCA9IE1ldGFtb3Jw
aCgpOworICB9LAorCisgIGJlZm9yZVJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7CisgICAgYnVm
ZmVyLnB1c2godGhpcy5tb3JwaC5zdGFydFRhZygpKTsKKyAgICBidWZmZXIucHVzaE9wZW5pbmdU
YWcoKTsKKyAgfSwKKworICBhZnRlclJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7CisgICAgYnVm
ZmVyLnB1c2hDbG9zaW5nVGFnKCk7CisgICAgYnVmZmVyLnB1c2godGhpcy5tb3JwaC5lbmRUYWco
KSk7CisgIH0sCisKKyAgY3JlYXRlRWxlbWVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGJ1ZmZl
ciA9IHRoaXMucmVuZGVyVG9CdWZmZXIoKTsKKyAgICB0aGlzLm91dGVySFRNTCA9IGJ1ZmZlci5z
dHJpbmcoKTsKKyAgICB0aGlzLmNsZWFyQnVmZmVyKCk7CisgIH0sCisKKyAgZG9tTWFuYWdlcjog
RE9NTWFuYWdlcgorfSk7CisKKy8qKgorICBAY2xhc3MgX01ldGFtb3JwaFZpZXcKKyAgQG5hbWVz
cGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5WaWV3CisgIEB1c2VzIEVtYmVyLl9NZXRhbW9y
cGgKKyAgQHByaXZhdGUKKyovCitFbWJlci5fTWV0YW1vcnBoVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKEVtYmVyLl9NZXRhbW9ycGgpOworCisvKioKKyAgQGNsYXNzIF9TaW1wbGVNZXRhbW9ycGhW
aWV3CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuVmlldworICBAdXNlcyBF
bWJlci5fTWV0YW1vcnBoCisgIEBwcml2YXRlCisqLworRW1iZXIuX1NpbXBsZU1ldGFtb3JwaFZp
ZXcgPSBFbWJlci5Db3JlVmlldy5leHRlbmQoRW1iZXIuX01ldGFtb3JwaCk7CisKKworfSkoKTsK
KworCisKKyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFscyBIYW5kbGViYXJzICovCisvKmpzaGludCBu
ZXdjYXA6ZmFsc2UqLworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRs
ZWJhcnMKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaGFuZGxl
YmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0OwordmFyIE1ldGFtb3JwaCA9IHJlcXVpcmVN
b2R1bGUoJ21ldGFtb3JwaCcpOworZnVuY3Rpb24gU2ltcGxlSGFuZGxlYmFyc1ZpZXcocGF0aCwg
cGF0aFJvb3QsIGlzRXNjYXBlZCwgdGVtcGxhdGVEYXRhKSB7CisgIHRoaXMucGF0aCA9IHBhdGg7
CisgIHRoaXMucGF0aFJvb3QgPSBwYXRoUm9vdDsKKyAgdGhpcy5pc0VzY2FwZWQgPSBpc0VzY2Fw
ZWQ7CisgIHRoaXMudGVtcGxhdGVEYXRhID0gdGVtcGxhdGVEYXRhOworCisgIHRoaXMubW9ycGgg
PSBNZXRhbW9ycGgoKTsKKyAgdGhpcy5zdGF0ZSA9ICdwcmVSZW5kZXInOworICB0aGlzLnVwZGF0
ZUlkID0gbnVsbDsKK30KKworRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3ID0gU2ltcGxlSGFu
ZGxlYmFyc1ZpZXc7CisKK1NpbXBsZUhhbmRsZWJhcnNWaWV3LnByb3RvdHlwZSA9IHsKKyAgaXNW
aXJ0dWFsOiB0cnVlLAorICBpc1ZpZXc6IHRydWUsCisKKyAgZGVzdHJveTogZnVuY3Rpb24gKCkg
eworICAgIGlmICh0aGlzLnVwZGF0ZUlkKSB7CisgICAgICBFbWJlci5ydW4uY2FuY2VsKHRoaXMu
dXBkYXRlSWQpOworICAgICAgdGhpcy51cGRhdGVJZCA9IG51bGw7CisgICAgfQorICAgIHRoaXMu
bW9ycGggPSBudWxsOworICB9LAorCisgIHByb3BlcnR5RGlkQ2hhbmdlOiBFbWJlci5LLAorCisg
IG5vcm1hbGl6ZWRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhdGggPSB0aGlzLnBhdGgs
CisgICAgICAgIHBhdGhSb290ID0gdGhpcy5wYXRoUm9vdCwKKyAgICAgICAgcmVzdWx0LCB0ZW1w
bGF0ZURhdGE7CisKKyAgICAvLyBVc2UgdGhlIHBhdGhSb290IGFzIHRoZSByZXN1bHQgaWYgbm8g
cGF0aCBpcyBwcm92aWRlZC4gVGhpcworICAgIC8vIGhhcHBlbnMgaWYgdGhlIHBhdGggaXMgYHRo
aXNgLCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgaW50bworICAgIC8vIGEgYHBhdGhSb290YCBvZiB0
aGUgY3VycmVudCBIYW5kbGViYXJzIGNvbnRleHQgYW5kIGEgcGF0aAorICAgIC8vIG9mIGAnJ2Au
CisgICAgaWYgKHBhdGggPT09ICcnKSB7CisgICAgICByZXN1bHQgPSBwYXRoUm9vdDsKKyAgICB9
IGVsc2UgeworICAgICAgdGVtcGxhdGVEYXRhID0gdGhpcy50ZW1wbGF0ZURhdGE7CisgICAgICBy
ZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhSb290LCBwYXRoLCB7IGRhdGE6IHRlbXBsYXRlRGF0
YSB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIHJlbmRlclRvQnVm
ZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKKyAgICB2YXIgc3RyaW5nID0gJyc7CisKKyAgICBzdHJp
bmcgKz0gdGhpcy5tb3JwaC5zdGFydFRhZygpOworICAgIHN0cmluZyArPSB0aGlzLnJlbmRlcigp
OworICAgIHN0cmluZyArPSB0aGlzLm1vcnBoLmVuZFRhZygpOworCisgICAgYnVmZmVyLnB1c2go
c3RyaW5nKTsKKyAgfSwKKworICByZW5kZXI6IGZ1bmN0aW9uKCkgeworICAgIC8vIElmIG5vdCBp
bnZva2VkIHZpYSBhIHRyaXBsZS1tdXN0YWNoZSAoe3t7Zm9vfX19KSwgZXNjYXBlCisgICAgLy8g
dGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLgorICAgIHZhciBlc2NhcGUgPSB0aGlzLmlzRXNj
YXBlZDsKKyAgICB2YXIgcmVzdWx0ID0gdGhpcy5ub3JtYWxpemVkVmFsdWUoKTsKKworICAgIGlm
IChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJlc3Vs
dCA9ICIiOworICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNh
ZmVTdHJpbmcpKSB7CisgICAgICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKKyAgICB9CisKKyAg
ICBpZiAoZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lv
bihyZXN1bHQpOyB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICByZXJlbmRlcjogZnVu
Y3Rpb24oKSB7CisgICAgc3dpdGNoKHRoaXMuc3RhdGUpIHsKKyAgICAgIGNhc2UgJ3ByZVJlbmRl
cic6CisgICAgICBjYXNlICdkZXN0cm95ZWQnOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2Ug
J2luQnVmZmVyJzoKKyAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJTb21ldGhpbmcgeW91
IGRpZCB0cmllZCB0byByZXBsYWNlIGFuIHt7ZXhwcmVzc2lvbn19IGJlZm9yZSBpdCB3YXMgaW5z
ZXJ0ZWQgaW50byB0aGUgRE9NLiIpOworICAgICAgY2FzZSAnaGFzRWxlbWVudCc6CisgICAgICBj
YXNlICdpbkRPTSc6CisgICAgICAgIHRoaXMudXBkYXRlSWQgPSBFbWJlci5ydW4uc2NoZWR1bGVP
bmNlKCdyZW5kZXInLCB0aGlzLCAndXBkYXRlJyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKwor
ICAgIHJldHVybiB0aGlzOworICB9LAorCisgIHVwZGF0ZTogZnVuY3Rpb24gKCkgeworICAgIHRo
aXMudXBkYXRlSWQgPSBudWxsOworICAgIHRoaXMubW9ycGguaHRtbCh0aGlzLnJlbmRlcigpKTsK
KyAgfSwKKworICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0YXRlKSB7CisgICAgdGhpcy5zdGF0
ZSA9IHN0YXRlOworICB9Cit9OworCit2YXIgc3RhdGVzID0gRW1iZXIuVmlldy5jbG9uZVN0YXRl
cyhFbWJlci5WaWV3LnN0YXRlcyksIG1lcmdlID0gRW1iZXIubWVyZ2U7CisKK21lcmdlKHN0YXRl
cy5fZGVmYXVsdCwgeworICByZXJlbmRlcklmTmVlZGVkOiBFbWJlci5LCit9KTsKKworbWVyZ2Uo
c3RhdGVzLmluRE9NLCB7CisgIHJlcmVuZGVySWZOZWVkZWQ6IGZ1bmN0aW9uKHZpZXcpIHsKKyAg
ICBpZiAoZ2V0KHZpZXcsICdub3JtYWxpemVkVmFsdWUnKSAhPT0gdmlldy5fbGFzdE5vcm1hbGl6
ZWRWYWx1ZSkgeworICAgICAgdmlldy5yZXJlbmRlcigpOworICAgIH0KKyAgfQorfSk7CisKKy8q
KgorICBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGEgcHJpdmF0ZSB2aWV3IGNyZWF0
ZWQgYnkgdGhlIEhhbmRsZWJhcnMKKyAgYHt7YmluZH19YCBoZWxwZXJzIHRoYXQgaXMgdXNlZCB0
byBrZWVwIHRyYWNrIG9mIGJvdW5kIHByb3BlcnRpZXMuCisKKyAgRXZlcnkgdGltZSBhIHByb3Bl
cnR5IGlzIGJvdW5kIHVzaW5nIGEgYHt7bXVzdGFjaGV9fWAsIGFuIGFub255bW91cyBzdWJjbGFz
cworICBvZiBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGNyZWF0ZWQgd2l0aCB0aGUg
YXBwcm9wcmlhdGUgc3ViLXRlbXBsYXRlCisgIGFuZCBjb250ZXh0IHNldCB1cC4gV2hlbiB0aGUg
YXNzb2NpYXRlZCBwcm9wZXJ0eSBjaGFuZ2VzLCBqdXN0IHRoZSB0ZW1wbGF0ZQorICBmb3IgdGhp
cyB2aWV3IHdpbGwgcmUtcmVuZGVyLgorCisgIEBjbGFzcyBfSGFuZGxlYmFyc0JvdW5kVmlldwor
ICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLl9NZXRhbW9ycGhWaWV3CisgIEBw
cml2YXRlCisqLworRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcgPSBFbWJlci5fTWV0YW1vcnBo
Vmlldy5leHRlbmQoeworICBpbnN0cnVtZW50TmFtZTogJ3JlbmRlci5ib3VuZEhhbmRsZWJhcnMn
LAorICBzdGF0ZXM6IHN0YXRlcywKKworICAvKioKKyAgICBUaGUgZnVuY3Rpb24gdXNlZCB0byBk
ZXRlcm1pbmUgaWYgdGhlIGBkaXNwbGF5VGVtcGxhdGVgIG9yCisgICAgYGludmVyc2VUZW1wbGF0
ZWAgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGlzIHNob3VsZCBiZSBhIGZ1bmN0aW9uIHRoYXQgdGFr
ZXMKKyAgICBhIHZhbHVlIGFuZCByZXR1cm5zIGEgQm9vbGVhbi4KKworICAgIEBwcm9wZXJ0eSBz
aG91bGREaXNwbGF5RnVuYworICAgIEB0eXBlIEZ1bmN0aW9uCisgICAgQGRlZmF1bHQgbnVsbAor
ICAqLworICBzaG91bGREaXNwbGF5RnVuYzogbnVsbCwKKworICAvKioKKyAgICBXaGV0aGVyIHRo
ZSB0ZW1wbGF0ZSByZW5kZXJlZCBieSB0aGlzIHZpZXcgZ2V0cyBwYXNzZWQgdGhlIGNvbnRleHQg
b2JqZWN0CisgICAgb2YgaXRzIHBhcmVudCB0ZW1wbGF0ZSwgb3IgZ2V0cyBwYXNzZWQgdGhlIHZh
bHVlIG9mIHJldHJpZXZpbmcgYHBhdGhgCisgICAgZnJvbSB0aGUgYHBhdGhSb290YC4KKworICAg
IEZvciBleGFtcGxlLCB0aGlzIGlzIHRydWUgd2hlbiB1c2luZyB0aGUgYHt7I2lmfX1gIGhlbHBl
ciwgYmVjYXVzZSB0aGUKKyAgICB0ZW1wbGF0ZSBpbnNpZGUgdGhlIGhlbHBlciBzaG91bGQgbG9v
ayB1cCBwcm9wZXJ0aWVzIHJlbGF0aXZlIHRvIHRoZSBzYW1lCisgICAgb2JqZWN0IGFzIG91dHNp
ZGUgdGhlIGJsb2NrLiBUaGlzIHdvdWxkIGJlIGBmYWxzZWAgd2hlbiB1c2VkIHdpdGggYHt7I3dp
dGgKKyAgICBmb299fWAgYmVjYXVzZSB0aGUgdGVtcGxhdGUgc2hvdWxkIHJlY2VpdmUgdGhlIG9i
amVjdCBmb3VuZCBieSBldmFsdWF0aW5nCisgICAgYGZvb2AuCisKKyAgICBAcHJvcGVydHkgcHJl
c2VydmVDb250ZXh0CisgICAgQHR5cGUgQm9vbGVhbgorICAgIEBkZWZhdWx0IGZhbHNlCisgICov
CisgIHByZXNlcnZlQ29udGV4dDogZmFsc2UsCisKKyAgLyoqCisgICAgSWYgYHByZXNlcnZlQ29u
dGV4dGAgaXMgdHJ1ZSwgdGhpcyBpcyB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkCisgICAg
dG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZS4KKworICAgIEBwcm9wZXJ0eSBwcmV2aW91c0NvbnRleHQK
KyAgICBAdHlwZSBPYmplY3QKKyAgKi8KKyAgcHJldmlvdXNDb250ZXh0OiBudWxsLAorCisgIC8q
KgorICAgIFRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgd2hlbiBgc2hvdWxkRGlzcGxheUZ1bmNgIGV2
YWx1YXRlcyB0byBgdHJ1ZWAuCisKKyAgICBAcHJvcGVydHkgZGlzcGxheVRlbXBsYXRlCisgICAg
QHR5cGUgRnVuY3Rpb24KKyAgICBAZGVmYXVsdCBudWxsCisgICovCisgIGRpc3BsYXlUZW1wbGF0
ZTogbnVsbCwKKworICAvKioKKyAgICBUaGUgdGVtcGxhdGUgdG8gcmVuZGVyIHdoZW4gYHNob3Vs
ZERpc3BsYXlGdW5jYCBldmFsdWF0ZXMgdG8gYGZhbHNlYC4KKworICAgIEBwcm9wZXJ0eSBpbnZl
cnNlVGVtcGxhdGUKKyAgICBAdHlwZSBGdW5jdGlvbgorICAgIEBkZWZhdWx0IG51bGwKKyAgKi8K
KyAgaW52ZXJzZVRlbXBsYXRlOiBudWxsLAorCisKKyAgLyoqCisgICAgVGhlIHBhdGggdG8gbG9v
ayB1cCBvbiBgcGF0aFJvb3RgIHRoYXQgaXMgcGFzc2VkIHRvCisgICAgYHNob3VsZERpc3BsYXlG
dW5jYCB0byBkZXRlcm1pbmUgd2hpY2ggdGVtcGxhdGUgdG8gcmVuZGVyLgorCisgICAgSW4gYWRk
aXRpb24sIGlmIGBwcmVzZXJ2ZUNvbnRleHRgIGlzIGBmYWxzZSxgIHRoZSBvYmplY3QgYXQgdGhp
cyBwYXRoIHdpbGwKKyAgICBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlIHdoZW4gcmVuZGVyaW5n
LgorCisgICAgQHByb3BlcnR5IHBhdGgKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCBu
dWxsCisgICovCisgIHBhdGg6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIG9iamVjdCBmcm9tIHdo
aWNoIHRoZSBgcGF0aGAgd2lsbCBiZSBsb29rZWQgdXAuIFNvbWV0aW1lcyB0aGlzIGlzIHRoZQor
ICAgIHNhbWUgYXMgdGhlIGBwcmV2aW91c0NvbnRleHRgLCBidXQgaW4gY2FzZXMgd2hlcmUgdGhp
cyB2aWV3IGhhcyBiZWVuCisgICAgZ2VuZXJhdGVkIGZvciBwYXRocyB0aGF0IHN0YXJ0IHdpdGgg
YSBrZXl3b3JkIHN1Y2ggYXMgYHZpZXdgIG9yCisgICAgYGNvbnRyb2xsZXJgLCB0aGUgcGF0aCBy
b290IHdpbGwgYmUgdGhhdCByZXNvbHZlZCBvYmplY3QuCisKKyAgICBAcHJvcGVydHkgcGF0aFJv
b3QKKyAgICBAdHlwZSBPYmplY3QKKyAgKi8KKyAgcGF0aFJvb3Q6IG51bGwsCisKKyAgbm9ybWFs
aXplZFZhbHVlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICB2YXIgcGF0aCA9IGdl
dCh0aGlzLCAncGF0aCcpLAorICAgICAgICBwYXRoUm9vdCAgPSBnZXQodGhpcywgJ3BhdGhSb290
JyksCisgICAgICAgIHZhbHVlTm9ybWFsaXplciA9IGdldCh0aGlzLCAndmFsdWVOb3JtYWxpemVy
RnVuYycpLAorICAgICAgICByZXN1bHQsIHRlbXBsYXRlRGF0YTsKKworICAgIC8vIFVzZSB0aGUg
cGF0aFJvb3QgYXMgdGhlIHJlc3VsdCBpZiBubyBwYXRoIGlzIHByb3ZpZGVkLiBUaGlzCisgICAg
Ly8gaGFwcGVucyBpZiB0aGUgcGF0aCBpcyBgdGhpc2AsIHdoaWNoIGdldHMgbm9ybWFsaXplZCBp
bnRvCisgICAgLy8gYSBgcGF0aFJvb3RgIG9mIHRoZSBjdXJyZW50IEhhbmRsZWJhcnMgY29udGV4
dCBhbmQgYSBwYXRoCisgICAgLy8gb2YgYCcnYC4KKyAgICBpZiAocGF0aCA9PT0gJycpIHsKKyAg
ICAgIHJlc3VsdCA9IHBhdGhSb290OworICAgIH0gZWxzZSB7CisgICAgICB0ZW1wbGF0ZURhdGEg
PSBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOworICAgICAgcmVzdWx0ID0gaGFuZGxlYmFyc0dl
dChwYXRoUm9vdCwgcGF0aCwgeyBkYXRhOiB0ZW1wbGF0ZURhdGEgfSk7CisgICAgfQorCisgICAg
cmV0dXJuIHZhbHVlTm9ybWFsaXplciA/IHZhbHVlTm9ybWFsaXplcihyZXN1bHQpIDogcmVzdWx0
OworICB9KS5wcm9wZXJ0eSgncGF0aCcsICdwYXRoUm9vdCcsICd2YWx1ZU5vcm1hbGl6ZXJGdW5j
Jykudm9sYXRpbGUoKSwKKworICByZXJlbmRlcklmTmVlZGVkOiBmdW5jdGlvbigpIHsKKyAgICB0
aGlzLmN1cnJlbnRTdGF0ZS5yZXJlbmRlcklmTmVlZGVkKHRoaXMpOworICB9LAorCisgIC8qKgor
ICAgIERldGVybWluZXMgd2hpY2ggdGVtcGxhdGUgdG8gaW52b2tlLCBzZXRzIHVwIHRoZSBjb3Jy
ZWN0IHN0YXRlIGJhc2VkIG9uCisgICAgdGhhdCBsb2dpYywgdGhlbiBpbnZva2VzIHRoZSBkZWZh
dWx0IGBFbWJlci5WaWV3YCBgcmVuZGVyYCBpbXBsZW1lbnRhdGlvbi4KKworICAgIFRoaXMgbWV0
aG9kIHdpbGwgZmlyc3QgbG9vayB1cCB0aGUgYHBhdGhgIGtleSBvbiBgcGF0aFJvb3RgLAorICAg
IHRoZW4gcGFzcyB0aGF0IHZhbHVlIHRvIHRoZSBgc2hvdWxkRGlzcGxheUZ1bmNgIGZ1bmN0aW9u
LiBJZiB0aGF0IHJldHVybnMKKyAgICBgdHJ1ZSxgIHRoZSBgZGlzcGxheVRlbXBsYXRlYCBmdW5j
dGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRvIERPTS4gT3RoZXJ3aXNlLAorICAgIGBpbnZlcnNlVGVt
cGxhdGVgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgcmVuZGVyZWQuCisKKyAgICBGb3IgZXhhbXBs
ZSwgaWYgdGhpcyBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIHJlcHJlc2VudGVkIHRoZSBg
e3sjd2l0aAorICAgIGZvb319YCBoZWxwZXIsIGl0IHdvdWxkIGxvb2sgdXAgdGhlIGBmb29gIHBy
b3BlcnR5IG9mIGl0cyBjb250ZXh0LCBhbmQKKyAgICBgc2hvdWxkRGlzcGxheUZ1bmNgIHdvdWxk
IGFsd2F5cyByZXR1cm4gdHJ1ZS4gVGhlIG9iamVjdCBmb3VuZCBieSBsb29raW5nCisgICAgdXAg
YGZvb2Agd291bGQgYmUgcGFzc2VkIHRvIGBkaXNwbGF5VGVtcGxhdGVgLgorCisgICAgQG1ldGhv
ZCByZW5kZXIKKyAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyCisgICovCisg
IHJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7CisgICAgLy8gSWYgbm90IGludm9rZWQgdmlhIGEg
dHJpcGxlLW11c3RhY2hlICh7e3tmb299fX0pLCBlc2NhcGUKKyAgICAvLyB0aGUgY29udGVudCBv
ZiB0aGUgdGVtcGxhdGUuCisgICAgdmFyIGVzY2FwZSA9IGdldCh0aGlzLCAnaXNFc2NhcGVkJyk7
CisKKyAgICB2YXIgc2hvdWxkRGlzcGxheSA9IGdldCh0aGlzLCAnc2hvdWxkRGlzcGxheUZ1bmMn
KSwKKyAgICAgICAgcHJlc2VydmVDb250ZXh0ID0gZ2V0KHRoaXMsICdwcmVzZXJ2ZUNvbnRleHQn
KSwKKyAgICAgICAgY29udGV4dCA9IGdldCh0aGlzLCAncHJldmlvdXNDb250ZXh0Jyk7CisKKyAg
ICB2YXIgaW52ZXJzZVRlbXBsYXRlID0gZ2V0KHRoaXMsICdpbnZlcnNlVGVtcGxhdGUnKSwKKyAg
ICAgICAgZGlzcGxheVRlbXBsYXRlID0gZ2V0KHRoaXMsICdkaXNwbGF5VGVtcGxhdGUnKTsKKwor
ICAgIHZhciByZXN1bHQgPSBnZXQodGhpcywgJ25vcm1hbGl6ZWRWYWx1ZScpOworICAgIHRoaXMu
X2xhc3ROb3JtYWxpemVkVmFsdWUgPSByZXN1bHQ7CisKKyAgICAvLyBGaXJzdCwgdGVzdCB0aGUg
Y29uZGl0aW9uYWwgdG8gc2VlIGlmIHdlIHNob3VsZAorICAgIC8vIHJlbmRlciB0aGUgdGVtcGxh
dGUgb3Igbm90LgorICAgIGlmIChzaG91bGREaXNwbGF5KHJlc3VsdCkpIHsKKyAgICAgIHNldCh0
aGlzLCAndGVtcGxhdGUnLCBkaXNwbGF5VGVtcGxhdGUpOworCisgICAgICAvLyBJZiB3ZSBhcmUg
cHJlc2VydmluZyB0aGUgY29udGV4dCAoZm9yIGV4YW1wbGUsIGlmIHRoaXMKKyAgICAgIC8vIGlz
IGFuICNpZiBibG9jaywgY2FsbCB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc2FtZSBvYmplY3QuCisg
ICAgICBpZiAocHJlc2VydmVDb250ZXh0KSB7CisgICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQn
LCBjb250ZXh0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UsIGRldGVybWlu
ZSBpZiB0aGlzIGlzIGEgYmxvY2sgYmluZCBvciBub3QuCisgICAgICAvLyBJZiBzbywgcGFzcyB0
aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgdGVtcGxhdGUKKyAgICAgICAgaWYgKGRpc3BsYXlU
ZW1wbGF0ZSkgeworICAgICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCByZXN1bHQpOworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJpbmQgYmxvY2ssIGp1c3Qg
cHVzaCB0aGUgcmVzdWx0IG9mIHRoZQorICAgICAgICAvLyBleHByZXNzaW9uIHRvIHRoZSByZW5k
ZXIgY29udGV4dCBhbmQgcmV0dXJuLgorICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwg
cmVzdWx0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICIiOworICAgICAg
ICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcp
KSB7CisgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgICB9CisK
KyAgICAgICAgICBpZiAoZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBl
RXhwcmVzc2lvbihyZXN1bHQpOyB9CisgICAgICAgICAgYnVmZmVyLnB1c2gocmVzdWx0KTsKKyAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGludmVy
c2VUZW1wbGF0ZSkgeworICAgICAgc2V0KHRoaXMsICd0ZW1wbGF0ZScsIGludmVyc2VUZW1wbGF0
ZSk7CisKKyAgICAgIGlmIChwcmVzZXJ2ZUNvbnRleHQpIHsKKyAgICAgICAgc2V0KHRoaXMsICdf
Y29udGV4dCcsIGNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0KHRoaXMsICdf
Y29udGV4dCcsIHJlc3VsdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNldCh0aGlz
LCAndGVtcGxhdGUnLCBmdW5jdGlvbigpIHsgcmV0dXJuICcnOyB9KTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdGhpcy5fc3VwZXIoYnVmZmVyKTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVu
Y3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFy
cworKi8KKwordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBmbXQgPSBFbWJl
ci5TdHJpbmcuZm10OwordmFyIGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldCwg
bm9ybWFsaXplUGF0aCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aDsKK3ZhciBmb3JF
YWNoID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsKKwordmFyIEVtYmVySGFuZGxlYmFy
cyA9IEVtYmVyLkhhbmRsZWJhcnMsIGhlbHBlcnMgPSBFbWJlckhhbmRsZWJhcnMuaGVscGVyczsK
KworLy8gQmluZHMgYSBwcm9wZXJ0eSBpbnRvIHRoZSBET00uIFRoaXMgd2lsbCBjcmVhdGUgYSBo
b29rIGluIERPTSB0aGF0IHRoZQorLy8gS1ZPIHN5c3RlbSB3aWxsIGxvb2sgZm9yIGFuZCB1cGRh
dGUgaWYgdGhlIHByb3BlcnR5IGNoYW5nZXMuCitmdW5jdGlvbiBiaW5kKHByb3BlcnR5LCBvcHRp
b25zLCBwcmVzZXJ2ZUNvbnRleHQsIHNob3VsZERpc3BsYXksIHZhbHVlTm9ybWFsaXplciwgY2hp
bGRQcm9wZXJ0aWVzKSB7CisgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhLAorICAgICAgZm4gPSBv
cHRpb25zLmZuLAorICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKKyAgICAgIHZpZXcg
PSBkYXRhLnZpZXcsCisgICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXMsCisgICAgICBub3JtYWxp
emVkLCBvYnNlcnZlciwgaTsKKworICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJyZW50
Q29udGV4dCwgcHJvcGVydHksIGRhdGEpOworCisgIC8vIFNldCB1cCBvYnNlcnZlcnMgZm9yIG9i
c2VydmFibGUgb2JqZWN0cworICBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiB0aGlzKSB7CisgICAg
aWYgKGRhdGEuaW5zaWRlR3JvdXApIHsKKyAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Cisg
ICAgICAgIEVtYmVyLnJ1bi5vbmNlKHZpZXcsICdyZXJlbmRlcicpOworICAgICAgfTsKKworICAg
ICAgdmFyIHRlbXBsYXRlLCBjb250ZXh0LCByZXN1bHQgPSBoYW5kbGViYXJzR2V0KGN1cnJlbnRD
b250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7CisKKyAgICAgIHJlc3VsdCA9IHZhbHVlTm9ybWFs
aXplcihyZXN1bHQpOworCisgICAgICBjb250ZXh0ID0gcHJlc2VydmVDb250ZXh0ID8gY3VycmVu
dENvbnRleHQgOiByZXN1bHQ7CisgICAgICBpZiAoc2hvdWxkRGlzcGxheShyZXN1bHQpKSB7Cisg
ICAgICAgIHRlbXBsYXRlID0gZm47CisgICAgICB9IGVsc2UgaWYgKGludmVyc2UpIHsKKyAgICAg
ICAgdGVtcGxhdGUgPSBpbnZlcnNlOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZShjb250ZXh0
LCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ3JlYXRl
IHRoZSB2aWV3IHRoYXQgd2lsbCB3cmFwIHRoZSBvdXRwdXQgb2YgdGhpcyB0ZW1wbGF0ZS9wcm9w
ZXJ0eQorICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgbmVhcmVzdCB2aWV3J3MgY2hpbGRWaWV3
cyBhcnJheS4KKyAgICAgIC8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBFbWJlci5fSGFuZGxl
YmFyc0JvdW5kVmlldyBmb3IgbW9yZS4KKyAgICAgIHZhciBiaW5kVmlldyA9IHZpZXcuY3JlYXRl
Q2hpbGRWaWV3KEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3LCB7CisgICAgICAgIHByZXNlcnZl
Q29udGV4dDogcHJlc2VydmVDb250ZXh0LAorICAgICAgICBzaG91bGREaXNwbGF5RnVuYzogc2hv
dWxkRGlzcGxheSwKKyAgICAgICAgdmFsdWVOb3JtYWxpemVyRnVuYzogdmFsdWVOb3JtYWxpemVy
LAorICAgICAgICBkaXNwbGF5VGVtcGxhdGU6IGZuLAorICAgICAgICBpbnZlcnNlVGVtcGxhdGU6
IGludmVyc2UsCisgICAgICAgIHBhdGg6IHByb3BlcnR5LAorICAgICAgICBwYXRoUm9vdDogY3Vy
cmVudENvbnRleHQsCisgICAgICAgIHByZXZpb3VzQ29udGV4dDogY3VycmVudENvbnRleHQsCisg
ICAgICAgIGlzRXNjYXBlZDogIW9wdGlvbnMuaGFzaC51bmVzY2FwZWQsCisgICAgICAgIHRlbXBs
YXRlRGF0YTogb3B0aW9ucy5kYXRhCisgICAgICB9KTsKKworICAgICAgdmlldy5hcHBlbmRDaGls
ZChiaW5kVmlldyk7CisKKyAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIEVt
YmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIGJpbmRWaWV3LCAncmVyZW5kZXJJZk5lZWRl
ZCcpOworICAgICAgfTsKKyAgICB9CisKKyAgICAvLyBPYnNlcnZlcyB0aGUgZ2l2ZW4gcHJvcGVy
dHkgb24gdGhlIGNvbnRleHQgYW5kCisgICAgLy8gdGVsbHMgdGhlIEVtYmVyLl9IYW5kbGViYXJz
Qm91bmRWaWV3IHRvIHJlLXJlbmRlci4gSWYgcHJvcGVydHkKKyAgICAvLyBpcyBhbiBlbXB0eSBz
dHJpbmcsIHdlIGFyZSBwcmludGluZyB0aGUgY3VycmVudCBjb250ZXh0CisgICAgLy8gb2JqZWN0
ICh7e3RoaXN9fSkgc28gdXBkYXRpbmcgaXQgaXMgbm90IG91ciByZXNwb25zaWJpbGl0eS4KKyAg
ICBpZiAobm9ybWFsaXplZC5wYXRoICE9PSAnJykgeworICAgICAgdmlldy5yZWdpc3Rlck9ic2Vy
dmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoLCBvYnNlcnZlcik7CisgICAgICBp
ZiAoY2hpbGRQcm9wZXJ0aWVzKSB7CisgICAgICAgIGZvciAoaT0wOyBpPGNoaWxkUHJvcGVydGll
cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxp
emVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCsnLicrY2hpbGRQcm9wZXJ0aWVzW2ldLCBvYnNlcnZl
cik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIG9i
amVjdCBpcyBub3Qgb2JzZXJ2YWJsZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAorICAgIC8v
IGJlIGRvbmUgd2l0aCBpdC4KKyAgICBkYXRhLmJ1ZmZlci5wdXNoKGhhbmRsZWJhcnNHZXQoY3Vy
cmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSk7CisgIH0KK30KKworZnVuY3Rpb24gc2lt
cGxlQmluZChwcm9wZXJ0eSwgb3B0aW9ucykgeworICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwK
KyAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCisgICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXMsCisg
ICAgICBub3JtYWxpemVkLCBvYnNlcnZlcjsKKworICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0
aChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIGRhdGEpOworCisgIC8vIFNldCB1cCBvYnNlcnZl
cnMgZm9yIG9ic2VydmFibGUgb2JqZWN0cworICBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiB0aGlz
KSB7CisgICAgaWYgKGRhdGEuaW5zaWRlR3JvdXApIHsKKyAgICAgIG9ic2VydmVyID0gZnVuY3Rp
b24oKSB7CisgICAgICAgIEVtYmVyLnJ1bi5vbmNlKHZpZXcsICdyZXJlbmRlcicpOworICAgICAg
fTsKKworICAgICAgdmFyIHJlc3VsdCA9IGhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHBy
b3BlcnR5LCBvcHRpb25zKTsKKyAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09
PSB1bmRlZmluZWQpIHsgcmVzdWx0ID0gIiI7IH0KKyAgICAgIGRhdGEuYnVmZmVyLnB1c2gocmVz
dWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGJpbmRWaWV3ID0gbmV3IEVtYmVyLl9TaW1w
bGVIYW5kbGViYXJzVmlldygKKyAgICAgICAgcHJvcGVydHksIGN1cnJlbnRDb250ZXh0LCAhb3B0
aW9ucy5oYXNoLnVuZXNjYXBlZCwgb3B0aW9ucy5kYXRhCisgICAgICApOworCisgICAgICBiaW5k
Vmlldy5fcGFyZW50VmlldyA9IHZpZXc7CisgICAgICB2aWV3LmFwcGVuZENoaWxkKGJpbmRWaWV3
KTsKKworICAgICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgRW1iZXIucnVuLnNj
aGVkdWxlT25jZSgncmVuZGVyJywgYmluZFZpZXcsICdyZXJlbmRlcicpOworICAgICAgfTsKKyAg
ICB9CisKKyAgICAvLyBPYnNlcnZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgb24gdGhlIGNvbnRleHQg
YW5kCisgICAgLy8gdGVsbHMgdGhlIEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3IHRvIHJlLXJl
bmRlci4gSWYgcHJvcGVydHkKKyAgICAvLyBpcyBhbiBlbXB0eSBzdHJpbmcsIHdlIGFyZSBwcmlu
dGluZyB0aGUgY3VycmVudCBjb250ZXh0CisgICAgLy8gb2JqZWN0ICh7e3RoaXN9fSkgc28gdXBk
YXRpbmcgaXQgaXMgbm90IG91ciByZXNwb25zaWJpbGl0eS4KKyAgICBpZiAobm9ybWFsaXplZC5w
YXRoICE9PSAnJykgeworICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKG5vcm1hbGl6ZWQucm9v
dCwgbm9ybWFsaXplZC5wYXRoLCBvYnNlcnZlcik7CisgICAgfQorICB9IGVsc2UgeworICAgIC8v
IFRoZSBvYmplY3QgaXMgbm90IG9ic2VydmFibGUsIHNvIGp1c3QgcmVuZGVyIGl0IG91dCBhbmQK
KyAgICAvLyBiZSBkb25lIHdpdGggaXQuCisgICAgZGF0YS5idWZmZXIucHVzaChoYW5kbGViYXJz
R2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucykpOworICB9Cit9CisKKy8qKgor
ICBAcHJpdmF0ZQorCisgICdfdHJpYWdlTXVzdGFjaGUnIGlzIHVzZWQgaW50ZXJuYWxseSBzZWxl
Y3QgYmV0d2VlbiBhIGJpbmRpbmcgYW5kIGhlbHBlciBmb3IKKyAgdGhlIGdpdmVuIGNvbnRleHQu
IFVudGlsIHRoaXMgcG9pbnQsIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGV0ZXJtaW5lIGlmIHRoZQor
ICBtdXN0YWNoZSBpcyBhIHByb3BlcnR5IHJlZmVyZW5jZSBvciBhIHJlZ3VsYXIgaGVscGVyIHJl
ZmVyZW5jZS4gVGhpcyB0cmlhZ2UKKyAgaGVscGVyIHJlc29sdmVzIHRoYXQuCisKKyAgVGhpcyB3
b3VsZCBub3QgYmUgdHlwaWNhbGx5IGludm9rZWQgYnkgZGlyZWN0bHkuCisKKyAgQG1ldGhvZCBf
dHJpYWdlTXVzdGFjaGUKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFt
IHtTdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5L2hlbHBlcklEIHRvIHRyaWFnZQorICBAcGFyYW0g
e0Z1bmN0aW9ufSBmbiBDb250ZXh0IHRvIHByb3ZpZGUgZm9yIHJlbmRlcmluZworICBAcmV0dXJu
IHtTdHJpbmd9IEhUTUwgc3RyaW5nCisqLworRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCdfdHJpYWdlTXVzdGFjaGUnLCBmdW5jdGlvbihwcm9wZXJ0eSwgZm4pIHsKKyAgRW1iZXIuYXNz
ZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgX3RyaWFn
ZU11c3RhY2hlIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPD0gMik7CisgIGlmIChoZWxwZXJz
W3Byb3BlcnR5XSkgeworICAgIHJldHVybiBoZWxwZXJzW3Byb3BlcnR5XS5jYWxsKHRoaXMsIGZu
KTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gaGVscGVycy5iaW5kLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgIH0KK30pOworCisvKioKKyAgQHByaXZhdGUKKworICBgYmluZGAgY2FuIGJl
IHVzZWQgdG8gZGlzcGxheSBhIHZhbHVlLCB0aGVuIHVwZGF0ZSB0aGF0IHZhbHVlIGlmIGl0Cisg
IGNoYW5nZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIHByaW50IHRoZSBgdGl0bGVg
IHByb3BlcnR5IG9mCisgIGBjb250ZW50YDoKKworICBgYGBoYW5kbGViYXJzCisgIHt7YmluZCAi
Y29udGVudC50aXRsZSJ9fQorICBgYGAKKworICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBgdGl0bGVg
IHByb3BlcnR5IGFzIGEgc3RyaW5nLCB0aGVuIGNyZWF0ZSBhIG5ldyBvYnNlcnZlcgorICBhdCB0
aGUgc3BlY2lmaWVkIHBhdGguIElmIGl0IGNoYW5nZXMsIGl0IHdpbGwgdXBkYXRlIHRoZSB2YWx1
ZSBpbiBET00uIE5vdGUKKyAgdGhhdCBpZiB5b3UgbmVlZCB0byBzdXBwb3J0IElFNyBhbmQgSUU4
IHlvdSBtdXN0IG1vZGlmeSB0aGUgbW9kZWwgb2JqZWN0cworICBwcm9wZXJ0aWVzIHVzaW5nIGBF
bWJlci5nZXQoKWAgYW5kIGBFbWJlci5zZXQoKWAgZm9yIHRoaXMgdG8gd29yayBhcyBpdAorICBy
ZWxpZXMgb24gRW1iZXIncyBLVk8gc3lzdGVtLiBGb3IgYWxsIG90aGVyIGJyb3dzZXJzIHRoaXMg
d2lsbCBiZSBoYW5kbGVkIGZvcgorICB5b3UgYXV0b21hdGljYWxseS4KKworICBAbWV0aG9kIGJp
bmQKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtTdHJpbmd9IHBy
b3BlcnR5IFByb3BlcnR5IHRvIGJpbmQKKyAgQHBhcmFtIHtGdW5jdGlvbn0gZm4gQ29udGV4dCB0
byBwcm92aWRlIGZvciByZW5kZXJpbmcKKyAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwor
Ki8KK0VtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYmluZCcsIGZ1bmN0aW9uKHByb3Bl
cnR5LCBvcHRpb25zKSB7CisgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwYXNzIG1vcmUgdGhh
biBvbmUgYXJndW1lbnQgdG8gdGhlIGJpbmQgaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA8PSAy
KTsKKworICB2YXIgY29udGV4dCA9IChvcHRpb25zLmNvbnRleHRzICYmIG9wdGlvbnMuY29udGV4
dHNbMF0pIHx8IHRoaXM7CisKKyAgaWYgKCFvcHRpb25zLmZuKSB7CisgICAgcmV0dXJuIHNpbXBs
ZUJpbmQuY2FsbChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7CisgIH0KKworICByZXR1cm4g
YmluZC5jYWxsKGNvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zLCBmYWxzZSwgZnVuY3Rpb24ocmVz
dWx0KSB7CisgICAgcmV0dXJuICFFbWJlci5pc05vbmUocmVzdWx0KTsKKyAgfSk7Cit9KTsKKwor
LyoqCisgIEBwcml2YXRlCisKKyAgVXNlIHRoZSBgYm91bmRJZmAgaGVscGVyIHRvIGNyZWF0ZSBh
IGNvbmRpdGlvbmFsIHRoYXQgcmUtZXZhbHVhdGVzCisgIHdoZW5ldmVyIHRoZSB0cnV0aGluZXNz
IG9mIHRoZSBib3VuZCB2YWx1ZSBjaGFuZ2VzLgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3sjYm91
bmRJZiAiY29udGVudC5zaG91bGREaXNwbGF5VGl0bGUifX0KKyAgICB7e2NvbnRlbnQudGl0bGV9
fQorICB7ey9ib3VuZElmfX0KKyAgYGBgCisKKyAgQG1ldGhvZCBib3VuZElmCisgIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0
eSB0byBiaW5kCisgIEBwYXJhbSB7RnVuY3Rpb259IGZuIENvbnRleHQgdG8gcHJvdmlkZSBmb3Ig
cmVuZGVyaW5nCisgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKKyovCitFbWJlckhhbmRs
ZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2JvdW5kSWYnLCBmdW5jdGlvbihwcm9wZXJ0eSwgZm4pIHsK
KyAgdmFyIGNvbnRleHQgPSAoZm4uY29udGV4dHMgJiYgZm4uY29udGV4dHNbMF0pIHx8IHRoaXM7
CisgIHZhciBmdW5jID0gZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgdmFyIHRydXRoeSA9IHJlc3Vs
dCAmJiBnZXQocmVzdWx0LCAnaXNUcnV0aHknKTsKKyAgICBpZiAodHlwZW9mIHRydXRoeSA9PT0g
J2Jvb2xlYW4nKSB7IHJldHVybiB0cnV0aHk7IH0KKworICAgIGlmIChFbWJlci5pc0FycmF5KHJl
c3VsdCkpIHsKKyAgICAgIHJldHVybiBnZXQocmVzdWx0LCAnbGVuZ3RoJykgIT09IDA7CisgICAg
fSBlbHNlIHsKKyAgICAgIHJldHVybiAhIXJlc3VsdDsKKyAgICB9CisgIH07CisKKyAgcmV0dXJu
IGJpbmQuY2FsbChjb250ZXh0LCBwcm9wZXJ0eSwgZm4sIHRydWUsIGZ1bmMsIGZ1bmMsIFsnaXNU
cnV0aHknLCAnbGVuZ3RoJ10pOworfSk7CisKKy8qKgorICBAbWV0aG9kIHdpdGgKKyAgQGZvciBF
bWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4dAorICBA
cGFyYW0ge0hhc2h9IG9wdGlvbnMKKyAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZworKi8K
K0VtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uKGNvbnRleHQs
IG9wdGlvbnMpIHsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHsKKyAgICB2YXIga2V5
d29yZE5hbWUsIHBhdGgsIHJvb3RQYXRoLCBub3JtYWxpemVkOworCisgICAgRW1iZXIuYXNzZXJ0
KCJJZiB5b3UgcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSB3aXRoIGhlbHBlciwg
aXQgbXVzdCBiZSBpbiB0aGUgZm9ybSAjd2l0aCBmb28gYXMgYmFyIiwgYXJndW1lbnRzWzFdID09
PSAiYXMiKTsKKyAgICBvcHRpb25zID0gYXJndW1lbnRzWzNdOworICAgIGtleXdvcmROYW1lID0g
YXJndW1lbnRzWzJdOworICAgIHBhdGggPSBhcmd1bWVudHNbMF07CisKKyAgICBFbWJlci5hc3Nl
cnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0byB0aGUgd2l0aCBoZWxwZXIiLCBvcHRpb25zLmZu
ICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7CisKKyAgICBpZiAoRW1iZXIu
aXNHbG9iYWxQYXRoKHBhdGgpKSB7CisgICAgICBFbWJlci5iaW5kKG9wdGlvbnMuZGF0YS5rZXl3
b3Jkcywga2V5d29yZE5hbWUsIHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBub3JtYWxpemVk
ID0gbm9ybWFsaXplUGF0aCh0aGlzLCBwYXRoLCBvcHRpb25zLmRhdGEpOworICAgICAgcGF0aCA9
IG5vcm1hbGl6ZWQucGF0aDsKKyAgICAgIHJvb3RQYXRoID0gbm9ybWFsaXplZC5yb290OworCisg
ICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCB5b3UgY2Fubm90
IGJpbmQgc2VwYXJhdGUgb2JqZWN0cworICAgICAgLy8gdG9nZXRoZXIuIFdoZW4gd2UgaW1wbGVt
ZW50IHRoYXQgZnVuY3Rpb25hbGl0eSwgd2Ugc2hvdWxkIHVzZSBpdCBoZXJlLgorICAgICAgdmFy
IGNvbnRleHRLZXkgPSBFbWJlci4kLmV4cGFuZG8gKyBFbWJlci5ndWlkRm9yKHJvb3RQYXRoKTsK
KyAgICAgIG9wdGlvbnMuZGF0YS5rZXl3b3Jkc1tjb250ZXh0S2V5XSA9IHJvb3RQYXRoOworCisg
ICAgICAvLyBpZiB0aGUgcGF0aCBpcyAnJyAoInRoaXMiKSwganVzdCBiaW5kIGRpcmVjdGx5IHRv
IHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgIHZhciBjb250ZXh0UGF0aCA9IHBhdGggPyBjb250
ZXh0S2V5ICsgJy4nICsgcGF0aCA6IGNvbnRleHRLZXk7CisgICAgICBFbWJlci5iaW5kKG9wdGlv
bnMuZGF0YS5rZXl3b3Jkcywga2V5d29yZE5hbWUsIGNvbnRleHRQYXRoKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gYmluZC5jYWxsKHRoaXMsIHBhdGgsIG9wdGlvbnMsIHRydWUsIGZ1bmN0aW9uKHJl
c3VsdCkgeworICAgICAgcmV0dXJuICFFbWJlci5pc05vbmUocmVzdWx0KTsKKyAgICB9KTsKKyAg
fSBlbHNlIHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3RseSBvbmUgYXJn
dW1lbnQgdG8gdGhlIHdpdGggaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7CisgICAg
RW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHdpdGggaGVscGVyIiwg
b3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZNLm5vb3ApOworICAgIHJl
dHVybiBoZWxwZXJzLmJpbmQuY2FsbChvcHRpb25zLmNvbnRleHRzWzBdLCBjb250ZXh0LCBvcHRp
b25zKTsKKyAgfQorfSk7CisKKworLyoqCisgIFNlZSBgYm91bmRJZmAKKworICBAbWV0aG9kIGlm
CisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7RnVuY3Rpb259IGNv
bnRleHQKKyAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBz
dHJpbmcKKyovCitFbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lmJywgZnVuY3Rpb24o
Y29udGV4dCwgb3B0aW9ucykgeworICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3Rs
eSBvbmUgYXJndW1lbnQgdG8gdGhlIGlmIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPT09IDIp
OworICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0byB0aGUgaWYgaGVscGVy
Iiwgb3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZNLm5vb3ApOworCisg
IHJldHVybiBoZWxwZXJzLmJvdW5kSWYuY2FsbChvcHRpb25zLmNvbnRleHRzWzBdLCBjb250ZXh0
LCBvcHRpb25zKTsKK30pOworCisvKioKKyAgQG1ldGhvZCB1bmxlc3MKKyAgQGZvciBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4dAorICBAcGFyYW0g
e0hhc2h9IG9wdGlvbnMKKyAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZworKi8KK0VtYmVy
SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24oY29udGV4dCwgb3B0
aW9ucykgeworICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3RseSBvbmUgYXJndW1l
bnQgdG8gdGhlIHVubGVzcyBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKKyAgRW1i
ZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHVubGVzcyBoZWxwZXIiLCBv
cHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7CisKKyAgdmFy
IGZuID0gb3B0aW9ucy5mbiwgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZTsKKworICBvcHRpb25z
LmZuID0gaW52ZXJzZTsKKyAgb3B0aW9ucy5pbnZlcnNlID0gZm47CisKKyAgcmV0dXJuIGhlbHBl
cnMuYm91bmRJZi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0sIGNvbnRleHQsIG9wdGlvbnMpOwor
fSk7CisKKy8qKgorICBgYmluZEF0dHJgIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgYmluZGluZyBi
ZXR3ZWVuIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMgYW5kCisgIEVtYmVyIG9iamVjdHMuIEZvciBl
eGFtcGxlOgorCisgIGBgYGhhbmRsZWJhcnMKKyAgPGltZyB7e2JpbmRBdHRyIHNyYz0iaW1hZ2VV
cmwiIGFsdD0iaW1hZ2VUaXRsZSJ9fT4KKyAgYGBgCisKKyAgVGhlIGFib3ZlIGhhbmRsZWJhcnMg
dGVtcGxhdGUgd2lsbCBmaWxsIHRoZSBgPGltZz5gJ3MgYHNyY2AgYXR0cmlidXRlIHdpbGwKKyAg
dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIHdpdGggYCJpbWFnZVVybCJgIGFu
ZCBpdHMgYGFsdGAKKyAgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBy
ZWZlcmVuY2VkIHdpdGggYCJpbWFnZVRpdGxlImAuCisKKyAgSWYgdGhlIHJlbmRlcmluZyBjb250
ZXh0IG9mIHRoaXMgdGVtcGxhdGUgaXMgdGhlIGZvbGxvd2luZyBvYmplY3Q6CisKKyAgYGBgamF2
YXNjcmlwdAorICB7CisgICAgaW1hZ2VVcmw6ICdodHRwOi8vbG9sY2F0cy5pbmZvL2hhei1hLWZ1
bm55JywKKyAgICBpbWFnZVRpdGxlOiAnQSBodW1vcm91cyBpbWFnZSBvZiBhIGNhdCcKKyAgfQor
ICBgYGAKKworICBUaGUgcmVzdWx0aW5nIEhUTUwgb3V0cHV0IHdpbGwgYmU6CisKKyAgYGBgaHRt
bAorICA8aW1nIHNyYz0iaHR0cDovL2xvbGNhdHMuaW5mby9oYXotYS1mdW5ueSIgYWx0PSJBIGh1
bW9yb3VzIGltYWdlIG9mIGEgY2F0Ij4KKyAgYGBgCisKKyAgYGJpbmRBdHRyYCBjYW5ub3QgcmVk
ZWNsYXJlIGV4aXN0aW5nIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMuIFRoZSB1c2Ugb2YgYHNyY2AK
KyAgaW4gdGhlIGZvbGxvd2luZyBgYmluZEF0dHJgIGV4YW1wbGUgd2lsbCBiZSBpZ25vcmVkIGFu
ZCB0aGUgaGFyZCBjb2RlZCB2YWx1ZQorICBvZiBgc3JjPSIvZmFpbHdoYWxlLmdpZiJgIHdpbGwg
dGFrZSBwcmVjZWRlbmNlOgorCisgIGBgYGhhbmRsZWJhcnMKKyAgPGltZyBzcmM9Ii9mYWlsd2hh
bGUuZ2lmIiB7e2JpbmRBdHRyIHNyYz0iaW1hZ2VVcmwiIGFsdD0iaW1hZ2VUaXRsZSJ9fT4KKyAg
YGBgCisKKyAgIyMjIGBiaW5kQXR0cmAgYW5kIHRoZSBgY2xhc3NgIGF0dHJpYnV0ZQorCisgIGBi
aW5kQXR0cmAgc3VwcG9ydHMgYSBzcGVjaWFsIHN5bnRheCBmb3IgaGFuZGxpbmcgYSBudW1iZXIg
b2YgY2FzZXMgdW5pcXVlCisgIHRvIHRoZSBgY2xhc3NgIERPTSBlbGVtZW50IGF0dHJpYnV0ZS4g
VGhlIGBjbGFzc2AgYXR0cmlidXRlIGNvbWJpbmVzCisgIG11bHRpcGxlIGRpc2NyZWV0IHZhbHVl
cyBpbnRvIGEgc2luZ2xlIGF0dHJpYnV0ZSBhcyBhIHNwYWNlLWRlbGltaXRlZAorICBsaXN0IG9m
IHN0cmluZ3MuIEVhY2ggc3RyaW5nIGNhbiBiZToKKworICAqIGEgc3RyaW5nIHJldHVybiB2YWx1
ZSBvZiBhbiBvYmplY3QncyBwcm9wZXJ0eS4KKyAgKiBhIGJvb2xlYW4gcmV0dXJuIHZhbHVlIG9m
IGFuIG9iamVjdCdzIHByb3BlcnR5CisgICogYSBoYXJkLWNvZGVkIHZhbHVlCisKKyAgQSBzdHJp
bmcgcmV0dXJuIHZhbHVlIHdvcmtzIGlkZW50aWNhbGx5IHRvIG90aGVyIHVzZXMgb2YgYGJpbmRB
dHRyYC4gVGhlCisgIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2lsbCBiZWNvbWUgdGhl
IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIEZvcgorICBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHZp
ZXcgYW5kIHRlbXBsYXRlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZp
ZXcuZXh0ZW5kKHsKKyAgICAgIHNvbWVQcm9wZXJ0eTogZnVuY3Rpb24oKXsKKyAgICAgICAgcmV0
dXJuICJhVmFsdWUiOworICAgICAgfS5wcm9wZXJ0eSgpCisgICAgfSkKKyAgYGBgCisKKyAgYGBg
aGFuZGxlYmFycworICA8aW1nIHt7YmluZEF0dHIgY2xhc3M9InZpZXcuc29tZVByb3BlcnR5fX0+
CisgIGBgYAorCisgIFJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIHJlbmRlcmVkIG91dHB1dDoKKwor
ICBgYGBodG1sIAorICA8aW1nIGNsYXNzPSJhVmFsdWUiPgorICBgYGAKKworICBBIGJvb2xlYW4g
cmV0dXJuIHZhbHVlIHdpbGwgaW5zZXJ0IGEgc3BlY2lmaWVkIGNsYXNzIG5hbWUgaWYgdGhlIHBy
b3BlcnR5CisgIHJldHVybnMgYHRydWVgIGFuZCByZW1vdmUgdGhlIGNsYXNzIG5hbWUgaWYgdGhl
IHByb3BlcnR5IHJldHVybnMgYGZhbHNlYC4KKworICBBIGNsYXNzIG5hbWUgaXMgcHJvdmlkZWQg
dmlhIHRoZSBzeW50YXggCisgIGBzb21lUHJvcGVydHlOYW1lOmNsYXNzLW5hbWUtaWYtdHJ1ZWAu
CisKKyAgYGBgamF2YXNjcmlwdAorICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBz
b21lQm9vbDogdHJ1ZQorICB9KQorICBgYGAKKworICBgYGBoYW5kbGViYXJzCisgIDxpbWcge3ti
aW5kQXR0ciBjbGFzcz0idmlldy5zb21lQm9vbDpjbGFzcy1uYW1lLWlmLXRydWUifX0+CisgIGBg
YAorCisgIFJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIHJlbmRlcmVkIG91dHB1dDoKKworICBgYGBo
dG1sCisgIDxpbWcgY2xhc3M9ImNsYXNzLW5hbWUtaWYtdHJ1ZSI+CisgIGBgYAorCisgIEFuIGFk
ZGl0aW9uYWwgc2VjdGlvbiBvZiB0aGUgYmluZGluZyBjYW4gYmUgcHJvdmlkZWQgaWYgeW91IHdh
bnQgdG8KKyAgcmVwbGFjZSB0aGUgZXhpc3RpbmcgY2xhc3MgaW5zdGVhZCBvZiByZW1vdmluZyBp
dCB3aGVuIHRoZSBib29sZWFuCisgIHZhbHVlIGNoYW5nZXM6CisKKyAgYGBgaGFuZGxlYmFycwor
ICA8aW1nIHt7YmluZEF0dHIgY2xhc3M9InZpZXcuc29tZUJvb2w6Y2xhc3MtbmFtZS1pZi10cnVl
OmNsYXNzLW5hbWUtaWYtZmFsc2UifX0+CisgIGBgYAorCisgIEEgaGFyZC1jb2RlZCB2YWx1ZSBj
YW4gYmUgdXNlZCBieSBwcmVwZW5kaW5nIGA6YCB0byB0aGUgZGVzaXJlZAorICBjbGFzcyBuYW1l
OiBgOmNsYXNzLW5hbWUtdG8tYWx3YXlzLWFwcGx5YC4KKworICBgYGBoYW5kbGViYXJzCisgIDxp
bWcge3tiaW5kQXR0ciBjbGFzcz0iOmNsYXNzLW5hbWUtdG8tYWx3YXlzLWFwcGx5In19PgorICBg
YGAKKworICBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgcmVuZGVyZWQgb3V0cHV0OgorCisgIGBg
YGh0bWwKKyAgPGltZyBjbGFzcz0iOmNsYXNzLW5hbWUtdG8tYWx3YXlzLWFwcGx5Ij4KKyAgYGBg
CisKKyAgQWxsIHRocmVlIHN0cmF0ZWdpZXMgLSBzdHJpbmcgcmV0dXJuIHZhbHVlLCBib29sZWFu
IHJldHVybiB2YWx1ZSwgYW5kCisgIGhhcmQtY29kZWQgdmFsdWUg4oCTIGNhbiBiZSBjb21iaW5l
ZCBpbiBhIHNpbmdsZSBkZWNsYXJhdGlvbjoKKworICBgYGBoYW5kbGViYXJzCisgIDxpbWcge3ti
aW5kQXR0ciBjbGFzcz0iOmNsYXNzLW5hbWUtdG8tYWx3YXlzLWFwcGx5IHZpZXcuc29tZUJvb2w6
Y2xhc3MtbmFtZS1pZi10cnVlIHZpZXcuc29tZVByb3BlcnR5In19PgorICBgYGAKKworICBAbWV0
aG9kIGJpbmRBdHRyCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7
SGFzaH0gb3B0aW9ucworICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCisqLworRW1iZXJI
YW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdiaW5kQXR0cicsIGZ1bmN0aW9uKG9wdGlvbnMpIHsK
KworICB2YXIgYXR0cnMgPSBvcHRpb25zLmhhc2g7CisKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVz
dCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBoYXNoIGFyZ3VtZW50IHRvIGJpbmRBdHRyIiwgISFFbWJl
ci5rZXlzKGF0dHJzKS5sZW5ndGgpOworCisgIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7
CisgIHZhciByZXQgPSBbXTsKKyAgdmFyIGN0eCA9IHRoaXM7CisKKyAgLy8gR2VuZXJhdGUgYSB1
bmlxdWUgaWQgZm9yIHRoaXMgZWxlbWVudC4gVGhpcyB3aWxsIGJlIGFkZGVkIGFzIGEKKyAgLy8g
ZGF0YSBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQgc28gaXQgY2FuIGJlIGxvb2tlZCB1cCB3aGVu
CisgIC8vIHRoZSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2VzLgorICB2YXIgZGF0YUlkID0gKytFbWJl
ci51dWlkOworCisgIC8vIEhhbmRsZSBjbGFzc2VzIGRpZmZlcmVudGx5LCBhcyB3ZSBjYW4gYmlu
ZCBtdWx0aXBsZSBjbGFzc2VzCisgIHZhciBjbGFzc0JpbmRpbmdzID0gYXR0cnNbJ2NsYXNzJ107
CisgIGlmIChjbGFzc0JpbmRpbmdzICE9PSBudWxsICYmIGNsYXNzQmluZGluZ3MgIT09IHVuZGVm
aW5lZCkgeworICAgIHZhciBjbGFzc1Jlc3VsdHMgPSBFbWJlckhhbmRsZWJhcnMuYmluZENsYXNz
ZXModGhpcywgY2xhc3NCaW5kaW5ncywgdmlldywgZGF0YUlkLCBvcHRpb25zKTsKKworICAgIHJl
dC5wdXNoKCdjbGFzcz0iJyArIEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihjbGFz
c1Jlc3VsdHMuam9pbignICcpKSArICciJyk7CisgICAgZGVsZXRlIGF0dHJzWydjbGFzcyddOwor
ICB9CisKKyAgdmFyIGF0dHJLZXlzID0gRW1iZXIua2V5cyhhdHRycyk7CisKKyAgLy8gRm9yIGVh
Y2ggYXR0cmlidXRlIHBhc3NlZCwgY3JlYXRlIGFuIG9ic2VydmVyIGFuZCBlbWl0IHRoZQorICAv
LyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBhbiBhdHRyaWJ1dGUuCisgIGZvckVh
Y2guY2FsbChhdHRyS2V5cywgZnVuY3Rpb24oYXR0cikgeworICAgIHZhciBwYXRoID0gYXR0cnNb
YXR0cl0sCisgICAgICAgIG5vcm1hbGl6ZWQ7CisKKyAgICBFbWJlci5hc3NlcnQoZm10KCJZb3Ug
bXVzdCBwcm92aWRlIGEgU3RyaW5nIGZvciBhIGJvdW5kIGF0dHJpYnV0ZSwgbm90ICVAIiwgW3Bh
dGhdKSwgdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKTsKKworICAgIG5vcm1hbGl6ZWQgPSBub3Jt
YWxpemVQYXRoKGN0eCwgcGF0aCwgb3B0aW9ucy5kYXRhKTsKKworICAgIHZhciB2YWx1ZSA9IChw
YXRoID09PSAndGhpcycpID8gbm9ybWFsaXplZC5yb290IDogaGFuZGxlYmFyc0dldChjdHgsIHBh
dGgsIG9wdGlvbnMpLAorICAgICAgICB0eXBlID0gRW1iZXIudHlwZU9mKHZhbHVlKTsKKworICAg
IEVtYmVyLmFzc2VydChmbXQoIkF0dHJpYnV0ZXMgbXVzdCBiZSBudW1iZXJzLCBzdHJpbmdzIG9y
IGJvb2xlYW5zLCBub3QgJUAiLCBbdmFsdWVdKSwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09
IHVuZGVmaW5lZCB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0
eXBlID09PSAnYm9vbGVhbicpOworCisgICAgdmFyIG9ic2VydmVyLCBpbnZva2VyOworCisgICAg
b2JzZXJ2ZXIgPSBmdW5jdGlvbiBvYnNlcnZlcigpIHsKKyAgICAgIHZhciByZXN1bHQgPSBoYW5k
bGViYXJzR2V0KGN0eCwgcGF0aCwgb3B0aW9ucyk7CisKKyAgICAgIEVtYmVyLmFzc2VydChmbXQo
IkF0dHJpYnV0ZXMgbXVzdCBiZSBudW1iZXJzLCBzdHJpbmdzIG9yIGJvb2xlYW5zLCBub3QgJUAi
LCBbcmVzdWx0XSksIHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCB8fCB0
eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8
fCB0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbicpOworCisgICAgICB2YXIgZWxlbSA9IHZpZXcu
JCgiW2RhdGEtYmluZGF0dHItIiArIGRhdGFJZCArICI9JyIgKyBkYXRhSWQgKyAiJ10iKTsKKwor
ICAgICAgLy8gSWYgd2UgYXJlbid0IGFibGUgdG8gZmluZCB0aGUgZWxlbWVudCwgaXQgbWVhbnMg
dGhlIGVsZW1lbnQKKyAgICAgIC8vIHRvIHdoaWNoIHdlIHdlcmUgYm91bmQgaGFzIGJlZW4gcmVt
b3ZlZCBmcm9tIHRoZSB2aWV3LgorICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBjYW4gYXNzdW1l
IHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiByZS1yZW5kZXJlZAorICAgICAgLy8gYW5kIHdlIG5lZWQg
dG8gY2xlYW4gdXAgdGhlIG9ic2VydmVyLgorICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubGVuZ3Ro
ID09PSAwKSB7CisgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwg
bm9ybWFsaXplZC5wYXRoLCBpbnZva2VyKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisg
ICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MoZWxlbSwgYXR0ciwgcmVzdWx0
KTsKKyAgICB9OworCisgICAgaW52b2tlciA9IGZ1bmN0aW9uKCkgeworICAgICAgRW1iZXIucnVu
LnNjaGVkdWxlT25jZSgncmVuZGVyJywgb2JzZXJ2ZXIpOworICAgIH07CisKKyAgICAvLyBBZGQg
YW4gb2JzZXJ2ZXIgdG8gdGhlIHZpZXcgZm9yIHdoZW4gdGhlIHByb3BlcnR5IGNoYW5nZXMuCisg
ICAgLy8gV2hlbiB0aGUgb2JzZXJ2ZXIgZmlyZXMsIGZpbmQgdGhlIGVsZW1lbnQgdXNpbmcgdGhl
CisgICAgLy8gdW5pcXVlIGRhdGEgaWQgYW5kIHVwZGF0ZSB0aGUgYXR0cmlidXRlIHRvIHRoZSBu
ZXcgdmFsdWUuCisgICAgaWYgKHBhdGggIT09ICd0aGlzJykgeworICAgICAgdmlldy5yZWdpc3Rl
ck9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoLCBpbnZva2VyKTsKKyAg
ICB9CisKKyAgICAvLyBpZiB0aGlzIGNoYW5nZXMsIGFsc28gY2hhbmdlIHRoZSBsb2dpYyBpbiBl
bWJlci12aWV3cy9saWIvdmlld3Mvdmlldy5qcworICAgIGlmICgodHlwZSA9PT0gJ3N0cmluZycg
fHwgKHR5cGUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpKSkgeworICAgICAgcmV0LnB1
c2goYXR0ciArICc9IicgKyBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odmFsdWUp
ICsgJyInKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGUgPT09ICdib29sZWFuJykgewor
ICAgICAgLy8gVGhlIGRldmVsb3BlciBjb250cm9scyB0aGUgYXR0ciBuYW1lLCBzbyBpdCBzaG91
bGQgYWx3YXlzIGJlIHNhZmUKKyAgICAgIHJldC5wdXNoKGF0dHIgKyAnPSInICsgYXR0ciArICci
Jyk7CisgICAgfQorICB9LCB0aGlzKTsKKworICAvLyBBZGQgdGhlIHVuaXF1ZSBpZGVudGlmaWVy
CisgIC8vIE5PVEU6IFdlIHVzZSBhbGwgbG93ZXItY2FzZSBzaW5jZSBGaXJlZm94IGhhcyBwcm9i
bGVtcyB3aXRoIG1peGVkIGNhc2UgaW4gU1ZHCisgIHJldC5wdXNoKCdkYXRhLWJpbmRhdHRyLScg
KyBkYXRhSWQgKyAnPSInICsgZGF0YUlkICsgJyInKTsKKyAgcmV0dXJuIG5ldyBFbWJlckhhbmRs
ZWJhcnMuU2FmZVN0cmluZyhyZXQuam9pbignICcpKTsKK30pOworCisvKioKKyAgQHByaXZhdGUK
KworICBIZWxwZXIgdGhhdCwgZ2l2ZW4gYSBzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nIG9mIHByb3Bl
cnR5IHBhdGhzIGFuZCBhIGNvbnRleHQsCisgIHJldHVybnMgYW4gYXJyYXkgb2YgY2xhc3MgbmFt
ZXMuIENhbGxpbmcgdGhpcyBtZXRob2QgYWxzbyBoYXMgdGhlIHNpZGUKKyAgZWZmZWN0IG9mIHNl
dHRpbmcgdXAgb2JzZXJ2ZXJzIGF0IHRob3NlIHByb3BlcnR5IHBhdGhzLCBzdWNoIHRoYXQgaWYg
dGhleQorICBjaGFuZ2UsIHRoZSBjb3JyZWN0IGNsYXNzIG5hbWUgd2lsbCBiZSByZWFwcGxpZWQg
dG8gdGhlIERPTSBlbGVtZW50LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgcGFzcyB0aGUgc3Ry
aW5nICJmb29CYXIiLCBpdCB3aWxsIGZpcnN0IGxvb2sgdXAgdGhlCisgICJmb29CYXIiIHZhbHVl
IG9mIHRoZSBjb250ZXh0LiBJZiB0aGF0IHZhbHVlIGlzIHRydWUsIGl0IHdpbGwgYWRkIHRoZQor
ICAiZm9vLWJhciIgY2xhc3MgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCAoaS5lLiwgdGhlIGRhc2hl
cml6ZWQgZm9ybSBvZgorICAiZm9vQmFyIikuIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaXQg
d2lsbCBhZGQgdGhhdCBzdHJpbmcgYXMgdGhlIGNsYXNzLgorICBPdGhlcndpc2UsIGl0IHdpbGwg
bm90IGFkZCBhbnkgbmV3IGNsYXNzIG5hbWUuCisKKyAgQG1ldGhvZCBiaW5kQ2xhc3NlcworICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMKKyAgQHBhcmFtIHtFbWJlci5PYmplY3R9IGNvbnRleHQgVGhl
IGNvbnRleHQgZnJvbSB3aGljaCB0byBsb29rdXAgcHJvcGVydGllcworICBAcGFyYW0ge1N0cmlu
Z30gY2xhc3NCaW5kaW5ncyBBIHN0cmluZywgc3BhY2Utc2VwYXJhdGVkLCBvZiBjbGFzcyBiaW5k
aW5ncyAKKyAgICB0byB1c2UKKyAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3IFRoZSB2aWV3IGlu
IHdoaWNoIG9ic2VydmVycyBzaG91bGQgbG9vayBmb3IgdGhlIAorICAgIGVsZW1lbnQgdG8gdXBk
YXRlCisgIEBwYXJhbSB7U3J0aW5nfSBiaW5kQXR0cklkIE9wdGlvbmFsIGJpbmRBdHRyIGlkIHVz
ZWQgdG8gbG9va3VwIGVsZW1lbnRzCisgIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBjbGFz
cyBuYW1lcyB0byBhZGQKKyovCitFbWJlckhhbmRsZWJhcnMuYmluZENsYXNzZXMgPSBmdW5jdGlv
bihjb250ZXh0LCBjbGFzc0JpbmRpbmdzLCB2aWV3LCBiaW5kQXR0cklkLCBvcHRpb25zKSB7Cisg
IHZhciByZXQgPSBbXSwgbmV3Q2xhc3MsIHZhbHVlLCBlbGVtOworCisgIC8vIEhlbHBlciBtZXRo
b2QgdG8gcmV0cmlldmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIGNvbnRleHQgYW5kCisgIC8vIGRl
dGVybWluZSB3aGljaCBjbGFzcyBzdHJpbmcgdG8gcmV0dXJuLCBiYXNlZCBvbiB3aGV0aGVyIGl0
IGlzCisgIC8vIGEgQm9vbGVhbiBvciBub3QuCisgIHZhciBjbGFzc1N0cmluZ0ZvclBhdGggPSBm
dW5jdGlvbihyb290LCBwYXJzZWRQYXRoLCBvcHRpb25zKSB7CisgICAgdmFyIHZhbCwKKyAgICAg
ICAgcGF0aCA9IHBhcnNlZFBhdGgucGF0aDsKKworICAgIGlmIChwYXRoID09PSAndGhpcycpIHsK
KyAgICAgIHZhbCA9IHJvb3Q7CisgICAgfSBlbHNlIGlmIChwYXRoID09PSAnJykgeworICAgICAg
dmFsID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgdmFsID0gaGFuZGxlYmFyc0dldChyb290
LCBwYXRoLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICByZXR1cm4gRW1iZXIuVmlldy5fY2xhc3NT
dHJpbmdGb3JWYWx1ZShwYXRoLCB2YWwsIHBhcnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRo
LmZhbHN5Q2xhc3NOYW1lKTsKKyAgfTsKKworICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSBwYXNzZWQs
IGxvb3AgdGhyb3VnaCBhbmQgc2V0dXAKKyAgLy8gYW4gb2JzZXJ2ZXIuCisgIGZvckVhY2guY2Fs
bChjbGFzc0JpbmRpbmdzLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGJpbmRpbmcpIHsKKworICAgIC8v
IFZhcmlhYmxlIGluIHdoaWNoIHRoZSBvbGQgY2xhc3MgdmFsdWUgaXMgc2F2ZWQuIFRoZSBvYnNl
cnZlciBmdW5jdGlvbgorICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFibGUsIHNvIGl0IGtu
b3dzIHdoaWNoIHN0cmluZyB0byByZW1vdmUgd2hlbgorICAgIC8vIHRoZSBwcm9wZXJ0eSBjaGFu
Z2VzLgorICAgIHZhciBvbGRDbGFzczsKKworICAgIHZhciBvYnNlcnZlciwgaW52b2tlcjsKKwor
ICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgoYmluZGlu
ZyksCisgICAgICAgIHBhdGggPSBwYXJzZWRQYXRoLnBhdGgsCisgICAgICAgIHBhdGhSb290ID0g
Y29udGV4dCwKKyAgICAgICAgbm9ybWFsaXplZDsKKworICAgIGlmIChwYXRoICE9PSAnJyAmJiBw
YXRoICE9PSAndGhpcycpIHsKKyAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRl
eHQsIHBhdGgsIG9wdGlvbnMuZGF0YSk7CisKKyAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5y
b290OworICAgICAgcGF0aCA9IG5vcm1hbGl6ZWQucGF0aDsKKyAgICB9CisKKyAgICAvLyBTZXQg
dXAgYW4gb2JzZXJ2ZXIgb24gdGhlIGNvbnRleHQuIElmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLCB0
b2dnbGUgdGhlCisgICAgLy8gY2xhc3MgbmFtZS4KKyAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkg
eworICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAg
bmV3Q2xhc3MgPSBjbGFzc1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFyc2VkUGF0aCwgb3B0aW9u
cyk7CisgICAgICBlbGVtID0gYmluZEF0dHJJZCA/IHZpZXcuJCgiW2RhdGEtYmluZGF0dHItIiAr
IGJpbmRBdHRySWQgKyAiPSciICsgYmluZEF0dHJJZCArICInXSIpIDogdmlldy4kKCk7CisKKyAg
ICAgIC8vIElmIHdlIGNhbid0IGZpbmQgdGhlIGVsZW1lbnQgYW55bW9yZSwgYSBwYXJlbnQgdGVt
cGxhdGUgaGFzIGJlZW4KKyAgICAgIC8vIHJlLXJlbmRlcmVkIGFuZCB3ZSd2ZSBiZWVuIG51a2Vk
LiBSZW1vdmUgdGhlIG9ic2VydmVyLgorICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubGVuZ3RoID09
PSAwKSB7CisgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHBhdGhSb290LCBwYXRoLCBpbnZv
a2VyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGFk
ZGVkIGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQsIHJlbW92ZSBpdC4KKyAgICAgICAgaWYgKG9sZENs
YXNzKSB7CisgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7CisgICAgICAgIH0K
KworICAgICAgICAvLyBJZiBuZWNlc3NhcnksIGFkZCBhIG5ldyBjbGFzcy4gTWFrZSBzdXJlIHdl
IGtlZXAgdHJhY2sgb2YgaXQgc28KKyAgICAgICAgLy8gaXQgY2FuIGJlIHJlbW92ZWQgaW4gdGhl
IGZ1dHVyZS4KKyAgICAgICAgaWYgKG5ld0NsYXNzKSB7CisgICAgICAgICAgZWxlbS5hZGRDbGFz
cyhuZXdDbGFzcyk7CisgICAgICAgICAgb2xkQ2xhc3MgPSBuZXdDbGFzczsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICBvbGRDbGFzcyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9OworCisgICAgaW52b2tlciA9IGZ1bmN0aW9uKCkgeworICAgICAgRW1iZXIucnVuLnNjaGVk
dWxlT25jZSgncmVuZGVyJywgb2JzZXJ2ZXIpOworICAgIH07CisKKyAgICBpZiAocGF0aCAhPT0g
JycgJiYgcGF0aCAhPT0gJ3RoaXMnKSB7CisgICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocGF0
aFJvb3QsIHBhdGgsIGludm9rZXIpOworICAgIH0KKworICAgIC8vIFdlJ3ZlIGFscmVhZHkgc2V0
dXAgdGhlIG9ic2VydmVyOyBub3cgd2UganVzdCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlCisgICAg
Ly8gY29ycmVjdCBiZWhhdmlvciByaWdodCBub3cgb24gdGhlIGZpcnN0IHBhc3MgdGhyb3VnaC4K
KyAgICB2YWx1ZSA9IGNsYXNzU3RyaW5nRm9yUGF0aChjb250ZXh0LCBwYXJzZWRQYXRoLCBvcHRp
b25zKTsKKworICAgIGlmICh2YWx1ZSkgeworICAgICAgcmV0LnB1c2godmFsdWUpOworCisgICAg
ICAvLyBNYWtlIHN1cmUgd2Ugc2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBi
ZSByZW1vdmVkIGlmIHRoZQorICAgICAgLy8gb2JzZXJ2ZXIgZmlyZXMuCisgICAgICBvbGRDbGFz
cyA9IHZhbHVlOworICAgIH0KKyAgfSk7CisKKyAgcmV0dXJuIHJldDsKK307CisKKworfSkoKTsK
KworCisKKyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFscyBIYW5kbGViYXJzICovCisKKy8vIFRPRE86
IERvbid0IHJlcXVpcmUgdGhlIGVudGlyZSBtb2R1bGUKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1
Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQ7Cit2YXIgUEFSRU5UX1ZJRVdfUEFUSCA9IC9ecGFyZW50Vmlld1wuLzsKK3Zh
ciBFbWJlckhhbmRsZWJhcnMgPSBFbWJlci5IYW5kbGViYXJzOworCitFbWJlckhhbmRsZWJhcnMu
Vmlld0hlbHBlciA9IEVtYmVyLk9iamVjdC5jcmVhdGUoeworCisgIHByb3BlcnRpZXNGcm9tSFRN
TE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMsIHRoaXNDb250ZXh0KSB7CisgICAgdmFyIGhhc2gg
PSBvcHRpb25zLmhhc2gsIGRhdGEgPSBvcHRpb25zLmRhdGE7CisgICAgdmFyIGV4dGVuc2lvbnMg
PSB7fSwKKyAgICAgICAgY2xhc3NlcyA9IGhhc2hbJ2NsYXNzJ10sCisgICAgICAgIGR1cCA9IGZh
bHNlOworCisgICAgaWYgKGhhc2guaWQpIHsKKyAgICAgIGV4dGVuc2lvbnMuZWxlbWVudElkID0g
aGFzaC5pZDsKKyAgICAgIGR1cCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGNsYXNzZXMpIHsK
KyAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7CisgICAgICBleHRlbnNpb25zLmNs
YXNzTmFtZXMgPSBjbGFzc2VzOworICAgICAgZHVwID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAo
aGFzaC5jbGFzc0JpbmRpbmcpIHsKKyAgICAgIGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3Mg
PSBoYXNoLmNsYXNzQmluZGluZy5zcGxpdCgnICcpOworICAgICAgZHVwID0gdHJ1ZTsKKyAgICB9
CisKKyAgICBpZiAoaGFzaC5jbGFzc05hbWVCaW5kaW5ncykgeworICAgICAgaWYgKGV4dGVuc2lv
bnMuY2xhc3NOYW1lQmluZGluZ3MgPT09IHVuZGVmaW5lZCkgZXh0ZW5zaW9ucy5jbGFzc05hbWVC
aW5kaW5ncyA9IFtdOworICAgICAgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IGV4dGVu
c2lvbnMuY2xhc3NOYW1lQmluZGluZ3MuY29uY2F0KGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3Bs
aXQoJyAnKSk7CisgICAgICBkdXAgPSB0cnVlOworICAgIH0KKworICAgIGlmIChoYXNoLmF0dHJp
YnV0ZUJpbmRpbmdzKSB7CisgICAgICBFbWJlci5hc3NlcnQoIlNldHRpbmcgJ2F0dHJpYnV0ZUJp
bmRpbmdzJyB2aWEgSGFuZGxlYmFycyBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHN1YmNsYXNzIEVt
YmVyLlZpZXcgYW5kIHNldCBpdCB0aGVyZSBpbnN0ZWFkLiIpOworICAgICAgZXh0ZW5zaW9ucy5h
dHRyaWJ1dGVCaW5kaW5ncyA9IG51bGw7CisgICAgICBkdXAgPSB0cnVlOworICAgIH0KKworICAg
IGlmIChkdXApIHsKKyAgICAgIGhhc2ggPSBFbWJlci4kLmV4dGVuZCh7fSwgaGFzaCk7CisgICAg
ICBkZWxldGUgaGFzaC5pZDsKKyAgICAgIGRlbGV0ZSBoYXNoWydjbGFzcyddOworICAgICAgZGVs
ZXRlIGhhc2guY2xhc3NCaW5kaW5nOworICAgIH0KKworICAgIC8vIFNldCB0aGUgcHJvcGVyIGNv
bnRleHQgZm9yIGFsbCBiaW5kaW5ncyBwYXNzZWQgdG8gdGhlIGhlbHBlci4gVGhpcyBhcHBsaWVz
IHRvIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdzCisgICAgLy8gYXMgd2VsbCBhcyBjbGFzcyBu
YW1lIGJpbmRpbmdzLiBJZiB0aGUgYmluZGluZ3MgYXJlIGxvY2FsLCBtYWtlIHRoZW0gcmVsYXRp
dmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dAorICAgIC8vIGluc3RlYWQgb2YgdGhlIHZpZXcuCisg
ICAgdmFyIHBhdGg7CisKKyAgICAvLyBFdmFsdWF0ZSB0aGUgY29udGV4dCBvZiByZWd1bGFyIGF0
dHJpYnV0ZSBiaW5kaW5nczoKKyAgICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKKyAgICAgIGlm
ICghaGFzaC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZTsgfQorCisgICAgICAvLyBU
ZXN0IGlmIHRoZSBwcm9wZXJ0eSBlbmRzIGluICJCaW5kaW5nIgorICAgICAgaWYgKEVtYmVyLklT
X0JJTkRJTkcudGVzdChwcm9wKSAmJiB0eXBlb2YgaGFzaFtwcm9wXSA9PT0gJ3N0cmluZycpIHsK
KyAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoKGhhc2hbcHJvcF0s
IGRhdGEpOworICAgICAgICBpZiAocGF0aCkgeyBoYXNoW3Byb3BdID0gcGF0aDsgfQorICAgICAg
fQorICAgIH0KKworICAgIC8vIEV2YWx1YXRlIHRoZSBjb250ZXh0IG9mIGNsYXNzIG5hbWUgYmlu
ZGluZ3M6CisgICAgaWYgKGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MpIHsKKyAgICAgIGZv
ciAodmFyIGIgaW4gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncykgeworICAgICAgICB2YXIg
ZnVsbCA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3NbYl07CisgICAgICAgIGlmICh0eXBl
b2YgZnVsbCA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAvLyBDb250ZXh0dWFsaXplIHRoZSBw
YXRoIG9mIGNsYXNzTmFtZUJpbmRpbmcgc28gdGhpczoKKyAgICAgICAgICAvLworICAgICAgICAg
IC8vICAgICBjbGFzc05hbWVCaW5kaW5nPSJpc0dyZWVuOmdyZWVuIgorICAgICAgICAgIC8vCisg
ICAgICAgICAgLy8gaXMgY29udmVydGVkIHRvIHRoaXM6CisgICAgICAgICAgLy8KKyAgICAgICAg
ICAvLyAgICAgY2xhc3NOYW1lQmluZGluZz0iX3BhcmVudFZpZXcuY29udGV4dC5pc0dyZWVuOmdy
ZWVuIgorICAgICAgICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0
eVBhdGgoZnVsbCk7CisgICAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQ
YXRoKHBhcnNlZFBhdGgucGF0aCwgZGF0YSk7CisgICAgICAgICAgaWYgKHBhdGgpIHsgZXh0ZW5z
aW9ucy5jbGFzc05hbWVCaW5kaW5nc1tiXSA9IHBhdGggKyBwYXJzZWRQYXRoLmNsYXNzTmFtZXM7
IH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFbWJlci4kLmV4dGVu
ZChoYXNoLCBleHRlbnNpb25zKTsKKyAgfSwKKworICAvLyBUcmFuc2Zvcm0gYmluZGluZ3MgZnJv
bSB0aGUgY3VycmVudCBjb250ZXh0IHRvIGEgY29udGV4dCB0aGF0IGNhbiBiZSBldmFsdWF0ZWQg
d2l0aGluIHRoZSB2aWV3LgorICAvLyBSZXR1cm5zIG51bGwgaWYgdGhlIHBhdGggc2hvdWxkbid0
IGJlIGNoYW5nZWQuCisgIC8vCisgIC8vIFRPRE86IGNvbnNpZGVyIHRoZSBhZGRpdGlvbiBvZiBh
IHByZWZpeCB0aGF0IHdvdWxkIGFsbG93IHRoaXMgbWV0aG9kIHRvIHJldHVybiBgcGF0aGAuCisg
IGNvbnRleHR1YWxpemVCaW5kaW5nUGF0aDogZnVuY3Rpb24ocGF0aCwgZGF0YSkgeworICAgIHZh
ciBub3JtYWxpemVkID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKG51bGwsIHBhdGgs
IGRhdGEpOworICAgIGlmIChub3JtYWxpemVkLmlzS2V5d29yZCkgeworICAgICAgcmV0dXJuICd0
ZW1wbGF0ZURhdGEua2V5d29yZHMuJyArIHBhdGg7CisgICAgfSBlbHNlIGlmIChFbWJlci5pc0ds
b2JhbFBhdGgocGF0aCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSBpZiAocGF0
aCA9PT0gJ3RoaXMnKSB7CisgICAgICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRleHQnOworICAg
IH0gZWxzZSB7CisgICAgICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRleHQuJyArIHBhdGg7Cisg
ICAgfQorICB9LAorCisgIGhlbHBlcjogZnVuY3Rpb24odGhpc0NvbnRleHQsIHBhdGgsIG9wdGlv
bnMpIHsKKyAgICB2YXIgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKKyAgICAgICAgZGF0YSA9
IG9wdGlvbnMuZGF0YSwKKyAgICAgICAgdmlldyA9IGRhdGEudmlldywKKyAgICAgICAgZm4gPSBv
cHRpb25zLmZuLAorICAgICAgICBoYXNoID0gb3B0aW9ucy5oYXNoLAorICAgICAgICBuZXdWaWV3
OworCisgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgcGF0aCkgeworICAgICAgbmV3VmlldyA9
IEVtYmVySGFuZGxlYmFycy5nZXQodGhpc0NvbnRleHQsIHBhdGgsIG9wdGlvbnMpOworICAgICAg
RW1iZXIuYXNzZXJ0KCJVbmFibGUgdG8gZmluZCB2aWV3IGF0IHBhdGggJyIgKyBwYXRoICsgIici
LCAhIW5ld1ZpZXcpOworICAgIH0gZWxzZSB7CisgICAgICBuZXdWaWV3ID0gcGF0aDsKKyAgICB9
CisKKyAgICBFbWJlci5hc3NlcnQoRW1iZXIuU3RyaW5nLmZtdCgnWW91IG11c3QgcGFzcyBhIHZp
ZXcgdG8gdGhlICN2aWV3IGhlbHBlciwgbm90ICVAICglQCknLCBbcGF0aCwgbmV3Vmlld10pLCBF
bWJlci5WaWV3LmRldGVjdChuZXdWaWV3KSB8fCBFbWJlci5WaWV3LmRldGVjdEluc3RhbmNlKG5l
d1ZpZXcpKTsKKworICAgIHZhciB2aWV3T3B0aW9ucyA9IHRoaXMucHJvcGVydGllc0Zyb21IVE1M
T3B0aW9ucyhvcHRpb25zLCB0aGlzQ29udGV4dCk7CisgICAgdmFyIGN1cnJlbnRWaWV3ID0gZGF0
YS52aWV3OworICAgIHZpZXdPcHRpb25zLnRlbXBsYXRlRGF0YSA9IG9wdGlvbnMuZGF0YTsKKyAg
ICB2YXIgbmV3Vmlld1Byb3RvID0gbmV3Vmlldy5wcm90byA/IG5ld1ZpZXcucHJvdG8oKSA6IG5l
d1ZpZXc7CisKKyAgICBpZiAoZm4pIHsKKyAgICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBw
cm92aWRlIGEgdGVtcGxhdGUgYmxvY2sgaWYgeW91IGFsc28gc3BlY2lmaWVkIGEgdGVtcGxhdGVO
YW1lIiwgIWdldCh2aWV3T3B0aW9ucywgJ3RlbXBsYXRlTmFtZScpICYmICFnZXQobmV3Vmlld1By
b3RvLCAndGVtcGxhdGVOYW1lJykpOworICAgICAgdmlld09wdGlvbnMudGVtcGxhdGUgPSBmbjsK
KyAgICB9CisKKyAgICAvLyBXZSBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBfY29udGV4dGAg
Y29tcHV0ZWQgcHJvcGVydHkgaWYgdGhlcmUgaXMKKyAgICAvLyBubyBzcGVjaWZpZWQgY29udHJv
bGxlci4gU2VlIFZpZXcjX2NvbnRleHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgaWYgKCFu
ZXdWaWV3UHJvdG8uY29udHJvbGxlciAmJiAhbmV3Vmlld1Byb3RvLmNvbnRyb2xsZXJCaW5kaW5n
ICYmICF2aWV3T3B0aW9ucy5jb250cm9sbGVyICYmICF2aWV3T3B0aW9ucy5jb250cm9sbGVyQmlu
ZGluZykgeworICAgICAgdmlld09wdGlvbnMuX2NvbnRleHQgPSB0aGlzQ29udGV4dDsKKyAgICB9
CisKKyAgICBjdXJyZW50Vmlldy5hcHBlbmRDaGlsZChuZXdWaWV3LCB2aWV3T3B0aW9ucyk7Cisg
IH0KK30pOworCisvKioKKyAgYHt7dmlld319YCBpbnNlcnRzIGEgbmV3IGluc3RhbmNlIG9mIGBF
bWJlci5WaWV3YCBpbnRvIGEgdGVtcGxhdGUgcGFzc2luZyBpdHMKKyAgb3B0aW9ucyB0byB0aGUg
YEVtYmVyLlZpZXdgJ3MgYGNyZWF0ZWAgbWV0aG9kIGFuZCB1c2luZyB0aGUgc3VwcGxpZWQgYmxv
Y2sgYXMKKyAgdGhlIHZpZXcncyBvd24gdGVtcGxhdGUuCisKKyAgQW4gZW1wdHkgYDxib2R5PmAg
YW5kIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6CisKKyAgYGBgaGFuZGxlYmFycworICBBIHNwYW46
CisgIHt7I3ZpZXcgdGFnTmFtZT0ic3BhbiJ9fQorICAgIGhlbGxvLgorICB7ey92aWV3fX0KKyAg
YGBgCisKKyAgV2lsbCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6CisKKyAgYGBgaHRtbAorICA8
Ym9keT4KKyAgICA8IS0tIE5vdGU6IHRoZSBoYW5kbGViYXJzIHRlbXBsYXRlIHNjcmlwdAorICAg
ICAgICAgYWxzbyByZXN1bHRzIGluIGEgcmVuZGVyZWQgRW1iZXIuVmlldworICAgICAgICAgd2hp
Y2ggaXMgdGhlIG91dGVyIDxkaXY+IGhlcmUgLS0+CisKKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12
aWV3Ij4KKyAgICAgIEEgc3BhbjoKKyAgICAgIDxzcGFuIGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJl
ci12aWV3Ij4KKyAgICAgICAgSGVsbG8uCisgICAgICA8L3NwYW4+CisgICAgPC9kaXY+CisgIDwv
Ym9keT4KKyAgYGBgCisKKyAgIyMjIGBwYXJlbnRWaWV3YCBzZXR0aW5nCisKKyAgVGhlIGBwYXJl
bnRWaWV3YCBwcm9wZXJ0eSBvZiB0aGUgbmV3IGBFbWJlci5WaWV3YCBpbnN0YW5jZSBjcmVhdGVk
IHRocm91Z2gKKyAgYHt7dmlld319YCB3aWxsIGJlIHNldCB0byB0aGUgYEVtYmVyLlZpZXdgIGlu
c3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZQorICBge3t2aWV3fX1gIHdhcyBjYWxsZWQuCisK
KyAgYGBgamF2YXNjcmlwdAorICBhVmlldyA9IEVtYmVyLlZpZXcuY3JlYXRlKHsKKyAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJ7eyN2aWV3fX0gbXkgcGFyZW50OiB7e3Bh
cmVudFZpZXcuZWxlbWVudElkfX0ge3svdmlld319IikKKyAgfSk7CisKKyAgYVZpZXcuYXBwZW5k
VG8oJ2JvZHknKTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6CisK
KyAgYGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICA8
ZGl2IGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICAgIG15IHBhcmVudDogZW1i
ZXIxCisgICAgPC9kaXY+CisgIDwvZGl2PgorICBgYGAKKworICAjIyMgU2V0dGluZyBDU1MgaWQg
YW5kIGNsYXNzIGF0dHJpYnV0ZXMKKworICBUaGUgSFRNTCBgaWRgIGF0dHJpYnV0ZSBjYW4gYmUg
c2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQgd2l0aAorICB0aGUgYGlk
YCBvcHRpb24uIFRoaXMgb3B0aW9uIHdpbGwgX25vdF8gYmUgcGFzc2VkIHRvIGBFbWJlci5WaWV3
LmNyZWF0ZWAuCisKKyAgYGBgaGFuZGxlYmFycworICB7eyN2aWV3IHRhZ05hbWU9InNwYW4iIGlk
PSJhLWN1c3RvbS1pZCJ9fQorICAgIGhlbGxvLgorICB7ey92aWV3fX0KKyAgYGBgCisKKyAgUmVz
dWx0cyBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3RydWN0dXJlOgorCisgIGBgYGh0bWwKKyAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgPHNwYW4gaWQ9ImEtY3VzdG9tLWlkIiBjbGFzcz0i
ZW1iZXItdmlldyI+CisgICAgICBoZWxsby4KKyAgICA8L3NwYW4+CisgIDwvZGl2PgorICBgYGAK
KworICBUaGUgSFRNTCBgY2xhc3NgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3
fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQKKyAgd2l0aCB0aGUgYGNsYXNzYCBvciBgY2xhc3NOYW1l
QmluZGluZ3NgIG9wdGlvbnMuIFRoZSBgY2xhc3NgIG9wdGlvbiB3aWxsCisgIGRpcmVjdGx5IHNl
dCB0aGUgQ1NTIGBjbGFzc2AgYXR0cmlidXRlIGFuZCB3aWxsIG5vdCBiZSBwYXNzZWQgdG8KKyAg
YEVtYmVyLlZpZXcuY3JlYXRlYC4gYGNsYXNzTmFtZUJpbmRpbmdzYCB3aWxsIGJlIHBhc3NlZCB0
byBgY3JlYXRlYCBhbmQgdXNlCisgIGBFbWJlci5WaWV3YCdzIGNsYXNzIG5hbWUgYmluZGluZyBm
dW5jdGlvbmFsaXR5OgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3sjdmlldyB0YWdOYW1lPSJzcGFu
IiBjbGFzcz0iYS1jdXN0b20tY2xhc3MifX0KKyAgICBoZWxsby4KKyAge3svdmlld319CisgIGBg
YAorCisgIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToKKworICBgYGBo
dG1sCisgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgIDxzcGFuIGlkPSJlbWJlcjIiIGNs
YXNzPSJlbWJlci12aWV3IGEtY3VzdG9tLWNsYXNzIj4KKyAgICAgIGhlbGxvLgorICAgIDwvc3Bh
bj4KKyAgPC9kaXY+CisgIGBgYAorCisgICMjIyBTdXBwbHlpbmcgYSBkaWZmZXJlbnQgdmlldyBj
bGFzcworCisgIGB7e3ZpZXd9fWAgY2FuIHRha2UgYW4gb3B0aW9uYWwgZmlyc3QgYXJndW1lbnQg
YmVmb3JlIGl0cyBzdXBwbGllZCBvcHRpb25zIHRvCisgIHNwZWNpZnkgYSBwYXRoIHRvIGEgY3Vz
dG9tIHZpZXcgY2xhc3MuCisKKyAgYGBgaGFuZGxlYmFycworICB7eyN2aWV3ICJNeUFwcC5DdXN0
b21WaWV3In19CisgICAgaGVsbG8uCisgIHt7L3ZpZXd9fQorICBgYGAKKworICBUaGUgZmlyc3Qg
YXJndW1lbnQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSBwYXRoLiBFbWJlciB3aWxsIHNlYXJjaCBm
b3IgdGhlCisgIHZpZXcgY2xhc3Mgc3RhcnRpbmcgYXQgdGhlIGBFbWJlci5WaWV3YCBvZiB0aGUg
dGVtcGxhdGUgd2hlcmUgYHt7dmlld319YCB3YXMKKyAgdXNlZCBhcyB0aGUgcm9vdCBvYmplY3Q6
CisKKyAgYGBgamF2YXNjcmlwdAorICBNeUFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7
fSk7CisgIE15QXBwLk91dGVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBpbm5lclZp
ZXdDbGFzczogRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgY2xhc3NOYW1lczogWydhLWN1c3Rv
bS12aWV3LWNsYXNzLWFzLXByb3BlcnR5J10KKyAgICB9KSwKKyAgICB0ZW1wbGF0ZTogRW1iZXIu
SGFuZGxlYmFycy5jb21waWxlKCd7eyN2aWV3ICJpbm5lclZpZXdDbGFzcyJ9fSBoaSB7ey92aWV3
fX0nKQorICB9KTsKKworICBNeUFwcC5PdXRlclZpZXcuY3JlYXRlKCkuYXBwZW5kVG8oJ2JvZHkn
KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgorCisgIGBg
YGh0bWwKKyAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgPGRpdiBp
ZD0iZW1iZXIyIiBjbGFzcz0iZW1iZXItdmlldyBhLWN1c3RvbS12aWV3LWNsYXNzLWFzLXByb3Bl
cnR5Ij4KKyAgICAgIGhpCisgICAgPC9kaXY+CisgIDwvZGl2PgorICBgYGAKKworICAjIyMgQmxv
Y2tsZXNzIHVzZQorCisgIElmIHlvdSBzdXBwbHkgYSBjdXN0b20gYEVtYmVyLlZpZXdgIHN1YmNs
YXNzIHRoYXQgc3BlY2lmaWVzIGl0cyBvd24gdGVtcGxhdGUKKyAgb3IgcHJvdmlkZSBhIGB0ZW1w
bGF0ZU5hbWVgIG9wdGlvbiB0byBge3t2aWV3fX1gIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQKKyAg
c3VwcGx5aW5nIGEgYmxvY2suIEF0dGVtcHRzIHRvIHVzZSBib3RoIGEgYHRlbXBsYXRlTmFtZWAg
b3B0aW9uIGFuZCBzdXBwbHkgYQorICBibG9jayB3aWxsIHRocm93IGFuIGVycm9yLgorCisgIGBg
YGhhbmRsZWJhcnMKKyAge3t2aWV3ICJNeUFwcC5WaWV3V2l0aEFUZW1wbGF0ZURlZmluZWQifX0K
KyAgYGBgCisKKyAgIyMjIGB2aWV3TmFtZWAgcHJvcGVydHkKKworICBZb3UgY2FuIHN1cHBseSBh
IGB2aWV3TmFtZWAgb3B0aW9uIHRvIGB7e3ZpZXd9fWAuIFRoZSBgRW1iZXIuVmlld2AgaW5zdGFu
Y2UKKyAgd2lsbCBiZSByZWZlcmVuY2VkIGFzIGEgcHJvcGVydHkgb2YgaXRzIHBhcmVudCB2aWV3
IGJ5IHRoaXMgbmFtZS4KKworICBgYGBqYXZhc2NyaXB0CisgIGFWaWV3ID0gRW1iZXIuVmlldy5j
cmVhdGUoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ3t7I3ZpZXcg
dmlld05hbWU9ImFDaGlsZEJ5TmFtZSJ9fSBoaSB7ey92aWV3fX0nKQorICB9KTsKKworICBhVmll
dy5hcHBlbmRUbygnYm9keScpOworICBhVmlldy5nZXQoJ2FDaGlsZEJ5TmFtZScpIC8vIHRoZSBp
bnN0YW5jZSBvZiBFbWJlci5WaWV3IGNyZWF0ZWQgYnkge3t2aWV3fX0gaGVscGVyCisgIGBgYAor
CisgIEBtZXRob2QgdmlldworICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAcGFy
YW0ge1N0cmluZ30gcGF0aAorICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKKyAgQHJldHVybiB7U3Ry
aW5nfSBIVE1MIHN0cmluZworKi8KK0VtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndmll
dycsIGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgRW1iZXIuYXNzZXJ0KCJUaGUgdmlldyBo
ZWxwZXIgb25seSB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCIsIGFyZ3VtZW50cy5sZW5ndGggPD0g
Mik7CisKKyAgLy8gSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwgdHJlYXQgcGF0aCBwYXJhbSBhcyBv
cHRpb25zLgorICBpZiAocGF0aCAmJiBwYXRoLmRhdGEgJiYgcGF0aC5kYXRhLmlzUmVuZGVyRGF0
YSkgeworICAgIG9wdGlvbnMgPSBwYXRoOworICAgIHBhdGggPSAiRW1iZXIuVmlldyI7CisgIH0K
KworICByZXR1cm4gRW1iZXJIYW5kbGViYXJzLlZpZXdIZWxwZXIuaGVscGVyKHRoaXMsIHBhdGgs
IG9wdGlvbnMpOworfSk7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFs
cyBIYW5kbGViYXJzICovCisKKy8vIFRPRE86IERvbid0IHJlcXVpcmUgYWxsIG9mIHRoaXMgbW9k
dWxlCisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8K
KwordmFyIGdldCA9IEVtYmVyLmdldCwgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMu
Z2V0LCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OworCisvKioKKyAgYHt7Y29sbGVjdGlvbn19YCBp
cyBhIGBFbWJlci5IYW5kbGViYXJzYCBoZWxwZXIgZm9yIGFkZGluZyBpbnN0YW5jZXMgb2YKKyAg
YEVtYmVyLkNvbGxlY3Rpb25WaWV3YCB0byBhIHRlbXBsYXRlLiBTZWUgYEVtYmVyLkNvbGxlY3Rp
b25WaWV3YCBmb3IKKyAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBob3cgYSBgQ29sbGVjdGlv
blZpZXdgIGZ1bmN0aW9ucy4KKworICBge3tjb2xsZWN0aW9ufX1gJ3MgcHJpbWFyeSB1c2UgaXMg
YXMgYSBibG9jayBoZWxwZXIgd2l0aCBhIGBjb250ZW50QmluZGluZ2AKKyAgb3B0aW9uIHBvaW50
aW5nIHRvd2FyZHMgYW4gYEVtYmVyLkFycmF5YC1jb21wYXRpYmxlIG9iamVjdC4gQW4gYEVtYmVy
LlZpZXdgCisgIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBpdGVtIGluIGl0cyBg
Y29udGVudGAgcHJvcGVydHkuIEVhY2ggdmlldworICB3aWxsIGhhdmUgaXRzIG93biBgY29udGVu
dGAgcHJvcGVydHkgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGluIHRoZQorICBjb2xsZWN0
aW9uLgorCisgIFRoZSBwcm92aWRlZCBibG9jayB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIHRlbXBs
YXRlIGZvciBlYWNoIGl0ZW0ncyB2aWV3LgorCisgIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIHRo
ZSBmb2xsb3dpbmcgdGVtcGxhdGU6CisKKyAgYGBgaGFuZGxlYmFycworICB7eyNjb2xsZWN0aW9u
IGNvbnRlbnRCaW5kaW5nPSJBcHAuaXRlbXMifX0KKyAgICBIaSB7e3ZpZXcuY29udGVudC5uYW1l
fX0KKyAge3svY29sbGVjdGlvbn19CisgIGBgYAorCisgIEFuZCB0aGUgZm9sbG93aW5nIGFwcGxp
Y2F0aW9uIGNvZGUKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9u
LmNyZWF0ZSgpCisgIEFwcC5pdGVtcyA9IFsKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1l
OiAnRGF2ZSd9KSwKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnTWFyeSd9KSwKKyAg
ICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnU2FyYSd9KQorICBdCisgIGBgYAorCisgIFdp
bGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVjdHVyZSBiZWxvdworCisgIGBgYGh0bWwKKyAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+SGkgRGF2
ZTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkhpIE1hcnk8L2Rpdj4KKyAgICA8
ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBTYXJhPC9kaXY+CisgIDwvZGl2PgorICBgYGAKKwor
ICAjIyMgQmxvY2tsZXNzIFVzZQorCisgIElmIHlvdSBwcm92aWRlIGFuIGBpdGVtVmlld0NsYXNz
YCBvcHRpb24gdGhhdCBoYXMgaXRzIG93biBgdGVtcGxhdGVgIHlvdSBjYW4KKyAgb21pdCB0aGUg
YmxvY2suCisKKyAgVGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKKworICBgYGBoYW5kbGViYXJzCisg
IHt7Y29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIiBpdGVtVmlld0NsYXNzPSJB
cHAuQW5JdGVtVmlldyJ9fQorICBgYGAKKworICBBbmQgYXBwbGljYXRpb24gY29kZQorCisgIGBg
YGphdmFzY3JpcHQKKyAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7CisgIEFwcC5p
dGVtcyA9IFsKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnRGF2ZSd9KSwKKyAgICBF
bWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnTWFyeSd9KSwKKyAgICBFbWJlci5PYmplY3QuY3Jl
YXRlKHtuYW1lOiAnU2FyYSd9KQorICBdOworCisgIEFwcC5Bbkl0ZW1WaWV3ID0gRW1iZXIuVmll
dy5leHRlbmQoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkdyZWV0
aW5ncyB7e3ZpZXcuY29udGVudC5uYW1lfX0iKQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1
bHQgaW4gdGhlIEhUTUwgc3RydWN0dXJlIGJlbG93CisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNz
PSJlbWJlci12aWV3Ij4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgRGF2
ZTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBNYXJ5PC9kaXY+
CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIFNhcmE8L2Rpdj4KKyAgPC9k
aXY+CisgIGBgYAorCisgICMjIyBTcGVjaWZ5aW5nIGEgQ29sbGVjdGlvblZpZXcgc3ViY2xhc3MK
KworICBCeSBkZWZhdWx0IHRoZSBge3tjb2xsZWN0aW9ufX1gIGhlbHBlciB3aWxsIGNyZWF0ZSBh
biBpbnN0YW5jZSBvZgorICBgRW1iZXIuQ29sbGVjdGlvblZpZXdgLiBZb3UgY2FuIHN1cHBseSBh
IGBFbWJlci5Db2xsZWN0aW9uVmlld2Agc3ViY2xhc3MgdG8KKyAgdGhlIGhlbHBlciBieSBwYXNz
aW5nIGl0IGFzIHRoZSBmaXJzdCBhcmd1bWVudDoKKworICBgYGBoYW5kbGViYXJzCisgIHt7I2Nv
bGxlY3Rpb24gQXBwLk15Q3VzdG9tQ29sbGVjdGlvbkNsYXNzIGNvbnRlbnRCaW5kaW5nPSJBcHAu
aXRlbXMifX0KKyAgICBIaSB7e3ZpZXcuY29udGVudC5uYW1lfX0KKyAge3svY29sbGVjdGlvbn19
CisgIGBgYAorCisgICMjIyBGb3J3YXJkZWQgYGl0ZW0uKmAtbmFtZWQgT3B0aW9ucworCisgIEFz
IHdpdGggdGhlIGB7e3ZpZXd9fWAsIGhlbHBlciBvcHRpb25zIHBhc3NlZCB0byB0aGUgYHt7Y29s
bGVjdGlvbn19YCB3aWxsIGJlCisgIHNldCBvbiB0aGUgcmVzdWx0aW5nIGBFbWJlci5Db2xsZWN0
aW9uVmlld2AgYXMgcHJvcGVydGllcy4gQWRkaXRpb25hbGx5LAorICBvcHRpb25zIHByZWZpeGVk
IHdpdGggYGl0ZW1gIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgdmlld3MgcmVuZGVyZWQgZm9yIGVh
Y2gKKyAgaXRlbSAobm90ZSB0aGUgY2FtZWxjYXNpbmcpOgorCisgIGBgYGhhbmRsZWJhcnMKKyAg
e3sjY29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIgorICAgICAgICAgICAgICAg
IGl0ZW1UYWdOYW1lPSJwIgorICAgICAgICAgICAgICAgIGl0ZW1DbGFzc05hbWVzPSJncmVldGlu
ZyJ9fQorICAgIEhvd2R5IHt7dmlldy5jb250ZW50Lm5hbWV9fQorICB7ey9jb2xsZWN0aW9ufX0K
KyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToK
KworICBgYGBodG1sCisgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgIDxwIGNsYXNzPSJl
bWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBEYXZlPC9wPgorICAgIDxwIGNsYXNzPSJlbWJlci12
aWV3IGdyZWV0aW5nIj5Ib3dkeSBNYXJ5PC9wPgorICAgIDxwIGNsYXNzPSJlbWJlci12aWV3IGdy
ZWV0aW5nIj5Ib3dkeSBTYXJhPC9wPgorICA8L2Rpdj4KKyAgYGBgCisKKyAgQG1ldGhvZCBjb2xs
ZWN0aW9uCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7U3RyaW5n
fSBwYXRoCisgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwg
c3RyaW5nCisgIEBkZXByZWNhdGVkIFVzZSBge3tlYWNofX1gIGhlbHBlciBpbnN0ZWFkLgorKi8K
K0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2NvbGxlY3Rpb24nLCBmdW5jdGlvbihw
YXRoLCBvcHRpb25zKSB7CisgIEVtYmVyLmRlcHJlY2F0ZSgiVXNpbmcgdGhlIHt7Y29sbGVjdGlv
bn19IGhlbHBlciB3aXRob3V0IHNwZWNpZnlpbmcgYSBjbGFzcyBoYXMgYmVlbiBkZXByZWNhdGVk
IGFzIHRoZSB7e2VhY2h9fSBoZWxwZXIgbm93IHN1cHBvcnRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxp
dHkuIiwgcGF0aCAhPT0gJ2NvbGxlY3Rpb24nKTsKKworICAvLyBJZiBubyBwYXRoIGlzIHByb3Zp
ZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlvbnMuCisgIGlmIChwYXRoICYmIHBhdGguZGF0
YSAmJiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7CisgICAgb3B0aW9ucyA9IHBhdGg7CisgICAg
cGF0aCA9IHVuZGVmaW5lZDsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3Jl
IHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSBjb2xsZWN0aW9uIGhlbHBlciIsIGFyZ3VtZW50cy5s
ZW5ndGggPT09IDEpOworICB9IGVsc2UgeworICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBw
YXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gaGVscGVyIiwgYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMik7CisgIH0KKworICB2YXIgZm4gPSBvcHRpb25zLmZuOworICB2
YXIgZGF0YSA9IG9wdGlvbnMuZGF0YTsKKyAgdmFyIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7
CisgIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7CisKKyAgLy8gSWYgcGFzc2VkIGEgcGF0
aCBzdHJpbmcsIGNvbnZlcnQgdGhhdCBpbnRvIGFuIG9iamVjdC4KKyAgLy8gT3RoZXJ3aXNlLCBq
dXN0IGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNsYXNzLgorICB2YXIgY29sbGVjdGlvbkNsYXNz
OworICBjb2xsZWN0aW9uQ2xhc3MgPSBwYXRoID8gaGFuZGxlYmFyc0dldCh0aGlzLCBwYXRoLCBv
cHRpb25zKSA6IEVtYmVyLkNvbGxlY3Rpb25WaWV3OworICBFbWJlci5hc3NlcnQoZm10KCIlQCAj
Y29sbGVjdGlvbjogQ291bGQgbm90IGZpbmQgY29sbGVjdGlvbiBjbGFzcyAlQCIsIFtkYXRhLnZp
ZXcsIHBhdGhdKSwgISFjb2xsZWN0aW9uQ2xhc3MpOworCisgIHZhciBoYXNoID0gb3B0aW9ucy5o
YXNoLCBpdGVtSGFzaCA9IHt9LCBtYXRjaDsKKworICAvLyBFeHRyYWN0IGl0ZW0gdmlldyBjbGFz
cyBpZiBwcm92aWRlZCBlbHNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNsYXNzCisgIHZhciBp
dGVtVmlld0NsYXNzLCBpdGVtVmlld1BhdGggPSBoYXNoLml0ZW1WaWV3Q2xhc3M7CisgIHZhciBj
b2xsZWN0aW9uUHJvdG90eXBlID0gY29sbGVjdGlvbkNsYXNzLnByb3RvKCk7CisgIGRlbGV0ZSBo
YXNoLml0ZW1WaWV3Q2xhc3M7CisgIGl0ZW1WaWV3Q2xhc3MgPSBpdGVtVmlld1BhdGggPyBoYW5k
bGViYXJzR2V0KGNvbGxlY3Rpb25Qcm90b3R5cGUsIGl0ZW1WaWV3UGF0aCwgb3B0aW9ucykgOiBj
b2xsZWN0aW9uUHJvdG90eXBlLml0ZW1WaWV3Q2xhc3M7CisgIEVtYmVyLmFzc2VydChmbXQoIiVA
ICNjb2xsZWN0aW9uOiBDb3VsZCBub3QgZmluZCBpdGVtVmlld0NsYXNzICVAIiwgW2RhdGEudmll
dywgaXRlbVZpZXdQYXRoXSksICEhaXRlbVZpZXdDbGFzcyk7CisKKyAgLy8gR28gdGhyb3VnaCBv
cHRpb25zIHBhc3NlZCB0byB0aGUge3tjb2xsZWN0aW9ufX0gaGVscGVyIGFuZCBleHRyYWN0IG9w
dGlvbnMKKyAgLy8gdGhhdCBjb25maWd1cmUgaXRlbSB2aWV3cyBpbnN0ZWFkIG9mIHRoZSBjb2xs
ZWN0aW9uIGl0c2VsZi4KKyAgZm9yICh2YXIgcHJvcCBpbiBoYXNoKSB7CisgICAgaWYgKGhhc2gu
aGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIG1hdGNoID0gcHJvcC5tYXRjaCgvXml0ZW0o
LikoLiopJC8pOworCisgICAgICBpZihtYXRjaCAmJiBwcm9wICE9PSAnaXRlbUNvbnRyb2xsZXIn
KSB7CisgICAgICAgIC8vIENvbnZlcnQgaXRlbVNob3VsZEZvbyAtPiBzaG91bGRGb28KKyAgICAg
ICAgaXRlbUhhc2hbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSArIG1hdGNoWzJdXSA9IGhhc2hbcHJv
cF07CisgICAgICAgIC8vIERlbGV0ZSBmcm9tIGhhc2ggYXMgdGhpcyB3aWxsIGVuZCB1cCBnZXR0
aW5nIHBhc3NlZCB0byB0aGUKKyAgICAgICAgLy8ge3t2aWV3fX0gaGVscGVyIG1ldGhvZC4KKyAg
ICAgICAgZGVsZXRlIGhhc2hbcHJvcF07CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFyIHRh
Z05hbWUgPSBoYXNoLnRhZ05hbWUgfHwgY29sbGVjdGlvblByb3RvdHlwZS50YWdOYW1lOworCisg
IGlmIChmbikgeworICAgIGl0ZW1IYXNoLnRlbXBsYXRlID0gZm47CisgICAgZGVsZXRlIG9wdGlv
bnMuZm47CisgIH0KKworICB2YXIgZW1wdHlWaWV3Q2xhc3M7CisgIGlmIChpbnZlcnNlICYmIGlu
dmVyc2UgIT09IEhhbmRsZWJhcnMuVk0ubm9vcCkgeworICAgIGVtcHR5Vmlld0NsYXNzID0gZ2V0
KGNvbGxlY3Rpb25Qcm90b3R5cGUsICdlbXB0eVZpZXdDbGFzcycpOworICAgIGVtcHR5Vmlld0Ns
YXNzID0gZW1wdHlWaWV3Q2xhc3MuZXh0ZW5kKHsKKyAgICAgICAgICB0ZW1wbGF0ZTogaW52ZXJz
ZSwKKyAgICAgICAgICB0YWdOYW1lOiBpdGVtSGFzaC50YWdOYW1lCisgICAgfSk7CisgIH0gZWxz
ZSBpZiAoaGFzaC5lbXB0eVZpZXdDbGFzcykgeworICAgIGVtcHR5Vmlld0NsYXNzID0gaGFuZGxl
YmFyc0dldCh0aGlzLCBoYXNoLmVtcHR5Vmlld0NsYXNzLCBvcHRpb25zKTsKKyAgfQorICBpZiAo
ZW1wdHlWaWV3Q2xhc3MpIHsgaGFzaC5lbXB0eVZpZXcgPSBlbXB0eVZpZXdDbGFzczsgfQorCisg
IGlmKCFoYXNoLmtleXdvcmQpeworICAgIGl0ZW1IYXNoLl9jb250ZXh0ID0gRW1iZXIuY29tcHV0
ZWQuYWxpYXMoJ2NvbnRlbnQnKTsKKyAgfQorCisgIHZhciB2aWV3U3RyaW5nID0gdmlldy50b1N0
cmluZygpOworCisgIHZhciB2aWV3T3B0aW9ucyA9IEVtYmVyLkhhbmRsZWJhcnMuVmlld0hlbHBl
ci5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zKHsgZGF0YTogZGF0YSwgaGFzaDogaXRlbUhhc2gg
fSwgdGhpcyk7CisgIGhhc2guaXRlbVZpZXdDbGFzcyA9IGl0ZW1WaWV3Q2xhc3MuZXh0ZW5kKHZp
ZXdPcHRpb25zKTsKKworICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs
bCh0aGlzLCBjb2xsZWN0aW9uQ2xhc3MsIG9wdGlvbnMpOworfSk7CisKKworfSkoKTsKKworCisK
KyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFscyBIYW5kbGViYXJzICovCisvKioKK0Btb2R1bGUgZW1i
ZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIGhhbmRsZWJhcnNHZXQg
PSBFbWJlci5IYW5kbGViYXJzLmdldDsKKworLyoqCisgIGB1bmJvdW5kYCBhbGxvd3MgeW91IHRv
IG91dHB1dCBhIHByb3BlcnR5IHdpdGhvdXQgYmluZGluZy4gKkltcG9ydGFudDoqIFRoZQorICBv
dXRwdXQgd2lsbCBub3QgYmUgdXBkYXRlZCBpZiB0aGUgcHJvcGVydHkgY2hhbmdlcy4gVXNlIHdp
dGggY2F1dGlvbi4KKworICBgYGBoYW5kbGViYXJzCisgIDxkaXY+e3t1bmJvdW5kIHNvbWVQcm9w
ZXJ0eVRoYXREb2VzbnRDaGFuZ2V9fTwvZGl2PgorICBgYGAKKworICBgdW5ib3VuZGAgY2FuIGFs
c28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgYm91bmQgaGVscGVyIHRvCisgIHJlbmRl
ciBpdCBpbiBpdHMgdW5ib3VuZCBmb3JtOgorCisgIGBgYGhhbmRsZWJhcnMKKyAgPGRpdj57e3Vu
Ym91bmQgaGVscGVyTmFtZSBzb21lUHJvcGVydHlUaGF0RG9lc250Q2hhbmdlfX08L2Rpdj4KKyAg
YGBgCisKKyAgQG1ldGhvZCB1bmJvdW5kCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
CisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQorICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3Ry
aW5nCisqLworRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndW5ib3VuZCcsIGZ1bmN0
aW9uKHByb3BlcnR5LCBmbikgeworICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMu
bGVuZ3RoIC0gMV0sIGhlbHBlciwgY29udGV4dCwgb3V0OworCisgIGlmKGFyZ3VtZW50cy5sZW5n
dGggPiAyKSB7CisgICAgLy8gVW5ib3VuZCBoZWxwZXIgY2FsbC4KKyAgICBvcHRpb25zLmRhdGEu
aXNVbmJvdW5kID0gdHJ1ZTsKKyAgICBoZWxwZXIgPSBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnNb
YXJndW1lbnRzWzBdXSB8fCBFbWJlci5IYW5kbGViYXJzLmhlbHBlck1pc3Npbmc7CisgICAgb3V0
ID0gaGVscGVyLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50
cywgMSkpOyAKKyAgICBkZWxldGUgb3B0aW9ucy5kYXRhLmlzVW5ib3VuZDsKKyAgICByZXR1cm4g
b3V0OworICB9CisKKyAgY29udGV4dCA9IChmbi5jb250ZXh0cyAmJiBmbi5jb250ZXh0c1swXSkg
fHwgdGhpczsKKyAgcmV0dXJuIGhhbmRsZWJhcnNHZXQoY29udGV4dCwgcHJvcGVydHksIGZuKTsK
K30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLypqc2hpbnQgZGVidWc6dHJ1ZSov
CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwor
dmFyIGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldCwgbm9ybWFsaXplUGF0aCA9
IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aDsKKworLyoqCisgIGBsb2dgIGFsbG93cyB5
b3UgdG8gb3V0cHV0IHRoZSB2YWx1ZSBvZiBhIHZhbHVlIGluIHRoZSBjdXJyZW50IHJlbmRlcmlu
ZworICBjb250ZXh0LgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3tsb2cgbXlWYXJpYWJsZX19Cisg
IGBgYAorCisgIEBtZXRob2QgbG9nCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisg
IEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQorKi8KK0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJI
ZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKHByb3BlcnR5LCBvcHRpb25zKSB7CisgIHZhciBjb250ZXh0
ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0c1swXSkgfHwgdGhpcywKKyAg
ICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRleHQsIHByb3BlcnR5LCBvcHRpb25z
LmRhdGEpLAorICAgICAgcGF0aFJvb3QgPSBub3JtYWxpemVkLnJvb3QsCisgICAgICBwYXRoID0g
bm9ybWFsaXplZC5wYXRoLAorICAgICAgdmFsdWUgPSAocGF0aCA9PT0gJ3RoaXMnKSA/IHBhdGhS
b290IDogaGFuZGxlYmFyc0dldChwYXRoUm9vdCwgcGF0aCwgb3B0aW9ucyk7CisgIEVtYmVyLkxv
Z2dlci5sb2codmFsdWUpOworfSk7CisKKy8qKgorICBFeGVjdXRlIHRoZSBgZGVidWdnZXJgIHN0
YXRlbWVudCBpbiB0aGUgY3VycmVudCBjb250ZXh0LgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3tk
ZWJ1Z2dlcn19CisgIGBgYAorCisgIEBtZXRob2QgZGVidWdnZXIKKyAgQGZvciBFbWJlci5IYW5k
bGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5CisqLworRW1iZXIuSGFu
ZGxlYmFycy5yZWdpc3RlckhlbHBlcignZGVidWdnZXInLCBmdW5jdGlvbigpIHsKKyAgZGVidWdn
ZXI7Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJl
cgorQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQ7CisKK0VtYmVyLkhhbmRsZWJhcnMuRWFjaFZpZXcgPSBFbWJlci5D
b2xsZWN0aW9uVmlldy5leHRlbmQoRW1iZXIuX01ldGFtb3JwaCwgeworICBpbml0OiBmdW5jdGlv
bigpIHsKKyAgICB2YXIgaXRlbUNvbnRyb2xsZXIgPSBnZXQodGhpcywgJ2l0ZW1Db250cm9sbGVy
Jyk7CisgICAgdmFyIGJpbmRpbmc7CisKKyAgICBpZiAoaXRlbUNvbnRyb2xsZXIpIHsKKyAgICAg
IHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmNyZWF0ZSgpOworICAgICAg
c2V0KGNvbnRyb2xsZXIsICdpdGVtQ29udHJvbGxlcicsIGl0ZW1Db250cm9sbGVyKTsKKyAgICAg
IHNldChjb250cm9sbGVyLCAnY29udGFpbmVyJywgZ2V0KHRoaXMsICdjb250cm9sbGVyLmNvbnRh
aW5lcicpKTsKKyAgICAgIHNldChjb250cm9sbGVyLCAnX2VhY2hWaWV3JywgdGhpcyk7CisgICAg
ICBzZXQoY29udHJvbGxlciwgJ3RhcmdldCcsIGdldCh0aGlzLCAnY29udHJvbGxlcicpKTsKKwor
ICAgICAgdGhpcy5kaXNhYmxlQ29udGVudE9ic2VydmVycyhmdW5jdGlvbigpIHsKKyAgICAgICAg
c2V0KHRoaXMsICdjb250ZW50JywgY29udHJvbGxlcik7CisgICAgICAgIGJpbmRpbmcgPSBuZXcg
RW1iZXIuQmluZGluZygnY29udGVudCcsICdfZWFjaFZpZXcuZGF0YVNvdXJjZScpLm9uZVdheSgp
OworICAgICAgICBiaW5kaW5nLmNvbm5lY3QoY29udHJvbGxlcik7CisgICAgICB9KTsKKworICAg
ICAgc2V0KHRoaXMsICdfYXJyYXlDb250cm9sbGVyJywgY29udHJvbGxlcik7CisgICAgfSBlbHNl
IHsKKyAgICAgIHRoaXMuZGlzYWJsZUNvbnRlbnRPYnNlcnZlcnMoZnVuY3Rpb24oKSB7CisgICAg
ICAgIGJpbmRpbmcgPSBuZXcgRW1iZXIuQmluZGluZygnY29udGVudCcsICdkYXRhU291cmNlJyku
b25lV2F5KCk7CisgICAgICAgIGJpbmRpbmcuY29ubmVjdCh0aGlzKTsKKyAgICAgIH0pOworICAg
IH0KKworICAgIHJldHVybiB0aGlzLl9zdXBlcigpOworICB9LAorCisgIGRpc2FibGVDb250ZW50
T2JzZXJ2ZXJzOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgIEVtYmVyLnJlbW92ZUJlZm9yZU9i
c2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50V2lsbENoYW5nZScpOworICAg
IEVtYmVyLnJlbW92ZU9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50RGlk
Q2hhbmdlJyk7CisKKyAgICBjYWxsYmFjay5hcHBseSh0aGlzKTsKKworICAgIEVtYmVyLmFkZEJl
Zm9yZU9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50V2lsbENoYW5nZScp
OworICAgIEVtYmVyLmFkZE9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50
RGlkQ2hhbmdlJyk7CisgIH0sCisKKyAgaXRlbVZpZXdDbGFzczogRW1iZXIuX01ldGFtb3JwaFZp
ZXcsCisgIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5fTWV0YW1vcnBoVmlldywKKworICBjcmVhdGVD
aGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7CisgICAgdmlldyA9IHRoaXMuX3N1cGVy
KHZpZXcsIGF0dHJzKTsKKworICAgIC8vIEF0IHRoZSBtb21lbnQsIGlmIGEgY29udGFpbmVyIHZp
ZXcgc3ViY2xhc3Mgd2FudHMKKyAgICAvLyB0byBpbnNlcnQga2V5d29yZHMsIGl0IGlzIHJlc3Bv
bnNpYmxlIGZvciBjbG9uaW5nCisgICAgLy8gdGhlIGtleXdvcmRzIGhhc2guIFRoaXMgd2lsbCBi
ZSBmaXhlZCBtb21lbnRhcmlseS4KKyAgICB2YXIga2V5d29yZCA9IGdldCh0aGlzLCAna2V5d29y
ZCcpOworICAgIHZhciBjb250ZW50ID0gZ2V0KHZpZXcsICdjb250ZW50Jyk7CisKKyAgICBpZiAo
a2V5d29yZCkgeworICAgICAgdmFyIGRhdGEgPSBnZXQodmlldywgJ3RlbXBsYXRlRGF0YScpOwor
CisgICAgICBkYXRhID0gRW1iZXIuY29weShkYXRhKTsKKyAgICAgIGRhdGEua2V5d29yZHMgPSB2
aWV3LmNsb25lS2V5d29yZHMoKTsKKyAgICAgIHNldCh2aWV3LCAndGVtcGxhdGVEYXRhJywgZGF0
YSk7CisKKyAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgZG8gbm90IGJpbmQsIGJlY2F1c2UgdGhl
IGBjb250ZW50YCBvZgorICAgICAgLy8gYSAjZWFjaCBpdGVtIGNhbm5vdCBjaGFuZ2UuCisgICAg
ICBkYXRhLmtleXdvcmRzW2tleXdvcmRdID0gY29udGVudDsKKyAgICB9CisKKyAgICAvLyBJZiB7
eyNlYWNofX0gaXMgbG9vcGluZyBvdmVyIGFuIGFycmF5IG9mIGNvbnRyb2xsZXJzLAorICAgIC8v
IHBvaW50IGVhY2ggY2hpbGQgdmlldyBhdCB0aGVpciByZXNwZWN0aXZlIGNvbnRyb2xsZXIuCisg
ICAgaWYgKGNvbnRlbnQgJiYgZ2V0KGNvbnRlbnQsICdpc0NvbnRyb2xsZXInKSkgeworICAgICAg
c2V0KHZpZXcsICdjb250cm9sbGVyJywgY29udGVudCk7CisgICAgfQorCisgICAgcmV0dXJuIHZp
ZXc7CisgIH0sCisKKyAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcnJheUNv
bnRyb2xsZXIgPSBnZXQodGhpcywgJ19hcnJheUNvbnRyb2xsZXInKTsKKworICAgIGlmIChhcnJh
eUNvbnRyb2xsZXIpIHsKKyAgICAgIGFycmF5Q29udHJvbGxlci5kZXN0cm95KCk7CisgICAgfQor
CisgICAgcmV0dXJuIHRoaXMuX3N1cGVyKCk7CisgIH0KK30pOworCit2YXIgR3JvdXBlZEVhY2gg
PSBFbWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNoID0gZnVuY3Rpb24oY29udGV4dCwgcGF0aCwg
b3B0aW9ucykgeworICB2YXIgc2VsZiA9IHRoaXMsCisgICAgICBub3JtYWxpemVkID0gRW1iZXIu
SGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKGNvbnRleHQsIHBhdGgsIG9wdGlvbnMuZGF0YSk7CisK
KyAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgdGhpcy5wYXRoID0gcGF0aDsKKyAgdGhpcy5v
cHRpb25zID0gb3B0aW9uczsKKyAgdGhpcy50ZW1wbGF0ZSA9IG9wdGlvbnMuZm47CisgIHRoaXMu
Y29udGFpbmluZ1ZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKKyAgdGhpcy5ub3JtYWxpemVkUm9v
dCA9IG5vcm1hbGl6ZWQucm9vdDsKKyAgdGhpcy5ub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZWQu
cGF0aDsKKyAgdGhpcy5jb250ZW50ID0gdGhpcy5sb29rdXBDb250ZW50KCk7CisKKyAgdGhpcy5h
ZGRDb250ZW50T2JzZXJ2ZXJzKCk7CisgIHRoaXMuYWRkQXJyYXlPYnNlcnZlcnMoKTsKKworICB0
aGlzLmNvbnRhaW5pbmdWaWV3Lm9uKCd3aWxsQ2xlYXJSZW5kZXInLCBmdW5jdGlvbigpIHsKKyAg
ICBzZWxmLmRlc3Ryb3koKTsKKyAgfSk7Cit9OworCitHcm91cGVkRWFjaC5wcm90b3R5cGUgPSB7
CisgIGNvbnRlbnRXaWxsQ2hhbmdlOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnJlbW92ZUFycmF5
T2JzZXJ2ZXJzKCk7CisgIH0sCisKKyAgY29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7Cisg
ICAgdGhpcy5jb250ZW50ID0gdGhpcy5sb29rdXBDb250ZW50KCk7CisgICAgdGhpcy5hZGRBcnJh
eU9ic2VydmVycygpOworICAgIHRoaXMucmVyZW5kZXJDb250YWluaW5nVmlldygpOworICB9LAor
CisgIGNvbnRlbnRBcnJheVdpbGxDaGFuZ2U6IEVtYmVyLkssCisKKyAgY29udGVudEFycmF5RGlk
Q2hhbmdlOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnJlcmVuZGVyQ29udGFpbmluZ1ZpZXcoKTsK
KyAgfSwKKworICBsb29rdXBDb250ZW50OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRW1iZXIu
SGFuZGxlYmFycy5nZXQodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwg
dGhpcy5vcHRpb25zKTsKKyAgfSwKKworICBhZGRBcnJheU9ic2VydmVyczogZnVuY3Rpb24oKSB7
CisgICAgdGhpcy5jb250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhpcywgeworICAgICAgd2lsbENo
YW5nZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgZGlkQ2hhbmdlOiAnY29udGVu
dEFycmF5RGlkQ2hhbmdlJworICAgIH0pOworICB9LAorCisgIHJlbW92ZUFycmF5T2JzZXJ2ZXJz
OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlz
LCB7CisgICAgICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCisgICAgICBk
aWRDaGFuZ2U6ICdjb250ZW50QXJyYXlEaWRDaGFuZ2UnCisgICAgfSk7CisgIH0sCisKKyAgYWRk
Q29udGVudE9ic2VydmVyczogZnVuY3Rpb24oKSB7CisgICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2
ZXIodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5j
b250ZW50V2lsbENoYW5nZSk7CisgICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcy5ub3JtYWxpemVk
Um9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250ZW50RGlkQ2hhbmdlKTsK
KyAgfSwKKworICByZW1vdmVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKKyAgICBFbWJl
ci5yZW1vdmVCZWZvcmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6
ZWRQYXRoLCB0aGlzLmNvbnRlbnRXaWxsQ2hhbmdlKTsKKyAgICBFbWJlci5yZW1vdmVPYnNlcnZl
cih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLmNvbnRlbnRE
aWRDaGFuZ2UpOworICB9LAorCisgIHJlbmRlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRl
bnQgPSB0aGlzLmNvbnRlbnQsCisgICAgICAgIGNvbnRlbnRMZW5ndGggPSBnZXQoY29udGVudCwg
J2xlbmd0aCcpLAorICAgICAgICBkYXRhID0gdGhpcy5vcHRpb25zLmRhdGEsCisgICAgICAgIHRl
bXBsYXRlID0gdGhpcy50ZW1wbGF0ZTsKKworICAgIGRhdGEuaW5zaWRlRWFjaCA9IHRydWU7Cisg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50TGVuZ3RoOyBpKyspIHsKKyAgICAgIHRlbXBs
YXRlKGNvbnRlbnQub2JqZWN0QXQoaSksIHsgZGF0YTogZGF0YSB9KTsKKyAgICB9CisgIH0sCisK
KyAgcmVyZW5kZXJDb250YWluaW5nVmlldzogZnVuY3Rpb24oKSB7CisgICAgRW1iZXIucnVuLnNj
aGVkdWxlT25jZSgncmVuZGVyJywgdGhpcy5jb250YWluaW5nVmlldywgJ3JlcmVuZGVyJyk7Cisg
IH0sCisKKyAgZGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5yZW1vdmVDb250ZW50T2Jz
ZXJ2ZXJzKCk7CisgICAgdGhpcy5yZW1vdmVBcnJheU9ic2VydmVycygpOworICB9Cit9OworCisv
KioKKyAgVGhlIGB7eyNlYWNofX1gIGhlbHBlciBsb29wcyBvdmVyIGVsZW1lbnRzIGluIGEgY29s
bGVjdGlvbiwgcmVuZGVyaW5nIGl0cworICBibG9jayBvbmNlIGZvciBlYWNoIGl0ZW0uIEl0IGlz
IGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBIYW5kbGViYXJzIGB7eyNlYWNofX1gCisgIGhlbHBl
cjoKKworICBgYGBqYXZhc2NyaXB0CisgIERldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1ZGEnfSx7
bmFtZTogJ1RvbSd9LCB7bmFtZTogJ1BhdWwnfV07CisgIGBgYAorCisgIGBgYGhhbmRsZWJhcnMK
KyAge3sjZWFjaCBEZXZlbG9wZXJzfX0KKyAgICB7e25hbWV9fQorICB7ey9lYWNofX0KKyAgYGBg
CisKKyAgYHt7ZWFjaH19YCBzdXBwb3J0cyBhbiBhbHRlcm5hdGl2ZSBzeW50YXggd2l0aCBlbGVt
ZW50IG5hbWluZzoKKworICBgYGBoYW5kbGViYXJzCisgIHt7I2VhY2ggcGVyc29uIGluIERldmVs
b3BlcnN9fQorICAgIHt7cGVyc29uLm5hbWV9fQorICB7ey9lYWNofX0KKyAgYGBgCisKKyAgV2hl
biBsb29waW5nIG92ZXIgb2JqZWN0cyB0aGF0IGRvIG5vdCBoYXZlIHByb3BlcnRpZXMsIGB7e3Ro
aXN9fWAgY2FuIGJlIHVzZWQKKyAgdG8gcmVuZGVyIHRoZSBvYmplY3Q6CisKKyAgYGBgamF2YXNj
cmlwdAorICBEZXZlbG9wZXJOYW1lcyA9IFsnWWVodWRhJywgJ1RvbScsICdQYXVsJ10KKyAgYGBg
CisKKyAgYGBgaGFuZGxlYmFycworICB7eyNlYWNoIERldmVsb3Blck5hbWVzfX0KKyAgICB7e3Ro
aXN9fQorICB7ey9lYWNofX0KKyAgYGBgCisgICMjIyB7e2Vsc2V9fSBjb25kaXRpb24KKyAgYHt7
I2VhY2h9fWAgY2FuIGhhdmUgYSBtYXRjaGluZyBge3tlbHNlfX1gLiBUaGUgY29udGVudHMgb2Yg
dGhpcyBibG9jayB3aWxsIHJlbmRlcgorICBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4KKwor
ICBgYGAKKyAge3sjZWFjaCBwZXJzb24gaW4gRGV2ZWxvcGVyc319CisgICAge3twZXJzb24ubmFt
ZX19CisgIHt7ZWxzZX19CisgICAgPHA+U29ycnksIG5vYm9keSBpcyBhdmFpbGFibGUgZm9yIHRo
aXMgdGFzay48L3A+CisgIHt7L2VhY2h9fQorICBgYGAKKyAgIyMjIFNwZWNpZnlpbmcgYSBWaWV3
IGNsYXNzIGZvciBpdGVtcworICBJZiB5b3UgcHJvdmlkZSBhbiBgaXRlbVZpZXdDbGFzc2Agb3B0
aW9uIHRoYXQgcmVmZXJlbmNlcyBhIHZpZXcgY2xhc3MKKyAgd2l0aCBpdHMgb3duIGB0ZW1wbGF0
ZWAgeW91IGNhbiBvbWl0IHRoZSBibG9jay4KKworICBUaGUgZm9sbG93aW5nIHRlbXBsYXRlOgor
CisgIGBgYGhhbmRsZWJhcnMKKyAge3sjdmlldyBBcHAuTXlWaWV3IH19CisgICAge3tlYWNoIHZp
ZXcuaXRlbXMgaXRlbVZpZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXcifX0gCisgIHt7L3ZpZXd9fQor
ICBgYGAKKworICBBbmQgYXBwbGljYXRpb24gY29kZQorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICBNeVZpZXc6IEVtYmVyLlZpZXcuZXh0
ZW5kKHsKKyAgICAgIGl0ZW1zOiBbCisgICAgICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe25hbWU6
ICdEYXZlJ30pLAorICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnTWFyeSd9KSwK
KyAgICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKKyAgICAgIF0KKyAg
ICB9KQorICB9KTsKKworICBBcHAuQW5JdGVtVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAg
ICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJHcmVldGluZ3Mge3tuYW1lfX0i
KQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIEhUTUwgc3RydWN0dXJlIGJl
bG93CisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgRGF2ZTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVt
YmVyLXZpZXciPkdyZWV0aW5ncyBNYXJ5PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmll
dyI+R3JlZXRpbmdzIFNhcmE8L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorICAKKyAgIyMjIFJlcHJl
c2VudGluZyBlYWNoIGl0ZW0gd2l0aCBhIENvbnRyb2xsZXIuCisgIEJ5IGRlZmF1bHQgdGhlIGNv
bnRyb2xsZXIgbG9va3VwIHdpdGhpbiBhbiBge3sjZWFjaH19YCBibG9jayB3aWxsIGJlCisgIHRo
ZSBjb250cm9sbGVyIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZSB0aGUgYHt7I2VhY2h9fWAgd2FzIHVz
ZWQuIElmIGVhY2gKKyAgaXRlbSBuZWVkcyB0byBiZSBwcmVzZW50ZWQgYnkgYSBjdXN0b20gY29u
dHJvbGxlciB5b3UgY2FuIHByb3ZpZGUgYQorICBgaXRlbUNvbnRyb2xsZXJgIG9wdGlvbiB3aGlj
aCByZWZlcmVuY2VzIGEgY29udHJvbGxlciBieSBsb29rdXAgbmFtZS4KKyAgRWFjaCBpdGVtIGlu
IHRoZSBsb29wIHdpbGwgYmUgd3JhcHBlZCBpbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xs
ZXIKKyAgYW5kIHRoZSBpdGVtIGl0c2VsZiB3aWxsIGJlIHNldCB0byB0aGUgYGNvbnRlbnRgIHBy
b3BlcnR5IG9mIHRoYXQgY29udHJvbGxlci4KKyAgCisgIFRoaXMgaXMgdXNlZnVsIGluIGNhc2Vz
IHdoZXJlIHByb3BlcnRpZXMgb2YgbW9kZWwgb2JqZWN0cyBuZWVkIHRyYW5zZm9ybWF0aW9uCisg
IG9yIHN5bnRoZXNpcyBmb3IgZGlzcGxheToKKyAgCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLkRl
dmVsb3BlckNvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RDb250cm9sbGVyLmV4dGVuZCh7CisgICAg
aXNBdmFpbGFibGVGb3JIaXJlOiBmdW5jdGlvbigpeworICAgICAgcmV0dXJuICF0aGlzLmdldCgn
Y29udGVudC5pc0VtcGxveWVkJykgJiYgdGhpcy5nZXQoJ2NvbnRlbnQuaXNTZWVraW5nV29yaycp
OworICAgIH0ucHJvcGVydHkoJ2lzRW1wbG95ZWQnLCAnaXNTZWVraW5nV29yaycpCisgIH0pCisg
IGBgYAorICAKKyAgYGBgaGFuZGxlYmFycworICB7eyNlYWNoIHBlcnNvbiBpbiBEZXZlbG9wZXJz
IGl0ZW1Db250cm9sbGVyPSJkZXZlbG9wZXIifX0KKyAgICB7e3BlcnNvbi5uYW1lfX0ge3sjaWYg
cGVyc29uLmlzQXZhaWxhYmxlRm9ySGlyZX19SGlyZSBtZSF7ey9pZn19CisgIHt7L2VhY2h9fQor
ICBgYGAKKyAgCisgIEBtZXRob2QgZWFjaAorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVy
cworICBAcGFyYW0gW25hbWVdIHtTdHJpbmd9IG5hbWUgZm9yIGl0ZW0gKHVzZWQgd2l0aCBgaW5g
KQorICBAcGFyYW0gcGF0aCB7U3RyaW5nfSBwYXRoCisgIEBwYXJhbSBbb3B0aW9uc10ge09iamVj
dH0gSGFuZGxlYmFycyBrZXkvdmFsdWUgcGFpcnMgb2Ygb3B0aW9ucworICBAcGFyYW0gW29wdGlv
bnMuaXRlbVZpZXdDbGFzc10ge1N0cmluZ30gYSBwYXRoIHRvIGEgdmlldyBjbGFzcyB1c2VkIGZv
ciBlYWNoIGl0ZW0KKyAgQHBhcmFtIFtvcHRpb25zLml0ZW1Db250cm9sbGVyXSB7U3RyaW5nfSBu
YW1lIG9mIGEgY29udHJvbGxlciB0byBiZSBjcmVhdGVkIGZvciBlYWNoIGl0ZW0KKyovCitFbWJl
ci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdlYWNoJywgZnVuY3Rpb24ocGF0aCwgb3B0aW9u
cykgeworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkgeworICAgIEVtYmVyLmFzc2VydCgi
SWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgZWFjaCBoZWxwZXIsIGl0
IG11c3QgYmUgaW4gdGhlIGZvcm0gI2VhY2ggZm9vIGluIGJhciIsIGFyZ3VtZW50c1sxXSA9PT0g
ImluIik7CisKKyAgICB2YXIga2V5d29yZE5hbWUgPSBhcmd1bWVudHNbMF07CisKKyAgICBvcHRp
b25zID0gYXJndW1lbnRzWzNdOworICAgIHBhdGggPSBhcmd1bWVudHNbMl07CisgICAgaWYgKHBh
dGggPT09ICcnKSB7IHBhdGggPSAidGhpcyI7IH0KKworICAgIG9wdGlvbnMuaGFzaC5rZXl3b3Jk
ID0ga2V5d29yZE5hbWU7CisgIH0KKworICBvcHRpb25zLmhhc2guZGF0YVNvdXJjZUJpbmRpbmcg
PSBwYXRoOworICAvLyBTZXQgdXAgZW1wdHlWaWV3IGFzIGEgbWV0YW1vcnBoIHdpdGggbm8gdGFn
CisgIC8vb3B0aW9ucy5oYXNoLmVtcHR5Vmlld0NsYXNzID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7
CisKKyAgaWYgKG9wdGlvbnMuZGF0YS5pbnNpZGVHcm91cCAmJiAhb3B0aW9ucy5oYXNoLmdyb3Vw
ZWRSb3dzICYmICFvcHRpb25zLmhhc2guaXRlbVZpZXdDbGFzcykgeworICAgIG5ldyBFbWJlci5I
YW5kbGViYXJzLkdyb3VwZWRFYWNoKHRoaXMsIHBhdGgsIG9wdGlvbnMpLnJlbmRlcigpOworICB9
IGVsc2UgeworICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuY29sbGVjdGlvbi5j
YWxsKHRoaXMsICdFbWJlci5IYW5kbGViYXJzLkVhY2hWaWV3Jywgb3B0aW9ucyk7CisgIH0KK30p
OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3Vi
bW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKKy8qKgorICBgdGVtcGxhdGVgIGFsbG93cyB5
b3UgdG8gcmVuZGVyIGEgdGVtcGxhdGUgZnJvbSBpbnNpZGUgYW5vdGhlciB0ZW1wbGF0ZS4KKyAg
VGhpcyBhbGxvd3MgeW91IHRvIHJlLXVzZSB0aGUgc2FtZSB0ZW1wbGF0ZSBpbiBtdWx0aXBsZSBw
bGFjZXMuIEZvciBleGFtcGxlOgorCisgIGBgYGh0bWwKKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gt
aGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJsb2dnZWRfaW5fdXNlciI+CisgICAge3sj
d2l0aCBsb2dnZWRJblVzZXJ9fQorICAgICAgTGFzdCBMb2dpbjoge3tsYXN0TG9naW59fQorICAg
ICAgVXNlciBJbmZvOiB7e3RlbXBsYXRlICJ1c2VyX2luZm8ifX0KKyAgICB7ey93aXRofX0KKyAg
PC9zY3JpcHQ+CisgIGBgYAorCisgIGBgYGh0bWwKKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFu
ZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJ1c2VyX2luZm8iPgorICAgIE5hbWU6IDxlbT57
e25hbWV9fTwvZW0+CisgICAgS2FybWE6IDxlbT57e2thcm1hfX08L2VtPgorICA8L3NjcmlwdD4K
KyAgYGBgCisKKyAgVGhpcyBoZWxwZXIgbG9va3MgZm9yIHRlbXBsYXRlcyBpbiB0aGUgZ2xvYmFs
IGBFbWJlci5URU1QTEFURVNgIGhhc2guIElmIHlvdQorICBhZGQgYDxzY3JpcHQ+YCB0YWdzIHRv
IHlvdXIgcGFnZSB3aXRoIHRoZSBgZGF0YS10ZW1wbGF0ZS1uYW1lYCBhdHRyaWJ1dGUgc2V0LAor
ICB0aGV5IHdpbGwgYmUgY29tcGlsZWQgYW5kIHBsYWNlZCBpbiB0aGlzIGhhc2ggYXV0b21hdGlj
YWxseS4KKworICBZb3UgY2FuIGFsc28gbWFudWFsbHkgcmVnaXN0ZXIgdGVtcGxhdGVzIGJ5IGFk
ZGluZyB0aGVtIHRvIHRoZSBoYXNoOgorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuVEVNUExB
VEVTWyJteV9jb29sX3RlbXBsYXRlIl0gPSBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJzxiPnt7
dXNlcn19PC9iPicpOworICBgYGAKKworICBAbWV0aG9kIHRlbXBsYXRlCisgIEBmb3IgRW1iZXIu
SGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZU5hbWUgdGhlIHRl
bXBsYXRlIHRvIHJlbmRlcgorKi8KKworRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign
dGVtcGxhdGUnLCBmdW5jdGlvbihuYW1lLCBvcHRpb25zKSB7CisgIHZhciB0ZW1wbGF0ZSA9IEVt
YmVyLlRFTVBMQVRFU1tuYW1lXTsKKworICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIHRl
bXBsYXRlIHdpdGggbmFtZSAnIituYW1lKyInLiIsICEhdGVtcGxhdGUpOworCisgIEVtYmVyLlRF
TVBMQVRFU1tuYW1lXSh0aGlzLCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KTsKK30pOworCitFbWJl
ci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdwYXJ0aWFsJywgZnVuY3Rpb24obmFtZSwgb3B0
aW9ucykgeworICB2YXIgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgiLyIpLAorICAgICAgbGFzdFBh
cnQgPSBuYW1lUGFydHNbbmFtZVBhcnRzLmxlbmd0aCAtIDFdOworCisgIG5hbWVQYXJ0c1tuYW1l
UGFydHMubGVuZ3RoIC0gMV0gPSAiXyIgKyBsYXN0UGFydDsKKworICB2YXIgdW5kZXJzY29yZWRO
YW1lID0gbmFtZVBhcnRzLmpvaW4oIi8iKTsKKworICB2YXIgdGVtcGxhdGUgPSBFbWJlci5URU1Q
TEFURVNbdW5kZXJzY29yZWROYW1lXSwKKyAgICAgIGRlcHJlY2F0ZWRUZW1wbGF0ZSA9IEVtYmVy
LlRFTVBMQVRFU1tuYW1lXTsKKworICBFbWJlci5kZXByZWNhdGUoIllvdSB0cmllZCB0byByZW5k
ZXIgdGhlIHBhcnRpYWwgIiArIG5hbWUgKyAiLCB3aGljaCBzaG91bGQgYmUgYXQgJyIgKyB1bmRl
cnNjb3JlZE5hbWUgKyAiJywgYnV0IEVtYmVyIGZvdW5kICciICsgbmFtZSArICInLiBQbGVhc2Ug
dXNlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGluIHlvdXIgcGFydGlhbHMiLCB0ZW1wbGF0ZSk7Cisg
IEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUgJyIrbmFtZSsi
Jy4iLCB0ZW1wbGF0ZSB8fCBkZXByZWNhdGVkVGVtcGxhdGUpOworCisgIHRlbXBsYXRlID0gdGVt
cGxhdGUgfHwgZGVwcmVjYXRlZFRlbXBsYXRlOworCisgIHRlbXBsYXRlKHRoaXMsIHsgZGF0YTog
b3B0aW9ucy5kYXRhIH0pOworfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioK
K0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAgV2hlbiB1c2VkIGluIGEg
SGFuZGxlYmFycyB0ZW1wbGF0ZSB0aGF0IGlzIGFzc2lnbmVkIHRvIGFuIGBFbWJlci5WaWV3YAor
ICBpbnN0YW5jZSdzIGBsYXlvdXRgIHByb3BlcnR5IEVtYmVyIHdpbGwgcmVuZGVyIHRoZSBsYXlv
dXQgdGVtcGxhdGUgZmlyc3QsCisgIGluc2VydGluZyB0aGUgdmlldydzIG93biByZW5kZXJlZCBv
dXRwdXQgYXQgdGhlIGB7e3lpZWxkfX1gIGxvY2F0aW9uLgorCisgIEFuIGVtcHR5IGA8Ym9keT5g
IGFuZCB0aGUgZm9sbG93aW5nIGFwcGxpY2F0aW9uIGNvZGU6CisKKyAgYGBgamF2YXNjcmlwdAor
ICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBjbGFzc05hbWVzOiBbJ2Etdmlldy13
aXRoLWxheW91dCddLAorICAgIGxheW91dDogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8ZGl2
IGNsYXNzPSJ3cmFwcGVyIj57e3lpZWxkfX08L2Rpdj4nKSwKKyAgICB0ZW1wbGF0ZTogRW1iZXIu
SGFuZGxlYmFycy5jb21waWxlKCc8c3Bhbj5JIGFtIHdyYXBwZWQ8L3NwYW4+JykKKyAgfSk7CisK
KyAgYVZpZXcgPSBBVmlldy5jcmVhdGUoKTsKKyAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKKyAg
YGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIG91dHB1dDoKKworICBg
YGBodG1sCisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9J2VtYmVyLXZpZXcgYS12aWV3LXdpdGgt
bGF5b3V0Jz4KKyAgICAgIDxkaXYgY2xhc3M9IndyYXBwZXIiPgorICAgICAgICA8c3Bhbj5JIGFt
IHdyYXBwZWQ8L3NwYW4+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorICBg
YGAKKworICBUaGUgYHlpZWxkYCBoZWxwZXIgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhIHRl
bXBsYXRlIGFzc2lnbmVkIHRvIGFuCisgIGBFbWJlci5WaWV3YCdzIGBsYXlvdXRgIHByb3BlcnR5
IGFuZCB3aWxsIHRocm93IGFuIGVycm9yIGlmIGF0dGVtcHRlZC4KKworICBgYGBqYXZhc2NyaXB0
CisgIEJWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIGNsYXNzTmFtZXM6IFsnYS12aWV3
LXdpdGgtbGF5b3V0J10sCisgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgn
e3t5aWVsZH19JykKKyAgfSk7CisKKyAgYlZpZXcgPSBCVmlldy5jcmVhdGUoKTsKKyAgYlZpZXcu
YXBwZW5kVG8oJ2JvZHknKTsKKworICAvLyB0aHJvd3MKKyAgLy8gVW5jYXVnaHQgRXJyb3I6IGFz
c2VydGlvbiBmYWlsZWQ6IFlvdSBjYWxsZWQgeWllbGQgaW4gYSB0ZW1wbGF0ZSB0aGF0IHdhcyBu
b3QgYSBsYXlvdXQKKyAgYGBgCisKKyAgQG1ldGhvZCB5aWVsZAorICBAZm9yIEVtYmVyLkhhbmRs
ZWJhcnMuaGVscGVycworICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKKyAgQHJldHVybiB7U3RyaW5n
fSBIVE1MIHN0cmluZworKi8KK0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3lpZWxk
JywgZnVuY3Rpb24ob3B0aW9ucykgeworICB2YXIgdmlldyA9IG9wdGlvbnMuZGF0YS52aWV3LCB0
ZW1wbGF0ZTsKKworICB3aGlsZSAodmlldyAmJiAhZ2V0KHZpZXcsICdsYXlvdXQnKSkgeworICAg
IHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKKyAgfQorCisgIEVtYmVyLmFzc2VydCgi
WW91IGNhbGxlZCB5aWVsZCBpbiBhIHRlbXBsYXRlIHRoYXQgd2FzIG5vdCBhIGxheW91dCIsICEh
dmlldyk7CisKKyAgdGVtcGxhdGUgPSBnZXQodmlldywgJ3RlbXBsYXRlJyk7CisKKyAgaWYgKHRl
bXBsYXRlKSB7IHRlbXBsYXRlKHRoaXMsIG9wdGlvbnMpOyB9Cit9KTsKKworfSkoKTsKKworCisK
KyhmdW5jdGlvbigpIHsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKworfSkoKTsKKwor
CisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1o
YW5kbGViYXJzCisqLworCit2YXIgc2V0ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQ7CisK
Ky8qKgorICBUaGUgYEVtYmVyLkNoZWNrYm94YCB2aWV3IGNsYXNzIHJlbmRlcnMgYSBjaGVja2Jv
eAorICBbaW5wdXRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxlbWVu
dC9JbnB1dCkgZWxlbWVudC4gSXQKKyAgYWxsb3dzIGZvciBiaW5kaW5nIGFuIEVtYmVyIHByb3Bl
cnR5IChgY2hlY2tlZGApIHRvIHRoZSBzdGF0dXMgb2YgdGhlCisgIGNoZWNrYm94LgorCisgIEV4
YW1wbGU6CisKKyAgYGBgaGFuZGxlYmFycworICB7e3ZpZXcgRW1iZXIuQ2hlY2tib3ggY2hlY2tl
ZEJpbmRpbmc9InJlY2VpdmVFbWFpbCJ9fQorICBgYGAKKworICBZb3UgY2FuIGFkZCBhIGBsYWJl
bGAgdGFnIHlvdXJzZWxmIGluIHRoZSB0ZW1wbGF0ZSB3aGVyZSB0aGUgYEVtYmVyLkNoZWNrYm94
YAorICBpcyBiZWluZyB1c2VkLgorCisgIGBgYGh0bWwKKyAgPGxhYmVsPgorICAgIHt7dmlldyBF
bWJlci5DaGVja2JveCBjbGFzc05hbWVzPSJhcHBsaWNhdG9uLXNwZWNpZmljLWNoZWNrYm94In19
CisgICAgU29tZSBUaXRsZQorICA8L2xhYmVsPgorICBgYGAKKworICBUaGUgYGNoZWNrZWRgIGF0
dHJpYnV0ZSBvZiBhbiBgRW1iZXIuQ2hlY2tib3hgIG9iamVjdCBzaG91bGQgYWx3YXlzIGJlIHNl
dAorICB0aHJvdWdoIHRoZSBFbWJlciBvYmplY3Qgb3IgYnkgaW50ZXJhY3Rpbmcgd2l0aCBpdHMg
cmVuZGVyZWQgZWxlbWVudAorICByZXByZXNlbnRhdGlvbiB2aWEgdGhlIG1vdXNlLCBrZXlib2Fy
ZCwgb3IgdG91Y2guIFVwZGF0aW5nIHRoZSB2YWx1ZSBvZiB0aGUKKyAgY2hlY2tib3ggdmlhIGpR
dWVyeSB3aWxsIHJlc3VsdCBpbiB0aGUgY2hlY2tlZCB2YWx1ZSBvZiB0aGUgb2JqZWN0IGFuZCBp
dHMKKyAgZWxlbWVudCBsb3Npbmcgc3luY2hyb25pemF0aW9uLgorCisgICMjIExheW91dCBhbmQg
TGF5b3V0TmFtZSBwcm9wZXJ0aWVzCisKKyAgQmVjYXVzZSBIVE1MIGBpbnB1dGAgZWxlbWVudHMg
YXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBhbmQgYGxheW91dE5hbWVgCisgIHByb3BlcnRpZXMg
d2lsbCBub3QgYmUgYXBwbGllZC4gU2VlIGBFbWJlci5WaWV3YCdzIGxheW91dCBzZWN0aW9uIGZv
ciBtb3JlCisgIGluZm9ybWF0aW9uLgorCisgIEBjbGFzcyBDaGVja2JveAorICBAbmFtZXNwYWNl
IEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLlZpZXcKKyovCitFbWJlci5DaGVja2JveCA9IEVtYmVy
LlZpZXcuZXh0ZW5kKHsKKyAgY2xhc3NOYW1lczogWydlbWJlci1jaGVja2JveCddLAorCisgIHRh
Z05hbWU6ICdpbnB1dCcsCisKKyAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlwZScsICdjaGVja2Vk
JywgJ2Rpc2FibGVkJywgJ3RhYmluZGV4J10sCisKKyAgdHlwZTogImNoZWNrYm94IiwKKyAgY2hl
Y2tlZDogZmFsc2UsCisgIGRpc2FibGVkOiBmYWxzZSwKKworICBpbml0OiBmdW5jdGlvbigpIHsK
KyAgICB0aGlzLl9zdXBlcigpOworICAgIHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMuX3Vw
ZGF0ZUVsZW1lbnRWYWx1ZSk7CisgIH0sCisKKyAgX3VwZGF0ZUVsZW1lbnRWYWx1ZTogZnVuY3Rp
b24oKSB7CisgICAgc2V0KHRoaXMsICdjaGVja2VkJywgdGhpcy4kKCkucHJvcCgnY2hlY2tlZCcp
KTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUg
ZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIGdldCA9IEVtYmVy
LmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAgU2hhcmVkIG1peGluIHVzZWQgYnkgYEVt
YmVyLlRleHRGaWVsZGAgYW5kIGBFbWJlci5UZXh0QXJlYWAuCisKKyAgQGNsYXNzIFRleHRTdXBw
b3J0CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyAgQHByaXZh
dGUKKyovCitFbWJlci5UZXh0U3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CisgIHZhbHVl
OiAiIiwKKworICBhdHRyaWJ1dGVCaW5kaW5nczogWydwbGFjZWhvbGRlcicsICdkaXNhYmxlZCcs
ICdtYXhsZW5ndGgnLCAndGFiaW5kZXgnXSwKKyAgcGxhY2Vob2xkZXI6IG51bGwsCisgIGRpc2Fi
bGVkOiBmYWxzZSwKKyAgbWF4bGVuZ3RoOiBudWxsLAorCisgIGluc2VydE5ld2xpbmU6IEVtYmVy
LkssCisgIGNhbmNlbDogRW1iZXIuSywKKworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlz
Ll9zdXBlcigpOworICAgIHRoaXMub24oImZvY3VzT3V0IiwgdGhpcywgdGhpcy5fZWxlbWVudFZh
bHVlRGlkQ2hhbmdlKTsKKyAgICB0aGlzLm9uKCJjaGFuZ2UiLCB0aGlzLCB0aGlzLl9lbGVtZW50
VmFsdWVEaWRDaGFuZ2UpOworICAgIHRoaXMub24oInBhc3RlIiwgdGhpcywgdGhpcy5fZWxlbWVu
dFZhbHVlRGlkQ2hhbmdlKTsKKyAgICB0aGlzLm9uKCJjdXQiLCB0aGlzLCB0aGlzLl9lbGVtZW50
VmFsdWVEaWRDaGFuZ2UpOworICAgIHRoaXMub24oImlucHV0IiwgdGhpcywgdGhpcy5fZWxlbWVu
dFZhbHVlRGlkQ2hhbmdlKTsKKyAgICB0aGlzLm9uKCJrZXlVcCIsIHRoaXMsIHRoaXMuaW50ZXJw
cmV0S2V5RXZlbnRzKTsKKyAgfSwKKworICBpbnRlcnByZXRLZXlFdmVudHM6IGZ1bmN0aW9uKGV2
ZW50KSB7CisgICAgdmFyIG1hcCA9IEVtYmVyLlRleHRTdXBwb3J0LktFWV9FVkVOVFM7CisgICAg
dmFyIG1ldGhvZCA9IG1hcFtldmVudC5rZXlDb2RlXTsKKworICAgIHRoaXMuX2VsZW1lbnRWYWx1
ZURpZENoYW5nZSgpOworICAgIGlmIChtZXRob2QpIHsgcmV0dXJuIHRoaXNbbWV0aG9kXShldmVu
dCk7IH0KKyAgfSwKKworICBfZWxlbWVudFZhbHVlRGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKKyAg
ICBzZXQodGhpcywgJ3ZhbHVlJywgdGhpcy4kKCkudmFsKCkpOworICB9CisKK30pOworCitFbWJl
ci5UZXh0U3VwcG9ydC5LRVlfRVZFTlRTID0geworICAxMzogJ2luc2VydE5ld2xpbmUnLAorICAy
NzogJ2NhbmNlbCcKK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAgVGhlIGBFbWJlci5UZXh0RmllbGRg
IHZpZXcgY2xhc3MgcmVuZGVycyBhIHRleHQKKyAgW2lucHV0XShodHRwczovL2RldmVsb3Blci5t
b3ppbGxhLm9yZy9lbi9IVE1ML0VsZW1lbnQvSW5wdXQpIGVsZW1lbnQuIEl0CisgIGFsbG93cyBm
b3IgYmluZGluZyBFbWJlciBwcm9wZXJ0aWVzIHRvIHRoZSB0ZXh0IGZpZWxkIGNvbnRlbnRzIChg
dmFsdWVgKSwKKyAgbGl2ZS11cGRhdGluZyBhcyB0aGUgdXNlciBpbnB1dHMgdGV4dC4KKworICBF
eGFtcGxlOgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3t2aWV3IEVtYmVyLlRleHRGaWVsZCB2YWx1
ZUJpbmRpbmc9ImZpcnN0TmFtZSJ9fQorICBgYGAKKworICAjIyBMYXlvdXQgYW5kIExheW91dE5h
bWUgcHJvcGVydGllcworCisgIEJlY2F1c2UgSFRNTCBgaW5wdXRgIGVsZW1lbnRzIGFyZSBzZWxm
IGNsb3NpbmcgYGxheW91dGAgYW5kIGBsYXlvdXROYW1lYAorICBwcm9wZXJ0aWVzIHdpbGwgbm90
IGJlIGFwcGxpZWQuIFNlZSBgRW1iZXIuVmlld2AncyBsYXlvdXQgc2VjdGlvbiBmb3IgbW9yZQor
ICBpbmZvcm1hdGlvbi4KKworICAjIyBIVE1MIEF0dHJpYnV0ZXMKKworICBCeSBkZWZhdWx0IGBF
bWJlci5UZXh0RmllbGRgIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGB0eXBlYCwgYHZhbHVlYCwgYHNp
emVgLAorICBgcGxhY2Vob2xkZXJgLCBgZGlzYWJsZWRgLCBgbWF4bGVuZ3RoYCBhbmQgYHRhYmlu
ZGV4YCBhdHRyaWJ1dGVzIG9uIGEKKyAgdGVzdCBmaWVsZC4gSWYgeW91IG5lZWQgdG8gc3VwcG9y
dCBtb3JlIGF0dHJpYnV0ZXMgaGF2ZSBhIGxvb2sgYXQgdGhlCisgIGBhdHRyaWJ1dGVCaW5kaW5n
c2AgcHJvcGVydHkgaW4gYEVtYmVyLlZpZXdgJ3MgSFRNTCBBdHRyaWJ1dGVzIHNlY3Rpb24uCisK
KyAgVG8gZ2xvYmFsbHkgYWRkIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB5b3Ug
Y2FuIHJlb3BlbgorICBgRW1iZXIuVGV4dEZpZWxkYCBvciBgRW1iZXIuVGV4dFN1cHBvcnRgLgor
CisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuVGV4dFN1cHBvcnQucmVvcGVuKHsKKyAgICBhdHRy
aWJ1dGVCaW5kaW5nczogWyJyZXF1aXJlZCJdCisgIH0pCisgIGBgYAorCisgIEBjbGFzcyBUZXh0
RmllbGQKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5WaWV3CisgIEB1c2Vz
IEVtYmVyLlRleHRTdXBwb3J0CisqLworRW1iZXIuVGV4dEZpZWxkID0gRW1iZXIuVmlldy5leHRl
bmQoRW1iZXIuVGV4dFN1cHBvcnQsCisgIC8qKiBAc2NvcGUgRW1iZXIuVGV4dEZpZWxkLnByb3Rv
dHlwZSAqLyB7CisKKyAgY2xhc3NOYW1lczogWydlbWJlci10ZXh0LWZpZWxkJ10sCisgIHRhZ05h
bWU6ICJpbnB1dCIsCisgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5cGUnLCAndmFsdWUnLCAnc2l6
ZScsICdwYXR0ZXJuJ10sCisKKyAgLyoqCisgICAgVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRo
ZSBpbnB1dCBlbGVtZW50LiBBcyB0aGUgdXNlciBpbnB1dHMgdGV4dCwgdGhpcworICAgIHByb3Bl
cnR5IGlzIHVwZGF0ZWQgbGl2ZS4KKworICAgIEBwcm9wZXJ0eSB2YWx1ZQorICAgIEB0eXBlIFN0
cmluZworICAgIEBkZWZhdWx0ICIiCisgICovCisgIHZhbHVlOiAiIiwKKworICAvKioKKyAgICBU
aGUgYHR5cGVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVudC4KKworICAgIEBwcm9wZXJ0
eSB0eXBlCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgInRleHQiCisgICovCisgIHR5
cGU6ICJ0ZXh0IiwKKworICAvKioKKyAgICBUaGUgYHNpemVgIG9mIHRoZSB0ZXh0IGZpZWxkIGlu
IGNoYXJhY3RlcnMuCisKKyAgICBAcHJvcGVydHkgc2l6ZQorICAgIEB0eXBlIFN0cmluZworICAg
IEBkZWZhdWx0IG51bGwKKyAgKi8KKyAgc2l6ZTogbnVsbCwKKworICAvKioKKyAgICBUaGUgYHBh
dHRlcm5gIHRoZSBwYXR0ZXJuIGF0dHJpYnV0ZSBvZiBpbnB1dCBlbGVtZW50LgorCisgICAgQHBy
b3BlcnR5IHBhdHRlcm4KKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCBudWxsCisgICov
CisgIHBhdHRlcm46IG51bGwsCisKKyAgLyoqCisgICAgVGhlIGFjdGlvbiB0byBiZSBzZW50IHdo
ZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleS4KKworICAgIFRoaXMgaXMgc2ltaWxh
ciB0byB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciwgYnV0IGlzIGZpcmVkIHdoZW4KKyAgICB0aGUg
dXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5IHdoZW4gZWRpdGluZyBhIHRleHQgZmllbGQsIGFu
ZCBzZW5kcworICAgIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYXMgdGhlIGNvbnRleHQuCisKKyAg
IEBwcm9wZXJ0eSBhY3Rpb24KKyAgIEB0eXBlIFN0cmluZworICAgQGRlZmF1bHQgbnVsbAorICAq
LworICBhY3Rpb246IG51bGwsCisKKyAgLyoqCisgICAgV2hldGhlciB0aGV5IGBrZXlVcGAgZXZl
bnQgdGhhdCB0cmlnZ2VycyBhbiBgYWN0aW9uYCB0byBiZSBzZW50IGNvbnRpbnVlcworICAgIHBy
b3BhZ2F0aW5nIHRvIG90aGVyIHZpZXdzLgorCisgICAgQnkgZGVmYXVsdCwgd2hlbiB0aGUgdXNl
ciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5IG9uIHRoZWlyIGtleWJvYXJkIGFuZAorICAgIHRoZSB0
ZXh0IGZpZWxkIGhhcyBhbiBgYWN0aW9uYCBzZXQsIHRoZSBhY3Rpb24gd2lsbCBiZSBzZW50IHRv
IHRoZSB2aWV3J3MKKyAgICBjb250cm9sbGVyIGFuZCB0aGUga2V5IGV2ZW50IHdpbGwgc3RvcCBw
cm9wYWdhdGluZy4KKworICAgIElmIHlvdSB3b3VsZCBsaWtlIHBhcmVudCB2aWV3cyB0byByZWNl
aXZlIHRoZSBga2V5VXBgIGV2ZW50IGV2ZW4gYWZ0ZXIgYW4KKyAgICBhY3Rpb24gaGFzIGJlZW4g
ZGlzcGF0Y2hlZCwgc2V0IGBidWJibGVzYCB0byB0cnVlLgorCisgICAgQHByb3BlcnR5IGJ1YmJs
ZXMKKyAgICBAdHlwZSBCb29sZWFuCisgICAgQGRlZmF1bHQgZmFsc2UKKyAgKi8KKyAgYnViYmxl
czogZmFsc2UsCisKKyAgaW5zZXJ0TmV3bGluZTogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICB2YXIg
Y29udHJvbGxlciA9IGdldCh0aGlzLCAnY29udHJvbGxlcicpLAorICAgICAgICBhY3Rpb24gPSBn
ZXQodGhpcywgJ2FjdGlvbicpOworCisgICAgaWYgKGFjdGlvbikgeworICAgICAgY29udHJvbGxl
ci5zZW5kKGFjdGlvbiwgZ2V0KHRoaXMsICd2YWx1ZScpLCB0aGlzKTsKKworICAgICAgaWYgKCFn
ZXQodGhpcywgJ2J1YmJsZXMnKSkgeworICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsK
KyAgICAgIH0KKyAgICB9CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewor
LyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKK3Zh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKworLyoqCisgIEBjbGFzcyBCdXR0
b24KKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5WaWV3CisgIEB1c2VzIEVt
YmVyLlRhcmdldEFjdGlvblN1cHBvcnQKKyAgQGRlcHJlY2F0ZWQKKyovCitFbWJlci5CdXR0b24g
PSBFbWJlci5WaWV3LmV4dGVuZChFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LCB7CisgIGNsYXNz
TmFtZXM6IFsnZW1iZXItYnV0dG9uJ10sCisgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzQWN0aXZl
J10sCisKKyAgdGFnTmFtZTogJ2J1dHRvbicsCisKKyAgcHJvcGFnYXRlRXZlbnRzOiBmYWxzZSwK
KworICBhdHRyaWJ1dGVCaW5kaW5nczogWyd0eXBlJywgJ2Rpc2FibGVkJywgJ2hyZWYnLCAndGFi
aW5kZXgnXSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgT3ZlcnJpZGVzIGBUYXJnZXRB
Y3Rpb25TdXBwb3J0YCdzIGB0YXJnZXRPYmplY3RgIGNvbXB1dGVkCisgICAgcHJvcGVydHkgdG8g
dXNlIEhhbmRsZWJhcnMtc3BlY2lmaWMgcGF0aCByZXNvbHV0aW9uLgorCisgICAgQHByb3BlcnR5
IHRhcmdldE9iamVjdAorICAqLworICB0YXJnZXRPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgeworICAgIHZhciB0YXJnZXQgPSBnZXQodGhpcywgJ3RhcmdldCcpLAorICAgICAgICBy
b290ID0gZ2V0KHRoaXMsICdjb250ZXh0JyksCisgICAgICAgIGRhdGEgPSBnZXQodGhpcywgJ3Rl
bXBsYXRlRGF0YScpOworCisgICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnKSB7IHJl
dHVybiB0YXJnZXQ7IH0KKworICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmdldChyb290LCB0
YXJnZXQsIHsgZGF0YTogZGF0YSB9KTsKKyAgfSkucHJvcGVydHkoJ3RhcmdldCcpLAorCisgIC8v
IERlZmF1bHRzIHRvICdidXR0b24nIGlmIHRhZ05hbWUgaXMgJ2lucHV0JyBvciAnYnV0dG9uJwor
ICB0eXBlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXkpIHsKKyAgICB2YXIgdGFnTmFtZSA9
IHRoaXMudGFnTmFtZTsKKyAgICBpZiAodGFnTmFtZSA9PT0gJ2lucHV0JyB8fCB0YWdOYW1lID09
PSAnYnV0dG9uJykgeyByZXR1cm4gJ2J1dHRvbic7IH0KKyAgfSksCisKKyAgZGlzYWJsZWQ6IGZh
bHNlLAorCisgIC8vIEFsbG93ICdhJyB0YWdzIHRvIGFjdCBsaWtlIGJ1dHRvbnMKKyAgaHJlZjog
RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMudGFnTmFtZSA9PT0g
J2EnID8gJyMnIDogbnVsbDsKKyAgfSksCisKKyAgbW91c2VEb3duOiBmdW5jdGlvbigpIHsKKyAg
ICBpZiAoIWdldCh0aGlzLCAnZGlzYWJsZWQnKSkgeworICAgICAgc2V0KHRoaXMsICdpc0FjdGl2
ZScsIHRydWUpOworICAgICAgdGhpcy5fbW91c2VEb3duID0gdHJ1ZTsKKyAgICAgIHRoaXMuX21v
dXNlRW50ZXJlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBnZXQodGhpcywgJ3Byb3BhZ2F0
ZUV2ZW50cycpOworICB9LAorCisgIG1vdXNlTGVhdmU6IGZ1bmN0aW9uKCkgeworICAgIGlmICh0
aGlzLl9tb3VzZURvd24pIHsKKyAgICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCBmYWxzZSk7Cisg
ICAgICB0aGlzLl9tb3VzZUVudGVyZWQgPSBmYWxzZTsKKyAgICB9CisgIH0sCisKKyAgbW91c2VF
bnRlcjogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX21vdXNlRG93bikgeworICAgICAgc2V0
KHRoaXMsICdpc0FjdGl2ZScsIHRydWUpOworICAgICAgdGhpcy5fbW91c2VFbnRlcmVkID0gdHJ1
ZTsKKyAgICB9CisgIH0sCisKKyAgbW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICBpZiAo
Z2V0KHRoaXMsICdpc0FjdGl2ZScpKSB7CisgICAgICAvLyBBY3R1YWxseSBpbnZva2UgdGhlIGJ1
dHRvbidzIHRhcmdldCBhbmQgYWN0aW9uLgorICAgICAgLy8gVGhpcyBtZXRob2QgY29tZXMgZnJv
bSB0aGUgRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCBtaXhpbi4KKyAgICAgIHRoaXMudHJpZ2dl
ckFjdGlvbigpOworICAgICAgc2V0KHRoaXMsICdpc0FjdGl2ZScsIGZhbHNlKTsKKyAgICB9CisK
KyAgICB0aGlzLl9tb3VzZURvd24gPSBmYWxzZTsKKyAgICB0aGlzLl9tb3VzZUVudGVyZWQgPSBm
YWxzZTsKKyAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9wYWdhdGVFdmVudHMnKTsKKyAgfSwKKwor
ICBrZXlEb3duOiBmdW5jdGlvbihldmVudCkgeworICAgIC8vIEhhbmRsZSBzcGFjZSBvciBlbnRl
cgorICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSAzMikg
eworICAgICAgdGhpcy5tb3VzZURvd24oKTsKKyAgICB9CisgIH0sCisKKyAga2V5VXA6IGZ1bmN0
aW9uKGV2ZW50KSB7CisgICAgLy8gSGFuZGxlIHNwYWNlIG9yIGVudGVyCisgICAgaWYgKGV2ZW50
LmtleUNvZGUgPT09IDEzIHx8IGV2ZW50LmtleUNvZGUgPT09IDMyKSB7CisgICAgICB0aGlzLm1v
dXNlVXAoKTsKKyAgICB9CisgIH0sCisKKyAgLy8gVE9ETzogSGFuZGxlIHByb3BlciB0b3VjaCBi
ZWhhdmlvci4gSW5jbHVkaW5nIHNob3VsZCBtYWtlIGluYWN0aXZlIHdoZW4KKyAgLy8gZmluZ2Vy
IG1vdmVzIG1vcmUgdGhhbiAyMHggb3V0c2lkZSBvZiB0aGUgZWRnZSBvZiB0aGUgYnV0dG9uICh2
cyBtb3VzZQorICAvLyB3aGljaCBnb2VzIGluYWN0aXZlIGFzIHNvb24gYXMgbW91c2UgZ29lcyBv
dXQgb2YgZWRnZXMuKQorCisgIHRvdWNoU3RhcnQ6IGZ1bmN0aW9uKHRvdWNoKSB7CisgICAgcmV0
dXJuIHRoaXMubW91c2VEb3duKHRvdWNoKTsKKyAgfSwKKworICB0b3VjaEVuZDogZnVuY3Rpb24o
dG91Y2gpIHsKKyAgICByZXR1cm4gdGhpcy5tb3VzZVVwKHRvdWNoKTsKKyAgfSwKKworICBpbml0
OiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5kZXByZWNhdGUoIkVtYmVyLkJ1dHRvbiBpcyBkZXBy
ZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdXR1cmUgcmVsZWFzZXMuIENvbnNpZGVy
IHVzaW5nIHRoZSBge3thY3Rpb259fWAgaGVscGVyLiIpOworICAgIHRoaXMuX3N1cGVyKCk7Cisg
IH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVy
CitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQs
IHNldCA9IEVtYmVyLnNldDsKKworLyoqCisgIFRoZSBgRW1iZXIuVGV4dEFyZWFgIHZpZXcgY2xh
c3MgcmVuZGVycyBhCisgIFt0ZXh0YXJlYV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcv
ZW4vSFRNTC9FbGVtZW50L3RleHRhcmVhKSBlbGVtZW50LgorICBJdCBhbGxvd3MgZm9yIGJpbmRp
bmcgRW1iZXIgcHJvcGVydGllcyB0byB0aGUgdGV4dCBhcmVhIGNvbnRlbnRzIChgdmFsdWVgKSwK
KyAgbGl2ZS11cGRhdGluZyBhcyB0aGUgdXNlciBpbnB1dHMgdGV4dC4KKworICAjIyBMYXlvdXQg
YW5kIExheW91dE5hbWUgcHJvcGVydGllcworCisgIEJlY2F1c2UgSFRNTCBgdGV4dGFyZWFgIGVs
ZW1lbnRzIGRvIG5vdCBjb250YWluIGlubmVyIEhUTUwgdGhlIGBsYXlvdXRgIGFuZAorICBgbGF5
b3V0TmFtZWAgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUgYEVtYmVyLlZpZXdg
J3MgbGF5b3V0CisgIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgIyMgSFRNTCBB
dHRyaWJ1dGVzCisKKyAgQnkgZGVmYXVsdCBgRW1iZXIuVGV4dEFyZWFgIHByb3ZpZGVzIHN1cHBv
cnQgZm9yIGByb3dzYCwgYGNvbHNgLAorICBgcGxhY2Vob2xkZXJgLCBgZGlzYWJsZWRgLCBgbWF4
bGVuZ3RoYCBhbmQgYHRhYmluZGV4YCBhdHRyaWJ1dGVzIG9uIGEKKyAgdGV4dGFyZWEuIElmIHlv
dSBuZWVkIHRvIHN1cHBvcnQgIG1vcmUgYXR0cmlidXRlcyBoYXZlIGEgbG9vayBhdCB0aGUKKyAg
YGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0eSBpbiBgRW1iZXIuVmlld2AncyBIVE1MIEF0dHJp
YnV0ZXMgc2VjdGlvbi4KKworICBUbyBnbG9iYWxseSBhZGQgc3VwcG9ydCBmb3IgYWRkaXRpb25h
bCBhdHRyaWJ1dGVzIHlvdSBjYW4gcmVvcGVuCisgIGBFbWJlci5UZXh0QXJlYWAgb3IgYEVtYmVy
LlRleHRTdXBwb3J0YC4KKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLlRleHRTdXBwb3J0LnJl
b3Blbih7CisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsicmVxdWlyZWQiXQorICB9KQorICBgYGAK
KworICBAY2xhc3MgVGV4dEFyZWEKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJl
ci5WaWV3CisgIEB1c2VzIEVtYmVyLlRleHRTdXBwb3J0CisqLworRW1iZXIuVGV4dEFyZWEgPSBF
bWJlci5WaWV3LmV4dGVuZChFbWJlci5UZXh0U3VwcG9ydCwgeworICBjbGFzc05hbWVzOiBbJ2Vt
YmVyLXRleHQtYXJlYSddLAorCisgIHRhZ05hbWU6ICJ0ZXh0YXJlYSIsCisgIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbJ3Jvd3MnLCAnY29scyddLAorICByb3dzOiBudWxsLAorICBjb2xzOiBudWxsLAor
CisgIF91cGRhdGVFbGVtZW50VmFsdWU6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgeworICAg
IC8vIFdlIGRvIHRoaXMgY2hlY2sgc28gY3Vyc29yIHBvc2l0aW9uIGRvZXNuJ3QgZ2V0IGFmZmVj
dGVkIGluIElFCisgICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpLAorICAgICAgICAk
ZWwgPSB0aGlzLiQoKTsKKyAgICBpZiAoJGVsICYmIHZhbHVlICE9PSAkZWwudmFsKCkpIHsKKyAg
ICAgICRlbC52YWwodmFsdWUpOworICAgIH0KKyAgfSwgJ3ZhbHVlJyksCisKKyAgaW5pdDogZnVu
Y3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKyAgICB0aGlzLm9uKCJkaWRJbnNlcnRFbGVt
ZW50IiwgdGhpcywgdGhpcy5fdXBkYXRlRWxlbWVudFZhbHVlKTsKKyAgfQorCit9KTsKKworfSko
KTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qanNoaW50IGVxZXFlcTpmYWxzZSAqLworCisvKioK
K0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIHNl
dCA9IEVtYmVyLnNldCwKKyAgICBnZXQgPSBFbWJlci5nZXQsCisgICAgaW5kZXhPZiA9IEVtYmVy
LkVudW1lcmFibGVVdGlscy5pbmRleE9mLAorICAgIGluZGV4ZXNPZiA9IEVtYmVyLkVudW1lcmFi
bGVVdGlscy5pbmRleGVzT2YsCisgICAgcmVwbGFjZSA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5y
ZXBsYWNlLAorICAgIGlzQXJyYXkgPSBFbWJlci5pc0FycmF5LAorICAgIHByZWNvbXBpbGVUZW1w
bGF0ZSA9IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZTsKKworLyoqCisgIFRoZSBgRW1iZXIuU2Vs
ZWN0YCB2aWV3IGNsYXNzIHJlbmRlcnMgYQorICBbc2VsZWN0XShodHRwczovL2RldmVsb3Blci5t
b3ppbGxhLm9yZy9lbi9IVE1ML0VsZW1lbnQvc2VsZWN0KSBIVE1MIGVsZW1lbnQsCisgIGFsbG93
aW5nIHRoZSB1c2VyIHRvIGNob29zZSBmcm9tIGEgbGlzdCBvZiBvcHRpb25zLgorCisgIFRoZSB0
ZXh0IGFuZCBgdmFsdWVgIHByb3BlcnR5IG9mIGVhY2ggYDxvcHRpb24+YCBlbGVtZW50IHdpdGhp
biB0aGUKKyAgYDxzZWxlY3Q+YCBlbGVtZW50IGFyZSBwb3B1bGF0ZWQgZnJvbSB0aGUgb2JqZWN0
cyBpbiB0aGUgYEVsZW1lbnQuU2VsZWN0YCdzCisgIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhlIHVu
ZGVybHlpbmcgZGF0YSBvYmplY3Qgb2YgdGhlIHNlbGVjdGVkIGA8b3B0aW9uPmAgaXMKKyAgc3Rv
cmVkIGluIHRoZSBgRWxlbWVudC5TZWxlY3RgJ3MgYHZhbHVlYCBwcm9wZXJ0eS4KKworICAjIyMg
YGNvbnRlbnRgIGFzIGFuIGFycmF5IG9mIFN0cmluZ3MKKworICBUaGUgc2ltcGxlc3QgdmVyc2lv
biBvZiBhbiBgRW1iZXIuU2VsZWN0YCB0YWtlcyBhbiBhcnJheSBvZiBzdHJpbmdzIGFzIGl0cwor
ICBgY29udGVudGAgcHJvcGVydHkuIFRoZSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGJvdGggdGhl
IGB2YWx1ZWAgcHJvcGVydHkgYW5kCisgIHRoZSBpbm5lciB0ZXh0IG9mIGVhY2ggYDxvcHRpb24+
YCBlbGVtZW50IGluc2lkZSB0aGUgcmVuZGVyZWQgYDxzZWxlY3Q+YC4KKworICBFeGFtcGxlOgor
CisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLm5hbWVzID0gWyJZZWh1ZGEiLCAiVG9tIl07CisgIGBg
YAorCisgIGBgYGhhbmRsZWJhcnMKKyAge3t2aWV3IEVtYmVyLlNlbGVjdCBjb250ZW50QmluZGlu
Zz0iQXBwLm5hbWVzIn19CisgIGBgYAorCisgIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5n
IEhUTUw6CisKKyAgYGBgaHRtbAorICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgorICAg
IDxvcHRpb24gdmFsdWU9IlllaHVkYSI+WWVodWRhPC9vcHRpb24+CisgICAgPG9wdGlvbiB2YWx1
ZT0iVG9tIj5Ub208L29wdGlvbj4KKyAgPC9zZWxlY3Q+CisgIGBgYAorCisgIFlvdSBjYW4gY29u
dHJvbCB3aGljaCBgPG9wdGlvbj5gIGlzIHNlbGVjdGVkIHRocm91Z2ggdGhlIGBFbWJlci5TZWxl
Y3RgJ3MKKyAgYHZhbHVlYCBwcm9wZXJ0eSBkaXJlY3RseSBvciBhcyBhIGJpbmRpbmc6CisKKyAg
YGBgamF2YXNjcmlwdAorICBBcHAubmFtZXMgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICBz
ZWxlY3RlZDogJ1RvbScsCisgICAgY29udGVudDogWyJZZWh1ZGEiLCAiVG9tIl0KKyAgfSk7Cisg
IGBgYAorCisgIGBgYGhhbmRsZWJhcnMKKyAge3t2aWV3IEVtYmVyLlNlbGVjdAorICAgICAgICAg
Y29udGVudEJpbmRpbmc9IkFwcC5uYW1lcy5jb250ZW50IgorICAgICAgICAgdmFsdWVCaW5kaW5n
PSJBcHAubmFtZXMuc2VsZWN0ZWQiCisgIH19CisgIGBgYAorCisgIFdvdWxkIHJlc3VsdCBpbiB0
aGUgZm9sbG93aW5nIEhUTUwgd2l0aCB0aGUgYDxvcHRpb24+YCBmb3IgJ1RvbScgc2VsZWN0ZWQ6
CisKKyAgYGBgaHRtbAorICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgorICAgIDxvcHRp
b24gdmFsdWU9IlllaHVkYSI+WWVodWRhPC9vcHRpb24+CisgICAgPG9wdGlvbiB2YWx1ZT0iVG9t
IiBzZWxlY3RlZD0ic2VsZWN0ZWQiPlRvbTwvb3B0aW9uPgorICA8L3NlbGVjdD4KKyAgYGBgCisK
KyAgQSB1c2VyIGludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGA8c2VsZWN0PmAgdG8gY2hv
b3NlICJZZWh1ZGEiIHdvdWxkCisgIHVwZGF0ZSB0aGUgdmFsdWUgb2YgYEFwcC5uYW1lcy5zZWxl
Y3RlZGAgdG8gIlllaHVkYSIuCisKKyAgIyMjIGBjb250ZW50YCBhcyBhbiBBcnJheSBvZiBPYmpl
Y3RzCisKKyAgQW4gYEVtYmVyLlNlbGVjdGAgY2FuIGFsc28gdGFrZSBhbiBhcnJheSBvZiBKYXZh
U2NyaXB0IG9yIEVtYmVyIG9iamVjdHMgYXMKKyAgaXRzIGBjb250ZW50YCBwcm9wZXJ0eS4KKwor
ICBXaGVuIHVzaW5nIG9iamVjdHMgeW91IG5lZWQgdG8gdGVsbCB0aGUgYEVtYmVyLlNlbGVjdGAg
d2hpY2ggcHJvcGVydHkgc2hvdWxkCisgIGJlIGFjY2Vzc2VkIG9uIGVhY2ggb2JqZWN0IHRvIHN1
cHBseSB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIGA8b3B0aW9uPmAKKyAgYW5kIHdoaWNo
IHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIHRvIHN1cHBseSB0aGUgZWxlbWVudCB0ZXh0LgorCisg
IFRoZSBgb3B0aW9uVmFsdWVQYXRoYCBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRo
IG9uIGVhY2ggb2JqZWN0IHRvCisgIHRoZSBkZXNpcmVkIHByb3BlcnR5IGZvciB0aGUgYHZhbHVl
YCBhdHRyaWJ1dGUuIFRoZSBgb3B0aW9uTGFiZWxQYXRoYAorICBzcGVjaWZpZXMgdGhlIHBhdGgg
b24gZWFjaCBvYmplY3QgdG8gdGhlIGRlc2lyZWQgcHJvcGVydHkgZm9yIHRoZQorICBlbGVtZW50
J3MgdGV4dC4gQm90aCBwYXRocyBtdXN0IHJlZmVyZW5jZSBlYWNoIG9iamVjdCBpdHNlbGYgYXMg
YGNvbnRlbnRgOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLnByb2dyYW1tZXJzID0gWworICAg
IEVtYmVyLk9iamVjdC5jcmVhdGUoe2ZpcnN0TmFtZTogIlllaHVkYSIsIGlkOiAxfSksCisgICAg
RW1iZXIuT2JqZWN0LmNyZWF0ZSh7Zmlyc3ROYW1lOiAiVG9tIiwgICAgaWQ6IDJ9KQorICBdOwor
ICBgYGAKKworICBgYGBoYW5kbGViYXJzCisgIHt7dmlldyBFbWJlci5TZWxlY3QKKyAgICAgICAg
IGNvbnRlbnRCaW5kaW5nPSJBcHAucHJvZ3JhbW1lcnMiCisgICAgICAgICBvcHRpb25WYWx1ZVBh
dGg9ImNvbnRlbnQuaWQiCisgICAgICAgICBvcHRpb25MYWJlbFBhdGg9ImNvbnRlbnQuZmlyc3RO
YW1lIn19CisgIGBgYAorCisgIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6CisK
KyAgYGBgaHRtbAorICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgorICAgIDxvcHRpb24g
dmFsdWU+UGxlYXNlIFNlbGVjdDwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IjEiPlllaHVk
YTwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IjIiPlRvbTwvb3B0aW9uPgorICA8L3NlbGVj
dD4KKyAgYGBgCisKKyAgVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCBgPG9w
dGlvbj5gIHdpdGhpbiBhbiBgRW1iZXIuU2VsZWN0YAorICBjYW4gYmUgYm91bmQgdG8gYSBwcm9w
ZXJ0eSBvbiBhbm90aGVyIG9iamVjdCBieSBwcm92aWRpbmcgYQorICBgdmFsdWVCaW5kaW5nYCBv
cHRpb246CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAucHJvZ3JhbW1lcnMgPSBbCisgICAgRW1i
ZXIuT2JqZWN0LmNyZWF0ZSh7Zmlyc3ROYW1lOiAiWWVodWRhIiwgaWQ6IDF9KSwKKyAgICBFbWJl
ci5PYmplY3QuY3JlYXRlKHtmaXJzdE5hbWU6ICJUb20iLCAgICBpZDogMn0pCisgIF07CisKKyAg
QXBwLmN1cnJlbnRQcm9ncmFtbWVyID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgaWQ6IDIK
KyAgfSk7CisgIGBgYAorCisgIGBgYGhhbmRsZWJhcnMKKyAge3t2aWV3IEVtYmVyLlNlbGVjdAor
ICAgICAgICAgY29udGVudEJpbmRpbmc9IkFwcC5wcm9ncmFtbWVycyIKKyAgICAgICAgIG9wdGlv
blZhbHVlUGF0aD0iY29udGVudC5pZCIKKyAgICAgICAgIG9wdGlvbkxhYmVsUGF0aD0iY29udGVu
dC5maXJzdE5hbWUiCisgICAgICAgICB2YWx1ZUJpbmRpbmc9IkFwcC5jdXJyZW50UHJvZ3JhbW1l
ci5pZCJ9fQorICBgYGAKKworICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHdp
dGggYSBzZWxlY3RlZCBvcHRpb246CisKKyAgYGBgaHRtbAorICA8c2VsZWN0IGNsYXNzPSJlbWJl
ci1zZWxlY3QiPgorICAgIDxvcHRpb24gdmFsdWU+UGxlYXNlIFNlbGVjdDwvb3B0aW9uPgorICAg
IDxvcHRpb24gdmFsdWU9IjEiPlllaHVkYTwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IjIi
IHNlbGVjdGVkPSJzZWxlY3RlZCI+VG9tPC9vcHRpb24+CisgIDwvc2VsZWN0PgorICBgYGAKKwor
ICBJbnRlcmFjdGluZyB3aXRoIHRoZSByZW5kZXJlZCBlbGVtZW50IGJ5IHNlbGVjdGluZyB0aGUg
Zmlyc3Qgb3B0aW9uCisgICgnWWVodWRhJykgd2lsbCB1cGRhdGUgdGhlIGBpZGAgdmFsdWUgb2Yg
YEFwcC5jdXJyZW50UHJvZ3JhbW1lcmAKKyAgdG8gbWF0Y2ggdGhlIGB2YWx1ZWAgcHJvcGVydHkg
b2YgdGhlIG5ld2x5IHNlbGVjdGVkIGA8b3B0aW9uPmAuCisKKyAgQWx0ZXJuYXRpdmVseSwgeW91
IGNhbiBjb250cm9sIHNlbGVjdGlvbiB0aHJvdWdoIHRoZSB1bmRlcmx5aW5nIG9iamVjdHMKKyAg
dXNlZCB0byByZW5kZXIgZWFjaCBvYmplY3QgcHJvdmlkaW5nIGEgYHNlbGVjdGlvbkJpbmRpbmdg
LiBXaGVuIHRoZSBzZWxlY3RlZAorICBgPG9wdGlvbj5gIGlzIGNoYW5nZWQsIHRoZSBwcm9wZXJ0
eSBwYXRoIHByb3ZpZGVkIHRvIGBzZWxlY3Rpb25CaW5kaW5nYAorICB3aWxsIGJlIHVwZGF0ZWQg
dG8gbWF0Y2ggdGhlIGNvbnRlbnQgb2JqZWN0IG9mIHRoZSByZW5kZXJlZCBgPG9wdGlvbj5gCisg
IGVsZW1lbnQ6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuY29udHJvbGxlciA9IEVtYmVyLk9i
amVjdC5jcmVhdGUoeworICAgIHNlbGVjdGVkUGVyc29uOiBudWxsLAorICAgIGNvbnRlbnQ6IFsK
KyAgICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe2ZpcnN0TmFtZTogIlllaHVkYSIsIGlkOiAxfSks
CisgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtmaXJzdE5hbWU6ICJUb20iLCAgICBpZDogMn0p
CisgICAgXQorICB9KTsKKyAgYGBgCisKKyAgYGBgaGFuZGxlYmFycworICB7e3ZpZXcgRW1iZXIu
U2VsZWN0CisgICAgICAgICBjb250ZW50QmluZGluZz0iQXBwLmNvbnRyb2xsZXIuY29udGVudCIK
KyAgICAgICAgIG9wdGlvblZhbHVlUGF0aD0iY29udGVudC5pZCIKKyAgICAgICAgIG9wdGlvbkxh
YmVsUGF0aD0iY29udGVudC5maXJzdE5hbWUiCisgICAgICAgICBzZWxlY3Rpb25CaW5kaW5nPSJB
cHAuY29udHJvbGxlci5zZWxlY3RlZFBlcnNvbiJ9fQorICBgYGAKKworICBXb3VsZCByZXN1bHQg
aW4gdGhlIGZvbGxvd2luZyBIVE1MIHdpdGggYSBzZWxlY3RlZCBvcHRpb246CisKKyAgYGBgaHRt
bAorICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgorICAgIDxvcHRpb24gdmFsdWU+UGxl
YXNlIFNlbGVjdDwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IjEiPlllaHVkYTwvb3B0aW9u
PgorICAgIDxvcHRpb24gdmFsdWU9IjIiIHNlbGVjdGVkPSJzZWxlY3RlZCI+VG9tPC9vcHRpb24+
CisgIDwvc2VsZWN0PgorICBgYGAKKworICBJbnRlcmFjdGluZyB3aXRoIHRoZSByZW5kZXJlZCBl
bGVtZW50IGJ5IHNlbGVjdGluZyB0aGUgZmlyc3Qgb3B0aW9uCisgICgnWWVodWRhJykgd2lsbCB1
cGRhdGUgdGhlIGBzZWxlY3RlZFBlcnNvbmAgdmFsdWUgb2YgYEFwcC5jb250cm9sbGVyYAorICB0
byBtYXRjaCB0aGUgY29udGVudCBvYmplY3Qgb2YgdGhlIG5ld2x5IHNlbGVjdGVkIGA8b3B0aW9u
PmAuIEluIHRoaXMKKyAgY2FzZSBpdCBpcyB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBgQXBwLmNv
bnRlbnQuY29udGVudGAKKworICAjIyMgU3VwcGx5aW5nIGEgUHJvbXB0CisKKyAgQSBgbnVsbGAg
dmFsdWUgZm9yIHRoZSBgRW1iZXIuU2VsZWN0YCdzIGB2YWx1ZWAgb3IgYHNlbGVjdGlvbmAgcHJv
cGVydHkKKyAgcmVzdWx0cyBpbiB0aGVyZSBiZWluZyBubyBgPG9wdGlvbj5gIHdpdGggYSBgc2Vs
ZWN0ZWRgIGF0dHJpYnV0ZToKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5jb250cm9sbGVyID0g
RW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgc2VsZWN0ZWQ6IG51bGwsCisgICAgY29udGVudDog
WworICAgICAgIlllaHVkYSIsCisgICAgICAiVG9tIgorICAgIF0KKyAgfSk7CisgIGBgYAorCisg
IGBgYCBoYW5kbGViYXJzCisgIHt7dmlldyBFbWJlci5TZWxlY3QKKyAgICAgICAgIGNvbnRlbnRC
aW5kaW5nPSJBcHAuY29udHJvbGxlci5jb250ZW50IgorICAgICAgICAgdmFsdWVCaW5kaW5nPSJB
cHAuY29udHJvbGxlci5zZWxlY3RlZCIKKyAgfX0KKyAgYGBgCisKKyAgV291bGQgcmVzdWx0IGlu
IHRoZSBmb2xsb3dpbmcgSFRNTDoKKworICBgYGBodG1sCisgIDxzZWxlY3QgY2xhc3M9ImVtYmVy
LXNlbGVjdCI+CisgICAgPG9wdGlvbiB2YWx1ZT0iWWVodWRhIj5ZZWh1ZGE8L29wdGlvbj4KKyAg
ICA8b3B0aW9uIHZhbHVlPSJUb20iPlRvbTwvb3B0aW9uPgorICA8L3NlbGVjdD4KKyAgYGBgCisK
KyAgQWx0aG91Z2ggYEFwcC5jb250cm9sbGVyLnNlbGVjdGVkYCBpcyBgbnVsbGAgYW5kIG5vIGA8
b3B0aW9uPmAKKyAgaGFzIGEgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgdGhlIHJlbmRlcmVkIEhUTUwg
d2lsbCBkaXNwbGF5IHRoZQorICBmaXJzdCBpdGVtIGFzIHRob3VnaCBpdCB3ZXJlIHNlbGVjdGVk
LiBZb3UgY2FuIHN1cHBseSBhIHN0cmluZworICB2YWx1ZSBmb3IgdGhlIGBFbWJlci5TZWxlY3Rg
IHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rpb24KKyAgd2l0aCB0aGUgYHByb21w
dGAgb3B0aW9uOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLmNvbnRyb2xsZXIgPSBFbWJlci5P
YmplY3QuY3JlYXRlKHsKKyAgICBzZWxlY3RlZDogbnVsbCwKKyAgICBjb250ZW50OiBbCisgICAg
ICAiWWVodWRhIiwKKyAgICAgICJUb20iCisgICAgXQorICB9KTsKKyAgYGBgCisKKyAgYGBgaGFu
ZGxlYmFycworICB7e3ZpZXcgRW1iZXIuU2VsZWN0CisgICAgICAgICBjb250ZW50QmluZGluZz0i
QXBwLmNvbnRyb2xsZXIuY29udGVudCIKKyAgICAgICAgIHZhbHVlQmluZGluZz0iQXBwLmNvbnRy
b2xsZXIuc2VsZWN0ZWQiCisgICAgICAgICBwcm9tcHQ9IlBsZWFzZSBzZWxlY3QgYSBuYW1lIgor
ICB9fQorICBgYGAKKworICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgorCisg
IGBgYGh0bWwKKyAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KKyAgICA8b3B0aW9uPlBs
ZWFzZSBzZWxlY3QgYSBuYW1lPC9vcHRpb24+CisgICAgPG9wdGlvbiB2YWx1ZT0iWWVodWRhIj5Z
ZWh1ZGE8L29wdGlvbj4KKyAgICA8b3B0aW9uIHZhbHVlPSJUb20iPlRvbTwvb3B0aW9uPgorICA8
L3NlbGVjdD4KKyAgYGBgCisKKyAgQGNsYXNzIFNlbGVjdAorICBAbmFtZXNwYWNlIEVtYmVyCisg
IEBleHRlbmRzIEVtYmVyLlZpZXcKKyovCitFbWJlci5TZWxlY3QgPSBFbWJlci5WaWV3LmV4dGVu
ZCgKKyAgLyoqIEBzY29wZSBFbWJlci5TZWxlY3QucHJvdG90eXBlICovIHsKKworICB0YWdOYW1l
OiAnc2VsZWN0JywKKyAgY2xhc3NOYW1lczogWydlbWJlci1zZWxlY3QnXSwKKyAgZGVmYXVsdFRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlKGZ1bmN0aW9uIGFub255bW91cyhIYW5k
bGViYXJzLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKK3RoaXMuY29tcGlsZXJJbmZv
ID0gWzIsJz49IDEuMC4wLXJjLjMnXTsKK2hlbHBlcnMgPSBoZWxwZXJzIHx8IEVtYmVyLkhhbmRs
ZWJhcnMuaGVscGVyczsgZGF0YSA9IGRhdGEgfHwge307CisgIHZhciBidWZmZXIgPSAnJywgc3Rh
Y2sxLCBoYXNoVHlwZXMsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uLCBz
ZWxmPXRoaXM7CisKK2Z1bmN0aW9uIHByb2dyYW0xKGRlcHRoMCxkYXRhKSB7CisgIAorICB2YXIg
YnVmZmVyID0gJycsIGhhc2hUeXBlczsKKyAgZGF0YS5idWZmZXIucHVzaCgiPG9wdGlvbiB2YWx1
ZT1cIlwiPiIpOworICBoYXNoVHlwZXMgPSB7fTsKKyAgZGF0YS5idWZmZXIucHVzaChlc2NhcGVF
eHByZXNzaW9uKGhlbHBlcnMuX3RyaWFnZU11c3RhY2hlLmNhbGwoZGVwdGgwLCAidmlldy5wcm9t
cHQiLCB7aGFzaDp7fSxjb250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaFR5cGVzOmhh
c2hUeXBlcyxkYXRhOmRhdGF9KSkpOworICBkYXRhLmJ1ZmZlci5wdXNoKCI8L29wdGlvbj4iKTsK
KyAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCitmdW5jdGlvbiBwcm9ncmFtMyhkZXB0aDAsZGF0YSkg
eworICAKKyAgdmFyIGhhc2hUeXBlczsKKyAgaGFzaFR5cGVzID0geydjb250ZW50QmluZGluZyc6
ICJTVFJJTkcifTsKKyAgZGF0YS5idWZmZXIucHVzaChlc2NhcGVFeHByZXNzaW9uKGhlbHBlcnMu
dmlldy5jYWxsKGRlcHRoMCwgIkVtYmVyLlNlbGVjdE9wdGlvbiIsIHtoYXNoOnsKKyAgICAnY29u
dGVudEJpbmRpbmcnOiAoInRoaXMiKQorICB9LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQi
XSxoYXNoVHlwZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pKSk7CisgIH0KKworICBoYXNoVHlwZXMg
PSB7fTsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgInZpZXcucHJvbXB0
Iiwge2hhc2g6e30saW52ZXJzZTpzZWxmLm5vb3AsZm46c2VsZi5wcm9ncmFtKDEsIHByb2dyYW0x
LCBkYXRhKSxjb250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaFR5cGVzOmhhc2hUeXBl
cyxkYXRhOmRhdGF9KTsKKyAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0gMCkgeyBkYXRhLmJ1ZmZl
ci5wdXNoKHN0YWNrMSk7IH0KKyAgaGFzaFR5cGVzID0ge307CisgIHN0YWNrMSA9IGhlbHBlcnMu
ZWFjaC5jYWxsKGRlcHRoMCwgInZpZXcuY29udGVudCIsIHtoYXNoOnt9LGludmVyc2U6c2VsZi5u
b29wLGZuOnNlbGYucHJvZ3JhbSgzLCBwcm9ncmFtMywgZGF0YSksY29udGV4dHM6W2RlcHRoMF0s
dHlwZXM6WyJJRCJdLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7CisgIGlmKHN0YWNr
MSB8fCBzdGFjazEgPT09IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEpOyB9CisgIHJldHVy
biBidWZmZXI7CisgIAorfSksCisgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ211bHRpcGxlJywgJ2Rp
c2FibGVkJywgJ3RhYmluZGV4J10sCisKKyAgLyoqCisgICAgVGhlIGBtdWx0aXBsZWAgYXR0cmli
dXRlIG9mIHRoZSBzZWxlY3QgZWxlbWVudC4gSW5kaWNhdGVzIHdoZXRoZXIgbXVsdGlwbGUKKyAg
ICBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZC4KKworICAgIEBwcm9wZXJ0eSBtdWx0aXBsZQorICAg
IEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVsdCBmYWxzZQorICAqLworICBtdWx0aXBsZTogZmFs
c2UsCisKKyAgZGlzYWJsZWQ6IGZhbHNlLAorCisgIC8qKgorICAgIFRoZSBsaXN0IG9mIG9wdGlv
bnMuCisKKyAgICBJZiBgb3B0aW9uTGFiZWxQYXRoYCBhbmQgYG9wdGlvblZhbHVlUGF0aGAgYXJl
IG5vdCBvdmVycmlkZGVuLCB0aGlzIHNob3VsZAorICAgIGJlIGEgbGlzdCBvZiBzdHJpbmdzLCB3
aGljaCB3aWxsIHNlcnZlIHNpbXVsdGFuZW91c2x5IGFzIGxhYmVscyBhbmQgdmFsdWVzLgorCisg
ICAgT3RoZXJ3aXNlLCB0aGlzIHNob3VsZCBiZSBhIGxpc3Qgb2Ygb2JqZWN0cy4gRm9yIGluc3Rh
bmNlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLlNlbGVjdC5jcmVhdGUoeworICAg
ICAgY29udGVudDogRW1iZXIuQShbCisgICAgICAgICAgeyBpZDogMSwgZmlyc3ROYW1lOiAnWWVo
dWRhJyB9LAorICAgICAgICAgIHsgaWQ6IDIsIGZpcnN0TmFtZTogJ1RvbScgfQorICAgICAgICBd
KSwKKyAgICAgIG9wdGlvbkxhYmVsUGF0aDogJ2NvbnRlbnQuZmlyc3ROYW1lJywKKyAgICAgIG9w
dGlvblZhbHVlUGF0aDogJ2NvbnRlbnQuaWQnCisgICAgfSk7CisgICAgYGBgCisKKyAgICBAcHJv
cGVydHkgY29udGVudAorICAgIEB0eXBlIEFycmF5CisgICAgQGRlZmF1bHQgbnVsbAorICAqLwor
ICBjb250ZW50OiBudWxsLAorCisgIC8qKgorICAgIFdoZW4gYG11bHRpcGxlYCBpcyBgZmFsc2Vg
LCB0aGUgZWxlbWVudCBvZiBgY29udGVudGAgdGhhdCBpcyBjdXJyZW50bHkKKyAgICBzZWxlY3Rl
ZCwgaWYgYW55LgorCisgICAgV2hlbiBgbXVsdGlwbGVgIGlzIGB0cnVlYCwgYW4gYXJyYXkgb2Yg
c3VjaCBlbGVtZW50cy4KKworICAgIEBwcm9wZXJ0eSBzZWxlY3Rpb24KKyAgICBAdHlwZSBPYmpl
Y3Qgb3IgQXJyYXkKKyAgICBAZGVmYXVsdCBudWxsCisgICovCisgIHNlbGVjdGlvbjogbnVsbCwK
KworICAvKioKKyAgICBJbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgKHdoZW4gYG11bHRpcGxlYCBp
cyBgZmFsc2VgKSwgdmFsdWUgY2FuIGJlIHVzZWQgdG8KKyAgICBnZXQgdGhlIGN1cnJlbnQgc2Vs
ZWN0aW9uJ3MgdmFsdWUgb3Igc2V0IHRoZSBzZWxlY3Rpb24gYnkgaXQncyB2YWx1ZS4KKworICAg
IEl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2Rl
LgorCisgICAgQHByb3BlcnR5IHZhbHVlCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQg
bnVsbAorICAqLworICB2YWx1ZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCB2YWx1ZSkg
eworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IHJldHVybiB2YWx1ZTsgfQorICAg
IHZhciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ29wdGlvblZhbHVlUGF0aCcpLnJlcGxhY2UoL15j
b250ZW50XC4/LywgJycpOworICAgIHJldHVybiB2YWx1ZVBhdGggPyBnZXQodGhpcywgJ3NlbGVj
dGlvbi4nICsgdmFsdWVQYXRoKSA6IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7CisgIH0pLnByb3Bl
cnR5KCdzZWxlY3Rpb24nKSwKKworICAvKioKKyAgICBJZiBnaXZlbiwgYSB0b3AtbW9zdCBkdW1t
eSBvcHRpb24gd2lsbCBiZSByZW5kZXJlZCB0byBzZXJ2ZSBhcyBhIHVzZXIKKyAgICBwcm9tcHQu
CisKKyAgICBAcHJvcGVydHkgcHJvbXB0CisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQg
bnVsbAorICAqLworICBwcm9tcHQ6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIHBhdGggb2YgdGhl
IG9wdGlvbiBsYWJlbHMuIFNlZSBgY29udGVudGAuCisKKyAgICBAcHJvcGVydHkgb3B0aW9uTGFi
ZWxQYXRoCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgJ2NvbnRlbnQnCisgICovCisg
IG9wdGlvbkxhYmVsUGF0aDogJ2NvbnRlbnQnLAorCisgIC8qKgorICAgIFRoZSBwYXRoIG9mIHRo
ZSBvcHRpb24gdmFsdWVzLiBTZWUgYGNvbnRlbnRgLgorCisgICAgQHByb3BlcnR5IG9wdGlvblZh
bHVlUGF0aAorICAgIEB0eXBlIFN0cmluZworICAgIEBkZWZhdWx0ICdjb250ZW50JworICAqLwor
ICBvcHRpb25WYWx1ZVBhdGg6ICdjb250ZW50JywKKworICBfY2hhbmdlOiBmdW5jdGlvbigpIHsK
KyAgICBpZiAoZ2V0KHRoaXMsICdtdWx0aXBsZScpKSB7CisgICAgICB0aGlzLl9jaGFuZ2VNdWx0
aXBsZSgpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9jaGFuZ2VTaW5nbGUoKTsKKyAgICB9
CisgIH0sCisKKyAgc2VsZWN0aW9uRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigp
IHsKKyAgICB2YXIgc2VsZWN0aW9uID0gZ2V0KHRoaXMsICdzZWxlY3Rpb24nKTsKKyAgICBpZiAo
Z2V0KHRoaXMsICdtdWx0aXBsZScpKSB7CisgICAgICBpZiAoIWlzQXJyYXkoc2VsZWN0aW9uKSkg
eworICAgICAgICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIEVtYmVyLkEoW3NlbGVjdGlvbl0pKTsK
KyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy5fc2VsZWN0aW9uRGlkQ2hhbmdl
TXVsdGlwbGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fc2VsZWN0aW9uRGlkQ2hhbmdl
U2luZ2xlKCk7CisgICAgfQorICB9LCAnc2VsZWN0aW9uLkBlYWNoJyksCisKKyAgdmFsdWVEaWRD
aGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50ID0gZ2V0
KHRoaXMsICdjb250ZW50JyksCisgICAgICAgIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpLAor
ICAgICAgICB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ29wdGlvblZhbHVlUGF0aCcpLnJlcGxhY2Uo
L15jb250ZW50XC4/LywgJycpLAorICAgICAgICBzZWxlY3RlZFZhbHVlID0gKHZhbHVlUGF0aCA/
IGdldCh0aGlzLCAnc2VsZWN0aW9uLicgKyB2YWx1ZVBhdGgpIDogZ2V0KHRoaXMsICdzZWxlY3Rp
b24nKSksCisgICAgICAgIHNlbGVjdGlvbjsKKworICAgIGlmICh2YWx1ZSAhPT0gc2VsZWN0ZWRW
YWx1ZSkgeworICAgICAgc2VsZWN0aW9uID0gY29udGVudC5maW5kKGZ1bmN0aW9uKG9iaikgewor
ICAgICAgICByZXR1cm4gdmFsdWUgPT09ICh2YWx1ZVBhdGggPyBnZXQob2JqLCB2YWx1ZVBhdGgp
IDogb2JqKTsKKyAgICAgIH0pOworCisgICAgICB0aGlzLnNldCgnc2VsZWN0aW9uJywgc2VsZWN0
aW9uKTsKKyAgICB9CisgIH0sICd2YWx1ZScpLAorCisKKyAgX3RyaWdnZXJDaGFuZ2U6IGZ1bmN0
aW9uKCkgeworICAgIHZhciBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3NlbGVjdGlvbicpOworICAg
IHZhciB2YWx1ZSA9IGdldCh0aGlzLCAndmFsdWUnKTsKKworICAgIGlmIChzZWxlY3Rpb24pIHsg
dGhpcy5zZWxlY3Rpb25EaWRDaGFuZ2UoKTsgfQorICAgIGlmICh2YWx1ZSkgeyB0aGlzLnZhbHVl
RGlkQ2hhbmdlKCk7IH0KKworICAgIHRoaXMuX2NoYW5nZSgpOworICB9LAorCisgIF9jaGFuZ2VT
aW5nbGU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzZWxlY3RlZEluZGV4ID0gdGhpcy4kKClbMF0u
c2VsZWN0ZWRJbmRleCwKKyAgICAgICAgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAor
ICAgICAgICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcpOworCisgICAgaWYgKCFnZXQoY29u
dGVudCwgJ2xlbmd0aCcpKSB7IHJldHVybjsgfQorICAgIGlmIChwcm9tcHQgJiYgc2VsZWN0ZWRJ
bmRleCA9PT0gMCkgeyBzZXQodGhpcywgJ3NlbGVjdGlvbicsIG51bGwpOyByZXR1cm47IH0KKwor
ICAgIGlmIChwcm9tcHQpIHsgc2VsZWN0ZWRJbmRleCAtPSAxOyB9CisgICAgc2V0KHRoaXMsICdz
ZWxlY3Rpb24nLCBjb250ZW50Lm9iamVjdEF0KHNlbGVjdGVkSW5kZXgpKTsKKyAgfSwKKworCisg
IF9jaGFuZ2VNdWx0aXBsZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIG9wdGlvbnMgPSB0aGlzLiQo
J29wdGlvbjpzZWxlY3RlZCcpLAorICAgICAgICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcp
LAorICAgICAgICBvZmZzZXQgPSBwcm9tcHQgPyAxIDogMCwKKyAgICAgICAgY29udGVudCA9IGdl
dCh0aGlzLCAnY29udGVudCcpLAorICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3NlbGVj
dGlvbicpOworCisgICAgaWYgKCFjb250ZW50KXsgcmV0dXJuOyB9CisgICAgaWYgKG9wdGlvbnMp
IHsKKyAgICAgIHZhciBzZWxlY3RlZEluZGV4ZXMgPSBvcHRpb25zLm1hcChmdW5jdGlvbigpewor
ICAgICAgICByZXR1cm4gdGhpcy5pbmRleCAtIG9mZnNldDsKKyAgICAgIH0pLnRvQXJyYXkoKTsK
KyAgICAgIHZhciBuZXdTZWxlY3Rpb24gPSBjb250ZW50Lm9iamVjdHNBdChzZWxlY3RlZEluZGV4
ZXMpOworCisgICAgICBpZiAoaXNBcnJheShzZWxlY3Rpb24pKSB7CisgICAgICAgIHJlcGxhY2Uo
c2VsZWN0aW9uLCAwLCBnZXQoc2VsZWN0aW9uLCAnbGVuZ3RoJyksIG5ld1NlbGVjdGlvbik7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIG5ld1NlbGVjdGlv
bik7CisgICAgICB9CisgICAgfQorICB9LAorCisgIF9zZWxlY3Rpb25EaWRDaGFuZ2VTaW5nbGU6
IGZ1bmN0aW9uKCkgeworICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbGVtZW50Jyk7CisgICAgaWYg
KCFlbCkgeyByZXR1cm47IH0KKworICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50
JyksCisgICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyksCisgICAgICAg
IHNlbGVjdGlvbkluZGV4ID0gY29udGVudCA/IGluZGV4T2YoY29udGVudCwgc2VsZWN0aW9uKSA6
IC0xLAorICAgICAgICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcpOworCisgICAgaWYgKHBy
b21wdCkgeyBzZWxlY3Rpb25JbmRleCArPSAxOyB9CisgICAgaWYgKGVsKSB7IGVsLnNlbGVjdGVk
SW5kZXggPSBzZWxlY3Rpb25JbmRleDsgfQorICB9LAorCisgIF9zZWxlY3Rpb25EaWRDaGFuZ2VN
dWx0aXBsZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRl
bnQnKSwKKyAgICAgICAgc2VsZWN0aW9uID0gZ2V0KHRoaXMsICdzZWxlY3Rpb24nKSwKKyAgICAg
ICAgc2VsZWN0ZWRJbmRleGVzID0gY29udGVudCA/IGluZGV4ZXNPZihjb250ZW50LCBzZWxlY3Rp
b24pIDogWy0xXSwKKyAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMsICdwcm9tcHQnKSwKKyAgICAg
ICAgb2Zmc2V0ID0gcHJvbXB0ID8gMSA6IDAsCisgICAgICAgIG9wdGlvbnMgPSB0aGlzLiQoJ29w
dGlvbicpLAorICAgICAgICBhZGp1c3RlZDsKKworICAgIGlmIChvcHRpb25zKSB7CisgICAgICBv
cHRpb25zLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgIGFkanVzdGVkID0gdGhpcy5pbmRleCA+
IC0xID8gdGhpcy5pbmRleCAtIG9mZnNldCA6IC0xOworICAgICAgICB0aGlzLnNlbGVjdGVkID0g
aW5kZXhPZihzZWxlY3RlZEluZGV4ZXMsIGFkanVzdGVkKSA+IC0xOworICAgICAgfSk7CisgICAg
fQorICB9LAorCisgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX3N1cGVyKCk7CisgICAg
dGhpcy5vbigiZGlkSW5zZXJ0RWxlbWVudCIsIHRoaXMsIHRoaXMuX3RyaWdnZXJDaGFuZ2UpOwor
ICAgIHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMuX2NoYW5nZSk7CisgIH0KK30pOworCitF
bWJlci5TZWxlY3RPcHRpb24gPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgIHRhZ05hbWU6ICdvcHRp
b24nLAorICBhdHRyaWJ1dGVCaW5kaW5nczogWyd2YWx1ZScsICdzZWxlY3RlZCddLAorCisgIGRl
ZmF1bHRUZW1wbGF0ZTogZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgeworICAgIG9wdGlvbnMg
PSB7IGRhdGE6IG9wdGlvbnMuZGF0YSwgaGFzaDoge30gfTsKKyAgICBFbWJlci5IYW5kbGViYXJz
LmhlbHBlcnMuYmluZC5jYWxsKGNvbnRleHQsICJ2aWV3LmxhYmVsIiwgb3B0aW9ucyk7CisgIH0s
CisKKyAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5sYWJlbFBhdGhEaWRDaGFuZ2UoKTsK
KyAgICB0aGlzLnZhbHVlUGF0aERpZENoYW5nZSgpOworCisgICAgdGhpcy5fc3VwZXIoKTsKKyAg
fSwKKworICBzZWxlY3RlZDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNv
bnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKKyAgICAgICAgc2VsZWN0aW9uID0gZ2V0KHRo
aXMsICdwYXJlbnRWaWV3LnNlbGVjdGlvbicpOworICAgIGlmIChnZXQodGhpcywgJ3BhcmVudFZp
ZXcubXVsdGlwbGUnKSkgeworICAgICAgcmV0dXJuIHNlbGVjdGlvbiAmJiBpbmRleE9mKHNlbGVj
dGlvbiwgY29udGVudC52YWx1ZU9mKCkpID4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFBy
aW1pdGl2ZXMgZ2V0IHBhc3NlZCB0aHJvdWdoIGJpbmRpbmdzIGFzIG9iamVjdHMuLi4gc2luY2UK
KyAgICAgIC8vIGBuZXcgTnVtYmVyKDQpICE9PSA0YCwgd2UgdXNlIGA9PWAgYmVsb3cKKyAgICAg
IHJldHVybiBjb250ZW50ID09IHNlbGVjdGlvbjsKKyAgICB9CisgIH0pLnByb3BlcnR5KCdjb250
ZW50JywgJ3BhcmVudFZpZXcuc2VsZWN0aW9uJykudm9sYXRpbGUoKSwKKworICBsYWJlbFBhdGhE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgeworICAgIHZhciBsYWJlbFBhdGgg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0aW9uTGFiZWxQYXRoJyk7CisKKyAgICBpZiAoIWxh
YmVsUGF0aCkgeyByZXR1cm47IH0KKworICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICds
YWJlbCcsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIGdldCh0aGlz
LCBsYWJlbFBhdGgpOworICAgIH0pLnByb3BlcnR5KGxhYmVsUGF0aCkpOworICB9LCAncGFyZW50
Vmlldy5vcHRpb25MYWJlbFBhdGgnKSwKKworICB2YWx1ZVBhdGhEaWRDaGFuZ2U6IEVtYmVyLm9i
c2VydmVyKGZ1bmN0aW9uKCkgeworICAgIHZhciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ3BhcmVu
dFZpZXcub3B0aW9uVmFsdWVQYXRoJyk7CisKKyAgICBpZiAoIXZhbHVlUGF0aCkgeyByZXR1cm47
IH0KKworICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1ZScsIEVtYmVyLmNvbXB1
dGVkKGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIGdldCh0aGlzLCB2YWx1ZVBhdGgpOworICAg
IH0pLnByb3BlcnR5KHZhbHVlUGF0aCkpOworICB9LCAncGFyZW50Vmlldy5vcHRpb25WYWx1ZVBh
dGgnKQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvKmdsb2JhbHMgSGFuZGxlYmFycyAqLworLyoqCitAbW9kdWxlIGVtYmVy
CitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKKy8qKgorICBAcHJpdmF0ZQorCisg
IEZpbmQgdGVtcGxhdGVzIHN0b3JlZCBpbiB0aGUgaGVhZCB0YWcgYXMgc2NyaXB0IHRhZ3MgYW5k
IG1ha2UgdGhlbSBhdmFpbGFibGUKKyAgdG8gYEVtYmVyLkNvcmVWaWV3YCBpbiB0aGUgZ2xvYmFs
IGBFbWJlci5URU1QTEFURVNgIG9iamVjdC4gVGhpcyB3aWxsIGJlIHJ1bgorICBhcyBhcyBqUXVl
cnkgRE9NLXJlYWR5IGNhbGxiYWNrLgorCisgIFNjcmlwdCB0YWdzIHdpdGggYHRleHQveC1oYW5k
bGViYXJzYCB3aWxsIGJlIGNvbXBpbGVkCisgIHdpdGggRW1iZXIncyBIYW5kbGViYXJzIGFuZCBh
cmUgc3VpdGFibGUgZm9yIHVzZSBhcyBhIHZpZXcncyB0ZW1wbGF0ZS4KKyAgVGhvc2Ugd2l0aCB0
eXBlIGB0ZXh0L3gtcmF3LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQgd2l0aCByZWd1bGFy
CisgIEhhbmRsZWJhcnMgYW5kIGFyZSBzdWl0YWJsZSBmb3IgdXNlIGluIHZpZXdzJyBjb21wdXRl
ZCBwcm9wZXJ0aWVzLgorCisgIEBtZXRob2QgYm9vdHN0cmFwCisgIEBmb3IgRW1iZXIuSGFuZGxl
YmFycworICBAc3RhdGljCisgIEBwYXJhbSBjdHgKKyovCitFbWJlci5IYW5kbGViYXJzLmJvb3Rz
dHJhcCA9IGZ1bmN0aW9uKGN0eCkgeworICB2YXIgc2VsZWN0b3JzID0gJ3NjcmlwdFt0eXBlPSJ0
ZXh0L3gtaGFuZGxlYmFycyJdLCBzY3JpcHRbdHlwZT0idGV4dC94LXJhdy1oYW5kbGViYXJzIl0n
OworCisgIEVtYmVyLiQoc2VsZWN0b3JzLCBjdHgpCisgICAgLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBzY3JpcHQgdGFnCisgICAgdmFyIHNjcmlwdCA9
IEVtYmVyLiQodGhpcyksCisgICAgICAgIHR5cGUgICA9IHNjcmlwdC5hdHRyKCd0eXBlJyk7CisK
KyAgICB2YXIgY29tcGlsZSA9IChzY3JpcHQuYXR0cigndHlwZScpID09PSAndGV4dC94LXJhdy1o
YW5kbGViYXJzJykgPworICAgICAgICAgICAgICAgICAgRW1iZXIuJC5wcm94eShIYW5kbGViYXJz
LmNvbXBpbGUsIEhhbmRsZWJhcnMpIDoKKyAgICAgICAgICAgICAgICAgIEVtYmVyLiQucHJveHko
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlLCBFbWJlci5IYW5kbGViYXJzKSwKKyAgICAgIC8vIEdl
dCB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0LCB1c2VkIGJ5IEVtYmVyLlZpZXcncyB0ZW1wbGF0ZU5h
bWUgcHJvcGVydHkuCisgICAgICAvLyBGaXJzdCBsb29rIGZvciBkYXRhLXRlbXBsYXRlLW5hbWUg
YXR0cmlidXRlLCB0aGVuIGZhbGwgYmFjayB0byBpdHMKKyAgICAgIC8vIGlkIGlmIG5vIG5hbWUg
aXMgZm91bmQuCisgICAgICB0ZW1wbGF0ZU5hbWUgPSBzY3JpcHQuYXR0cignZGF0YS10ZW1wbGF0
ZS1uYW1lJykgfHwgc2NyaXB0LmF0dHIoJ2lkJykgfHwgJ2FwcGxpY2F0aW9uJywKKyAgICAgIHRl
bXBsYXRlID0gY29tcGlsZShzY3JpcHQuaHRtbCgpKTsKKworICAgIC8vIEZvciB0ZW1wbGF0ZXMg
d2hpY2ggaGF2ZSBhIG5hbWUsIHdlIHNhdmUgdGhlbSBhbmQgdGhlbiByZW1vdmUgdGhlbSBmcm9t
IHRoZSBET00KKyAgICBFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXSA9IHRlbXBsYXRlOwor
CisgICAgLy8gUmVtb3ZlIHNjcmlwdCB0YWcgZnJvbSBET00KKyAgICBzY3JpcHQucmVtb3ZlKCk7
CisgIH0pOworfTsKKworZnVuY3Rpb24gYm9vdHN0cmFwKCkgeworICBFbWJlci5IYW5kbGViYXJz
LmJvb3RzdHJhcCggRW1iZXIuJChkb2N1bWVudCkgKTsKK30KKworLyoKKyAgV2UgdGllIHRoaXMg
dG8gYXBwbGljYXRpb24ubG9hZCB0byBlbnN1cmUgdGhhdCB3ZSd2ZSBhdCBsZWFzdAorICBhdHRl
bXB0ZWQgdG8gYm9vdHN0cmFwIGF0IHRoZSBwb2ludCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBs
b2FkZWQuCisKKyAgV2UgYWxzbyB0aWUgdGhpcyB0byBkb2N1bWVudCByZWFkeSBzaW5jZSB3ZSdy
ZSBndWFyYW50ZWVkIHRoYXQgYWxsCisgIHRoZSBpbmxpbmUgdGVtcGxhdGVzIGFyZSBwcmVzZW50
IGF0IHRoaXMgcG9pbnQuCisKKyAgVGhlcmUncyBubyBoYXJtIHRvIHJ1bm5pbmcgdGhpcyB0d2lj
ZSwgc2luY2Ugd2UgcmVtb3ZlIHRoZSB0ZW1wbGF0ZXMKKyAgZnJvbSB0aGUgRE9NIGFmdGVyIHBy
b2Nlc3NpbmcuCisqLworCitFbWJlci5vbkxvYWQoJ2FwcGxpY2F0aW9uJywgYm9vdHN0cmFwKTsK
KworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorRW1iZXIgSGFuZGxlYmFycworCitA
bW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKK0ByZXF1aXJlcyBlbWJl
ci12aWV3cworKi8KKworRW1iZXIucnVuTG9hZEhvb2tzKCdFbWJlci5IYW5kbGViYXJzJywgRW1i
ZXIuSGFuZGxlYmFycyk7CisKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKK2RlZmluZSgicm91dGUt
cmVjb2duaXplciIsCisgIFtdLAorICBmdW5jdGlvbigpIHsKKyAgICAidXNlIHN0cmljdCI7Cisg
ICAgdmFyIHNwZWNpYWxzID0gWworICAgICAgJy8nLCAnLicsICcqJywgJysnLCAnPycsICd8JywK
KyAgICAgICcoJywgJyknLCAnWycsICddJywgJ3snLCAnfScsICdcXCcKKyAgICBdOworCisgICAg
dmFyIGVzY2FwZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcJyArIHNwZWNpYWxzLmpvaW4oJ3xcXCcp
ICsgJyknLCAnZycpOworCisgICAgLy8gQSBTZWdtZW50IHJlcHJlc2VudHMgYSBzZWdtZW50IGlu
IHRoZSBvcmlnaW5hbCByb3V0ZSBkZXNjcmlwdGlvbi4KKyAgICAvLyBFYWNoIFNlZ21lbnQgdHlw
ZSBwcm92aWRlcyBhbiBgZWFjaENoYXJgIGFuZCBgcmVnZXhgIG1ldGhvZC4KKyAgICAvLworICAg
IC8vIFRoZSBgZWFjaENoYXJgIG1ldGhvZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIG9uZSBv
ciBtb3JlIGNoYXJhY3RlcgorICAgIC8vIHNwZWNpZmljYXRpb25zLiBBIGNoYXJhY3RlciBzcGVj
aWZpY2F0aW9uIGNvbnN1bWVzIG9uZSBvciBtb3JlIGlucHV0CisgICAgLy8gY2hhcmFjdGVycy4K
KyAgICAvLworICAgIC8vIFRoZSBgcmVnZXhgIG1ldGhvZCByZXR1cm5zIGEgcmVnZXggZnJhZ21l
bnQgZm9yIHRoZSBzZWdtZW50LiBJZiB0aGUKKyAgICAvLyBzZWdtZW50IGlzIGEgZHluYW1pYyBv
ZiBzdGFyIHNlZ21lbnQsIHRoZSByZWdleCBmcmFnbWVudCBhbHNvIGluY2x1ZGVzCisgICAgLy8g
YSBjYXB0dXJlLgorICAgIC8vCisgICAgLy8gQSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBjb250
YWluczoKKyAgICAvLworICAgIC8vICogYHZhbGlkQ2hhcnNgOiBhIFN0cmluZyB3aXRoIGEgbGlz
dCBvZiBhbGwgdmFsaWQgY2hhcmFjdGVycywgb3IKKyAgICAvLyAqIGBpbnZhbGlkQ2hhcnNgOiBh
IFN0cmluZyB3aXRoIGEgbGlzdCBvZiBhbGwgaW52YWxpZCBjaGFyYWN0ZXJzCisgICAgLy8gKiBg
cmVwZWF0YDogdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gY2FuIHJlcGVhdAor
CisgICAgZnVuY3Rpb24gU3RhdGljU2VnbWVudChzdHJpbmcpIHsgdGhpcy5zdHJpbmcgPSBzdHJp
bmc7IH0KKyAgICBTdGF0aWNTZWdtZW50LnByb3RvdHlwZSA9IHsKKyAgICAgIGVhY2hDaGFyOiBm
dW5jdGlvbihjYWxsYmFjaykgeworICAgICAgICB2YXIgc3RyaW5nID0gdGhpcy5zdHJpbmcsIGNo
YXI7CisKKyAgICAgICAgZm9yICh2YXIgaT0wLCBsPXN0cmluZy5sZW5ndGg7IGk8bDsgaSsrKSB7
CisgICAgICAgICAgY2hhciA9IHN0cmluZy5jaGFyQXQoaSk7CisgICAgICAgICAgY2FsbGJhY2so
eyB2YWxpZENoYXJzOiBjaGFyIH0pOworICAgICAgICB9CisgICAgICB9LAorCisgICAgICByZWdl
eDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0cmluZy5yZXBsYWNlKGVzY2Fw
ZVJlZ2V4LCAnXFwkMScpOworICAgICAgfSwKKworICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKCkg
eworICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7CisgICAgICB9CisgICAgfTsKKworICAgIGZ1
bmN0aW9uIER5bmFtaWNTZWdtZW50KG5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsgfQorICAgIER5
bmFtaWNTZWdtZW50LnByb3RvdHlwZSA9IHsKKyAgICAgIGVhY2hDaGFyOiBmdW5jdGlvbihjYWxs
YmFjaykgeworICAgICAgICBjYWxsYmFjayh7IGludmFsaWRDaGFyczogIi8iLCByZXBlYXQ6IHRy
dWUgfSk7CisgICAgICB9LAorCisgICAgICByZWdleDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJl
dHVybiAiKFteL10rKSI7CisgICAgICB9LAorCisgICAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocGFy
YW1zKSB7CisgICAgICAgIHJldHVybiBwYXJhbXNbdGhpcy5uYW1lXTsKKyAgICAgIH0KKyAgICB9
OworCisgICAgZnVuY3Rpb24gU3RhclNlZ21lbnQobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9
CisgICAgU3RhclNlZ21lbnQucHJvdG90eXBlID0geworICAgICAgZWFjaENoYXI6IGZ1bmN0aW9u
KGNhbGxiYWNrKSB7CisgICAgICAgIGNhbGxiYWNrKHsgaW52YWxpZENoYXJzOiAiIiwgcmVwZWF0
OiB0cnVlIH0pOworICAgICAgfSwKKworICAgICAgcmVnZXg6IGZ1bmN0aW9uKCkgeworICAgICAg
ICByZXR1cm4gIiguKykiOworICAgICAgfSwKKworICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHBh
cmFtcykgeworICAgICAgICByZXR1cm4gcGFyYW1zW3RoaXMubmFtZV07CisgICAgICB9CisgICAg
fTsKKworICAgIGZ1bmN0aW9uIEVwc2lsb25TZWdtZW50KCkge30KKyAgICBFcHNpbG9uU2VnbWVu
dC5wcm90b3R5cGUgPSB7CisgICAgICBlYWNoQ2hhcjogZnVuY3Rpb24oKSB7fSwKKyAgICAgIHJl
Z2V4OiBmdW5jdGlvbigpIHsgcmV0dXJuICIiOyB9LAorICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9u
KCkgeyByZXR1cm4gIiI7IH0KKyAgICB9OworCisgICAgZnVuY3Rpb24gcGFyc2Uocm91dGUsIG5h
bWVzLCB0eXBlcykgeworICAgICAgLy8gbm9ybWFsaXplIHJvdXRlIGFzIG5vdCBzdGFydGluZyB3
aXRoIGEgIi8iLiBSZWNvZ25pdGlvbiB3aWxsCisgICAgICAvLyBhbHNvIG5vcm1hbGl6ZS4KKyAg
ICAgIGlmIChyb3V0ZS5jaGFyQXQoMCkgPT09ICIvIikgeyByb3V0ZSA9IHJvdXRlLnN1YnN0cigx
KTsgfQorCisgICAgICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zcGxpdCgiLyIpLCByZXN1bHRzID0g
W107CisKKyAgICAgIGZvciAodmFyIGk9MCwgbD1zZWdtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7
CisgICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbaV0sIG1hdGNoOworCisgICAgICAgIGlm
IChtYXRjaCA9IHNlZ21lbnQubWF0Y2goL146KFteXC9dKykkLykpIHsKKyAgICAgICAgICByZXN1
bHRzLnB1c2gobmV3IER5bmFtaWNTZWdtZW50KG1hdGNoWzFdKSk7CisgICAgICAgICAgbmFtZXMu
cHVzaChtYXRjaFsxXSk7CisgICAgICAgICAgdHlwZXMuZHluYW1pY3MrKzsKKyAgICAgICAgfSBl
bHNlIGlmIChtYXRjaCA9IHNlZ21lbnQubWF0Y2goL15cKihbXlwvXSspJC8pKSB7CisgICAgICAg
ICAgcmVzdWx0cy5wdXNoKG5ldyBTdGFyU2VnbWVudChtYXRjaFsxXSkpOworICAgICAgICAgIG5h
bWVzLnB1c2gobWF0Y2hbMV0pOworICAgICAgICAgIHR5cGVzLnN0YXJzKys7CisgICAgICAgIH0g
ZWxzZSBpZihzZWdtZW50ID09PSAiIikgeworICAgICAgICAgIHJlc3VsdHMucHVzaChuZXcgRXBz
aWxvblNlZ21lbnQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0cy5wdXNo
KG5ldyBTdGF0aWNTZWdtZW50KHNlZ21lbnQpKTsKKyAgICAgICAgICB0eXBlcy5zdGF0aWNzKys7
CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisg
ICAgLy8gQSBTdGF0ZSBoYXMgYSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBhbmQgKGBjaGFyU3Bl
Y2ApIGFuZCBhIGxpc3Qgb2YgcG9zc2libGUKKyAgICAvLyBzdWJzZXF1ZW50IHN0YXRlcyAoYG5l
eHRTdGF0ZXNgKS4KKyAgICAvLworICAgIC8vIElmIGEgU3RhdGUgaXMgYW4gYWNjZXB0aW5nIHN0
YXRlLCBpdCB3aWxsIGFsc28gaGF2ZSBzZXZlcmFsIGFkZGl0aW9uYWwKKyAgICAvLyBwcm9wZXJ0
aWVzOgorICAgIC8vCisgICAgLy8gKiBgcmVnZXhgOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0
IGlzIHVzZWQgdG8gZXh0cmFjdCBwYXJhbWV0ZXJzIGZyb20gcGF0aHMKKyAgICAvLyAgIHRoYXQg
cmVhY2hlZCB0aGlzIGFjY2VwdGluZyBzdGF0ZS4KKyAgICAvLyAqIGBoYW5kbGVyc2A6IEluZm9y
bWF0aW9uIG9uIGhvdyB0byBjb252ZXJ0IHRoZSBsaXN0IG9mIGNhcHR1cmVzIGludG8gY2FsbHMK
KyAgICAvLyAgIHRvIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFt
ZXRlcnMKKyAgICAvLyAqIGB0eXBlc2A6IEhvdyBtYW55IHN0YXRpYywgZHluYW1pYyBvciBzdGFy
IHNlZ21lbnRzIGluIHRoaXMgcm91dGUuIFVzZWQgdG8KKyAgICAvLyAgIGRlY2lkZSB3aGljaCBy
b3V0ZSB0byB1c2UgaWYgbXVsdGlwbGUgcmVnaXN0ZXJlZCByb3V0ZXMgbWF0Y2ggYSBwYXRoLgor
ICAgIC8vCisgICAgLy8gQ3VycmVudGx5LCBTdGF0ZSBpcyBpbXBsZW1lbnRlZCBuYWl2ZWx5IGJ5
IGxvb3Bpbmcgb3ZlciBgbmV4dFN0YXRlc2AgYW5kCisgICAgLy8gY29tcGFyaW5nIGEgY2hhcmFj
dGVyIHNwZWNpZmljYXRpb24gYWdhaW5zdCBhIGNoYXJhY3Rlci4gQSBtb3JlIGVmZmljaWVudAor
ICAgIC8vIGltcGxlbWVudGF0aW9uIHdvdWxkIHVzZSBhIGhhc2ggb2Yga2V5cyBwb2ludGluZyBh
dCBvbmUgb3IgbW9yZSBuZXh0IHN0YXRlcy4KKworICAgIGZ1bmN0aW9uIFN0YXRlKGNoYXJTcGVj
KSB7CisgICAgICB0aGlzLmNoYXJTcGVjID0gY2hhclNwZWM7CisgICAgICB0aGlzLm5leHRTdGF0
ZXMgPSBbXTsKKyAgICB9CisKKyAgICBTdGF0ZS5wcm90b3R5cGUgPSB7CisgICAgICBnZXQ6IGZ1
bmN0aW9uKGNoYXJTcGVjKSB7CisgICAgICAgIHZhciBuZXh0U3RhdGVzID0gdGhpcy5uZXh0U3Rh
dGVzOworCisgICAgICAgIGZvciAodmFyIGk9MCwgbD1uZXh0U3RhdGVzLmxlbmd0aDsgaTxsOyBp
KyspIHsKKyAgICAgICAgICB2YXIgY2hpbGQgPSBuZXh0U3RhdGVzW2ldOworCisgICAgICAgICAg
dmFyIGlzRXF1YWwgPSBjaGlsZC5jaGFyU3BlYy52YWxpZENoYXJzID09PSBjaGFyU3BlYy52YWxp
ZENoYXJzOworICAgICAgICAgIGlzRXF1YWwgPSBpc0VxdWFsICYmIGNoaWxkLmNoYXJTcGVjLmlu
dmFsaWRDaGFycyA9PT0gY2hhclNwZWMuaW52YWxpZENoYXJzOworCisgICAgICAgICAgaWYgKGlz
RXF1YWwpIHsgcmV0dXJuIGNoaWxkOyB9CisgICAgICAgIH0KKyAgICAgIH0sCisKKyAgICAgIHB1
dDogZnVuY3Rpb24oY2hhclNwZWMpIHsKKyAgICAgICAgdmFyIHN0YXRlOworCisgICAgICAgIC8v
IElmIHRoZSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBpbiBhIGNoaWxk
IG9mIHRoZSBjdXJyZW50CisgICAgICAgIC8vIHN0YXRlLCBqdXN0IHJldHVybiB0aGF0IHN0YXRl
LgorICAgICAgICBpZiAoc3RhdGUgPSB0aGlzLmdldChjaGFyU3BlYykpIHsgcmV0dXJuIHN0YXRl
OyB9CisKKyAgICAgICAgLy8gTWFrZSBhIG5ldyBzdGF0ZSBmb3IgdGhlIGNoYXJhY3RlciBzcGVj
CisgICAgICAgIHN0YXRlID0gbmV3IFN0YXRlKGNoYXJTcGVjKTsKKworICAgICAgICAvLyBJbnNl
cnQgdGhlIG5ldyBzdGF0ZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IHN0YXRlCisgICAgICAg
IHRoaXMubmV4dFN0YXRlcy5wdXNoKHN0YXRlKTsKKworICAgICAgICAvLyBJZiB0aGlzIGNoYXJh
Y3RlciBzcGVjaWZpY2F0aW9uIHJlcGVhdHMsIGluc2VydCB0aGUgbmV3IHN0YXRlIGFzIGEgY2hp
bGQKKyAgICAgICAgLy8gb2YgaXRzZWxmLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCB0cmlnZ2Vy
IGFuIGluZmluaXRlIGxvb3AgYmVjYXVzZSBlYWNoCisgICAgICAgIC8vIHRyYW5zaXRpb24gZHVy
aW5nIHJlY29nbml0aW9uIGNvbnN1bWVzIGEgY2hhcmFjdGVyLgorICAgICAgICBpZiAoY2hhclNw
ZWMucmVwZWF0KSB7CisgICAgICAgICAgc3RhdGUubmV4dFN0YXRlcy5wdXNoKHN0YXRlKTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgbmV3IHN0YXRlCisgICAgICAgIHJldHVy
biBzdGF0ZTsKKyAgICAgIH0sCisKKyAgICAgIC8vIEZpbmQgYSBsaXN0IG9mIGNoaWxkIHN0YXRl
cyBtYXRjaGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIKKyAgICAgIG1hdGNoOiBmdW5jdGlvbihjaGFy
KSB7CisgICAgICAgIC8vIERFQlVHICJQcm9jZXNzaW5nIGAiICsgY2hhciArICJgOiIKKyAgICAg
ICAgdmFyIG5leHRTdGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXMsCisgICAgICAgICAgICBjaGlsZCwg
Y2hhclNwZWMsIGNoYXJzOworCisgICAgICAgIC8vIERFQlVHICIgICIgKyBkZWJ1Z1N0YXRlKHRo
aXMpCisgICAgICAgIHZhciByZXR1cm5lZCA9IFtdOworCisgICAgICAgIGZvciAodmFyIGk9MCwg
bD1uZXh0U3RhdGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgICBjaGlsZCA9IG5leHRT
dGF0ZXNbaV07CisKKyAgICAgICAgICBjaGFyU3BlYyA9IGNoaWxkLmNoYXJTcGVjOworCisgICAg
ICAgICAgaWYgKHR5cGVvZiAoY2hhcnMgPSBjaGFyU3BlYy52YWxpZENoYXJzKSAhPT0gJ3VuZGVm
aW5lZCcpIHsKKyAgICAgICAgICAgIGlmIChjaGFycy5pbmRleE9mKGNoYXIpICE9PSAtMSkgeyBy
ZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQorICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChjaGFy
cyA9IGNoYXJTcGVjLmludmFsaWRDaGFycykgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAg
ICBpZiAoY2hhcnMuaW5kZXhPZihjaGFyKSA9PT0gLTEpIHsgcmV0dXJuZWQucHVzaChjaGlsZCk7
IH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuZWQ7Cisg
ICAgICB9CisKKyAgICAgIC8qKiBJRiBERUJVRworICAgICAgLCBkZWJ1ZzogZnVuY3Rpb24oKSB7
CisgICAgICAgIHZhciBjaGFyU3BlYyA9IHRoaXMuY2hhclNwZWMsCisgICAgICAgICAgICBkZWJ1
ZyA9ICJbIiwKKyAgICAgICAgICAgIGNoYXJzID0gY2hhclNwZWMudmFsaWRDaGFycyB8fCBjaGFy
U3BlYy5pbnZhbGlkQ2hhcnM7CisKKyAgICAgICAgaWYgKGNoYXJTcGVjLmludmFsaWRDaGFycykg
eyBkZWJ1ZyArPSAiXiI7IH0KKyAgICAgICAgZGVidWcgKz0gY2hhcnM7CisgICAgICAgIGRlYnVn
ICs9ICJdIjsKKworICAgICAgICBpZiAoY2hhclNwZWMucmVwZWF0KSB7IGRlYnVnICs9ICIrIjsg
fQorCisgICAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICAgIH0KKyAgICAgIEVORCBJRiAqKi8KKyAg
ICB9OworCisgICAgLyoqIElGIERFQlVHCisgICAgZnVuY3Rpb24gZGVidWcobG9nKSB7CisgICAg
ICBjb25zb2xlLmxvZyhsb2cpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRlYnVnU3RhdGUoc3Rh
dGUpIHsKKyAgICAgIHJldHVybiBzdGF0ZS5uZXh0U3RhdGVzLm1hcChmdW5jdGlvbihuKSB7Cisg
ICAgICAgIGlmIChuLm5leHRTdGF0ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiAiKCAiICsgbi5k
ZWJ1ZygpICsgIiBbYWNjZXB0aW5nXSApIjsgfQorICAgICAgICByZXR1cm4gIiggIiArIG4uZGVi
dWcoKSArICIgPHRoZW4+ICIgKyBuLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKHMpIHsgcmV0dXJu
IHMuZGVidWcoKSB9KS5qb2luKCIgb3IgIikgKyAiICkiOworICAgICAgfSkuam9pbigiLCAiKQor
ICAgIH0KKyAgICBFTkQgSUYgKiovCisKKyAgICAvLyBUaGlzIGlzIGEgc29tZXdoYXQgbmFpdmUg
c3RyYXRlZ3ksIGJ1dCBzaG91bGQgd29yayBpbiBhIGxvdCBvZiBjYXNlcworICAgIC8vIEEgYmV0
dGVyIHN0cmF0ZWd5IHdvdWxkIHByb3Blcmx5IHJlc29sdmUgL3Bvc3RzLzppZC9uZXcgYW5kIC9w
b3N0cy9lZGl0LzppZAorICAgIGZ1bmN0aW9uIHNvcnRTb2x1dGlvbnMoc3RhdGVzKSB7CisgICAg
ICByZXR1cm4gc3RhdGVzLnNvcnQoZnVuY3Rpb24oYSwgYikgeworICAgICAgICBpZiAoYS50eXBl
cy5zdGFycyAhPT0gYi50eXBlcy5zdGFycykgeyByZXR1cm4gYS50eXBlcy5zdGFycyAtIGIudHlw
ZXMuc3RhcnM7IH0KKyAgICAgICAgaWYgKGEudHlwZXMuZHluYW1pY3MgIT09IGIudHlwZXMuZHlu
YW1pY3MpIHsgcmV0dXJuIGEudHlwZXMuZHluYW1pY3MgLSBiLnR5cGVzLmR5bmFtaWNzOyB9Cisg
ICAgICAgIGlmIChhLnR5cGVzLnN0YXRpY3MgIT09IGIudHlwZXMuc3RhdGljcykgeyByZXR1cm4g
YS50eXBlcy5zdGF0aWNzIC0gYi50eXBlcy5zdGF0aWNzOyB9CisKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWNvZ25pemVDaGFyKHN0YXRlcywg
Y2hhcikgeworICAgICAgdmFyIG5leHRTdGF0ZXMgPSBbXTsKKworICAgICAgZm9yICh2YXIgaT0w
LCBsPXN0YXRlcy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHZhciBzdGF0ZSA9IHN0YXRl
c1tpXTsKKworICAgICAgICBuZXh0U3RhdGVzID0gbmV4dFN0YXRlcy5jb25jYXQoc3RhdGUubWF0
Y2goY2hhcikpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV4dFN0YXRlczsKKyAgICB9CisK
KyAgICBmdW5jdGlvbiBmaW5kSGFuZGxlcihzdGF0ZSwgcGF0aCkgeworICAgICAgdmFyIGhhbmRs
ZXJzID0gc3RhdGUuaGFuZGxlcnMsIHJlZ2V4ID0gc3RhdGUucmVnZXg7CisgICAgICB2YXIgY2Fw
dHVyZXMgPSBwYXRoLm1hdGNoKHJlZ2V4KSwgY3VycmVudENhcHR1cmUgPSAxOworICAgICAgdmFy
IHJlc3VsdCA9IFtdOworCisgICAgICBmb3IgKHZhciBpPTAsIGw9aGFuZGxlcnMubGVuZ3RoOyBp
PGw7IGkrKykgeworICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLCBuYW1lcyA9IGhh
bmRsZXIubmFtZXMsIHBhcmFtcyA9IHt9OworCisgICAgICAgIGZvciAodmFyIGo9MCwgbT1uYW1l
cy5sZW5ndGg7IGo8bTsgaisrKSB7CisgICAgICAgICAgcGFyYW1zW25hbWVzW2pdXSA9IGNhcHR1
cmVzW2N1cnJlbnRDYXB0dXJlKytdOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LnB1c2go
eyBoYW5kbGVyOiBoYW5kbGVyLmhhbmRsZXIsIHBhcmFtczogcGFyYW1zLCBpc0R5bmFtaWM6ICEh
bmFtZXMubGVuZ3RoIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KworICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50KSB7CisgICAg
ICBzZWdtZW50LmVhY2hDaGFyKGZ1bmN0aW9uKGNoYXIpIHsKKyAgICAgICAgdmFyIHN0YXRlOwor
CisgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRTdGF0ZS5wdXQoY2hhcik7CisgICAgICB9
KTsKKworICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbWFp
biBpbnRlcmZhY2UKKworICAgIHZhciBSb3V0ZVJlY29nbml6ZXIgPSBmdW5jdGlvbigpIHsKKyAg
ICAgIHRoaXMucm9vdFN0YXRlID0gbmV3IFN0YXRlKCk7CisgICAgICB0aGlzLm5hbWVzID0ge307
CisgICAgfTsKKworCisgICAgUm91dGVSZWNvZ25pemVyLnByb3RvdHlwZSA9IHsKKyAgICAgIGFk
ZDogZnVuY3Rpb24ocm91dGVzLCBvcHRpb25zKSB7CisgICAgICAgIHZhciBjdXJyZW50U3RhdGUg
PSB0aGlzLnJvb3RTdGF0ZSwgcmVnZXggPSAiXiIsCisgICAgICAgICAgICB0eXBlcyA9IHsgc3Rh
dGljczogMCwgZHluYW1pY3M6IDAsIHN0YXJzOiAwIH0sCisgICAgICAgICAgICBoYW5kbGVycyA9
IFtdLCBhbGxTZWdtZW50cyA9IFtdLCBuYW1lOworCisgICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1
ZTsKKworICAgICAgICBmb3IgKHZhciBpPTAsIGw9cm91dGVzLmxlbmd0aDsgaTxsOyBpKyspIHsK
KyAgICAgICAgICB2YXIgcm91dGUgPSByb3V0ZXNbaV0sIG5hbWVzID0gW107CisKKyAgICAgICAg
ICB2YXIgc2VnbWVudHMgPSBwYXJzZShyb3V0ZS5wYXRoLCBuYW1lcywgdHlwZXMpOworCisgICAg
ICAgICAgYWxsU2VnbWVudHMgPSBhbGxTZWdtZW50cy5jb25jYXQoc2VnbWVudHMpOworCisgICAg
ICAgICAgZm9yICh2YXIgaj0wLCBtPXNlZ21lbnRzLmxlbmd0aDsgajxtOyBqKyspIHsKKyAgICAg
ICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbal07CisKKyAgICAgICAgICAgIGlmIChzZWdt
ZW50IGluc3RhbmNlb2YgRXBzaWxvblNlZ21lbnQpIHsgY29udGludWU7IH0KKworICAgICAgICAg
ICAgaXNFbXB0eSA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBBZGQgYSAiLyIgZm9yIHRoZSBu
ZXcgc2VnbWVudAorICAgICAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1dCh7
IHZhbGlkQ2hhcnM6ICIvIiB9KTsKKyAgICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKKworICAgICAg
ICAgICAgLy8gQWRkIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlZ21lbnQgdG8gdGhlIE5GQSBh
bmQgcmVnZXgKKyAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGFkZFNlZ21lbnQoY3VycmVudFN0
YXRlLCBzZWdtZW50KTsKKyAgICAgICAgICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKKyAg
ICAgICAgICB9CisKKyAgICAgICAgICBoYW5kbGVycy5wdXNoKHsgaGFuZGxlcjogcm91dGUuaGFu
ZGxlciwgbmFtZXM6IG5hbWVzIH0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzRW1wdHkp
IHsKKyAgICAgICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0KHsgdmFsaWRDaGFy
czogIi8iIH0pOworICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAg
IGN1cnJlbnRTdGF0ZS5oYW5kbGVycyA9IGhhbmRsZXJzOworICAgICAgICBjdXJyZW50U3RhdGUu
cmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4ICsgIiQiKTsKKyAgICAgICAgY3VycmVudFN0YXRlLnR5
cGVzID0gdHlwZXM7CisKKyAgICAgICAgaWYgKG5hbWUgPSBvcHRpb25zICYmIG9wdGlvbnMuYXMp
IHsKKyAgICAgICAgICB0aGlzLm5hbWVzW25hbWVdID0geworICAgICAgICAgICAgc2VnbWVudHM6
IGFsbFNlZ21lbnRzLAorICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzCisgICAgICAgICAg
fTsKKyAgICAgICAgfQorICAgICAgfSwKKworICAgICAgaGFuZGxlcnNGb3I6IGZ1bmN0aW9uKG5h
bWUpIHsKKyAgICAgICAgdmFyIHJvdXRlID0gdGhpcy5uYW1lc1tuYW1lXSwgcmVzdWx0ID0gW107
CisgICAgICAgIGlmICghcm91dGUpIHsgdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0
ZSBuYW1lZCAiICsgbmFtZSk7IH0KKworICAgICAgICBmb3IgKHZhciBpPTAsIGw9cm91dGUuaGFu
ZGxlcnMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICAgIHJlc3VsdC5wdXNoKHJvdXRlLmhh
bmRsZXJzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9
LAorCisgICAgICBoYXNSb3V0ZTogZnVuY3Rpb24obmFtZSkgeworICAgICAgICByZXR1cm4gISF0
aGlzLm5hbWVzW25hbWVdOworICAgICAgfSwKKworICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5h
bWUsIHBhcmFtcykgeworICAgICAgICB2YXIgcm91dGUgPSB0aGlzLm5hbWVzW25hbWVdLCBvdXRw
dXQgPSAiIjsKKyAgICAgICAgaWYgKCFyb3V0ZSkgeyB0aHJvdyBuZXcgRXJyb3IoIlRoZXJlIGlz
IG5vIHJvdXRlIG5hbWVkICIgKyBuYW1lKTsgfQorCisgICAgICAgIHZhciBzZWdtZW50cyA9IHJv
dXRlLnNlZ21lbnRzOworCisgICAgICAgIGZvciAodmFyIGk9MCwgbD1zZWdtZW50cy5sZW5ndGg7
IGk8bDsgaSsrKSB7CisgICAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXTsKKworICAg
ICAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgRXBzaWxvblNlZ21lbnQpIHsgY29udGludWU7
IH0KKworICAgICAgICAgIG91dHB1dCArPSAiLyI7CisgICAgICAgICAgb3V0cHV0ICs9IHNlZ21l
bnQuZ2VuZXJhdGUocGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXQuY2hh
ckF0KDApICE9PSAnLycpIHsgb3V0cHV0ID0gJy8nICsgb3V0cHV0OyB9CisKKyAgICAgICAgcmV0
dXJuIG91dHB1dDsKKyAgICAgIH0sCisKKyAgICAgIHJlY29nbml6ZTogZnVuY3Rpb24ocGF0aCkg
eworICAgICAgICB2YXIgc3RhdGVzID0gWyB0aGlzLnJvb3RTdGF0ZSBdLCBpLCBsOworCisgICAg
ICAgIC8vIERFQlVHIEdST1VQIHBhdGgKKworICAgICAgICB2YXIgcGF0aExlbiA9IHBhdGgubGVu
Z3RoOworCisgICAgICAgIGlmIChwYXRoLmNoYXJBdCgwKSAhPT0gIi8iKSB7IHBhdGggPSAiLyIg
KyBwYXRoOyB9CisKKyAgICAgICAgaWYgKHBhdGhMZW4gPiAxICYmIHBhdGguY2hhckF0KHBhdGhM
ZW4gLSAxKSA9PT0gIi8iKSB7CisgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDAsIHBhdGhM
ZW4gLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wLCBsPXBhdGgubGVuZ3RoOyBp
PGw7IGkrKykgeworICAgICAgICAgIHN0YXRlcyA9IHJlY29nbml6ZUNoYXIoc3RhdGVzLCBwYXRo
LmNoYXJBdChpKSk7CisgICAgICAgICAgaWYgKCFzdGF0ZXMubGVuZ3RoKSB7IGJyZWFrOyB9Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBFTkQgREVCVUcgR1JPVVAKKworICAgICAgICB2YXIgc29s
dXRpb25zID0gW107CisgICAgICAgIGZvciAoaT0wLCBsPXN0YXRlcy5sZW5ndGg7IGk8bDsgaSsr
KSB7CisgICAgICAgICAgaWYgKHN0YXRlc1tpXS5oYW5kbGVycykgeyBzb2x1dGlvbnMucHVzaChz
dGF0ZXNbaV0pOyB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZXMgPSBzb3J0U29sdXRpb25z
KHNvbHV0aW9ucyk7CisKKyAgICAgICAgdmFyIHN0YXRlID0gc29sdXRpb25zWzBdOworCisgICAg
ICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5oYW5kbGVycykgeworICAgICAgICAgIHJldHVybiBmaW5k
SGFuZGxlcihzdGF0ZSwgcGF0aCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAg
ZnVuY3Rpb24gVGFyZ2V0KHBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKSB7CisgICAgICB0aGlzLnBh
dGggPSBwYXRoOworICAgICAgdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKKyAgICAgIHRoaXMuZGVs
ZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBUYXJnZXQucHJvdG90eXBlID0geworICAg
ICAgdG86IGZ1bmN0aW9uKHRhcmdldCwgY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIGRlbGVnYXRl
ID0gdGhpcy5kZWxlZ2F0ZTsKKworICAgICAgICBpZiAoZGVsZWdhdGUgJiYgZGVsZWdhdGUud2ls
bEFkZFJvdXRlKSB7CisgICAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdGUud2lsbEFkZFJvdXRlKHRo
aXMubWF0Y2hlci50YXJnZXQsIHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLm1h
dGNoZXIuYWRkKHRoaXMucGF0aCwgdGFyZ2V0KTsKKworICAgICAgICBpZiAoY2FsbGJhY2spIHsK
KyAgICAgICAgICBpZiAoY2FsbGJhY2subGVuZ3RoID09PSAwKSB7IHRocm93IG5ldyBFcnJvcigi
WW91IG11c3QgaGF2ZSBhbiBhcmd1bWVudCBpbiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIGB0b2Ai
KTsgfQorICAgICAgICAgIHRoaXMubWF0Y2hlci5hZGRDaGlsZCh0aGlzLnBhdGgsIHRhcmdldCwg
Y2FsbGJhY2ssIHRoaXMuZGVsZWdhdGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKwor
ICAgIGZ1bmN0aW9uIE1hdGNoZXIodGFyZ2V0KSB7CisgICAgICB0aGlzLnJvdXRlcyA9IHt9Owor
ICAgICAgdGhpcy5jaGlsZHJlbiA9IHt9OworICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Cisg
ICAgfQorCisgICAgTWF0Y2hlci5wcm90b3R5cGUgPSB7CisgICAgICBhZGQ6IGZ1bmN0aW9uKHBh
dGgsIGhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5yb3V0ZXNbcGF0aF0gPSBoYW5kbGVyOworICAg
ICAgfSwKKworICAgICAgYWRkQ2hpbGQ6IGZ1bmN0aW9uKHBhdGgsIHRhcmdldCwgY2FsbGJhY2ss
IGRlbGVnYXRlKSB7CisgICAgICAgIHZhciBtYXRjaGVyID0gbmV3IE1hdGNoZXIodGFyZ2V0KTsK
KyAgICAgICAgdGhpcy5jaGlsZHJlbltwYXRoXSA9IG1hdGNoZXI7CisKKyAgICAgICAgdmFyIG1h
dGNoID0gZ2VuZXJhdGVNYXRjaChwYXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSk7CisKKyAgICAgICAg
aWYgKGRlbGVnYXRlICYmIGRlbGVnYXRlLmNvbnRleHRFbnRlcmVkKSB7CisgICAgICAgICAgZGVs
ZWdhdGUuY29udGV4dEVudGVyZWQodGFyZ2V0LCBtYXRjaCk7CisgICAgICAgIH0KKworICAgICAg
ICBjYWxsYmFjayhtYXRjaCk7CisgICAgICB9CisgICAgfTsKKworICAgIGZ1bmN0aW9uIGdlbmVy
YXRlTWF0Y2goc3RhcnRpbmdQYXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSkgeworICAgICAgcmV0dXJu
IGZ1bmN0aW9uKHBhdGgsIG5lc3RlZENhbGxiYWNrKSB7CisgICAgICAgIHZhciBmdWxsUGF0aCA9
IHN0YXJ0aW5nUGF0aCArIHBhdGg7CisKKyAgICAgICAgaWYgKG5lc3RlZENhbGxiYWNrKSB7Cisg
ICAgICAgICAgbmVzdGVkQ2FsbGJhY2soZ2VuZXJhdGVNYXRjaChmdWxsUGF0aCwgbWF0Y2hlciwg
ZGVsZWdhdGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRhcmdl
dChzdGFydGluZ1BhdGggKyBwYXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSk7CisgICAgICAgIH0KKyAg
ICAgIH07CisgICAgfQorCisgICAgZnVuY3Rpb24gYWRkUm91dGUocm91dGVBcnJheSwgcGF0aCwg
aGFuZGxlcikgeworICAgICAgdmFyIGxlbiA9IDA7CisgICAgICBmb3IgKHZhciBpPTAsIGw9cm91
dGVBcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGxlbiArPSByb3V0ZUFycmF5W2ld
LnBhdGgubGVuZ3RoOworICAgICAgfQorCisgICAgICBwYXRoID0gcGF0aC5zdWJzdHIobGVuKTsK
KyAgICAgIHJvdXRlQXJyYXkucHVzaCh7IHBhdGg6IHBhdGgsIGhhbmRsZXI6IGhhbmRsZXIgfSk7
CisgICAgfQorCisgICAgZnVuY3Rpb24gZWFjaFJvdXRlKGJhc2VSb3V0ZSwgbWF0Y2hlciwgY2Fs
bGJhY2ssIGJpbmRpbmcpIHsKKyAgICAgIHZhciByb3V0ZXMgPSBtYXRjaGVyLnJvdXRlczsKKwor
ICAgICAgZm9yICh2YXIgcGF0aCBpbiByb3V0ZXMpIHsKKyAgICAgICAgaWYgKHJvdXRlcy5oYXNP
d25Qcm9wZXJ0eShwYXRoKSkgeworICAgICAgICAgIHZhciByb3V0ZUFycmF5ID0gYmFzZVJvdXRl
LnNsaWNlKCk7CisgICAgICAgICAgYWRkUm91dGUocm91dGVBcnJheSwgcGF0aCwgcm91dGVzW3Bh
dGhdKTsKKworICAgICAgICAgIGlmIChtYXRjaGVyLmNoaWxkcmVuW3BhdGhdKSB7CisgICAgICAg
ICAgICBlYWNoUm91dGUocm91dGVBcnJheSwgbWF0Y2hlci5jaGlsZHJlbltwYXRoXSwgY2FsbGJh
Y2ssIGJpbmRpbmcpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYWxsYmFjay5j
YWxsKGJpbmRpbmcsIHJvdXRlQXJyYXkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
fQorICAgIH0KKworICAgIFJvdXRlUmVjb2duaXplci5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24o
Y2FsbGJhY2ssIGFkZFJvdXRlQ2FsbGJhY2spIHsKKyAgICAgIHZhciBtYXRjaGVyID0gbmV3IE1h
dGNoZXIoKTsKKworICAgICAgY2FsbGJhY2soZ2VuZXJhdGVNYXRjaCgiIiwgbWF0Y2hlciwgdGhp
cy5kZWxlZ2F0ZSkpOworCisgICAgICBlYWNoUm91dGUoW10sIG1hdGNoZXIsIGZ1bmN0aW9uKHJv
dXRlKSB7CisgICAgICAgIGlmIChhZGRSb3V0ZUNhbGxiYWNrKSB7IGFkZFJvdXRlQ2FsbGJhY2so
dGhpcywgcm91dGUpOyB9CisgICAgICAgIGVsc2UgeyB0aGlzLmFkZChyb3V0ZSk7IH0KKyAgICAg
IH0sIHRoaXMpOworICAgIH07CisgICAgcmV0dXJuIFJvdXRlUmVjb2duaXplcjsKKyAgfSk7CisK
K30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CitkZWZpbmUoInJvdXRlciIsCisgIFsicm91dGUt
cmVjb2duaXplciJdLAorICBmdW5jdGlvbihSb3V0ZVJlY29nbml6ZXIpIHsKKyAgICAidXNlIHN0
cmljdCI7CisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorCisgICAgICBUaGlzIGZpbGUgcmVmZXJl
bmNlcyBzZXZlcmFsIGludGVybmFsIHN0cnVjdHVyZXM6CisKKyAgICAgICMjIGBSZWNvZ25pemVk
SGFuZGxlcmAKKworICAgICAgKiBge1N0cmluZ30gaGFuZGxlcmA6IEEgaGFuZGxlciBuYW1lCisg
ICAgICAqIGB7T2JqZWN0fSBwYXJhbXNgOiBBIGhhc2ggb2YgcmVjb2duaXplZCBwYXJhbWV0ZXJz
CisKKyAgICAgICMjIGBVbnJlc29sdmVkSGFuZGxlckluZm9gCisKKyAgICAgICogYHtCb29sZWFu
fSBpc0R5bmFtaWNgOiB3aGV0aGVyIGEgaGFuZGxlciBoYXMgYW55IGR5bmFtaWMgc2VnbWVudHMK
KyAgICAgICogYHtTdHJpbmd9IG5hbWVgOiB0aGUgbmFtZSBvZiBhIGhhbmRsZXIKKyAgICAgICog
YHtPYmplY3R9IGNvbnRleHRgOiB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBoYW5kbGVyCisK
KyAgICAgICMjIGBIYW5kbGVySW5mb2AKKworICAgICAgKiBge0Jvb2xlYW59IGlzRHluYW1pY2A6
IHdoZXRoZXIgYSBoYW5kbGVyIGhhcyBhbnkgZHluYW1pYyBzZWdtZW50cworICAgICAgKiBge1N0
cmluZ30gbmFtZWA6IHRoZSBvcmlnaW5hbCB1bnJlc29sdmVkIGhhbmRsZXIgbmFtZQorICAgICAg
KiBge09iamVjdH0gaGFuZGxlcmA6IGEgaGFuZGxlciBvYmplY3QKKyAgICAgICogYHtPYmplY3R9
IGNvbnRleHRgOiB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBoYW5kbGVyCisgICAgKi8KKwor
CisgICAgZnVuY3Rpb24gUm91dGVyKCkgeworICAgICAgdGhpcy5yZWNvZ25pemVyID0gbmV3IFJv
dXRlUmVjb2duaXplcigpOworICAgIH0KKworCisgICAgUm91dGVyLnByb3RvdHlwZSA9IHsKKyAg
ICAgIC8qKgorICAgICAgICBUaGUgbWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSByb3V0ZXIuIFRo
ZSBBUEkgaXMgZXNzZW50aWFsbHkKKyAgICAgICAgdGhlIHNhbWUgYXMgdGhlIGBtYXBgIG1ldGhv
ZCBpbiBgcm91dGUtcmVjb2duaXplcmAuCisKKyAgICAgICAgVGhpcyBtZXRob2QgZXh0cmFjdHMg
dGhlIFN0cmluZyBoYW5kbGVyIGF0IHRoZSBsYXN0IGAudG8oKWAKKyAgICAgICAgY2FsbCBhbmQg
dXNlcyBpdCBhcyB0aGUgbmFtZSBvZiB0aGUgd2hvbGUgcm91dGUuCisKKyAgICAgICAgQHBhcmFt
IHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgICovCisgICAgICBtYXA6IGZ1bmN0aW9uKGNhbGxi
YWNrKSB7CisgICAgICAgIHRoaXMucmVjb2duaXplci5kZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7
CisKKyAgICAgICAgdGhpcy5yZWNvZ25pemVyLm1hcChjYWxsYmFjaywgZnVuY3Rpb24ocmVjb2du
aXplciwgcm91dGUpIHsKKyAgICAgICAgICB2YXIgbGFzdEhhbmRsZXIgPSByb3V0ZVtyb3V0ZS5s
ZW5ndGggLSAxXS5oYW5kbGVyOworICAgICAgICAgIHZhciBhcmdzID0gW3JvdXRlLCB7IGFzOiBs
YXN0SGFuZGxlciB9XTsKKyAgICAgICAgICByZWNvZ25pemVyLmFkZC5hcHBseShyZWNvZ25pemVy
LCBhcmdzKTsKKyAgICAgICAgfSk7CisgICAgICB9LAorCisgICAgICBoYXNSb3V0ZTogZnVuY3Rp
b24ocm91dGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVjb2duaXplci5oYXNSb3V0ZShyb3V0
ZSk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAgVGhlIGVudHJ5IHBvaW50IGZvciBo
YW5kbGluZyBhIGNoYW5nZSB0byB0aGUgVVJMICh1c3VhbGx5CisgICAgICAgIHZpYSB0aGUgYmFj
ayBhbmQgZm9yd2FyZCBidXR0b24pLgorCisgICAgICAgIFJldHVybnMgYW4gQXJyYXkgb2YgaGFu
ZGxlcnMgYW5kIHRoZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQKKyAgICAgICAgd2l0aCB0aG9zZSBw
YXJhbWV0ZXJzLgorCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8gcHJvY2Vz
cworCisgICAgICAgIEByZXR1cm4ge0FycmF5fSBhbiBBcnJheSBvZiBgW2hhbmRsZXIsIHBhcmFt
ZXRlcl1gIHR1cGxlcworICAgICAgKi8KKyAgICAgIGhhbmRsZVVSTDogZnVuY3Rpb24odXJsKSB7
CisgICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5yZWNvZ25pemVyLnJlY29nbml6ZSh1cmwpLAor
ICAgICAgICAgICAgb2JqZWN0cyA9IFtdOworCisgICAgICAgIGlmICghcmVzdWx0cykgeworICAg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gcm91dGUgbWF0Y2hlZCB0aGUgVVJMICciICsgdXJs
ICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbGxlY3RPYmplY3RzKHRoaXMsIHJlc3Vs
dHMsIDAsIFtdKTsKKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICBIb29rIHBvaW50IGZv
ciB1cGRhdGluZyB0aGUgVVJMLgorCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwg
dG8gdXBkYXRlIHRvCisgICAgICAqLworICAgICAgdXBkYXRlVVJMOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgdGhyb3cgInVwZGF0ZVVSTCBpcyBub3QgaW1wbGVtZW50ZWQiOworICAgICAgfSwKKwor
ICAgICAgLyoqCisgICAgICAgIEhvb2sgcG9pbnQgZm9yIHJlcGxhY2luZyB0aGUgY3VycmVudCBV
UkwsIGkuZS4gd2l0aCByZXBsYWNlU3RhdGUKKworICAgICAgICBCeSBkZWZhdWx0IHRoaXMgYmVo
YXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAorCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1
cmwgYSBVUkwgdG8gdXBkYXRlIHRvCisgICAgICAqLworICAgICAgcmVwbGFjZVVSTDogZnVuY3Rp
b24odXJsKSB7CisgICAgICAgIHRoaXMudXBkYXRlVVJMKHVybCk7CisgICAgICB9LAorCisgICAg
ICAvKioKKyAgICAgICAgVHJhbnNpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgbmFtZWQgcm91dGUu
CisKKyAgICAgICAgSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRoZSBleGl0IGNhbGxiYWNrIG9uIGFu
eSBoYW5kbGVycworICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIgcmVwcmVzZW50ZWQgYnkgdGhl
IHRhcmdldCByb3V0ZS4KKworICAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBv
ZiB0aGUgcm91dGUKKyAgICAgICovCisgICAgICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKG5hbWUp
IHsKKyAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVu
dHMsIDEpOworICAgICAgICBkb1RyYW5zaXRpb24odGhpcywgbmFtZSwgdGhpcy51cGRhdGVVUkws
IGFyZ3MpOworICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgIElkZW50aWNhbCB0byBgdHJh
bnNpdGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAor
ICAgICAgICBpZiBwb3NzaWJsZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBw
cmltYXJpbHkgZm9yIHVzZSB3aXRoIGByZXBsYWNlU3RhdGVgLgorCisgICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgICAgKi8KKyAgICAgIHJlcGxh
Y2VXaXRoOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90
eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgZG9UcmFuc2l0aW9uKHRoaXMs
IG5hbWUsIHRoaXMucmVwbGFjZVVSTCwgYXJncyk7CisgICAgICB9LAorCisgICAgICAvKioKKyAg
ICAgICAgQHByaXZhdGUKKworICAgICAgICBUaGlzIG1ldGhvZCB0YWtlcyBhIGhhbmRsZXIgbmFt
ZSBhbmQgYSBsaXN0IG9mIGNvbnRleHRzIGFuZCByZXR1cm5zCisgICAgICAgIGEgc2VyaWFsaXpl
ZCBwYXJhbWV0ZXIgaGFzaCBzdWl0YWJsZSB0byBwYXNzIHRvIGByZWNvZ25pemVyLmdlbmVyYXRl
KClgLgorCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBoYW5kbGVyTmFtZQorICAgICAgICBAcGFy
YW0ge0FycmF5W09iamVjdF19IGNvbnRleHRzCisgICAgICAgIEByZXR1cm4ge09iamVjdH0gYSBz
ZXJpYWxpemVkIHBhcmFtZXRlciBoYXNoCisgICAgICAqLworICAgICAgcGFyYW1zRm9ySGFuZGxl
cjogZnVuY3Rpb24oaGFuZGxlck5hbWUsIGNhbGxiYWNrKSB7CisgICAgICAgIHZhciBvdXRwdXQg
PSB0aGlzLl9wYXJhbXNGb3JIYW5kbGVyKGhhbmRsZXJOYW1lLCBbXS5zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSkpOworICAgICAgICByZXR1cm4gb3V0cHV0LnBhcmFtczsKKyAgICAgIH0sCisKKyAg
ICAgIC8qKgorICAgICAgICBUYWtlIGEgbmFtZWQgcm91dGUgYW5kIGNvbnRleHQgb2JqZWN0cyBh
bmQgZ2VuZXJhdGUgYQorICAgICAgICBVUkwuCisKKyAgICAgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIHRvIGdlbmVyYXRlCisgICAgICAgICAgYSBVUkwgZm9y
CisgICAgICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBvYmplY3RzIGEgbGlzdCBvZiBvYmplY3RzIHRv
IHNlcmlhbGl6ZQorCisgICAgICAgIEByZXR1cm4ge1N0cmluZ30gYSBVUkwKKyAgICAgICovCisg
ICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oaGFuZGxlck5hbWUpIHsKKyAgICAgICAgdmFyIHBhcmFt
cyA9IHRoaXMucGFyYW1zRm9ySGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAg
ICByZXR1cm4gdGhpcy5yZWNvZ25pemVyLmdlbmVyYXRlKGhhbmRsZXJOYW1lLCBwYXJhbXMpOwor
ICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgIEBwcml2YXRlCisKKyAgICAgICAgVXNlZCBp
bnRlcm5hbGx5IGJ5IGBnZW5lcmF0ZWAgYW5kIGB0cmFuc2l0aW9uVG9gLgorICAgICAgKi8KKyAg
ICAgIF9wYXJhbXNGb3JIYW5kbGVyOiBmdW5jdGlvbihoYW5kbGVyTmFtZSwgb2JqZWN0cywgZG9V
cGRhdGUpIHsKKyAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5yZWNvZ25pemVyLmhhbmRsZXJz
Rm9yKGhhbmRsZXJOYW1lKSwKKyAgICAgICAgICAgIHBhcmFtcyA9IHt9LAorICAgICAgICAgICAg
dG9TZXR1cCA9IFtdLAorICAgICAgICAgICAgc3RhcnRJZHggPSBoYW5kbGVycy5sZW5ndGgsCisg
ICAgICAgICAgICBvYmplY3RzVG9NYXRjaCA9IG9iamVjdHMubGVuZ3RoLAorICAgICAgICAgICAg
b2JqZWN0LCBvYmplY3RDaGFuZ2VkLCBoYW5kbGVyT2JqLCBoYW5kbGVyLCBuYW1lcywgaSwgbGVu
OworCisgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGhhbmRsZXIgdG8gc3RhcnQgbWF0Y2hpbmcg
YXQKKyAgICAgICAgZm9yIChpPWhhbmRsZXJzLmxlbmd0aC0xOyBpPj0wICYmIG9iamVjdHNUb01h
dGNoPjA7IGktLSkgeworICAgICAgICAgIGlmIChoYW5kbGVyc1tpXS5uYW1lcy5sZW5ndGgpIHsK
KyAgICAgICAgICAgIG9iamVjdHNUb01hdGNoLS07CisgICAgICAgICAgICBzdGFydElkeCA9IGk7
CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iamVjdHNUb01hdGNoID4g
MCkgeworICAgICAgICAgIHRocm93ICJNb3JlIG9iamVjdHMgd2VyZSBwYXNzZWQgdGhhbiBkeW5h
bWljIHNlZ21lbnRzIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbm5lY3QgdGhlIG9iamVj
dHMgdG8gdGhlIHJvdXRlcworICAgICAgICBmb3IgKGk9MCwgbGVuPWhhbmRsZXJzLmxlbmd0aDsg
aTxsZW47IGkrKykgeworICAgICAgICAgIGhhbmRsZXJPYmogPSBoYW5kbGVyc1tpXTsKKyAgICAg
ICAgICBoYW5kbGVyID0gdGhpcy5nZXRIYW5kbGVyKGhhbmRsZXJPYmouaGFuZGxlcik7CisgICAg
ICAgICAgbmFtZXMgPSBoYW5kbGVyT2JqLm5hbWVzOworICAgICAgICAgIG9iamVjdENoYW5nZWQg
PSBmYWxzZTsKKworICAgICAgICAgIC8vIElmIGl0J3MgYSBkeW5hbWljIHNlZ21lbnQKKyAgICAg
ICAgICBpZiAobmFtZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG9iamVj
dHMsIHVzZSB0aGVtCisgICAgICAgICAgICBpZiAoaSA+PSBzdGFydElkeCkgeworICAgICAgICAg
ICAgICBvYmplY3QgPSBvYmplY3RzLnNoaWZ0KCk7CisgICAgICAgICAgICAgIG9iamVjdENoYW5n
ZWQgPSB0cnVlOworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSBleGlzdGluZyBjb250ZXh0
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBvYmplY3QgPSBoYW5kbGVyLmNv
bnRleHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0byBnZW5l
cmF0ZSBwYXJhbXMKKyAgICAgICAgICAgIGlmIChoYW5kbGVyLnNlcmlhbGl6ZSkgeworICAgICAg
ICAgICAgICBtZXJnZShwYXJhbXMsIGhhbmRsZXIuc2VyaWFsaXplKG9iamVjdCwgbmFtZXMpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIGR5bmFtaWMgc2VnbWVu
dCBhbmQgd2UncmUgdXBkYXRpbmcKKyAgICAgICAgICB9IGVsc2UgaWYgKGRvVXBkYXRlKSB7Cisg
ICAgICAgICAgICAvLyBJZiB3ZSd2ZSBwYXNzZWQgdGhlIG1hdGNoIHBvaW50IHdlIG5lZWQgdG8g
ZGVzZXJpYWxpemUgYWdhaW4KKyAgICAgICAgICAgIC8vIG9yIGlmIHdlIG5ldmVyIGhhZCBhIGNv
bnRleHQKKyAgICAgICAgICAgIGlmIChpID4gc3RhcnRJZHggfHwgIWhhbmRsZXIuaGFzT3duUHJv
cGVydHkoJ2NvbnRleHQnKSkgeworICAgICAgICAgICAgICBpZiAoaGFuZGxlci5kZXNlcmlhbGl6
ZSkgeworICAgICAgICAgICAgICAgIG9iamVjdCA9IGhhbmRsZXIuZGVzZXJpYWxpemUoe30pOwor
ICAgICAgICAgICAgICAgIG9iamVjdENoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAvLyBPdGhlcndpc2UgdXNlIGV4aXN0aW5nIGNvbnRleHQKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgIG9iamVjdCA9IGhhbmRsZXIuY29udGV4dDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSB1
cGRhdGUgdGhlIGNvbnRleHQgaGVyZSBzbyBpdCdzIGF2YWlsYWJsZSB0bworICAgICAgICAgIC8v
IHN1YnNlcXVlbnQgZGVzZXJpYWxpemUgY2FsbHMKKyAgICAgICAgICBpZiAoZG9VcGRhdGUgJiYg
b2JqZWN0Q2hhbmdlZCkgeworICAgICAgICAgICAgLy8gVE9ETzogSXQncyBhIGJpdCBhd2t3YXJk
IHRvIHNldCB0aGUgY29udGV4dCB0d2ljZSwgc2VlIGlmIHdlIGNhbiBEUlkgdGhpbmdzIHVwCisg
ICAgICAgICAgICBzZXRDb250ZXh0KGhhbmRsZXIsIG9iamVjdCk7CisgICAgICAgICAgfQorCisg
ICAgICAgICAgdG9TZXR1cC5wdXNoKHsKKyAgICAgICAgICAgIGlzRHluYW1pYzogISFoYW5kbGVy
T2JqLm5hbWVzLmxlbmd0aCwKKyAgICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXJPYmouaGFuZGxl
ciwKKyAgICAgICAgICAgIG5hbWU6IGhhbmRsZXJPYmoubmFtZSwKKyAgICAgICAgICAgIGNvbnRl
eHQ6IG9iamVjdAorICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsg
cGFyYW1zOiBwYXJhbXMsIHRvU2V0dXA6IHRvU2V0dXAgfTsKKyAgICAgIH0sCisKKyAgICAgIGlz
QWN0aXZlOiBmdW5jdGlvbihoYW5kbGVyTmFtZSkgeworICAgICAgICB2YXIgY29udGV4dHMgPSBb
XS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisKKyAgICAgICAgdmFyIGN1cnJlbnRIYW5kbGVy
SW5mb3MgPSB0aGlzLmN1cnJlbnRIYW5kbGVySW5mb3MsCisgICAgICAgICAgICBmb3VuZCA9IGZh
bHNlLCBuYW1lcywgb2JqZWN0LCBoYW5kbGVySW5mbywgaGFuZGxlck9iajsKKworICAgICAgICBm
b3IgKHZhciBpPWN1cnJlbnRIYW5kbGVySW5mb3MubGVuZ3RoLTE7IGk+PTA7IGktLSkgeworICAg
ICAgICAgIGhhbmRsZXJJbmZvID0gY3VycmVudEhhbmRsZXJJbmZvc1tpXTsKKyAgICAgICAgICBp
ZiAoaGFuZGxlckluZm8ubmFtZSA9PT0gaGFuZGxlck5hbWUpIHsgZm91bmQgPSB0cnVlOyB9CisK
KyAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0cy5sZW5ndGgg
PT09IDApIHsgYnJlYWs7IH0KKworICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvLmlzRHluYW1p
YykgeworICAgICAgICAgICAgICBvYmplY3QgPSBjb250ZXh0cy5wb3AoKTsKKyAgICAgICAgICAg
ICAgaWYgKGhhbmRsZXJJbmZvLmNvbnRleHQgIT09IG9iamVjdCkgeyByZXR1cm4gZmFsc2U7IH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
Y29udGV4dHMubGVuZ3RoID09PSAwICYmIGZvdW5kOworICAgICAgfSwKKworICAgICAgdHJpZ2dl
cjogZnVuY3Rpb24obmFtZSkgeworICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJn
dW1lbnRzKTsKKyAgICAgICAgdHJpZ2dlcih0aGlzLCBhcmdzKTsKKyAgICAgIH0KKyAgICB9Owor
CisgICAgZnVuY3Rpb24gbWVyZ2UoaGFzaCwgb3RoZXIpIHsKKyAgICAgIGZvciAodmFyIHByb3Ag
aW4gb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLmhhc093blByb3BlcnR5KHByb3ApKSB7IGhh
c2hbcHJvcF0gPSBvdGhlcltwcm9wXTsgfQorICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9u
IGlzQ3VycmVudChjdXJyZW50SGFuZGxlckluZm9zLCBoYW5kbGVyTmFtZSkgeworICAgICAgcmV0
dXJuIGN1cnJlbnRIYW5kbGVySW5mb3NbY3VycmVudEhhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5u
YW1lID09PSBoYW5kbGVyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisK
KyAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHRoZSBgY29sbGVj
dE9iamVjdHNgCisgICAgICBmdW5jdGlvbiBlbmNvdW50ZXJzIGEgcHJvbWlzZSB3aGlsZSBjb252
ZXJ0aW5nIFVSTCBwYXJhbWV0ZXJzCisgICAgICBpbnRvIG9iamVjdHMuCisKKyAgICAgIEl0IHRy
aWdnZXJzIHRoZSBgZW50ZXJgIGFuZCBgc2V0dXBgIG1ldGhvZHMgb24gdGhlIGBsb2FkaW5nYAor
ICAgICAgaGFuZGxlci4KKworICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgorICAgICovCisg
ICAgZnVuY3Rpb24gbG9hZGluZyhyb3V0ZXIpIHsKKyAgICAgIGlmICghcm91dGVyLmlzTG9hZGlu
ZykgeworICAgICAgICByb3V0ZXIuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgdmFyIGhhbmRs
ZXIgPSByb3V0ZXIuZ2V0SGFuZGxlcignbG9hZGluZycpOworCisgICAgICAgIGlmIChoYW5kbGVy
KSB7CisgICAgICAgICAgaWYgKGhhbmRsZXIuZW50ZXIpIHsgaGFuZGxlci5lbnRlcigpOyB9Cisg
ICAgICAgICAgaWYgKGhhbmRsZXIuc2V0dXApIHsgaGFuZGxlci5zZXR1cCgpOyB9CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisKKyAgICAgIFRo
aXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIGEgcHJvbWlzZSB3YXMgcHJldmlvdXNseQorICAgICAg
ZW5jb3VudGVyZWQgb25jZSBhbGwgcHJvbWlzZXMgYXJlIHJlc29sdmVkLgorCisgICAgICBJdCB0
cmlnZ2VycyB0aGUgYGV4aXRgIG1ldGhvZCBvbiB0aGUgYGxvYWRpbmdgIGhhbmRsZXIuCisKKyAg
ICAgIEBwYXJhbSB7Um91dGVyfSByb3V0ZXIKKyAgICAqLworICAgIGZ1bmN0aW9uIGxvYWRlZChy
b3V0ZXIpIHsKKyAgICAgIHJvdXRlci5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgIHZhciBoYW5k
bGVyID0gcm91dGVyLmdldEhhbmRsZXIoJ2xvYWRpbmcnKTsKKyAgICAgIGlmIChoYW5kbGVyICYm
IGhhbmRsZXIuZXhpdCkgeyBoYW5kbGVyLmV4aXQoKTsgfQorICAgIH0KKworICAgIC8qKgorICAg
ICAgQHByaXZhdGUKKworICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgYW55IGVuY291
bnRlcmVkIHByb21pc2UKKyAgICAgIGlzIHJlamVjdGVkLgorCisgICAgICBJdCB0cmlnZ2VycyB0
aGUgYGV4aXRgIG1ldGhvZCBvbiB0aGUgYGxvYWRpbmdgIGhhbmRsZXIsCisgICAgICB0aGUgYGVu
dGVyYCBtZXRob2Qgb24gdGhlIGBmYWlsdXJlYCBoYW5kbGVyLCBhbmQgdGhlCisgICAgICBgc2V0
dXBgIG1ldGhvZCBvbiB0aGUgYGZhaWx1cmVgIGhhbmRsZXIgd2l0aCB0aGUKKyAgICAgIGBlcnJv
cmAuCisKKyAgICAgIEBwYXJhbSB7Um91dGVyfSByb3V0ZXIKKyAgICAgIEBwYXJhbSB7T2JqZWN0
fSBlcnJvciB0aGUgcmVhc29uIGZvciB0aGUgcHJvbWlzZQorICAgICAgICByZWplY3Rpb24sIHRv
IHBhc3MgaW50byB0aGUgZmFpbHVyZSBoYW5kbGVyJ3MKKyAgICAgICAgYHNldHVwYCBtZXRob2Qu
CisgICAgKi8KKyAgICBmdW5jdGlvbiBmYWlsdXJlKHJvdXRlciwgZXJyb3IpIHsKKyAgICAgIGxv
YWRlZChyb3V0ZXIpOworICAgICAgdmFyIGhhbmRsZXIgPSByb3V0ZXIuZ2V0SGFuZGxlcignZmFp
bHVyZScpOworICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlci5zZXR1cCkgeyBoYW5kbGVyLnNl
dHVwKGVycm9yKTsgfQorICAgIH0KKworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIGZ1bmN0aW9uIGRvVHJhbnNpdGlvbihyb3V0ZXIsIG5hbWUsIG1ldGhvZCwgYXJncykgewor
ICAgICAgdmFyIG91dHB1dCA9IHJvdXRlci5fcGFyYW1zRm9ySGFuZGxlcihuYW1lLCBhcmdzLCB0
cnVlKTsKKyAgICAgIHZhciBwYXJhbXMgPSBvdXRwdXQucGFyYW1zLCB0b1NldHVwID0gb3V0cHV0
LnRvU2V0dXA7CisKKyAgICAgIHZhciB1cmwgPSByb3V0ZXIucmVjb2duaXplci5nZW5lcmF0ZShu
YW1lLCBwYXJhbXMpOworICAgICAgbWV0aG9kLmNhbGwocm91dGVyLCB1cmwpOworCisgICAgICBz
ZXR1cENvbnRleHRzKHJvdXRlciwgdG9TZXR1cCk7CisgICAgfQorCisgICAgLyoqCisgICAgICBA
cHJpdmF0ZQorCisgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIFVSTCBjaGFu
Z2UgaGFzIGJlZW4gaGFuZGxlZAorICAgICAgYnkgYHJvdXRlci5oYW5kbGVVUkxgLgorCisgICAg
ICBUYWtlcyBhbiBBcnJheSBvZiBgUmVjb2duaXplZEhhbmRsZXJgcywgYW5kIGNvbnZlcnRzIHRo
ZSByYXcKKyAgICAgIHBhcmFtcyBoYXNoZXMgaW50byBkZXNlcmlhbGl6ZWQgb2JqZWN0cyBieSBj
YWxsaW5nIGRlc2VyaWFsaXplCisgICAgICBvbiB0aGUgaGFuZGxlcnMuIFRoaXMgcHJvY2VzcyBi
dWlsZHMgdXAgYW4gQXJyYXkgb2YKKyAgICAgIGBIYW5kbGVySW5mb2BzLiBJdCB0aGVuIGNhbGxz
IGBzZXR1cENvbnRleHRzYCB3aXRoIHRoZSBBcnJheS4KKworICAgICAgSWYgdGhlIGBkZXNlcmlh
bGl6ZWAgbWV0aG9kIG9uIGEgaGFuZGxlciByZXR1cm5zIGEgcHJvbWlzZQorICAgICAgKGkuZS4g
aGFzIGEgbWV0aG9kIGNhbGxlZCBgdGhlbmApLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGF1c2UKKyAg
ICAgIGJ1aWxkaW5nIHVwIHRoZSBgSGFuZGxlckluZm9gIEFycmF5IHVudGlsIHRoZSBwcm9taXNl
IGlzCisgICAgICByZXNvbHZlZC4gSXQgd2lsbCB1c2UgdGhlIHJlc29sdmVkIHZhbHVlIGFzIHRo
ZSBjb250ZXh0IG9mCisgICAgICBgSGFuZGxlckluZm9gLgorICAgICovCisgICAgZnVuY3Rpb24g
Y29sbGVjdE9iamVjdHMocm91dGVyLCByZXN1bHRzLCBpbmRleCwgb2JqZWN0cykgeworICAgICAg
aWYgKHJlc3VsdHMubGVuZ3RoID09PSBpbmRleCkgeworICAgICAgICBsb2FkZWQocm91dGVyKTsK
KyAgICAgICAgc2V0dXBDb250ZXh0cyhyb3V0ZXIsIG9iamVjdHMpOworICAgICAgICByZXR1cm47
CisgICAgICB9CisKKyAgICAgIHZhciByZXN1bHQgPSByZXN1bHRzW2luZGV4XTsKKyAgICAgIHZh
ciBoYW5kbGVyID0gcm91dGVyLmdldEhhbmRsZXIocmVzdWx0LmhhbmRsZXIpOworICAgICAgdmFy
IG9iamVjdCA9IGhhbmRsZXIuZGVzZXJpYWxpemUgJiYgaGFuZGxlci5kZXNlcmlhbGl6ZShyZXN1
bHQucGFyYW1zKTsKKworICAgICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0LnRoZW4gPT09
ICdmdW5jdGlvbicpIHsKKyAgICAgICAgbG9hZGluZyhyb3V0ZXIpOworCisgICAgICAgIC8vIFRo
ZSBjaGFpbmVkIGB0aGVuYCBtZWFucyB0aGF0IHdlIGNhbiBhbHNvIGNhdGNoIGVycm9ycyB0aGF0
IGhhcHBlbiBpbiBgcHJvY2VlZGAKKyAgICAgICAgb2JqZWN0LnRoZW4ocHJvY2VlZCkudGhlbihu
dWxsLCBmdW5jdGlvbihlcnJvcikgeworICAgICAgICAgIGZhaWx1cmUocm91dGVyLCBlcnJvcik7
CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvY2VlZChvYmplY3QpOwor
ICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwcm9jZWVkKHZhbHVlKSB7CisgICAgICAgIGlmICho
YW5kbGVyLmNvbnRleHQgIT09IG9iamVjdCkgeworICAgICAgICAgIHNldENvbnRleHQoaGFuZGxl
ciwgb2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB1cGRhdGVkT2JqZWN0cyA9IG9i
amVjdHMuY29uY2F0KFt7CisgICAgICAgICAgY29udGV4dDogdmFsdWUsCisgICAgICAgICAgaGFu
ZGxlcjogcmVzdWx0LmhhbmRsZXIsCisgICAgICAgICAgaXNEeW5hbWljOiByZXN1bHQuaXNEeW5h
bWljCisgICAgICAgIH1dKTsKKyAgICAgICAgY29sbGVjdE9iamVjdHMocm91dGVyLCByZXN1bHRz
LCBpbmRleCArIDEsIHVwZGF0ZWRPYmplY3RzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioK
KyAgICAgIEBwcml2YXRlCisKKyAgICAgIFRha2VzIGFuIEFycmF5IG9mIGBVbnJlc29sdmVkSGFu
ZGxlckluZm9gcywgcmVzb2x2ZXMgdGhlIGhhbmRsZXIgbmFtZXMKKyAgICAgIGludG8gaGFuZGxl
cnMsIGFuZCB0aGVuIGZpZ3VyZXMgb3V0IHdoYXQgdG8gZG8gd2l0aCBlYWNoIG9mIHRoZSBoYW5k
bGVycy4KKworICAgICAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHJlZSBv
ZiBoYW5kbGVycy4gRWFjaCBoYW5kbGVyIGlzCisgICAgICBmb2xsb3dlZCBieSB0aGUgVVJMIHNl
Z21lbnQgaXQgaGFuZGxlcy4KKworICAgICAgYGBgCisgICAgICB8fmluZGV4ICgiLyIpCisgICAg
ICB8IHx+cG9zdHMgKCIvcG9zdHMiKQorICAgICAgfCB8IHwtc2hvd1Bvc3QgKCIvOmlkIikKKyAg
ICAgIHwgfCB8LW5ld1Bvc3QgKCIvbmV3IikKKyAgICAgIHwgfCB8LWVkaXRQb3N0ICgiL2VkaXQi
KQorICAgICAgfCB8fmFib3V0ICgiL2Fib3V0LzppZCIpCisgICAgICBgYGAKKworICAgICAgQ29u
c2lkZXIgdGhlIGZvbGxvd2luZyB0cmFuc2l0aW9uczoKKworICAgICAgMS4gQSBVUkwgdHJhbnNp
dGlvbiB0byBgL3Bvc3RzLzFgLgorICAgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGBkZXNlcmlhbGl6
ZWAgY2FsbGJhY2sgb24gdGhlCisgICAgICAgICAgICBgaW5kZXhgLCBgcG9zdHNgLCBhbmQgYHNo
b3dQb3N0YCBoYW5kbGVycworICAgICAgICAgMi4gVHJpZ2dlcnMgdGhlIGBlbnRlcmAgY2FsbGJh
Y2sgb24gdGhlIHNhbWUKKyAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNr
IG9uIHRoZSBzYW1lCisgICAgICAyLiBBIGRpcmVjdCB0cmFuc2l0aW9uIHRvIGBuZXdQb3N0YAor
ICAgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGBleGl0YCBjYWxsYmFjayBvbiBgc2hvd1Bvc3RgCisg
ICAgICAgICAyLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgbmV3UG9zdGAKKyAg
ICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAorICAg
ICAgMy4gQSBkaXJlY3QgdHJhbnNpdGlvbiB0byBgYWJvdXRgIHdpdGggYSBzcGVjaWZpZWQKKyAg
ICAgICAgIGNvbnRleHQgb2JqZWN0CisgICAgICAgICAxLiBUcmlnZ2VycyB0aGUgYGV4aXRgIGNh
bGxiYWNrIG9uIGBuZXdQb3N0YAorICAgICAgICAgICAgYW5kIGBwb3N0c2AKKyAgICAgICAgIDIu
IFRyaWdnZXJzIHRoZSBgc2VyaWFsaXplYCBjYWxsYmFjayBvbiBgYWJvdXRgCisgICAgICAgICAz
LiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgYWJvdXRgCisgICAgICAgICA0LiBU
cmlnZ2VycyB0aGUgYHNldHVwYCBjYWxsYmFjayBvbiBgYWJvdXRgCisKKyAgICAgIEBwYXJhbSB7
Um91dGVyfSByb3V0ZXIKKyAgICAgIEBwYXJhbSB7QXJyYXlbVW5yZXNvbHZlZEhhbmRsZXJJbmZv
XX0gaGFuZGxlckluZm9zCisgICAgKi8KKyAgICBmdW5jdGlvbiBzZXR1cENvbnRleHRzKHJvdXRl
ciwgaGFuZGxlckluZm9zKSB7CisgICAgICByZXNvbHZlSGFuZGxlcnMocm91dGVyLCBoYW5kbGVy
SW5mb3MpOworCisgICAgICB2YXIgcGFydGl0aW9uID0KKyAgICAgICAgcGFydGl0aW9uSGFuZGxl
cnMocm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MgfHwgW10sIGhhbmRsZXJJbmZvcyk7CisKKyAg
ICAgIHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zID0gaGFuZGxlckluZm9zOworCisgICAgICBl
YWNoSGFuZGxlcihwYXJ0aXRpb24uZXhpdGVkLCBmdW5jdGlvbihoYW5kbGVyLCBjb250ZXh0KSB7
CisgICAgICAgIGRlbGV0ZSBoYW5kbGVyLmNvbnRleHQ7CisgICAgICAgIGlmIChoYW5kbGVyLmV4
aXQpIHsgaGFuZGxlci5leGl0KCk7IH0KKyAgICAgIH0pOworCisgICAgICBlYWNoSGFuZGxlcihw
YXJ0aXRpb24udXBkYXRlZENvbnRleHQsIGZ1bmN0aW9uKGhhbmRsZXIsIGNvbnRleHQpIHsKKyAg
ICAgICAgc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0KTsKKyAgICAgICAgaWYgKGhhbmRsZXIu
c2V0dXApIHsgaGFuZGxlci5zZXR1cChjb250ZXh0KTsgfQorICAgICAgfSk7CisKKyAgICAgIHZh
ciBhYm9ydGVkID0gZmFsc2U7CisgICAgICBlYWNoSGFuZGxlcihwYXJ0aXRpb24uZW50ZXJlZCwg
ZnVuY3Rpb24oaGFuZGxlciwgY29udGV4dCkgeworICAgICAgICBpZiAoYWJvcnRlZCkgeyByZXR1
cm47IH0KKyAgICAgICAgaWYgKGhhbmRsZXIuZW50ZXIpIHsgaGFuZGxlci5lbnRlcigpOyB9Cisg
ICAgICAgIHNldENvbnRleHQoaGFuZGxlciwgY29udGV4dCk7CisgICAgICAgIGlmIChoYW5kbGVy
LnNldHVwKSB7CisgICAgICAgICAgaWYgKGZhbHNlID09PSBoYW5kbGVyLnNldHVwKGNvbnRleHQp
KSB7CisgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgIH0pOworCisgICAgICBpZiAocm91dGVyLmRpZFRyYW5zaXRpb24pIHsKKyAgICAgICAg
cm91dGVyLmRpZFRyYW5zaXRpb24oaGFuZGxlckluZm9zKTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICAvKioKKyAgICAgIEBwcml2YXRlCisKKyAgICAgIEl0ZXJhdGVzIG92ZXIgYW4gYXJyYXkgb2Yg
YEhhbmRsZXJJbmZvYHMsIHBhc3NpbmcgdGhlIGhhbmRsZXIKKyAgICAgIGFuZCBjb250ZXh0IGlu
dG8gdGhlIGNhbGxiYWNrLgorCisgICAgICBAcGFyYW0ge0FycmF5W0hhbmRsZXJJbmZvXX0gaGFu
ZGxlckluZm9zCisgICAgICBAcGFyYW0ge0Z1bmN0aW9uKE9iamVjdCwgT2JqZWN0KX0gY2FsbGJh
Y2sKKyAgICAqLworICAgIGZ1bmN0aW9uIGVhY2hIYW5kbGVyKGhhbmRsZXJJbmZvcywgY2FsbGJh
Y2spIHsKKyAgICAgIGZvciAodmFyIGk9MCwgbD1oYW5kbGVySW5mb3MubGVuZ3RoOyBpPGw7IGkr
KykgeworICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV0sCisgICAgICAg
ICAgICBoYW5kbGVyID0gaGFuZGxlckluZm8uaGFuZGxlciwKKyAgICAgICAgICAgIGNvbnRleHQg
PSBoYW5kbGVySW5mby5jb250ZXh0OworCisgICAgICAgIGNhbGxiYWNrKGhhbmRsZXIsIGNvbnRl
eHQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAgQHByaXZhdGUKKworICAgICAg
VXBkYXRlcyB0aGUgYGhhbmRsZXJgIGZpZWxkIGluIGVhY2ggZWxlbWVudCBpbiBhbiBBcnJheSBv
ZgorICAgICAgYFVucmVzb2x2ZWRIYW5kbGVySW5mb2BzIGZyb20gYSBoYW5kbGVyIG5hbWUgdG8g
YSByZXNvbHZlZCBoYW5kbGVyLgorCisgICAgICBXaGVuIGRvbmUsIHRoZSBBcnJheSB3aWxsIGNv
bnRhaW4gYEhhbmRsZXJJbmZvYCBzdHJ1Y3R1cmVzLgorCisgICAgICBAcGFyYW0ge1JvdXRlcn0g
cm91dGVyCisgICAgICBAcGFyYW0ge0FycmF5W1VucmVzb2x2ZWRIYW5kbGVySW5mb119IGhhbmRs
ZXJJbmZvcworICAgICovCisgICAgZnVuY3Rpb24gcmVzb2x2ZUhhbmRsZXJzKHJvdXRlciwgaGFu
ZGxlckluZm9zKSB7CisgICAgICB2YXIgaGFuZGxlckluZm87CisKKyAgICAgIGZvciAodmFyIGk9
MCwgbD1oYW5kbGVySW5mb3MubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICBoYW5kbGVySW5m
byA9IGhhbmRsZXJJbmZvc1tpXTsKKworICAgICAgICBoYW5kbGVySW5mby5uYW1lID0gaGFuZGxl
ckluZm8uaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlckluZm8uaGFuZGxlciA9IHJvdXRlci5nZXRI
YW5kbGVyKGhhbmRsZXJJbmZvLmhhbmRsZXIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgor
ICAgICAgQHByaXZhdGUKKworICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0cmFu
c2l0aW9uaW5nIGZyb20gb25lIFVSTCB0bworICAgICAgYW5vdGhlciB0byBkZXRlcm1pbmUgd2hp
Y2ggaGFuZGxlcnMgYXJlIG5vdCBsb25nZXIgYWN0aXZlLAorICAgICAgd2hpY2ggaGFuZGxlcnMg
YXJlIG5ld2x5IGFjdGl2ZSwgYW5kIHdoaWNoIGhhbmRsZXJzIHJlbWFpbgorICAgICAgYWN0aXZl
IGJ1dCBoYXZlIHRoZWlyIGNvbnRleHQgY2hhbmdlZC4KKworICAgICAgVGFrZSBhIGxpc3Qgb2Yg
b2xkIGhhbmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5kIHBhcnRpdGlvbgorICAgICAgdGhlbSBp
bnRvIGZvdXIgYnVja2V0czoKKworICAgICAgKiB1bmNoYW5nZWQ6IHRoZSBoYW5kbGVyIHdhcyBh
Y3RpdmUgaW4gYm90aCB0aGUgb2xkIGFuZAorICAgICAgICBuZXcgVVJMLCBhbmQgaXRzIGNvbnRl
eHQgcmVtYWlucyB0aGUgc2FtZQorICAgICAgKiB1cGRhdGVkIGNvbnRleHQ6IHRoZSBoYW5kbGVy
IHdhcyBhY3RpdmUgaW4gYm90aCB0aGUKKyAgICAgICAgb2xkIGFuZCBuZXcgVVJMLCBidXQgaXRz
IGNvbnRleHQgY2hhbmdlZC4gVGhlIGhhbmRsZXIncworICAgICAgICBgc2V0dXBgIG1ldGhvZCwg
aWYgYW55LCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcKKyAgICAgICAgY29udGV4dC4KKyAg
ICAgICogZXhpdGVkOiB0aGUgaGFuZGxlciB3YXMgYWN0aXZlIGluIHRoZSBvbGQgVVJMLCBidXQg
aXMKKyAgICAgICAgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAgICAgICogZW50ZXJlZDogdGhlIGhhbmRs
ZXIgd2FzIG5vdCBhY3RpdmUgaW4gdGhlIG9sZCBVUkwsIGJ1dAorICAgICAgICBpcyBub3cgYWN0
aXZlLgorCisgICAgICBUaGUgUGFydGl0aW9uZWRIYW5kbGVycyBzdHJ1Y3R1cmUgaGFzIHRocmVl
IGZpZWxkczoKKworICAgICAgKiBgdXBkYXRlZENvbnRleHRgOiBhIGxpc3Qgb2YgYEhhbmRsZXJJ
bmZvYCBvYmplY3RzIHRoYXQKKyAgICAgICAgcmVwcmVzZW50IGhhbmRsZXJzIHRoYXQgcmVtYWlu
IGFjdGl2ZSBidXQgaGF2ZSBhIGNoYW5nZWQKKyAgICAgICAgY29udGV4dAorICAgICAgKiBgZW50
ZXJlZGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKyAg
ICAgICAgaGFuZGxlcnMgdGhhdCBhcmUgbmV3bHkgYWN0aXZlCisgICAgICAqIGBleGl0ZWRgOiBh
IGxpc3Qgb2YgYEhhbmRsZXJJbmZvYCBvYmplY3RzIHRoYXQgYXJlIG5vCisgICAgICAgIGxvbmdl
ciBhY3RpdmUuCisKKyAgICAgIEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBvbGRIYW5kbGVy
cyBhIGxpc3Qgb2YgdGhlIGhhbmRsZXIKKyAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2
aW91cyBVUkwgKG9yIGBbXWAgaWYgdGhpcyBpcyB0aGUKKyAgICAgICAgZmlyc3QgaGFuZGxlZCB0
cmFuc2l0aW9uKQorICAgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG5ld0hhbmRsZXJz
IGEgbGlzdCBvZiB0aGUgaGFuZGxlcgorICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBV
UkwKKworICAgICAgQHJldHVybiB7UGFydGl0aW9ufQorICAgICovCisgICAgZnVuY3Rpb24gcGFy
dGl0aW9uSGFuZGxlcnMob2xkSGFuZGxlcnMsIG5ld0hhbmRsZXJzKSB7CisgICAgICB2YXIgaGFu
ZGxlcnMgPSB7CisgICAgICAgICAgICB1cGRhdGVkQ29udGV4dDogW10sCisgICAgICAgICAgICBl
eGl0ZWQ6IFtdLAorICAgICAgICAgICAgZW50ZXJlZDogW10KKyAgICAgICAgICB9OworCisgICAg
ICB2YXIgaGFuZGxlckNoYW5nZWQsIGNvbnRleHRDaGFuZ2VkLCBpLCBsOworCisgICAgICBmb3Ig
KGk9MCwgbD1uZXdIYW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHZhciBvbGRI
YW5kbGVyID0gb2xkSGFuZGxlcnNbaV0sIG5ld0hhbmRsZXIgPSBuZXdIYW5kbGVyc1tpXTsKKwor
ICAgICAgICBpZiAoIW9sZEhhbmRsZXIgfHwgb2xkSGFuZGxlci5oYW5kbGVyICE9PSBuZXdIYW5k
bGVyLmhhbmRsZXIpIHsKKyAgICAgICAgICBoYW5kbGVyQ2hhbmdlZCA9IHRydWU7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoaGFuZGxlckNoYW5nZWQpIHsKKyAgICAgICAgICBoYW5kbGVycy5l
bnRlcmVkLnB1c2gobmV3SGFuZGxlcik7CisgICAgICAgICAgaWYgKG9sZEhhbmRsZXIpIHsgaGFu
ZGxlcnMuZXhpdGVkLnVuc2hpZnQob2xkSGFuZGxlcik7IH0KKyAgICAgICAgfSBlbHNlIGlmIChj
b250ZXh0Q2hhbmdlZCB8fCBvbGRIYW5kbGVyLmNvbnRleHQgIT09IG5ld0hhbmRsZXIuY29udGV4
dCkgeworICAgICAgICAgIGNvbnRleHRDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICBoYW5kbGVy
cy51cGRhdGVkQ29udGV4dC5wdXNoKG5ld0hhbmRsZXIpOworICAgICAgICB9CisgICAgICB9CisK
KyAgICAgIGZvciAoaT1uZXdIYW5kbGVycy5sZW5ndGgsIGw9b2xkSGFuZGxlcnMubGVuZ3RoOyBp
PGw7IGkrKykgeworICAgICAgICBoYW5kbGVycy5leGl0ZWQudW5zaGlmdChvbGRIYW5kbGVyc1tp
XSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBoYW5kbGVyczsKKyAgICB9CisKKyAgICBmdW5j
dGlvbiB0cmlnZ2VyKHJvdXRlciwgYXJncykgeworICAgICAgdmFyIGN1cnJlbnRIYW5kbGVySW5m
b3MgPSByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvczsKKworICAgICAgdmFyIG5hbWUgPSBhcmdz
LnNoaWZ0KCk7CisKKyAgICAgIGlmICghY3VycmVudEhhbmRsZXJJbmZvcykgeworICAgICAgICB0
aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCB0cmlnZ2VyIGV2ZW50ICciICsgbmFtZSArICInLiBU
aGVyZSBhcmUgbm8gYWN0aXZlIGhhbmRsZXJzIik7CisgICAgICB9CisKKyAgICAgIGZvciAodmFy
IGk9Y3VycmVudEhhbmRsZXJJbmZvcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7CisgICAgICAgIHZh
ciBoYW5kbGVySW5mbyA9IGN1cnJlbnRIYW5kbGVySW5mb3NbaV0sCisgICAgICAgICAgICBoYW5k
bGVyID0gaGFuZGxlckluZm8uaGFuZGxlcjsKKworICAgICAgICBpZiAoaGFuZGxlci5ldmVudHMg
JiYgaGFuZGxlci5ldmVudHNbbmFtZV0pIHsKKyAgICAgICAgICBoYW5kbGVyLmV2ZW50c1tuYW1l
XS5hcHBseShoYW5kbGVyLCBhcmdzKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3RoaW5nIGhhbmRsZWQgdGhlIGV2ZW50
ICciICsgbmFtZSArICInLiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNldENvbnRleHQoaGFu
ZGxlciwgY29udGV4dCkgeworICAgICAgaGFuZGxlci5jb250ZXh0ID0gY29udGV4dDsKKyAgICAg
IGlmIChoYW5kbGVyLmNvbnRleHREaWRDaGFuZ2UpIHsgaGFuZGxlci5jb250ZXh0RGlkQ2hhbmdl
KCk7IH0KKyAgICB9CisgICAgcmV0dXJuIFJvdXRlcjsKKyAgfSk7CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGlu
ZworKi8KKworZnVuY3Rpb24gRFNMKG5hbWUpIHsKKyAgdGhpcy5wYXJlbnQgPSBuYW1lOworICB0
aGlzLm1hdGNoZXMgPSBbXTsKK30KKworRFNMLnByb3RvdHlwZSA9IHsKKyAgcmVzb3VyY2U6IGZ1
bmN0aW9uKG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5n
dGggPT09IDIgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIGNhbGxi
YWNrID0gb3B0aW9uczsKKyAgICAgIG9wdGlvbnMgPSB7fTsKKyAgICB9CisKKyAgICBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgICAgb3B0aW9ucyA9IHt9OworICAgIH0KKworICAg
IGlmICh0eXBlb2Ygb3B0aW9ucy5wYXRoICE9PSAnc3RyaW5nJykgeworICAgICAgb3B0aW9ucy5w
YXRoID0gIi8iICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgIHZh
ciBkc2wgPSBuZXcgRFNMKG5hbWUpOworICAgICAgY2FsbGJhY2suY2FsbChkc2wpOworICAgICAg
dGhpcy5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgZHNsLmdlbmVyYXRlKCkpOworICAgIH0gZWxz
ZSB7CisgICAgICB0aGlzLnB1c2gob3B0aW9ucy5wYXRoLCBuYW1lKTsKKyAgICB9CisgIH0sCisK
KyAgcHVzaDogZnVuY3Rpb24odXJsLCBuYW1lLCBjYWxsYmFjaykgeworICAgIGlmICh1cmwgPT09
ICIiIHx8IHVybCA9PT0gIi8iKSB7IHRoaXMuZXhwbGljaXRJbmRleCA9IHRydWU7IH0KKworICAg
IHRoaXMubWF0Y2hlcy5wdXNoKFt1cmwsIG5hbWUsIGNhbGxiYWNrXSk7CisgIH0sCisKKyAgcm91
dGU6IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0
IHVzZSBgdGhpcy5yZXNvdXJjZWAgdG8gbmVzdCIsIHR5cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rp
b24nKTsKKworICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAgaWYgKHR5cGVvZiBv
cHRpb25zLnBhdGggIT09ICdzdHJpbmcnKSB7CisgICAgICBvcHRpb25zLnBhdGggPSAiLyIgKyBu
YW1lOworICAgIH0KKworICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudCAhPT0gJ2Fw
cGxpY2F0aW9uJykgeworICAgICAgbmFtZSA9IHRoaXMucGFyZW50ICsgIi4iICsgbmFtZTsKKyAg
ICB9CisKKyAgICB0aGlzLnB1c2gob3B0aW9ucy5wYXRoLCBuYW1lKTsKKyAgfSwKKworICBnZW5l
cmF0ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIGRzbE1hdGNoZXMgPSB0aGlzLm1hdGNoZXM7CisK
KyAgICBpZiAoIXRoaXMuZXhwbGljaXRJbmRleCkgeworICAgICAgdGhpcy5yb3V0ZSgiaW5kZXgi
LCB7IHBhdGg6ICIvIiB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gZnVuY3Rpb24obWF0Y2gpIHsK
KyAgICAgIGZvciAodmFyIGk9MCwgbD1kc2xNYXRjaGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAg
ICAgICAgdmFyIGRzbE1hdGNoID0gZHNsTWF0Y2hlc1tpXTsKKyAgICAgICAgbWF0Y2goZHNsTWF0
Y2hbMF0pLnRvKGRzbE1hdGNoWzFdLCBkc2xNYXRjaFsyXSk7CisgICAgICB9CisgICAgfTsKKyAg
fQorfTsKKworRFNMLm1hcCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgIHZhciBkc2wgPSBuZXcg
RFNMKCk7CisgIGNhbGxiYWNrLmNhbGwoZHNsKTsKKyAgcmV0dXJuIGRzbDsKK307CisKK0VtYmVy
LlJvdXRlckRTTCA9IERTTDsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1v
ZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisqLworCitFbWJlci5jb250cm9s
bGVyRm9yID0gZnVuY3Rpb24oY29udGFpbmVyLCBjb250cm9sbGVyTmFtZSwgY29udGV4dCkgewor
ICByZXR1cm4gY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlck5hbWUp
IHx8CisgICAgICAgICBFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIoY29udGFpbmVyLCBjb250cm9s
bGVyTmFtZSwgY29udGV4dCk7Cit9OworCitFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIgPSBmdW5j
dGlvbihjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KSB7CisgIHZhciBjb250cm9s
bGVyOworCisgIGlmIChjb250ZXh0ICYmIEVtYmVyLmlzQXJyYXkoY29udGV4dCkpIHsKKyAgICBj
b250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7CisgICAgICBjb250ZW50
OiBjb250ZXh0CisgICAgfSk7CisgIH0gZWxzZSBpZiAoY29udGV4dCkgeworICAgIGNvbnRyb2xs
ZXIgPSBFbWJlci5PYmplY3RDb250cm9sbGVyLmV4dGVuZCh7CisgICAgICBjb250ZW50OiBjb250
ZXh0CisgICAgfSk7CisgIH0gZWxzZSB7CisgICAgY29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xs
ZXIuZXh0ZW5kKCk7CisgIH0KKworICBjb250cm9sbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuICIoZ2VuZXJhdGVkICIgKyBjb250cm9sbGVyTmFtZSArICIgY29udHJvbGxl
cikiOworICB9OworCisgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcicsIGNvbnRyb2xs
ZXJOYW1lLCBjb250cm9sbGVyKTsKKyAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xs
ZXI6JyArIGNvbnRyb2xsZXJOYW1lKTsKK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7
CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZworKi8KKwordmFy
IFJvdXRlciA9IHJlcXVpcmVNb2R1bGUoInJvdXRlciIpOwordmFyIGdldCA9IEVtYmVyLmdldCwg
c2V0ID0gRW1iZXIuc2V0LCBjbGFzc2lmeSA9IEVtYmVyLlN0cmluZy5jbGFzc2lmeTsKKwordmFy
IERlZmF1bHRWaWV3ID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7CitmdW5jdGlvbiBzZXR1cExvY2F0
aW9uKHJvdXRlcikgeworICB2YXIgbG9jYXRpb24gPSBnZXQocm91dGVyLCAnbG9jYXRpb24nKSwK
KyAgICAgIHJvb3RVUkwgPSBnZXQocm91dGVyLCAncm9vdFVSTCcpOworCisgIGlmICgnc3RyaW5n
JyA9PT0gdHlwZW9mIGxvY2F0aW9uKSB7CisgICAgbG9jYXRpb24gPSBzZXQocm91dGVyLCAnbG9j
YXRpb24nLCBFbWJlci5Mb2NhdGlvbi5jcmVhdGUoeworICAgICAgaW1wbGVtZW50YXRpb246IGxv
Y2F0aW9uCisgICAgfSkpOworCisgICAgaWYgKHR5cGVvZiByb290VVJMID09PSAnc3RyaW5nJykg
eworICAgICAgc2V0KGxvY2F0aW9uLCAncm9vdFVSTCcsIHJvb3RVUkwpOworICAgIH0KKyAgfQor
fQorCisvKioKKyAgVGhlIGBFbWJlci5Sb3V0ZXJgIGNsYXNzIG1hbmFnZXMgdGhlIGFwcGxpY2F0
aW9uIHN0YXRlIGFuZCBVUkxzLiBSZWZlciB0bworICB0aGUgW3JvdXRpbmcgZ3VpZGVdKGh0dHA6
Ly9lbWJlcmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZvciBkb2N1bWVudGF0aW9uLgorCisgIEBj
bGFzcyBSb3V0ZXIKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5PYmplY3QK
KyovCitFbWJlci5Sb3V0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgbG9jYXRpb246ICdo
YXNoJywKKworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnJvdXRlciA9IHRoaXMuY29u
c3RydWN0b3Iucm91dGVyOworICAgIHRoaXMuX2FjdGl2ZVZpZXdzID0ge307CisgICAgc2V0dXBM
b2NhdGlvbih0aGlzKTsKKyAgfSwKKworICB1cmw6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiBnZXQodGhpcywgJ2xvY2F0aW9uJykuZ2V0VVJMKCk7CisgIH0pLAorCisg
IHN0YXJ0Um91dGluZzogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5yb3V0ZXIgPSB0aGlzLnJvdXRl
ciB8fCB0aGlzLmNvbnN0cnVjdG9yLm1hcChFbWJlci5LKTsKKworICAgIHZhciByb3V0ZXIgPSB0
aGlzLnJvdXRlciwKKyAgICAgICAgbG9jYXRpb24gPSBnZXQodGhpcywgJ2xvY2F0aW9uJyksCisg
ICAgICAgIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLAorICAgICAgICBzZWxmID0gdGhpczsK
KworICAgIHNldHVwUm91dGVyKHRoaXMsIHJvdXRlciwgbG9jYXRpb24pOworCisgICAgY29udGFp
bmVyLnJlZ2lzdGVyKCd2aWV3JywgJ2RlZmF1bHQnLCBEZWZhdWx0Vmlldyk7CisgICAgY29udGFp
bmVyLnJlZ2lzdGVyKCd2aWV3JywgJ3RvcGxldmVsJywgRW1iZXIuVmlldy5leHRlbmQoKSk7CisK
KyAgICBsb2NhdGlvbi5vblVwZGF0ZVVSTChmdW5jdGlvbih1cmwpIHsKKyAgICAgIHNlbGYuaGFu
ZGxlVVJMKHVybCk7CisgICAgfSk7CisKKyAgICB0aGlzLmhhbmRsZVVSTChsb2NhdGlvbi5nZXRV
UkwoKSk7CisgIH0sCisKKyAgZGlkVHJhbnNpdGlvbjogZnVuY3Rpb24oaW5mb3MpIHsKKyAgICAv
LyBEb24ndCBkbyBhbnkgZnVydGhlciBhY3Rpb24gaGVyZSBpZiB3ZSByZWRpcmVjdGVkCisgICAg
Zm9yICh2YXIgaT0wLCBsPWluZm9zLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIGlmIChpbmZv
c1tpXS5oYW5kbGVyLnJlZGlyZWN0ZWQpIHsgcmV0dXJuOyB9CisgICAgfQorCisgICAgdmFyIGFw
cENvbnRyb2xsZXIgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6YXBwbGljYXRp
b24nKSwKKyAgICAgICAgcGF0aCA9IHJvdXRlUGF0aChpbmZvcyk7CisKKyAgICBzZXQoYXBwQ29u
dHJvbGxlciwgJ2N1cnJlbnRQYXRoJywgcGF0aCk7CisgICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNo
YW5nZSgndXJsJyk7CisKKyAgICBpZiAoZ2V0KHRoaXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJ
VElPTlMpIHsKKyAgICAgIEVtYmVyLkxvZ2dlci5sb2coIlRyYW5zaXRpb25lZCBpbnRvICciICsg
cGF0aCArICInIik7CisgICAgfQorICB9LAorCisgIGhhbmRsZVVSTDogZnVuY3Rpb24odXJsKSB7
CisgICAgdGhpcy5yb3V0ZXIuaGFuZGxlVVJMKHVybCk7CisgICAgdGhpcy5ub3RpZnlQcm9wZXJ0
eUNoYW5nZSgndXJsJyk7CisgIH0sCisKKyAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihuYW1lKSB7
CisgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgZG9UcmFuc2l0
aW9uKHRoaXMsICd0cmFuc2l0aW9uVG8nLCBhcmdzKTsKKyAgfSwKKworICByZXBsYWNlV2l0aDog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Cisg
ICAgZG9UcmFuc2l0aW9uKHRoaXMsICdyZXBsYWNlV2l0aCcsIGFyZ3MpOworICB9LAorCisgIGdl
bmVyYXRlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdXJsID0gdGhpcy5yb3V0ZXIuZ2VuZXJhdGUu
YXBwbHkodGhpcy5yb3V0ZXIsIGFyZ3VtZW50cyk7CisgICAgcmV0dXJuIHRoaXMubG9jYXRpb24u
Zm9ybWF0VVJMKHVybCk7CisgIH0sCisKKyAgaXNBY3RpdmU6IGZ1bmN0aW9uKHJvdXRlTmFtZSkg
eworICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKKyAgICByZXR1cm4gcm91dGVyLmlzQWN0
aXZlLmFwcGx5KHJvdXRlciwgYXJndW1lbnRzKTsKKyAgfSwKKworICBzZW5kOiBmdW5jdGlvbihu
YW1lLCBjb250ZXh0KSB7CisgICAgdGhpcy5yb3V0ZXIudHJpZ2dlci5hcHBseSh0aGlzLnJvdXRl
ciwgYXJndW1lbnRzKTsKKyAgfSwKKworICBoYXNSb3V0ZTogZnVuY3Rpb24ocm91dGUpIHsKKyAg
ICByZXR1cm4gdGhpcy5yb3V0ZXIuaGFzUm91dGUocm91dGUpOworICB9LAorCisgIF9sb29rdXBB
Y3RpdmVWaWV3OiBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUpIHsKKyAgICB2YXIgYWN0aXZlID0gdGhp
cy5fYWN0aXZlVmlld3NbdGVtcGxhdGVOYW1lXTsKKyAgICByZXR1cm4gYWN0aXZlICYmIGFjdGl2
ZVswXTsKKyAgfSwKKworICBfY29ubmVjdEFjdGl2ZVZpZXc6IGZ1bmN0aW9uKHRlbXBsYXRlTmFt
ZSwgdmlldykgeworICAgIHZhciBleGlzdGluZyA9IHRoaXMuX2FjdGl2ZVZpZXdzW3RlbXBsYXRl
TmFtZV07CisKKyAgICBpZiAoZXhpc3RpbmcpIHsKKyAgICAgIGV4aXN0aW5nWzBdLm9mZignd2ls
bERlc3Ryb3lFbGVtZW50JywgdGhpcywgZXhpc3RpbmdbMV0pOworICAgIH0KKworICAgIHZhciBk
aXNjb25uZWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICBkZWxldGUgdGhpcy5fYWN0aXZlVmlld3Nb
dGVtcGxhdGVOYW1lXTsKKyAgICB9OworCisgICAgdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxhdGVO
YW1lXSA9IFt2aWV3LCBkaXNjb25uZWN0XTsKKyAgICB2aWV3Lm9uZSgnd2lsbERlc3Ryb3lFbGVt
ZW50JywgdGhpcywgZGlzY29ubmVjdCk7CisgIH0KK30pOworCitFbWJlci5Sb3V0ZXIucmVvcGVu
Q2xhc3MoeworICBkZWZhdWx0RmFpbHVyZUhhbmRsZXI6IHsKKyAgICBzZXR1cDogZnVuY3Rpb24o
ZXJyb3IpIHsKKyAgICAgIEVtYmVyLkxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgbG9hZGluZyBy
b3V0ZTonLCBlcnJvcik7CisKKyAgICAgIC8vIFVzaW5nIHNldFRpbWVvdXQgYWxsb3dzIHVzIHRv
IGVzY2FwZSBmcm9tIHRoZSBQcm9taXNlJ3MgdHJ5L2NhdGNoIGJsb2NrCisgICAgICBzZXRUaW1l
b3V0KGZ1bmN0aW9uKCkgeyB0aHJvdyBlcnJvcjsgfSk7CisgICAgfQorICB9Cit9KTsKKworZnVu
Y3Rpb24gZ2V0SGFuZGxlckZ1bmN0aW9uKHJvdXRlcikgeworICB2YXIgc2VlbiA9IHt9LCBjb250
YWluZXIgPSByb3V0ZXIuY29udGFpbmVyOworCisgIHJldHVybiBmdW5jdGlvbihuYW1lKSB7Cisg
ICAgdmFyIGhhbmRsZXIgPSBjb250YWluZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSk7CisgICAg
aWYgKHNlZW5bbmFtZV0pIHsgcmV0dXJuIGhhbmRsZXI7IH0KKworICAgIHNlZW5bbmFtZV0gPSB0
cnVlOworCisgICAgaWYgKCFoYW5kbGVyKSB7CisgICAgICBpZiAobmFtZSA9PT0gJ2xvYWRpbmcn
KSB7IHJldHVybiB7fTsgfQorICAgICAgaWYgKG5hbWUgPT09ICdmYWlsdXJlJykgeyByZXR1cm4g
cm91dGVyLmNvbnN0cnVjdG9yLmRlZmF1bHRGYWlsdXJlSGFuZGxlcjsgfQorCisgICAgICBjb250
YWluZXIucmVnaXN0ZXIoJ3JvdXRlJywgbmFtZSwgRW1iZXIuUm91dGUuZXh0ZW5kKCkpOworICAg
ICAgaGFuZGxlciA9IGNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicgKyBuYW1lKTsKKyAgICB9CisK
KyAgICBoYW5kbGVyLnJvdXRlTmFtZSA9IG5hbWU7CisgICAgcmV0dXJuIGhhbmRsZXI7CisgIH07
Cit9CisKK2Z1bmN0aW9uIGhhbmRsZXJJc0FjdGl2ZShyb3V0ZXIsIGhhbmRsZXJOYW1lKSB7Cisg
IHZhciBoYW5kbGVyID0gcm91dGVyLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicgKyBoYW5kbGVy
TmFtZSksCisgICAgICBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLnJvdXRlci5jdXJyZW50
SGFuZGxlckluZm9zLAorICAgICAgaGFuZGxlckluZm87CisKKyAgZm9yICh2YXIgaT0wLCBsPWN1
cnJlbnRIYW5kbGVySW5mb3MubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIGhhbmRsZXJJbmZvID0g
Y3VycmVudEhhbmRsZXJJbmZvc1tpXTsKKyAgICBpZiAoaGFuZGxlckluZm8uaGFuZGxlciA9PT0g
aGFuZGxlcikgeyByZXR1cm4gdHJ1ZTsgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitm
dW5jdGlvbiByb3V0ZVBhdGgoaGFuZGxlckluZm9zKSB7CisgIHZhciBwYXRoID0gW107CisKKyAg
Zm9yICh2YXIgaT0xLCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgdmFy
IG5hbWUgPSBoYW5kbGVySW5mb3NbaV0ubmFtZSwKKyAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5z
cGxpdCgiLiIpOworCisgICAgcGF0aC5wdXNoKG5hbWVQYXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0g
MV0pOworICB9CisKKyAgcmV0dXJuIHBhdGguam9pbigiLiIpOworfQorCitmdW5jdGlvbiBzZXR1
cFJvdXRlcihlbWJlclJvdXRlciwgcm91dGVyLCBsb2NhdGlvbikgeworICB2YXIgbGFzdFVSTDsK
KworICByb3V0ZXIuZ2V0SGFuZGxlciA9IGdldEhhbmRsZXJGdW5jdGlvbihlbWJlclJvdXRlcik7
CisKKyAgdmFyIGRvVXBkYXRlVVJMID0gZnVuY3Rpb24oKSB7CisgICAgbG9jYXRpb24uc2V0VVJM
KGxhc3RVUkwpOworICB9OworCisgIHJvdXRlci51cGRhdGVVUkwgPSBmdW5jdGlvbihwYXRoKSB7
CisgICAgbGFzdFVSTCA9IHBhdGg7CisgICAgRW1iZXIucnVuLm9uY2UoZG9VcGRhdGVVUkwpOwor
ICB9OworCisgIGlmIChsb2NhdGlvbi5yZXBsYWNlVVJMKSB7CisgICAgdmFyIGRvUmVwbGFjZVVS
TCA9IGZ1bmN0aW9uKCkgeworICAgICAgbG9jYXRpb24ucmVwbGFjZVVSTChsYXN0VVJMKTsKKyAg
ICB9OworCisgICAgcm91dGVyLnJlcGxhY2VVUkwgPSBmdW5jdGlvbihwYXRoKSB7CisgICAgICBs
YXN0VVJMID0gcGF0aDsKKyAgICAgIEVtYmVyLnJ1bi5vbmNlKGRvUmVwbGFjZVVSTCk7CisgICAg
fTsKKyAgfQorCisgIHJvdXRlci5kaWRUcmFuc2l0aW9uID0gZnVuY3Rpb24oaW5mb3MpIHsKKyAg
ICBlbWJlclJvdXRlci5kaWRUcmFuc2l0aW9uKGluZm9zKTsKKyAgfTsKK30KKworZnVuY3Rpb24g
ZG9UcmFuc2l0aW9uKHJvdXRlciwgbWV0aG9kLCBhcmdzKSB7CisgIHZhciBwYXNzZWROYW1lID0g
YXJnc1swXSwgbmFtZTsKKworICBpZiAoIXJvdXRlci5yb3V0ZXIuaGFzUm91dGUoYXJnc1swXSkp
IHsKKyAgICBuYW1lID0gYXJnc1swXSA9IHBhc3NlZE5hbWUgKyAnLmluZGV4JzsKKyAgfSBlbHNl
IHsKKyAgICBuYW1lID0gcGFzc2VkTmFtZTsKKyAgfQorCisgIEVtYmVyLmFzc2VydCgiVGhlIHJv
dXRlICIgKyBwYXNzZWROYW1lICsgIiB3YXMgbm90IGZvdW5kIiwgcm91dGVyLnJvdXRlci5oYXNS
b3V0ZShuYW1lKSk7CisKKyAgcm91dGVyLnJvdXRlclttZXRob2RdLmFwcGx5KHJvdXRlci5yb3V0
ZXIsIGFyZ3MpOworICByb3V0ZXIubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3VybCcpOworfQorCitF
bWJlci5Sb3V0ZXIucmVvcGVuQ2xhc3MoeworICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Cisg
ICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyID0gbmV3IFJvdXRlcigpOworCisgICAgdmFyIGRz
bCA9IEVtYmVyLlJvdXRlckRTTC5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnJlc291cmNl
KCdhcHBsaWNhdGlvbicsIHsgcGF0aDogIi8iIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICBjYWxs
YmFjay5jYWxsKHRoaXMpOworICAgICAgfSk7CisgICAgfSk7CisKKyAgICByb3V0ZXIubWFwKGRz
bC5nZW5lcmF0ZSgpKTsKKyAgICByZXR1cm4gcm91dGVyOworICB9Cit9KTsKKworfSkoKTsKKwor
CisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1y
b3V0aW5nCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsCisgICAg
Y2xhc3NpZnkgPSBFbWJlci5TdHJpbmcuY2xhc3NpZnksCisgICAgZGVjYW1lbGl6ZSA9IEVtYmVy
LlN0cmluZy5kZWNhbWVsaXplOworCisvKioKKyAgVGhlIGBFbWJlci5Sb3V0ZWAgY2xhc3MgaXMg
dXNlZCB0byBkZWZpbmUgaW5kaXZpZHVhbCByb3V0ZXMuIFJlZmVyIHRvCisgIHRoZSBbcm91dGlu
ZyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy9yb3V0aW5nLykgZm9yIGRvY3VtZW50
YXRpb24uCisKKyAgQGNsYXNzIFJvdXRlCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMg
RW1iZXIuT2JqZWN0CisqLworRW1iZXIuUm91dGUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAg
LyoqCisgICAgQHByaXZhdGUKKworICAgIEBtZXRob2QgZXhpdAorICAqLworICBleGl0OiBmdW5j
dGlvbigpIHsKKyAgICB0aGlzLmRlYWN0aXZhdGUoKTsKKyAgICB0ZWFyZG93blZpZXcodGhpcyk7
CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIEBtZXRob2QgZW50ZXIKKyAgKi8K
KyAgZW50ZXI6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuYWN0aXZhdGUoKTsKKyAgfSwKKworICAv
KioKKyAgICBUaGUgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMga2V5ZWQgYnkgbmFtZSBhdmFpbGFi
bGUgb24gdGhpcyByb3V0ZSBhcworICAgIGFjdGlvbiB0YXJnZXRzLgorCisgICAgVGhlc2UgZnVu
Y3Rpb25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlzIHRy
aWdnZXJlZAorICAgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlvbidz
IGN1cnJlbnQgcm91dGUgaXMgdGhpcyByb3V0ZS4KKworICAgIEV2ZW50cyBjYW4gYWxzbyBiZSBp
bnZva2VkIGZyb20gb3RoZXIgcGFydHMgb2YgeW91ciBhcHBsaWNhdGlvbiB2aWEgYFJvdXRlI3Nl
bmRgLgorCisgICAgVGhlIGNvbnRleHQgb2YgZXZlbnQgd2lsbCBiZSB0aGUgdGhpcyByb3V0ZS4K
KworICAgIEBzZWUge0VtYmVyLlJvdXRlI3NlbmR9CisgICAgQHNlZSB7SGFuZGxlYmFycy5oZWxw
ZXJzLmFjdGlvbn0KKworICAgIEBwcm9wZXJ0eSBldmVudHMKKyAgICBAdHlwZSBIYXNoCisgICAg
QGRlZmF1bHQgbnVsbAorICAqLworICBldmVudHM6IG51bGwsCisKKyAgLyoqCisgICAgVGhpcyBo
b29rIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHJvdXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMgcm91
dGUuIEl0IGlzCisgICAgbm90IGV4ZWN1dGVkIHdoZW4gdGhlIG1vZGVsIGZvciB0aGUgcm91dGUg
Y2hhbmdlcy4KKworICAgIEBtZXRob2QgZGVhY3RpdmF0ZQorICAqLworICBkZWFjdGl2YXRlOiBF
bWJlci5LLAorCisgIC8qKgorICAgIFRoaXMgaG9vayBpcyBleGVjdXRlZCB3aGVuIHRoZSByb3V0
ZXIgZW50ZXJzIHRoZSByb3V0ZSBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgSXQgaXMgbm90IGV4
ZWN1dGVkIHdoZW4gdGhlIG1vZGVsIGZvciB0aGUgcm91dGUgY2hhbmdlcy4KKworICAgIEBtZXRo
b2QgYWN0aXZhdGUKKyAgKi8KKyAgYWN0aXZhdGU6IEVtYmVyLkssCisKKyAgLyoqCisgICAgVHJh
bnNpdGlvbiBpbnRvIGFub3RoZXIgcm91dGUuIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9y
IHRoZQorICAgIHJvdXRlIGluIHF1ZXN0aW9uLiBUaGUgbW9kZWwgd2lsbCBiZSBzZXJpYWxpemVk
IGludG8gdGhlIFVSTAorICAgIHVzaW5nIHRoZSBgc2VyaWFsaXplYCBob29rLgorCisgICAgQG1l
dGhvZCB0cmFuc2l0aW9uVG8KKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0
aGUgcm91dGUKKyAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZQorICAqLworICB0cmFu
c2l0aW9uVG86IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLl9jaGVja2luZ1JlZGlyZWN0KSB7
IHRoaXMucmVkaXJlY3RlZCA9IHRydWU7IH0KKyAgICByZXR1cm4gdGhpcy5yb3V0ZXIudHJhbnNp
dGlvblRvLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOworICB9LAorCisgIC8qKgorICAg
IFRyYW5zaXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdoaWxlIHJlcGxhY2luZyB0aGUgY3VycmVu
dCBVUkwgaWYKKyAgICBwb3NzaWJsZS4gSWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9gIGluIGFs
bCBvdGhlciByZXNwZWN0cy4KKworICAgIEBtZXRob2QgcmVwbGFjZVdpdGgKKyAgICBAcGFyYW0g
e1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKKyAgICBAcGFyYW0gey4uLk9iamVj
dH0gbW9kZWxzIHRoZQorICAqLworICByZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7CisgICAgaWYg
KHRoaXMuX2NoZWNraW5nUmVkaXJlY3QpIHsgdGhpcy5yZWRpcmVjdGVkID0gdHJ1ZTsgfQorICAg
IHJldHVybiB0aGlzLnJvdXRlci5yZXBsYWNlV2l0aC5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1l
bnRzKTsKKyAgfSwKKworICBzZW5kOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yb3V0
ZXIuc2VuZC5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1lbnRzKTsKKyAgfSwKKworICAvKioKKyAg
ICBAcHJpdmF0ZQorCisgICAgVGhpcyBob29rIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igcm91dGVy
LmpzCisKKyAgICBAbWV0aG9kIHNldHVwCisgICovCisgIHNldHVwOiBmdW5jdGlvbihjb250ZXh0
KSB7CisgICAgdGhpcy5yZWRpcmVjdGVkID0gZmFsc2U7CisgICAgdGhpcy5fY2hlY2tpbmdSZWRp
cmVjdCA9IHRydWU7CisKKyAgICB0aGlzLnJlZGlyZWN0KGNvbnRleHQpOworCisgICAgdGhpcy5f
Y2hlY2tpbmdSZWRpcmVjdCA9IGZhbHNlOworICAgIGlmICh0aGlzLnJlZGlyZWN0ZWQpIHsgcmV0
dXJuIGZhbHNlOyB9CisKKyAgICB2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlckZvcih0
aGlzLnJvdXRlTmFtZSwgY29udGV4dCk7CisKKyAgICBpZiAoY29udHJvbGxlcikgeworICAgICAg
dGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgICAgIHNldChjb250cm9sbGVyLCAnbW9k
ZWwnLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5zZXR1cENvbnRyb2xsZXJzKSB7
CisgICAgICBFbWJlci5kZXByZWNhdGUoIkVtYmVyLlJvdXRlLnNldHVwQ29udHJvbGxlcnMgaXMg
ZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5Sb3V0ZS5zZXR1cENvbnRyb2xsZXIoY29udHJv
bGxlciwgbW9kZWwpIGluc3RlYWQuIik7CisgICAgICB0aGlzLnNldHVwQ29udHJvbGxlcnMoY29u
dHJvbGxlciwgY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuc2V0dXBDb250cm9s
bGVyKGNvbnRyb2xsZXIsIGNvbnRleHQpOworICAgIH0KKworICAgIGlmICh0aGlzLnJlbmRlclRl
bXBsYXRlcykgeworICAgICAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5Sb3V0ZS5yZW5kZXJUZW1w
bGF0ZXMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5Sb3V0ZS5yZW5kZXJUZW1wbGF0
ZShjb250cm9sbGVyLCBtb2RlbCkgaW5zdGVhZC4iKTsKKyAgICAgIHRoaXMucmVuZGVyVGVtcGxh
dGVzKGNvbnRleHQpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnJlbmRlclRlbXBsYXRlKGNv
bnRyb2xsZXIsIGNvbnRleHQpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBBIGhvb2sgeW91
IGNhbiBpbXBsZW1lbnQgdG8gb3B0aW9uYWxseSByZWRpcmVjdCB0byBhbm90aGVyIHJvdXRlLgor
CisgICAgSWYgeW91IGNhbGwgYHRoaXMudHJhbnNpdGlvblRvYCBmcm9tIGluc2lkZSBvZiB0aGlz
IGhvb2ssIHRoaXMgcm91dGUKKyAgICB3aWxsIG5vdCBiZSBlbnRlcmVkIGluIGZhdm9yIG9mIHRo
ZSBvdGhlciBob29rLgorCisgICAgQG1ldGhvZCByZWRpcmVjdAorICAgIEBwYXJhbSB7T2JqZWN0
fSBtb2RlbCB0aGUgbW9kZWwgZm9yIHRoaXMgcm91dGUKKyAgKi8KKyAgcmVkaXJlY3Q6IEVtYmVy
LkssCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFRoZSBob29rIGNhbGxlZCBieSBgcm91
dGVyLmpzYCB0byBjb252ZXJ0IHBhcmFtZXRlcnMgaW50byB0aGUgY29udGV4dAorICAgIGZvciB0
aGlzIGhhbmRsZXIuIFRoZSBwdWJsaWMgRW1iZXIgaG9vayBpcyBgbW9kZWxgLgorCisgICAgQG1l
dGhvZCBkZXNlcmlhbGl6ZQorICAqLworICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24ocGFyYW1zKSB7
CisgICAgdmFyIG1vZGVsID0gdGhpcy5tb2RlbChwYXJhbXMpOworICAgIHJldHVybiB0aGlzLmN1
cnJlbnRNb2RlbCA9IG1vZGVsOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBD
YWxsZWQgd2hlbiB0aGUgY29udGV4dCBpcyBjaGFuZ2VkIGJ5IHJvdXRlci5qcy4KKyAgKi8KKyAg
Y29udGV4dERpZENoYW5nZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5jdXJyZW50TW9kZWwgPSB0
aGlzLmNvbnRleHQ7CisgIH0sCisKKyAgLyoqCisgICAgQSBob29rIHlvdSBjYW4gaW1wbGVtZW50
IHRvIGNvbnZlcnQgdGhlIFVSTCBpbnRvIHRoZSBtb2RlbCBmb3IKKyAgICB0aGlzIHJvdXRlLgor
CisgICAgYGBganMKKyAgICBBcHAuUm91dGUubWFwKGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBt
YXRjaCgiL3Bvc3RzLzpwb3N0X2lkIikudG8oInBvc3QiKTsKKyAgICB9KTsKKyAgICBgYGAKKwor
ICAgIFRoZSBtb2RlbCBmb3IgdGhlIGBwb3N0YCByb3V0ZSBpcyBgQXBwLlBvc3QuZmluZChwYXJh
bXMucG9zdF9pZClgLgorCisgICAgQnkgZGVmYXVsdCwgaWYgeW91ciByb3V0ZSBoYXMgYSBkeW5h
bWljIHNlZ21lbnQgZW5kaW5nIGluIGBfaWRgOgorCisgICAgKiBUaGUgbW9kZWwgY2xhc3MgaXMg
ZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZWdtZW50IChgcG9zdF9pZGAncworICAgICAgY2xhc3MgaXMg
YEFwcC5Qb3N0YCkKKyAgICAqIFRoZSBmaW5kIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIG1vZGVs
IGNsYXNzIHdpdGggdGhlIHZhbHVlIG9mCisgICAgICB0aGUgZHluYW1pYyBzZWdtZW50LgorCisg
ICAgQG1ldGhvZCBtb2RlbAorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgdGhlIHBhcmFtZXRl
cnMgZXh0cmFjdGVkIGZyb20gdGhlIFVSTAorICAqLworICBtb2RlbDogZnVuY3Rpb24ocGFyYW1z
KSB7CisgICAgdmFyIG1hdGNoLCBuYW1lLCBzYXdQYXJhbXMsIHZhbHVlOworCisgICAgZm9yICh2
YXIgcHJvcCBpbiBwYXJhbXMpIHsKKyAgICAgIGlmIChtYXRjaCA9IHByb3AubWF0Y2goL14oLiop
X2lkJC8pKSB7CisgICAgICAgIG5hbWUgPSBtYXRjaFsxXTsKKyAgICAgICAgdmFsdWUgPSBwYXJh
bXNbcHJvcF07CisgICAgICB9CisgICAgICBzYXdQYXJhbXMgPSB0cnVlOworICAgIH0KKworICAg
IGlmICghbmFtZSAmJiBzYXdQYXJhbXMpIHsgcmV0dXJuIHBhcmFtczsgfQorICAgIGVsc2UgaWYg
KCFuYW1lKSB7IHJldHVybjsgfQorCisgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzaWZ5KG5hbWUp
LAorICAgICAgICBuYW1lc3BhY2UgPSB0aGlzLnJvdXRlci5uYW1lc3BhY2UsCisgICAgICAgIG1v
ZGVsQ2xhc3MgPSBuYW1lc3BhY2VbY2xhc3NOYW1lXTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91
IHVzZWQgdGhlIGR5bmFtaWMgc2VnbWVudCAiICsgbmFtZSArICJfaWQgaW4geW91ciByb3V0ZXIs
IGJ1dCAiICsgbmFtZXNwYWNlICsgIi4iICsgY2xhc3NOYW1lICsgIiBkaWQgbm90IGV4aXN0IGFu
ZCB5b3UgZGlkIG5vdCBvdmVycmlkZSB5b3VyIHN0YXRlJ3MgYG1vZGVsYCBob29rLiIsIG1vZGVs
Q2xhc3MpOworICAgIHJldHVybiBtb2RlbENsYXNzLmZpbmQodmFsdWUpOworICB9LAorCisgIC8q
KgorICAgIEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0byBjb252ZXJ0IHRoZSByb3V0ZSdzIG1v
ZGVsIGludG8gcGFyYW1ldGVycworICAgIGZvciB0aGUgVVJMLgorCisgICAgYGBganMKKyAgICBB
cHAuUm91dGUubWFwKGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBtYXRjaCgiL3Bvc3RzLzpwb3N0
X2lkIikudG8oInBvc3QiKTsKKyAgICB9KTsKKworICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5S
b3V0ZS5leHRlbmQoeworICAgICAgbW9kZWw6IGZ1bmN0aW9uKHBhcmFtcykgeworICAgICAgICAv
LyB0aGUgc2VydmVyIHJldHVybnMgYHsgaWQ6IDEyIH1gCisgICAgICAgIHJldHVybiBqUXVlcnku
Z2V0SlNPTigiL3Bvc3RzLyIgKyBwYXJhbXMucG9zdF9pZCk7CisgICAgICB9LAorCisgICAgICBz
ZXJpYWxpemU6IGZ1bmN0aW9uKG1vZGVsKSB7CisgICAgICAgIC8vIHRoaXMgd2lsbCBtYWtlIHRo
ZSBVUkwgYC9wb3N0cy8xMmAKKyAgICAgICAgcmV0dXJuIHsgcG9zdF9pZDogbW9kZWwuaWQgfTsK
KyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKworICAgIFRoZSBkZWZhdWx0IGBzZXJpYWxpemVg
IG1ldGhvZCBpbnNlcnRzIHRoZSBtb2RlbCdzIGBpZGAgaW50byB0aGUKKyAgICByb3V0ZSdzIGR5
bmFtaWMgc2VnbWVudCAoaW4gdGhpcyBjYXNlLCBgOnBvc3RfaWRgKS4KKworICAgIFRoaXMgbWV0
aG9kIGlzIGNhbGxlZCB3aGVuIGB0cmFuc2l0aW9uVG9gIGlzIGNhbGxlZCB3aXRoIGEgY29udGV4
dAorICAgIGluIG9yZGVyIHRvIHBvcHVsYXRlIHRoZSBVUkwuCisKKyAgICBAbWV0aG9kIHNlcmlh
bGl6ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgcm91dGUncyBtb2RlbAorICAgIEBw
YXJhbSB7QXJyYXl9IHBhcmFtcyBhbiBBcnJheSBvZiBwYXJhbWV0ZXIgbmFtZXMgZm9yIHRoZSBj
dXJyZW50CisgICAgICByb3V0ZSAoaW4gdGhlIGV4YW1wbGUsIGBbJ3Bvc3RfaWQnXWAuCisgICAg
QHJldHVybiB7T2JqZWN0fSB0aGUgc2VyaWFsaXplZCBwYXJhbWV0ZXJzCisgICovCisgIHNlcmlh
bGl6ZTogZnVuY3Rpb24obW9kZWwsIHBhcmFtcykgeworICAgIGlmIChwYXJhbXMubGVuZ3RoICE9
PSAxKSB7IHJldHVybjsgfQorCisgICAgdmFyIG5hbWUgPSBwYXJhbXNbMF0sIG9iamVjdCA9IHt9
OworCisgICAgaWYgKC9faWQkLy50ZXN0KG5hbWUpKSB7CisgICAgICBvYmplY3RbbmFtZV0gPSBn
ZXQobW9kZWwsICdpZCcpOworICAgIH0gZWxzZSB7CisgICAgICBvYmplY3RbbmFtZV0gPSBtb2Rl
bDsKKyAgICB9CisKKyAgICByZXR1cm4gb2JqZWN0OworICB9LAorCisgIC8qKgorICAgIEEgaG9v
ayB5b3UgY2FuIHVzZSB0byBzZXR1cCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgcm91
dGUuCisKKyAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3Ig
dGhlIGN1cnJlbnQgcm91dGUgYW5kIHRoZQorICAgIG1vZGVsIHN1cHBsaWVkIGJ5IHRoZSBgbW9k
ZWxgIGhvb2suCisKKyAgICBgYGBqcworICAgIEFwcC5Sb3V0ZS5tYXAoZnVuY3Rpb24obWF0Y2gp
IHsKKyAgICAgIG1hdGNoKCIvcG9zdHMvOnBvc3RfaWQiKS50bygicG9zdCIpOworICAgIH0pOwor
ICAgIGBgYAorCisgICAgRm9yIHRoZSBgcG9zdGAgcm91dGUsIHRoZSBjb250cm9sbGVyIGlzIGBB
cHAuUG9zdENvbnRyb2xsZXJgLgorCisgICAgQnkgZGVmYXVsdCwgdGhlIGBzZXR1cENvbnRyb2xs
ZXJgIGhvb2sgc2V0cyB0aGUgYGNvbnRlbnRgIHByb3BlcnR5IG9mCisgICAgdGhlIGNvbnRyb2xs
ZXIgdG8gdGhlIGBtb2RlbGAuCisKKyAgICBJZiBubyBleHBsaWNpdCBjb250cm9sbGVyIGlzIGRl
ZmluZWQsIHRoZSByb3V0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlCisgICAgYW4gYXBwcm9w
cmlhdGUgY29udHJvbGxlciBmb3IgdGhlIG1vZGVsOgorCisgICAgKiBpZiB0aGUgbW9kZWwgaXMg
YW4gYEVtYmVyLkFycmF5YCAoaW5jbHVkaW5nIHJlY29yZCBhcnJheXMgZnJvbSBFbWJlcgorICAg
ICAgRGF0YSksIHRoZSBjb250cm9sbGVyIGlzIGFuIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgLgor
ICAgICogb3RoZXJ3aXNlLCB0aGUgY29udHJvbGxlciBpcyBhbiBgRW1iZXIuT2JqZWN0Q29udHJv
bGxlcmAuCisKKyAgICBUaGlzIG1lYW5zIHRoYXQgeW91ciB0ZW1wbGF0ZSB3aWxsIGdldCBhIHBy
b3h5IGZvciB0aGUgbW9kZWwgYXMgaXRzCisgICAgY29udGV4dCwgYW5kIHlvdSBjYW4gYWN0IGFz
IHRob3VnaCB0aGUgbW9kZWwgaXRzZWxmIHdhcyB0aGUgY29udGV4dC4KKworICAgIEBtZXRob2Qg
c2V0dXBDb250cm9sbGVyCisgICovCisgIHNldHVwQ29udHJvbGxlcjogRW1iZXIuSywKKworICAv
KioKKyAgICBSZXR1cm5zIHRoZSBjb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCisK
KyAgICBgYGBqcworICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAg
ICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7CisgICAgICAg
IHRoaXMuX3N1cGVyKGNvbnRyb2xsZXIsIHBvc3QpOworICAgICAgICB0aGlzLmNvbnRyb2xsZXJG
b3IoJ3Bvc3RzJykuc2V0KCdjdXJyZW50UG9zdCcsIHBvc3QpOworICAgICAgfQorICAgIH0pOwor
ICAgIGBgYAorCisgICAgQnkgZGVmYXVsdCwgdGhlIGNvbnRyb2xsZXIgZm9yIGBwb3N0YCBpcyB0
aGUgc2hhcmVkIGluc3RhbmNlIG9mCisgICAgYEFwcC5Qb3N0Q29udHJvbGxlcmAuCisKKyAgICBA
bWV0aG9kIGNvbnRyb2xsZXJGb3IKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBv
ZiB0aGUgcm91dGUKKyAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwgdGhlIG1vZGVsIGFzc29jaWF0
ZWQgd2l0aCB0aGUgcm91dGUgKG9wdGlvbmFsKQorICAgIEByZXR1cm4ge0VtYmVyLkNvbnRyb2xs
ZXJ9CisgICovCisgIGNvbnRyb2xsZXJGb3I6IGZ1bmN0aW9uKG5hbWUsIG1vZGVsKSB7CisgICAg
dmFyIGNvbnRhaW5lciA9IHRoaXMucm91dGVyLmNvbnRhaW5lciwKKyAgICAgICAgY29udHJvbGxl
ciA9IGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIG5hbWUpOworCisgICAgaWYgKCFj
b250cm9sbGVyKSB7CisgICAgICBtb2RlbCA9IG1vZGVsIHx8IHRoaXMubW9kZWxGb3IobmFtZSk7
CisKKyAgICAgIEVtYmVyLmFzc2VydCgiWW91IGFyZSB0cnlpbmcgdG8gbG9vayB1cCBhIGNvbnRy
b2xsZXIgdGhhdCB5b3UgZGlkIG5vdCBkZWZpbmUsIGFuZCBmb3Igd2hpY2ggRW1iZXIgZG9lcyBu
b3Qga25vdyB0aGUgbW9kZWwuXG5cblRoaXMgaXMgbm90IGEgY29udHJvbGxlciBmb3IgYSByb3V0
ZSwgc28geW91IG11c3QgZXhwbGljaXRseSBkZWZpbmUgdGhlIGNvbnRyb2xsZXIgKCIrdGhpcy5y
b3V0ZXIubmFtZXNwYWNlLnRvU3RyaW5nKCkgKyAiLiIgKyBFbWJlci5TdHJpbmcuY2FwaXRhbGl6
ZShFbWJlci5TdHJpbmcuY2FtZWxpemUobmFtZSkpKyJDb250cm9sbGVyKSBvciBwYXNzIGEgbW9k
ZWwgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYGNvbnRyb2xsZXJGb3JgLCBzbyB0aGF0IEVt
YmVyIGtub3dzIHdoaWNoIHR5cGUgb2YgY29udHJvbGxlciB0byBjcmVhdGUgZm9yIHlvdS4iLCBt
b2RlbCB8fCB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicgKyBuYW1lKSk7CisKKyAgICAg
IGNvbnRyb2xsZXIgPSBFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIoY29udGFpbmVyLCBuYW1lLCBt
b2RlbCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRyb2xsZXI7CisgIH0sCisKKyAgLyoqCisg
ICAgUmV0dXJucyB0aGUgY3VycmVudCBtb2RlbCBmb3IgYSBnaXZlbiByb3V0ZS4KKworICAgIFRo
aXMgaXMgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgYG1vZGVsYCBob29rIG9mIHRoZSByb3V0
ZQorICAgIGluIHF1ZXN0aW9uLgorCisgICAgQG1ldGhvZCBtb2RlbEZvcgorICAgIEBwYXJhbSB7
U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgIEByZXR1cm4ge09iamVjdH0g
dGhlIG1vZGVsIG9iamVjdAorICAqLworICBtb2RlbEZvcjogZnVuY3Rpb24obmFtZSkgeworICAg
IHZhciByb3V0ZSA9IHRoaXMuY29udGFpbmVyLmxvb2t1cCgncm91dGU6JyArIG5hbWUpOworICAg
IHJldHVybiByb3V0ZSAmJiByb3V0ZS5jdXJyZW50TW9kZWw7CisgIH0sCisKKyAgLyoqCisgICAg
QSBob29rIHlvdSBjYW4gdXNlIHRvIHJlbmRlciB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjdXJyZW50
IHJvdXRlLgorCisgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGNvbnRyb2xsZXIg
Zm9yIHRoZSBjdXJyZW50IHJvdXRlIGFuZCB0aGUKKyAgICBtb2RlbCBzdXBwbGllZCBieSB0aGUg
YG1vZGVsYCBob29rLiBCeSBkZWZhdWx0LCBpdCByZW5kZXJzIHRoZSByb3V0ZSdzCisgICAgdGVt
cGxhdGUsIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIHJvdXRlLgorCisg
ICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gc2V0IHVwIGFuZCByZW5kZXIgYWRk
aXRpb25hbCBvcgorICAgIGFsdGVybmF0aXZlIHRlbXBsYXRlcy4KKworICAgIEBtZXRob2QgcmVu
ZGVyVGVtcGxhdGUKKyAgICBAcGFyYW0ge09iamVjdH0gY29udHJvbGxlciB0aGUgcm91dGUncyBj
b250cm9sbGVyCisgICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCisg
ICovCisgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgeworICAg
IHRoaXMucmVuZGVyKCk7CisgIH0sCisKKyAgLyoqCisgICAgUmVuZGVycyBhIHRlbXBsYXRlIGlu
dG8gYW4gb3V0bGV0LgorCisgICAgVGhpcyBtZXRob2QgaGFzIGEgbnVtYmVyIG9mIGRlZmF1bHRz
LCBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUKKyAgICByb3V0ZSBzcGVjaWZpZWQgaW4gdGhlIHJv
dXRlci4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgYGBganMKKyAgICBBcHAuUm91dGVyLm1h
cChmdW5jdGlvbihtYXRjaCkgeworICAgICAgbWF0Y2goIi8iKS50bygiaW5kZXgiKTsKKyAgICAg
IG1hdGNoKCIvcG9zdHMvOnBvc3RfaWQiKS50bygicG9zdCIpOworICAgIH0pOworCisgICAgQXBw
LlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoeworICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1
bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJlbmRlcigpOworICAgICAgfQorICAgIH0pOworICAg
IGBgYAorCisgICAgVGhlIG5hbWUgb2YgdGhlIGBQb3N0Um91dGVgLCBhcyBkZWZpbmVkIGJ5IHRo
ZSByb3V0ZXIsIGlzIGBwb3N0YC4KKworICAgIEJ5IGRlZmF1bHQsIHJlbmRlciB3aWxsOgorCisg
ICAgKiByZW5kZXIgdGhlIGBwb3N0YCB0ZW1wbGF0ZQorICAgICogd2l0aCB0aGUgYHBvc3RgIHZp
ZXcgKGBQb3N0Vmlld2ApIGZvciBldmVudCBoYW5kbGluZywgaWYgb25lIGV4aXN0cworICAgICog
YW5kIHRoZSBgcG9zdGAgY29udHJvbGxlciAoYFBvc3RDb250cm9sbGVyYCksIGlmIG9uZSBleGlz
dHMKKyAgICAqIGludG8gdGhlIGBtYWluYCBvdXRsZXQgb2YgdGhlIGBhcHBsaWNhdGlvbmAgdGVt
cGxhdGUKKworICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcjoKKworICAgIGBgYGpz
CisgICAgQXBwLlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoeworICAgICAgcmVuZGVyVGVt
cGxhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJlbmRlcignbXlQb3N0JywgeyAgIC8v
IHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKKyAgICAgICAgICBpbnRvOiAnaW5kZXgnLCAgICAgICAg
ICAvLyB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyIGludG8KKyAgICAgICAgICBvdXRsZXQ6ICdkZXRh
aWwnLCAgICAgICAvLyB0aGUgbmFtZSBvZiB0aGUgb3V0bGV0IGluIHRoYXQgdGVtcGxhdGUKKyAg
ICAgICAgICBjb250cm9sbGVyOiAnYmxvZ1Bvc3QnICAvLyB0aGUgY29udHJvbGxlciB0byB1c2Ug
Zm9yIHRoZSB0ZW1wbGF0ZQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAK
KworICAgIFJlbWVtYmVyIHRoYXQgdGhlIGNvbnRyb2xsZXIncyBgY29udGVudGAgd2lsbCBiZSB0
aGUgcm91dGUncyBtb2RlbC4gSW4KKyAgICB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0IG1vZGVsIHdp
bGwgYmUgYEFwcC5Qb3N0LmZpbmQocGFyYW1zLnBvc3RfaWQpYC4KKworICAgIEBtZXRob2QgcmVu
ZGVyCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRv
IHJlbmRlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zCisgICovCisg
IHJlbmRlcjogZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgeworICAgIGlmICh0eXBlb2YgbmFtZSA9
PT0gJ29iamVjdCcgJiYgIW9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMgPSBuYW1lOworICAgICAg
bmFtZSA9IHRoaXMucm91dGVOYW1lOworICAgIH0KKworICAgIG5hbWUgPSBuYW1lID8gbmFtZS5y
ZXBsYWNlKC9cLy9nLCAnLicpIDogdGhpcy5yb3V0ZU5hbWU7CisKKyAgICB2YXIgY29udGFpbmVy
ID0gdGhpcy5jb250YWluZXIsCisgICAgICAgIHZpZXcgPSBjb250YWluZXIubG9va3VwKCd2aWV3
OicgKyBuYW1lKSwKKyAgICAgICAgdGVtcGxhdGUgPSBjb250YWluZXIubG9va3VwKCd0ZW1wbGF0
ZTonICsgbmFtZSk7CisKKyAgICBpZiAoIXZpZXcgJiYgIXRlbXBsYXRlKSB7IHJldHVybjsgfQor
CisgICAgb3B0aW9ucyA9IG5vcm1hbGl6ZU9wdGlvbnModGhpcywgbmFtZSwgdGVtcGxhdGUsIG9w
dGlvbnMpOworICAgIHZpZXcgPSBzZXR1cFZpZXcodmlldywgY29udGFpbmVyLCBvcHRpb25zKTsK
KworICAgIGlmIChvcHRpb25zLm91dGxldCA9PT0gJ21haW4nKSB7IHRoaXMubGFzdFJlbmRlcmVk
VGVtcGxhdGUgPSBuYW1lOyB9CisKKyAgICBhcHBlbmRWaWV3KHRoaXMsIHZpZXcsIG9wdGlvbnMp
OworICB9LAorCisgIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICB0ZWFyZG93blZpZXco
dGhpcyk7CisgIH0KK30pOworCitmdW5jdGlvbiBwYXJlbnRSb3V0ZShyb3V0ZSkgeworICB2YXIg
aGFuZGxlckluZm9zID0gcm91dGUucm91dGVyLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zOwor
CisgIHZhciBwYXJlbnQsIGN1cnJlbnQ7CisKKyAgZm9yICh2YXIgaT0wLCBsPWhhbmRsZXJJbmZv
cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgY3VycmVudCA9IGhhbmRsZXJJbmZvc1tpXS5oYW5k
bGVyOworICAgIGlmIChjdXJyZW50ID09PSByb3V0ZSkgeyByZXR1cm4gcGFyZW50OyB9CisgICAg
cGFyZW50ID0gY3VycmVudDsKKyAgfQorfQorCitmdW5jdGlvbiBwYXJlbnRUZW1wbGF0ZShyb3V0
ZSwgaXNSZWN1cnNpdmUpIHsKKyAgdmFyIHBhcmVudCA9IHBhcmVudFJvdXRlKHJvdXRlKSwgdGVt
cGxhdGU7CisKKyAgaWYgKCFwYXJlbnQpIHsgcmV0dXJuOyB9CisKKyAgRW1iZXIud2FybigiVGhl
IGltbWVkaWF0ZSBwYXJlbnQgcm91dGUgZGlkIG5vdCByZW5kZXIgaW50byB0aGUgbWFpbiBvdXRs
ZXQgYW5kIHRoZSBkZWZhdWx0ICdpbnRvJyBvcHRpb24gbWF5IG5vdCBiZSBleHBlY3RlZCIsICFp
c1JlY3Vyc2l2ZSk7CisKKyAgaWYgKHRlbXBsYXRlID0gcGFyZW50Lmxhc3RSZW5kZXJlZFRlbXBs
YXRlKSB7CisgICAgcmV0dXJuIHRlbXBsYXRlOworICB9IGVsc2UgeworICAgIHJldHVybiBwYXJl
bnRUZW1wbGF0ZShwYXJlbnQsIHRydWUpOworICB9Cit9CisKK2Z1bmN0aW9uIG5vcm1hbGl6ZU9w
dGlvbnMocm91dGUsIG5hbWUsIHRlbXBsYXRlLCBvcHRpb25zKSB7CisgIG9wdGlvbnMgPSBvcHRp
b25zIHx8IHt9OworICBvcHRpb25zLmludG8gPSBvcHRpb25zLmludG8gPyBvcHRpb25zLmludG8u
cmVwbGFjZSgvXC8vZywgJy4nKSA6IHBhcmVudFRlbXBsYXRlKHJvdXRlKTsKKyAgb3B0aW9ucy5v
dXRsZXQgPSBvcHRpb25zLm91dGxldCB8fCAnbWFpbic7CisgIG9wdGlvbnMubmFtZSA9IG5hbWU7
CisgIG9wdGlvbnMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKKworICBFbWJlci5hc3NlcnQoIkFuIG91
dGxldCAoIitvcHRpb25zLm91dGxldCsiKSB3YXMgc3BlY2lmaWVkIGJ1dCB0aGlzIHZpZXcgd2ls
bCByZW5kZXIgYXQgdGhlIHJvb3QgbGV2ZWwuIiwgb3B0aW9ucy5vdXRsZXQgPT09ICdtYWluJyB8
fCBvcHRpb25zLmludG8pOworCisgIHZhciBjb250cm9sbGVyID0gb3B0aW9ucy5jb250cm9sbGVy
LCBuYW1lZENvbnRyb2xsZXI7CisKKyAgaWYgKG9wdGlvbnMuY29udHJvbGxlcikgeworICAgIGNv
bnRyb2xsZXIgPSBvcHRpb25zLmNvbnRyb2xsZXI7CisgIH0gZWxzZSBpZiAobmFtZWRDb250cm9s
bGVyID0gcm91dGUuY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgbmFtZSkpIHsKKyAg
ICBjb250cm9sbGVyID0gbmFtZWRDb250cm9sbGVyOworICB9IGVsc2UgeworICAgIGNvbnRyb2xs
ZXIgPSByb3V0ZS5yb3V0ZU5hbWU7CisgIH0KKworICBpZiAodHlwZW9mIGNvbnRyb2xsZXIgPT09
ICdzdHJpbmcnKSB7CisgICAgY29udHJvbGxlciA9IHJvdXRlLmNvbnRhaW5lci5sb29rdXAoJ2Nv
bnRyb2xsZXI6JyArIGNvbnRyb2xsZXIpOworICB9CisKKyAgb3B0aW9ucy5jb250cm9sbGVyID0g
Y29udHJvbGxlcjsKKworICByZXR1cm4gb3B0aW9uczsKK30KKworZnVuY3Rpb24gc2V0dXBWaWV3
KHZpZXcsIGNvbnRhaW5lciwgb3B0aW9ucykgeworICB2YXIgZGVmYXVsdFZpZXcgPSBvcHRpb25z
LmludG8gPyAndmlldzpkZWZhdWx0JyA6ICd2aWV3OnRvcGxldmVsJzsKKworICB2aWV3ID0gdmll
dyB8fCBjb250YWluZXIubG9va3VwKGRlZmF1bHRWaWV3KTsKKworICBpZiAoIWdldCh2aWV3LCAn
dGVtcGxhdGVOYW1lJykpIHsKKyAgICBzZXQodmlldywgJ3RlbXBsYXRlJywgb3B0aW9ucy50ZW1w
bGF0ZSk7CisKKyAgICBzZXQodmlldywgJ19kZWJ1Z1RlbXBsYXRlTmFtZScsIG9wdGlvbnMubmFt
ZSk7CisgIH0KKworICBzZXQodmlldywgJ3JlbmRlcmVkTmFtZScsIG9wdGlvbnMubmFtZSk7Cisg
IHNldCh2aWV3LCAnY29udHJvbGxlcicsIG9wdGlvbnMuY29udHJvbGxlcik7CisKKyAgcmV0dXJu
IHZpZXc7Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFZpZXcocm91dGUsIHZpZXcsIG9wdGlvbnMpIHsK
KyAgaWYgKG9wdGlvbnMuaW50bykgeworICAgIHZhciBwYXJlbnRWaWV3ID0gcm91dGUucm91dGVy
Ll9sb29rdXBBY3RpdmVWaWV3KG9wdGlvbnMuaW50byk7CisgICAgcm91dGUudGVhcmRvd25WaWV3
ID0gdGVhcmRvd25PdXRsZXQocGFyZW50Vmlldywgb3B0aW9ucy5vdXRsZXQpOworICAgIHBhcmVu
dFZpZXcuY29ubmVjdE91dGxldChvcHRpb25zLm91dGxldCwgdmlldyk7CisgIH0gZWxzZSB7Cisg
ICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0KHJvdXRlLCAncm91dGVyLm5hbWVzcGFjZS5yb290RWxl
bWVudCcpOworICAgIHJvdXRlLnJvdXRlci5fY29ubmVjdEFjdGl2ZVZpZXcob3B0aW9ucy5uYW1l
LCB2aWV3KTsKKyAgICByb3V0ZS50ZWFyZG93blZpZXcgPSB0ZWFyZG93blRvcExldmVsKHZpZXcp
OworICAgIHZpZXcuYXBwZW5kVG8ocm9vdEVsZW1lbnQpOworICB9Cit9CisKK2Z1bmN0aW9uIHRl
YXJkb3duVG9wTGV2ZWwodmlldykgeworICByZXR1cm4gZnVuY3Rpb24oKSB7IHZpZXcuZGVzdHJv
eSgpOyB9OworfQorCitmdW5jdGlvbiB0ZWFyZG93bk91dGxldChwYXJlbnRWaWV3LCBvdXRsZXQp
IHsKKyAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBwYXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3V0
bGV0KTsgfTsKK30KKworZnVuY3Rpb24gdGVhcmRvd25WaWV3KHJvdXRlKSB7CisgIGlmIChyb3V0
ZS50ZWFyZG93blZpZXcpIHsgcm91dGUudGVhcmRvd25WaWV3KCk7IH0KKworICBkZWxldGUgcm91
dGUudGVhcmRvd25WaWV3OworICBkZWxldGUgcm91dGUubGFzdFJlbmRlcmVkVGVtcGxhdGU7Cit9
CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24o
KSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZworKi8KKwor
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworRW1iZXIub25Mb2FkKCdFbWJl
ci5IYW5kbGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykgeworCisgIHZhciByZXNvbHZlUGFy
YW1zID0gRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlUGFyYW1zLAorICAgICAgaXNTaW1wbGVDbGlj
ayA9IEVtYmVyLlZpZXdVdGlscy5pc1NpbXBsZUNsaWNrOworCisgIGZ1bmN0aW9uIGZ1bGxSb3V0
ZU5hbWUocm91dGVyLCBuYW1lKSB7CisgICAgaWYgKCFyb3V0ZXIuaGFzUm91dGUobmFtZSkpIHsK
KyAgICAgIG5hbWUgPSBuYW1lICsgJy5pbmRleCc7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWU7
CisgIH0KKworICBmdW5jdGlvbiByZXNvbHZlZFBhdGhzKG9wdGlvbnMpIHsKKyAgICB2YXIgdHlw
ZXMgPSBvcHRpb25zLm9wdGlvbnMudHlwZXMuc2xpY2UoMSksCisgICAgICAgIGRhdGEgPSBvcHRp
b25zLm9wdGlvbnMuZGF0YTsKKworICAgIHJldHVybiByZXNvbHZlUGFyYW1zKG9wdGlvbnMuY29u
dGV4dCwgb3B0aW9ucy5wYXJhbXMsIHsgdHlwZXM6IHR5cGVzLCBkYXRhOiBkYXRhIH0pOworICB9
CisKKyAgZnVuY3Rpb24gYXJncyhsaW5rVmlldywgcm91dGVyLCByb3V0ZSkgeworICAgIHZhciBw
YXNzZWRSb3V0ZU5hbWUgPSByb3V0ZSB8fCBsaW5rVmlldy5uYW1lZFJvdXRlLCByb3V0ZU5hbWU7
CisKKyAgICByb3V0ZU5hbWUgPSBmdWxsUm91dGVOYW1lKHJvdXRlciwgcGFzc2VkUm91dGVOYW1l
KTsKKworICAgIEVtYmVyLmFzc2VydCgiVGhlIHJvdXRlICIgKyBwYXNzZWRSb3V0ZU5hbWUgKyAi
IHdhcyBub3QgZm91bmQiLCByb3V0ZXIuaGFzUm91dGUocm91dGVOYW1lKSk7CisKKyAgICB2YXIg
cmV0ID0gWyByb3V0ZU5hbWUgXTsKKyAgICByZXR1cm4gcmV0LmNvbmNhdChyZXNvbHZlZFBhdGhz
KGxpbmtWaWV3LnBhcmFtZXRlcnMpKTsKKyAgfQorCisgIHZhciBMaW5rVmlldyA9IEVtYmVyLlZp
ZXcuZXh0ZW5kKHsKKyAgICB0YWdOYW1lOiAnYScsCisgICAgbmFtZWRSb3V0ZTogbnVsbCwKKyAg
ICBjdXJyZW50V2hlbjogbnVsbCwKKyAgICB0aXRsZTogbnVsbCwKKyAgICBhY3RpdmVDbGFzczog
J2FjdGl2ZScsCisgICAgcmVwbGFjZTogZmFsc2UsCisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsn
aHJlZicsICd0aXRsZSddLAorICAgIGNsYXNzTmFtZUJpbmRpbmdzOiAnYWN0aXZlJywKKworICAg
IC8vIEV2ZW4gdGhvdWdoIHRoaXMgaXNuJ3QgYSB2aXJ0dWFsIHZpZXcsIHdlIHdhbnQgdG8gdHJl
YXQgaXQgYXMgaWYgaXQgaXMKKyAgICAvLyBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSBwYXJl
bnQgd2l0aCB7e3ZpZXcucHJvcH19CisgICAgY29uY3JldGVWaWV3OiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKyAgICB9
KS5wcm9wZXJ0eSgncGFyZW50VmlldycpLnZvbGF0aWxlKCksCisKKyAgICBhY3RpdmU6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHJvdXRlciA9IHRoaXMuZ2V0KCdyb3V0
ZXInKSwKKyAgICAgICAgICBwYXJhbXMgPSByZXNvbHZlZFBhdGhzKHRoaXMucGFyYW1ldGVycyks
CisgICAgICAgICAgY3VycmVudFdpdGhJbmRleCA9IHRoaXMuY3VycmVudFdoZW4gKyAnLmluZGV4
JywKKyAgICAgICAgICBpc0FjdGl2ZSA9IHJvdXRlci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIsIFt0
aGlzLmN1cnJlbnRXaGVuXS5jb25jYXQocGFyYW1zKSkgfHwKKyAgICAgICAgICAgICAgICAgICAg
IHJvdXRlci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIsIFtjdXJyZW50V2l0aEluZGV4XS5jb25jYXQo
cGFyYW1zKSk7CisKKyAgICAgIGlmIChpc0FjdGl2ZSkgeyByZXR1cm4gZ2V0KHRoaXMsICdhY3Rp
dmVDbGFzcycpOyB9CisgICAgfSkucHJvcGVydHkoJ25hbWVkUm91dGUnLCAncm91dGVyLnVybCcp
LAorCisgICAgcm91dGVyOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICAgIHJldHVy
biB0aGlzLmdldCgnY29udHJvbGxlcicpLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRlcjptYWluJyk7
CisgICAgfSksCisKKyAgICBjbGljazogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGlmICghaXNT
aW1wbGVDbGljayhldmVudCkpIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgZXZlbnQucHJldmVu
dERlZmF1bHQoKTsKKyAgICAgIGlmICh0aGlzLmJ1YmJsZXMgPT09IGZhbHNlKSB7IGV2ZW50LnN0
b3BQcm9wYWdhdGlvbigpOyB9CisKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLmdldCgncm91dGVy
Jyk7CisKKyAgICAgIGlmICh0aGlzLmdldCgncmVwbGFjZScpKSB7CisgICAgICAgIHJvdXRlci5y
ZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIGFyZ3ModGhpcywgcm91dGVyKSk7CisgICAgICB9IGVs
c2UgeworICAgICAgICByb3V0ZXIudHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgYXJncyh0aGlz
LCByb3V0ZXIpKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaHJlZjogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5nZXQoJ3JvdXRlcicpOworICAg
ICAgcmV0dXJuIHJvdXRlci5nZW5lcmF0ZS5hcHBseShyb3V0ZXIsIGFyZ3ModGhpcywgcm91dGVy
KSk7CisgICAgfSkKKyAgfSk7CisKKyAgTGlua1ZpZXcudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsg
cmV0dXJuICJMaW5rVmlldyI7IH07CisKKyAgLyoqCisgICAgQG1ldGhvZCBsaW5rVG8KKyAgICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICAgIEBwYXJhbSB7U3RyaW5nfSByb3V0ZU5h
bWUKKyAgICBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdKgorICAgIEByZXR1cm4ge1N0cmluZ30g
SFRNTCBzdHJpbmcKKyAgKi8KKyAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbGlu
a1RvJywgZnVuY3Rpb24obmFtZSkgeworICAgIHZhciBvcHRpb25zID0gW10uc2xpY2UuY2FsbChh
cmd1bWVudHMsIC0xKVswXTsKKyAgICB2YXIgcGFyYW1zID0gW10uc2xpY2UuY2FsbChhcmd1bWVu
dHMsIDEsIC0xKTsKKworICAgIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoOworCisgICAgaGFzaC5u
YW1lZFJvdXRlID0gbmFtZTsKKyAgICBoYXNoLmN1cnJlbnRXaGVuID0gaGFzaC5jdXJyZW50V2hl
biB8fCBuYW1lOworCisgICAgaGFzaC5wYXJhbWV0ZXJzID0geworICAgICAgY29udGV4dDogdGhp
cywKKyAgICAgIG9wdGlvbnM6IG9wdGlvbnMsCisgICAgICBwYXJhbXM6IHBhcmFtcworICAgIH07
CisKKyAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBM
aW5rVmlldywgb3B0aW9ucyk7CisgIH0pOworCit9KTsKKworCit9KSgpOworCisKKworKGZ1bmN0
aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyov
CisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK0VtYmVyLm9uTG9hZCgn
RW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKKyAgLyoqCisgIEBtb2R1
bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCisgICovCisKKyAgSGFuZGxl
YmFycy5PdXRsZXRWaWV3ID0gRW1iZXIuQ29udGFpbmVyVmlldy5leHRlbmQoRW1iZXIuX01ldGFt
b3JwaCk7CisKKyAgLyoqCisgICAgVGhlIGBvdXRsZXRgIGhlbHBlciBhbGxvd3MgeW91IHRvIHNw
ZWNpZnkgdGhhdCB0aGUgY3VycmVudAorICAgIHZpZXcncyBjb250cm9sbGVyIHdpbGwgZmlsbCBp
biB0aGUgdmlldyBmb3IgYSBnaXZlbiBhcmVhLgorCisgICAgYGBgIGhhbmRsZWJhcnMKKyAgICB7
e291dGxldH19CisgICAgYGBgCisKKyAgICBCeSBkZWZhdWx0LCB3aGVuIHRoZSB0aGUgY3VycmVu
dCBjb250cm9sbGVyJ3MgYHZpZXdgIHByb3BlcnR5IGNoYW5nZXMsIHRoZQorICAgIG91dGxldCB3
aWxsIHJlcGxhY2UgaXRzIGN1cnJlbnQgdmlldyB3aXRoIHRoZSBuZXcgdmlldy4gWW91IGNhbiBz
ZXQgdGhlCisgICAgYHZpZXdgIHByb3BlcnR5IGRpcmVjdGx5LCBidXQgaXQncyBub3JtYWxseSBi
ZXN0IHRvIHVzZSBgY29ubmVjdE91dGxldGAuCisKKyAgICBgYGAgamF2YXNjcmlwdAorICAgICMg
SW5zdGFudGlhdGUgQXBwLlBvc3RzVmlldyBhbmQgYXNzaWduIHRvIGB2aWV3YCwgc28gYXMgdG8g
cmVuZGVyIGludG8gb3V0bGV0LgorICAgIGNvbnRyb2xsZXIuY29ubmVjdE91dGxldCgncG9zdHMn
KTsKKyAgICBgYGAKKworICAgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgcGFydGljdWxhciBuYW1l
IG90aGVyIHRoYW4gYHZpZXdgOgorCisgICAgYGBgIGhhbmRsZWJhcnMKKyAgICB7e291dGxldCBt
YXN0ZXJWaWV3fX0KKyAgICB7e291dGxldCBkZXRhaWxWaWV3fX0KKyAgICBgYGAKKworICAgIFRo
ZW4sIHlvdSBjYW4gY29udHJvbCBzZXZlcmFsIG91dGxldHMgZnJvbSBhIHNpbmdsZSBjb250cm9s
bGVyLgorCisgICAgYGBgIGphdmFzY3JpcHQKKyAgICAjIEluc3RhbnRpYXRlIEFwcC5Qb3N0c1Zp
ZXcgYW5kIGFzc2lnbiB0byBjb250cm9sbGVyLm1hc3RlclZpZXcuCisgICAgY29udHJvbGxlci5j
b25uZWN0T3V0bGV0KCdtYXN0ZXJWaWV3JywgJ3Bvc3RzJyk7CisgICAgIyBBbHNvLCBpbnN0YW50
aWF0ZSBBcHAuUG9zdEluZm9WaWV3IGFuZCBhc3NpZ24gdG8gY29udHJvbGxlci5kZXRhaWxWaWV3
LgorICAgIGNvbnRyb2xsZXIuY29ubmVjdE91dGxldCgnZGV0YWlsVmlldycsICdwb3N0SW5mbycp
OworICAgIGBgYAorCisgICAgQG1ldGhvZCBvdXRsZXQKKyAgICBAZm9yIEVtYmVyLkhhbmRsZWJh
cnMuaGVscGVycworICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgb24g
dGhlIGNvbnRyb2xsZXIKKyAgICAgIHRoYXQgaG9sZHMgdGhlIHZpZXcgZm9yIHRoaXMgb3V0bGV0
CisgICovCisgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ291dGxldCcsIGZ1bmN0aW9uKHBy
b3BlcnR5LCBvcHRpb25zKSB7CisgICAgdmFyIG91dGxldFNvdXJjZTsKKworICAgIGlmIChwcm9w
ZXJ0eSAmJiBwcm9wZXJ0eS5kYXRhICYmIHByb3BlcnR5LmRhdGEuaXNSZW5kZXJEYXRhKSB7Cisg
ICAgICBvcHRpb25zID0gcHJvcGVydHk7CisgICAgICBwcm9wZXJ0eSA9ICdtYWluJzsKKyAgICB9
CisKKyAgICBvdXRsZXRTb3VyY2UgPSBvcHRpb25zLmRhdGEudmlldzsKKyAgICB3aGlsZSAoIShv
dXRsZXRTb3VyY2UuZ2V0KCd0ZW1wbGF0ZS5pc1RvcCcpKSl7CisgICAgICBvdXRsZXRTb3VyY2Ug
PSBvdXRsZXRTb3VyY2UuZ2V0KCdfcGFyZW50VmlldycpOworICAgIH0KKworICAgIG9wdGlvbnMu
ZGF0YS52aWV3LnNldCgnb3V0bGV0U291cmNlJywgb3V0bGV0U291cmNlKTsKKyAgICBvcHRpb25z
Lmhhc2guY3VycmVudFZpZXdCaW5kaW5nID0gJ192aWV3Lm91dGxldFNvdXJjZS5fb3V0bGV0cy4n
ICsgcHJvcGVydHk7CisKKyAgICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0
aGlzLCBIYW5kbGViYXJzLk91dGxldFZpZXcsIG9wdGlvbnMpOworICB9KTsKK30pOworCit9KSgp
OworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVt
YmVyLXJvdXRpbmcKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsK
K0VtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsK
KworICAvKioKKyAgICBSZW5kZXJzIHRoZSBuYW1lZCB0ZW1wbGF0ZSBpbiB0aGUgY3VycmVudCBj
b250ZXh0IHVzaW5nIHRoZSBzaW5nbGV0b24KKyAgICBpbnN0YW5jZSBvZiB0aGUgc2FtZS1uYW1l
ZCBjb250cm9sbGVyLgorCisgICAgSWYgYSB2aWV3IGNsYXNzIHdpdGggdGhlIHNhbWUgbmFtZSBl
eGlzdHMsIHVzZXMgdGhlIHZpZXcgY2xhc3MuCisKKyAgICBJZiBhIGBtb2RlbGAgaXMgc3BlY2lm
aWVkLCBpdCBiZWNvbWVzIHRoZSBtb2RlbCBmb3IgdGhhdCBjb250cm9sbGVyLgorCisgICAgVGhl
IGRlZmF1bHQgdGFyZ2V0IGZvciBge3thY3Rpb259fWBzIGluIHRoZSByZW5kZXJlZCB0ZW1wbGF0
ZSBpcyB0aGUKKyAgICBuYW1lZCBjb250cm9sbGVyLgorCisgICAgQG1ldGhvZCBhY3Rpb24KKyAg
ICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICAgIEBwYXJhbSB7U3RyaW5nfSBhY3Rp
b25OYW1lCisgICAgQHBhcmFtIHtPYmplY3Q/fSBtb2RlbAorICAgIEBwYXJhbSB7SGFzaH0gb3B0
aW9ucworICAqLworICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdyZW5kZXInLCBm
dW5jdGlvbihuYW1lLCBjb250ZXh0U3RyaW5nLCBvcHRpb25zKSB7CisgICAgRW1iZXIuYXNzZXJ0
KCJZb3UgbXVzdCBwYXNzIGEgdGVtcGxhdGUgdG8gcmVuZGVyIiwgYXJndW1lbnRzLmxlbmd0aCA+
PSAyKTsKKyAgICB2YXIgY29udGFpbmVyLCByb3V0ZXIsIGNvbnRyb2xsZXIsIHZpZXcsIGNvbnRl
eHQ7CisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgb3B0aW9ucyA9
IGNvbnRleHRTdHJpbmc7CisgICAgICBjb250ZXh0U3RyaW5nID0gdW5kZWZpbmVkOworICAgIH0K
KworICAgIGlmICh0eXBlb2YgY29udGV4dFN0cmluZyA9PT0gJ3N0cmluZycpIHsKKyAgICAgIGNv
bnRleHQgPSBFbWJlci5IYW5kbGViYXJzLmdldChvcHRpb25zLmNvbnRleHRzWzFdLCBjb250ZXh0
U3RyaW5nLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9cLy9n
LCAnLicpOworICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVy
LmNvbnRhaW5lcjsKKyAgICByb3V0ZXIgPSBjb250YWluZXIubG9va3VwKCdyb3V0ZXI6bWFpbicp
OworCisgICAgRW1iZXIuYXNzZXJ0KCJUaGlzIHZpZXcgaXMgYWxyZWFkeSByZW5kZXJlZCIsICFy
b3V0ZXIgfHwgIXJvdXRlci5fbG9va3VwQWN0aXZlVmlldyhuYW1lKSk7CisKKyAgICB2aWV3ID0g
Y29udGFpbmVyLmxvb2t1cCgndmlldzonICsgbmFtZSkgfHwgY29udGFpbmVyLmxvb2t1cCgndmll
dzpkZWZhdWx0Jyk7CisKKyAgICBpZiAoY29udHJvbGxlciA9IG9wdGlvbnMuaGFzaC5jb250cm9s
bGVyKSB7CisgICAgICBjb250cm9sbGVyID0gY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjon
ICsgY29udHJvbGxlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRyb2xsZXIgPSBFbWJlci5j
b250cm9sbGVyRm9yKGNvbnRhaW5lciwgbmFtZSwgY29udGV4dCk7CisgICAgfQorCisgICAgaWYg
KGNvbnRyb2xsZXIgJiYgY29udGV4dCkgeworICAgICAgY29udHJvbGxlci5zZXQoJ21vZGVsJywg
Y29udGV4dCk7CisgICAgfQorCisgICAgdmFyIHJvb3QgPSBvcHRpb25zLmNvbnRleHRzWzFdOwor
CisgICAgaWYgKHJvb3QpIHsKKyAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihyb290LCBjb250
ZXh0U3RyaW5nLCBmdW5jdGlvbigpIHsKKyAgICAgICAgY29udHJvbGxlci5zZXQoJ21vZGVsJywg
RW1iZXIuSGFuZGxlYmFycy5nZXQocm9vdCwgY29udGV4dFN0cmluZywgb3B0aW9ucykpOworICAg
ICAgfSk7CisgICAgfQorCisgICAgY29udHJvbGxlci5zZXQoJ3RhcmdldCcsIG9wdGlvbnMuZGF0
YS5rZXl3b3Jkcy5jb250cm9sbGVyKTsKKworICAgIG9wdGlvbnMuaGFzaC52aWV3TmFtZSA9IEVt
YmVyLlN0cmluZy5jYW1lbGl6ZShuYW1lKTsKKyAgICBvcHRpb25zLmhhc2gudGVtcGxhdGUgPSBj
b250YWluZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgbmFtZSk7CisgICAgb3B0aW9ucy5oYXNoLmNv
bnRyb2xsZXIgPSBjb250cm9sbGVyOworCisgICAgaWYgKHJvdXRlcikgeworICAgICAgcm91dGVy
Ll9jb25uZWN0QWN0aXZlVmlldyhuYW1lLCB2aWV3KTsKKyAgICB9CisKKyAgICBFbWJlci5IYW5k
bGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIHZpZXcsIG9wdGlvbnMpOworICB9KTsKKwor
fSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0Bz
dWJtb2R1bGUgZW1iZXItcm91dGluZworKi8KK0VtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFy
cycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKKworICB2YXIgcmVzb2x2ZVBhcmFtcyA9IEVtYmVy
LkhhbmRsZWJhcnMucmVzb2x2ZVBhcmFtcywKKyAgICAgIGlzU2ltcGxlQ2xpY2sgPSBFbWJlci5W
aWV3VXRpbHMuaXNTaW1wbGVDbGljazsKKworICB2YXIgRW1iZXJIYW5kbGViYXJzID0gRW1iZXIu
SGFuZGxlYmFycywKKyAgICAgIGhhbmRsZWJhcnNHZXQgPSBFbWJlckhhbmRsZWJhcnMuZ2V0LAor
ICAgICAgU2FmZVN0cmluZyA9IEVtYmVySGFuZGxlYmFycy5TYWZlU3RyaW5nLAorICAgICAgZ2V0
ID0gRW1iZXIuZ2V0LAorICAgICAgYV9zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKKwor
ICBmdW5jdGlvbiBhcmdzKG9wdGlvbnMsIGFjdGlvbk5hbWUpIHsKKyAgICB2YXIgcmV0ID0gW107
CisgICAgaWYgKGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KKworICAgIHZh
ciB0eXBlcyA9IG9wdGlvbnMub3B0aW9ucy50eXBlcy5zbGljZSgxKSwKKyAgICAgICAgZGF0YSA9
IG9wdGlvbnMub3B0aW9ucy5kYXRhOworCisgICAgcmV0dXJuIHJldC5jb25jYXQocmVzb2x2ZVBh
cmFtcyhvcHRpb25zLmNvbnRleHQsIG9wdGlvbnMucGFyYW1zLCB7IHR5cGVzOiB0eXBlcywgZGF0
YTogZGF0YSB9KSk7CisgIH0KKworICB2YXIgQWN0aW9uSGVscGVyID0gRW1iZXJIYW5kbGViYXJz
LkFjdGlvbkhlbHBlciA9IHsKKyAgICByZWdpc3RlcmVkQWN0aW9uczoge30KKyAgfTsKKworICBB
Y3Rpb25IZWxwZXIucmVnaXN0ZXJBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25OYW1lLCBvcHRpb25z
KSB7CisgICAgdmFyIGFjdGlvbklkID0gKCsrRW1iZXIudXVpZCkudG9TdHJpbmcoKTsKKworICAg
IEFjdGlvbkhlbHBlci5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF0gPSB7CisgICAgICBldmVu
dE5hbWU6IG9wdGlvbnMuZXZlbnROYW1lLAorICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZXZlbnQp
IHsKKyAgICAgICAgaWYgKCFpc1NpbXBsZUNsaWNrKGV2ZW50KSkgeyByZXR1cm4gdHJ1ZTsgfQor
ICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisgICAgICAgIGlmIChvcHRpb25zLmJ1
YmJsZXMgPT09IGZhbHNlKSB7CisgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Cisg
ICAgICAgIH0KKworICAgICAgICB2YXIgdmlldyA9IG9wdGlvbnMudmlldywKKyAgICAgICAgICAg
IGNvbnRleHRzID0gb3B0aW9ucy5jb250ZXh0cywKKyAgICAgICAgICAgIHRhcmdldCA9IG9wdGlv
bnMudGFyZ2V0OworCisgICAgICAgIGlmICh0YXJnZXQudGFyZ2V0KSB7CisgICAgICAgICAgdGFy
Z2V0ID0gaGFuZGxlYmFyc0dldCh0YXJnZXQucm9vdCwgdGFyZ2V0LnRhcmdldCwgdGFyZ2V0Lm9w
dGlvbnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5yb290
OworICAgICAgICB9CisKKyAgICAgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgeworICAgICAgICAg
IGlmICh0YXJnZXQuc2VuZCkgeworICAgICAgICAgICAgdGFyZ2V0LnNlbmQuYXBwbHkodGFyZ2V0
LCBhcmdzKG9wdGlvbnMucGFyYW1ldGVycywgYWN0aW9uTmFtZSkpOworICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBFbWJlci5hc3NlcnQoIlRoZSBhY3Rpb24gJyIgKyBhY3Rpb25OYW1l
ICsgIicgZGlkIG5vdCBleGlzdCBvbiAiICsgdGFyZ2V0LCB0eXBlb2YgdGFyZ2V0W2FjdGlvbk5h
bWVdID09PSAnZnVuY3Rpb24nKTsKKyAgICAgICAgICAgIHRhcmdldFthY3Rpb25OYW1lXS5hcHBs
eSh0YXJnZXQsIGFyZ3Mob3B0aW9ucy5wYXJhbWV0ZXJzKSk7CisgICAgICAgICAgfQorICAgICAg
ICB9KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgb3B0aW9ucy52aWV3Lm9uKCd3aWxsQ2xlYXJS
ZW5kZXInLCBmdW5jdGlvbigpIHsKKyAgICAgIGRlbGV0ZSBBY3Rpb25IZWxwZXIucmVnaXN0ZXJl
ZEFjdGlvbnNbYWN0aW9uSWRdOworICAgIH0pOworCisgICAgcmV0dXJuIGFjdGlvbklkOworICB9
OworCisgIC8qKgorICAgIFRoZSBge3thY3Rpb259fWAgaGVscGVyIHJlZ2lzdGVycyBhbiBIVE1M
IGVsZW1lbnQgd2l0aGluIGEgdGVtcGxhdGUgZm9yIERPTQorICAgIGV2ZW50IGhhbmRsaW5nIGFu
ZCBmb3J3YXJkcyB0aGF0IGludGVyYWN0aW9uIHRvIHRoZSB2aWV3J3MgY29udHJvbGxlcgorICAg
IG9yIHN1cHBsaWVkIGB0YXJnZXRgIG9wdGlvbiAoc2VlICdTcGVjaWZ5aW5nIGEgVGFyZ2V0Jyku
CisKKyAgICBJZiB0aGUgdmlldydzIGNvbnRyb2xsZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBl
dmVudCwgdGhlIGV2ZW50IGlzIHNlbnQKKyAgICB0byB0aGUgY3VycmVudCByb3V0ZSwgYW5kIGl0
IGJ1YmJsZXMgdXAgdGhlIHJvdXRlIGhpZXJhcmNoeSBmcm9tIHRoZXJlLgorCisgICAgVXNlciBp
bnRlcmFjdGlvbiB3aXRoIHRoYXQgZWxlbWVudCB3aWxsIGludm9rZSB0aGUgc3VwcGxpZWQgYWN0
aW9uIG5hbWUgb24KKyAgICB0aGUgYXBwcm9wcmlhdGUgdGFyZ2V0LgorCisgICAgR2l2ZW4gdGhl
IGZvbGxvd2luZyBIYW5kbGViYXJzIHRlbXBsYXRlIG9uIHRoZSBwYWdlCisKKyAgICBgYGBoYW5k
bGViYXJzCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0
ZS1uYW1lPSdhLXRlbXBsYXRlJz4KKyAgICAgIDxkaXYge3thY3Rpb24gYW5BY3Rpb25OYW1lfX0+
CisgICAgICAgIGNsaWNrIG1lCisgICAgICA8L2Rpdj4KKyAgICA8L3NjcmlwdD4KKyAgICBgYGAK
KworICAgIEFuZCBhcHBsaWNhdGlvbiBjb2RlCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQUNv
bnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICBhbkFjdGlvbk5hbWU6
IGZ1bmN0aW9uKCkge30KKyAgICB9KTsKKworICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQo
eworICAgICAgY29udHJvbGxlcjogQUNvbnRyb2xsZXIuY3JlYXRlKCksCisgICAgICB0ZW1wbGF0
ZU5hbWU6ICdhLXRlbXBsYXRlJworICAgIH0pOworCisgICAgYVZpZXcgPSBBVmlldy5jcmVhdGUo
KTsKKyAgICBhVmlldy5hcHBlbmRUbygnYm9keScpOworICAgIGBgYAorCisgICAgV2lsbCByZXN1
bHRzIGluIHRoZSBmb2xsb3dpbmcgcmVuZGVyZWQgSFRNTAorCisgICAgYGBgaHRtbAorICAgIDxk
aXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgPGRpdiBkYXRhLWVtYmVyLWFjdGlvbj0iMSI+
CisgICAgICAgIGNsaWNrIG1lCisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICBgYGAKKwor
ICAgIENsaWNraW5nICJjbGljayBtZSIgd2lsbCB0cmlnZ2VyIHRoZSBgYW5BY3Rpb25OYW1lYCBt
ZXRob2Qgb2YgdGhlCisgICAgYEFDb250cm9sbGVyYC4gSW4gdGhpcyBjYXNlLCBubyBhZGRpdGlv
bmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQuCisKKyAgICBJZiB5b3UgcHJvdmlkZSBhZGRp
dGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGhlbHBlcjoKKworICAgIGBgYGhhbmRsZWJhcnMKKyAg
ICA8YnV0dG9uIHt7YWN0aW9uICdlZGl0JyBwb3N0fX0+RWRpdDwvYnV0dG9uPgorICAgIGBgYAor
CisgICAgVGhvc2UgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCBhbG9uZyBhcyBhcmd1bWVudHMg
dG8gdGhlIEphdmFTY3JpcHQKKyAgICBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbi4K
KworICAgICMjIyBFdmVudCBQcm9wYWdhdGlvbgorCisgICAgRXZlbnRzIHRyaWdnZXJlZCB0aHJv
dWdoIHRoZSBhY3Rpb24gaGVscGVyIHdpbGwgYXV0b21hdGljYWxseSBoYXZlCisgICAgYC5wcmV2
ZW50RGVmYXVsdCgpYCBjYWxsZWQgb24gdGhlbS4gWW91IGRvIG5vdCBuZWVkIHRvIGRvIHNvIGlu
IHlvdXIgZXZlbnQKKyAgICBoYW5kbGVycy4KKworICAgIFRvIGFsc28gZGlzYWJsZSBidWJibGlu
ZywgcGFzcyBgYnViYmxlcz1mYWxzZWAgdG8gdGhlIGhlbHBlcjoKKworICAgIGBgYGhhbmRsZWJh
cnMKKyAgICA8YnV0dG9uIHt7YWN0aW9uICdlZGl0JyBwb3N0IGJ1YmJsZXM9ZmFsc2V9fT5FZGl0
PC9idXR0b24+CisgICAgYGBgCisKKyAgICBJZiB5b3UgbmVlZCB0aGUgZGVmYXVsdCBoYW5kbGVy
IHRvIHRyaWdnZXIgeW91IHNob3VsZCBlaXRoZXIgcmVnaXN0ZXIgeW91cgorICAgIG93biBldmVu
dCBoYW5kbGVyLCBvciB1c2UgZXZlbnQgbWV0aG9kcyBvbiB5b3VyIHZpZXcgY2xhc3MuIFNlZSBg
RW1iZXIuVmlld2AKKyAgICAnUmVzcG9uZGluZyB0byBCcm93c2VyIEV2ZW50cycgZm9yIG1vcmUg
aW5mb3JtYXRpb24uCisKKyAgICAjIyMgU3BlY2lmeWluZyBET00gZXZlbnQgdHlwZQorCisgICAg
QnkgZGVmYXVsdCB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciByZWdpc3RlcnMgZm9yIERPTSBgY2xp
Y2tgIGV2ZW50cy4gWW91IGNhbgorICAgIHN1cHBseSBhbiBgb25gIG9wdGlvbiB0byB0aGUgaGVs
cGVyIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgRE9NIGV2ZW50IG5hbWU6CisKKyAgICBgYGBoYW5k
bGViYXJzCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0
ZS1uYW1lPSdhLXRlbXBsYXRlJz4KKyAgICAgIDxkaXYge3thY3Rpb24gYW5BY3Rpb25OYW1lIG9u
PSJkb3VibGVDbGljayJ9fT4KKyAgICAgICAgY2xpY2sgbWUKKyAgICAgIDwvZGl2PgorICAgIDwv
c2NyaXB0PgorICAgIGBgYAorCisgICAgU2VlIGBFbWJlci5WaWV3YCAnUmVzcG9uZGluZyB0byBC
cm93c2VyIEV2ZW50cycgZm9yIGEgbGlzdCBvZgorICAgIGFjY2VwdGFibGUgRE9NIGV2ZW50IG5h
bWVzLgorCisgICAgTk9URTogQmVjYXVzZSBge3thY3Rpb259fWAgZGVwZW5kcyBvbiBFbWJlcidz
IGV2ZW50IGRpc3BhdGNoIHN5c3RlbSBpdCB3aWxsCisgICAgb25seSBmdW5jdGlvbiBpZiBhbiBg
RW1iZXIuRXZlbnREaXNwYXRjaGVyYCBpbnN0YW5jZSBpcyBhdmFpbGFibGUuIEFuCisgICAgYEVt
YmVyLkV2ZW50RGlzcGF0Y2hlcmAgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gYSBuZXcg
YEVtYmVyLkFwcGxpY2F0aW9uYAorICAgIGlzIGNyZWF0ZWQuIEhhdmluZyBhbiBpbnN0YW5jZSBv
ZiBgRW1iZXIuQXBwbGljYXRpb25gIHdpbGwgc2F0aXNmeSB0aGlzCisgICAgcmVxdWlyZW1lbnQu
CisKKyAgICAjIyMgU3BlY2lmeWluZyBhIFRhcmdldAorCisgICAgVGhlcmUgYXJlIHNldmVyYWwg
cG9zc2libGUgdGFyZ2V0IG9iamVjdHMgZm9yIGB7e2FjdGlvbn19YCBoZWxwZXJzOgorCisgICAg
SW4gYSB0eXBpY2FsIEVtYmVyIGFwcGxpY2F0aW9uLCB3aGVyZSB2aWV3cyBhcmUgbWFuYWdlZCB0
aHJvdWdoIHVzZSBvZiB0aGUKKyAgICBge3tvdXRsZXR9fWAgaGVscGVyLCBhY3Rpb25zIHdpbGwg
YnViYmxlIHRvIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIsIHRoZW4KKyAgICB0byB0aGUgY3VycmVu
dCByb3V0ZSwgYW5kIHRoZW4gdXAgdGhlIHJvdXRlIGhpZXJhcmNoeS4KKworICAgIEFsdGVybmF0
aXZlbHksIGEgYHRhcmdldGAgb3B0aW9uIGNhbiBiZSBwcm92aWRlZCB0byB0aGUgaGVscGVyIHRv
IGNoYW5nZQorICAgIHdoaWNoIG9iamVjdCB3aWxsIHJlY2VpdmUgdGhlIG1ldGhvZCBjYWxsLiBU
aGlzIG9wdGlvbiBtdXN0IGJlIGEgcGF0aAorICAgIHBhdGggdG8gYW4gb2JqZWN0LCBhY2Nlc3Np
YmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQ6CisKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPHNj
cmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSdhLXRlbXBs
YXRlJz4KKyAgICAgIDxkaXYge3thY3Rpb24gYW5BY3Rpb25OYW1lIHRhcmdldD0iTXlBcHBsaWNh
dGlvbi5zb21lT2JqZWN0In19PgorICAgICAgICBjbGljayBtZQorICAgICAgPC9kaXY+CisgICAg
PC9zY3JpcHQ+CisgICAgYGBgCisKKyAgICBDbGlja2luZyAiY2xpY2sgbWUiIGluIHRoZSByZW5k
ZXJlZCBIVE1MIG9mIHRoZSBhYm92ZSB0ZW1wbGF0ZSB3aWxsIHRyaWdnZXIKKyAgICB0aGUgIGBh
bkFjdGlvbk5hbWVgIG1ldGhvZCBvZiB0aGUgb2JqZWN0IGF0IGBNeUFwcGxpY2F0aW9uLnNvbWVP
YmplY3RgLgorCisgICAgSWYgYW4gYWN0aW9uJ3MgdGFyZ2V0IGRvZXMgbm90IGltcGxlbWVudCBh
IG1ldGhvZCB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkCisgICAgYWN0aW9uIG5hbWUgYW4gZXJy
b3Igd2lsbCBiZSB0aHJvd24uCisKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPHNjcmlwdCB0eXBl
PSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSdhLXRlbXBsYXRlJz4KKyAg
ICAgIDxkaXYge3thY3Rpb24gYU1ldGhvZE5hbWVUaGF0SXNNaXNzaW5nfX0+CisgICAgICAgIGNs
aWNrIG1lCisgICAgICA8L2Rpdj4KKyAgICA8L3NjcmlwdD4KKyAgICBgYGAKKworICAgIFdpdGgg
dGhlIGZvbGxvd2luZyBhcHBsaWNhdGlvbiBjb2RlCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
QVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZU5hbWU7ICdhLXRlbXBs
YXRlJywKKyAgICAgIC8vIG5vdGU6IG5vIG1ldGhvZCAnYU1ldGhvZE5hbWVUaGF0SXNNaXNzaW5n
JworICAgICAgYW5BY3Rpb25OYW1lOiBmdW5jdGlvbihldmVudCkge30KKyAgICB9KTsKKworICAg
IGFWaWV3ID0gQVZpZXcuY3JlYXRlKCk7CisgICAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKKyAg
ICBgYGAKKworICAgIFdpbGwgdGhyb3cgYFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IGNhbGwg
bWV0aG9kICdjYWxsJyBvZiB1bmRlZmluZWRgIHdoZW4KKyAgICAiY2xpY2sgbWUiIGlzIGNsaWNr
ZWQuCisKKyAgICAjIyMgQWRkaXRpb25hbCBQYXJhbWV0ZXJzCisKKyAgICBZb3UgbWF5IHNwZWNp
ZnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBge3thY3Rpb259fWAgaGVscGVyLiBUaGVz
ZQorICAgIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCBhbG9uZyBhcyB0aGUgYXJndW1lbnRzIHRvIHRo
ZSBKYXZhU2NyaXB0IGZ1bmN0aW9uCisgICAgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24uCisKKyAg
ICBgYGBoYW5kbGViYXJzCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0
YS10ZW1wbGF0ZS1uYW1lPSdhLXRlbXBsYXRlJz4KKyAgICAgIHt7I2VhY2ggcGVyc29uIGluIHBl
b3BsZX19CisgICAgICAgIDxkaXYge3thY3Rpb24gZWRpdCBwZXJzb259fT4KKyAgICAgICAgICBj
bGljayBtZQorICAgICAgICA8L2Rpdj4KKyAgICAgIHt7L2VhY2h9fQorICAgIDwvc2NyaXB0Pgor
ICAgIGBgYAorCisgICAgQ2xpY2tpbmcgImNsaWNrIG1lIiB3aWxsIHRyaWdnZXIgdGhlIGBlZGl0
YCBtZXRob2Qgb24gdGhlIGN1cnJlbnQgdmlldydzCisgICAgY29udHJvbGxlciB3aXRoIHRoZSBj
dXJyZW50IHBlcnNvbiBhcyBhIHBhcmFtZXRlci4KKworICAgIEBtZXRob2QgYWN0aW9uCisgICAg
QGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgICBAcGFyYW0ge1N0cmluZ30gYWN0aW9u
TmFtZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0qCisgICAgQHBhcmFtIHtIYXNofSBv
cHRpb25zCisgICovCisgIEVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYWN0aW9uJywg
ZnVuY3Rpb24oYWN0aW9uTmFtZSkgeworICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3Vt
ZW50cy5sZW5ndGggLSAxXSwKKyAgICAgICAgY29udGV4dHMgPSBhX3NsaWNlLmNhbGwoYXJndW1l
bnRzLCAxLCAtMSk7CisKKyAgICB2YXIgaGFzaCA9IG9wdGlvbnMuaGFzaCwKKyAgICAgICAgdmll
dyA9IG9wdGlvbnMuZGF0YS52aWV3LAorICAgICAgICBjb250cm9sbGVyLCBsaW5rOworCisgICAg
Ly8gY3JlYXRlIGEgaGFzaCB0byBwYXNzIGFsb25nIHRvIHJlZ2lzdGVyQWN0aW9uCisgICAgdmFy
IGFjdGlvbiA9IHsKKyAgICAgIGV2ZW50TmFtZTogaGFzaC5vbiB8fCAiY2xpY2siCisgICAgfTsK
KworICAgIGFjdGlvbi5wYXJhbWV0ZXJzID0geworICAgICAgY29udGV4dDogdGhpcywKKyAgICAg
IG9wdGlvbnM6IG9wdGlvbnMsCisgICAgICBwYXJhbXM6IGNvbnRleHRzCisgICAgfTsKKworICAg
IGFjdGlvbi52aWV3ID0gdmlldyA9IGdldCh2aWV3LCAnY29uY3JldGVWaWV3Jyk7CisKKyAgICB2
YXIgcm9vdCwgdGFyZ2V0OworCisgICAgaWYgKGhhc2gudGFyZ2V0KSB7CisgICAgICByb290ID0g
dGhpczsKKyAgICAgIHRhcmdldCA9IGhhc2gudGFyZ2V0OworICAgIH0gZWxzZSBpZiAoY29udHJv
bGxlciA9IG9wdGlvbnMuZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyKSB7CisgICAgICByb290ID0g
Y29udHJvbGxlcjsKKyAgICB9CisKKyAgICBhY3Rpb24udGFyZ2V0ID0geyByb290OiByb290LCB0
YXJnZXQ6IHRhcmdldCwgb3B0aW9uczogb3B0aW9ucyB9OworICAgIGFjdGlvbi5idWJibGVzID0g
aGFzaC5idWJibGVzOworCisgICAgdmFyIGFjdGlvbklkID0gQWN0aW9uSGVscGVyLnJlZ2lzdGVy
QWN0aW9uKGFjdGlvbk5hbWUsIGFjdGlvbik7CisgICAgcmV0dXJuIG5ldyBTYWZlU3RyaW5nKCdk
YXRhLWVtYmVyLWFjdGlvbj0iJyArIGFjdGlvbklkICsgJyInKTsKKyAgfSk7CisKK30pOworCit9
KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxl
IGVtYmVyLXJvdXRpbmcKKyovCisKK2lmIChFbWJlci5FTlYuRVhQRVJJTUVOVEFMX0NPTlRST0xf
SEVMUEVSKSB7CisgIHZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKworICAv
KioKKyAgICBUaGUgY29udHJvbCBoZWxwZXIgaXMgY3VycmVudGx5IHVuZGVyIGRldmVsb3BtZW50
IGFuZCBpcyBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4KKyAgICBUbyBlbmFibGUgaXQsIHNldCBg
RU5WLkVYUEVSSU1FTlRBTF9DT05UUk9MX0hFTFBFUiA9IHRydWVgIGJlZm9yZSByZXF1aXJpbmcg
RW1iZXIuCisKKyAgICBAbWV0aG9kIGNvbnRyb2wKKyAgICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMu
aGVscGVycworICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRoCisgICAgQHBhcmFtIHtTdHJpbmd9IG1v
ZGVsUGF0aAorICAgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICAgIEByZXR1cm4ge1N0cmluZ30g
SFRNTCBzdHJpbmcKKyAgKi8KKyAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignY29u
dHJvbCcsIGZ1bmN0aW9uKHBhdGgsIG1vZGVsUGF0aCwgb3B0aW9ucykgeworICAgIGlmIChhcmd1
bWVudHMubGVuZ3RoID09PSAyKSB7CisgICAgICBvcHRpb25zID0gbW9kZWxQYXRoOworICAgICAg
bW9kZWxQYXRoID0gdW5kZWZpbmVkOworICAgIH0KKworICAgIHZhciBtb2RlbDsKKworICAgIGlm
IChtb2RlbFBhdGgpIHsKKyAgICAgIG1vZGVsID0gRW1iZXIuSGFuZGxlYmFycy5nZXQodGhpcywg
bW9kZWxQYXRoLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICB2YXIgY29udHJvbGxlciA9IG9wdGlv
bnMuZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyLAorICAgICAgICB2aWV3ID0gb3B0aW9ucy5kYXRh
LmtleXdvcmRzLnZpZXcsCisgICAgICAgIGNoaWxkcmVuID0gZ2V0KGNvbnRyb2xsZXIsICdfY2hp
bGRDb250YWluZXJzJyksCisgICAgICAgIGNvbnRyb2xJRCA9IG9wdGlvbnMuaGFzaC5jb250cm9s
SUQsCisgICAgICAgIGNvbnRhaW5lciwgc3ViQ29udGFpbmVyOworCisgICAgaWYgKGNoaWxkcmVu
Lmhhc093blByb3BlcnR5KGNvbnRyb2xJRCkpIHsKKyAgICAgIHN1YkNvbnRhaW5lciA9IGNoaWxk
cmVuW2NvbnRyb2xJRF07CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRhaW5lciA9IGdldChjb250
cm9sbGVyLCAnY29udGFpbmVyJyksCisgICAgICBzdWJDb250YWluZXIgPSBjb250YWluZXIuY2hp
bGQoKTsKKyAgICAgIGNoaWxkcmVuW2NvbnRyb2xJRF0gPSBzdWJDb250YWluZXI7CisgICAgfQor
CisgICAgdmFyIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cLy9nLCAnLicpOworCisg
ICAgdmFyIGNoaWxkVmlldyA9IHN1YkNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyArIG5vcm1hbGl6
ZWRQYXRoKSB8fCBzdWJDb250YWluZXIubG9va3VwKCd2aWV3OmRlZmF1bHQnKSwKKyAgICAgICAg
Y2hpbGRDb250cm9sbGVyID0gc3ViQ29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgbm9y
bWFsaXplZFBhdGgpLAorICAgICAgICBjaGlsZFRlbXBsYXRlID0gc3ViQ29udGFpbmVyLmxvb2t1
cCgndGVtcGxhdGU6JyArIHBhdGgpOworCisgICAgRW1iZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmlu
ZCBjb250cm9sbGVyIGZvciBwYXRoOiAiICsgbm9ybWFsaXplZFBhdGgsIGNoaWxkQ29udHJvbGxl
cik7CisgICAgRW1iZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmluZCB2aWV3IGZvciBwYXRoOiAiICsg
bm9ybWFsaXplZFBhdGgsIGNoaWxkVmlldyk7CisKKyAgICBzZXQoY2hpbGRDb250cm9sbGVyLCAn
dGFyZ2V0JywgY29udHJvbGxlcik7CisgICAgc2V0KGNoaWxkQ29udHJvbGxlciwgJ21vZGVsJywg
bW9kZWwpOworCisgICAgb3B0aW9ucy5oYXNoLnRlbXBsYXRlID0gY2hpbGRUZW1wbGF0ZTsKKyAg
ICBvcHRpb25zLmhhc2guY29udHJvbGxlciA9IGNoaWxkQ29udHJvbGxlcjsKKworICAgIGZ1bmN0
aW9uIG9ic2VydmVyKCkgeworICAgICAgdmFyIG1vZGVsID0gRW1iZXIuSGFuZGxlYmFycy5nZXQo
dGhpcywgbW9kZWxQYXRoLCBvcHRpb25zKTsKKyAgICAgIHNldChjaGlsZENvbnRyb2xsZXIsICdt
b2RlbCcsIG1vZGVsKTsKKyAgICAgIGNoaWxkVmlldy5yZXJlbmRlcigpOworICAgIH0KKworICAg
IEVtYmVyLmFkZE9ic2VydmVyKHRoaXMsIG1vZGVsUGF0aCwgb2JzZXJ2ZXIpOworICAgIGNoaWxk
Vmlldy5vbmUoJ3dpbGxEZXN0cm95RWxlbWVudCcsIHRoaXMsIGZ1bmN0aW9uKCkgeworICAgICAg
RW1iZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywgbW9kZWxQYXRoLCBvYnNlcnZlcik7CisgICAgfSk7
CisKKyAgICBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIGNoaWxkVmll
dywgb3B0aW9ucyk7CisgIH0pOworfQorCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworCit9
KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxl
IGVtYmVyLXJvdXRpbmcKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKKworRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7CisgIHRyYW5zaXRpb25Ub1JvdXRl
OiBmdW5jdGlvbigpIHsKKyAgICAvLyB0YXJnZXQgbWF5IGJlIGVpdGhlciBhbm90aGVyIGNvbnRy
b2xsZXIgb3IgYSByb3V0ZXIKKyAgICB2YXIgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwK
KyAgICAgICAgbWV0aG9kID0gdGFyZ2V0LnRyYW5zaXRpb25Ub1JvdXRlIHx8IHRhcmdldC50cmFu
c2l0aW9uVG87CisgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7Cisg
IH0sCisKKyAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5kZXByZWNhdGUo
InRyYW5zaXRpb25UbyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRyYW5zaXRpb25Ub1JvdXRl
LiIpOworICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ub1JvdXRlLmFwcGx5KHRoaXMsIGFyZ3Vt
ZW50cyk7CisgIH0sCisKKyAgcmVwbGFjZVJvdXRlOiBmdW5jdGlvbigpIHsKKyAgICAvLyB0YXJn
ZXQgbWF5IGJlIGVpdGhlciBhbm90aGVyIGNvbnRyb2xsZXIgb3IgYSByb3V0ZXIKKyAgICB2YXIg
dGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKKyAgICAgICAgbWV0aG9kID0gdGFyZ2V0LnJl
cGxhY2VSb3V0ZSB8fCB0YXJnZXQucmVwbGFjZVdpdGg7CisgICAgcmV0dXJuIG1ldGhvZC5hcHBs
eSh0YXJnZXQsIGFyZ3VtZW50cyk7CisgIH0sCisKKyAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkg
eworICAgIEVtYmVyLmRlcHJlY2F0ZSgicmVwbGFjZVdpdGggaXMgZGVwcmVjYXRlZC4gUGxlYXNl
IHVzZSByZXBsYWNlUm91dGUuIik7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZVJvdXRlLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkg
eworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyovCisKK3Zh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKworRW1iZXIuVmlldy5yZW9wZW4o
eworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICBzZXQodGhpcywgJ19vdXRsZXRzJywge30pOwor
ICAgIHRoaXMuX3N1cGVyKCk7CisgIH0sCisKKyAgY29ubmVjdE91dGxldDogZnVuY3Rpb24ob3V0
bGV0TmFtZSwgdmlldykgeworICAgIHZhciBvdXRsZXRzID0gZ2V0KHRoaXMsICdfb3V0bGV0cycp
LAorICAgICAgICBjb250YWluZXIgPSBnZXQodGhpcywgJ2NvbnRhaW5lcicpLAorICAgICAgICBy
b3V0ZXIgPSBjb250YWluZXIgJiYgY29udGFpbmVyLmxvb2t1cCgncm91dGVyOm1haW4nKSwKKyAg
ICAgICAgcmVuZGVyZWROYW1lID0gZ2V0KHZpZXcsICdyZW5kZXJlZE5hbWUnKTsKKworICAgIHNl
dChvdXRsZXRzLCBvdXRsZXROYW1lLCB2aWV3KTsKKworICAgIGlmIChyb3V0ZXIgJiYgcmVuZGVy
ZWROYW1lKSB7CisgICAgICByb3V0ZXIuX2Nvbm5lY3RBY3RpdmVWaWV3KHJlbmRlcmVkTmFtZSwg
dmlldyk7CisgICAgfQorICB9LAorCisgIGRpc2Nvbm5lY3RPdXRsZXQ6IGZ1bmN0aW9uKG91dGxl
dE5hbWUpIHsKKyAgICB2YXIgb3V0bGV0cyA9IGdldCh0aGlzLCAnX291dGxldHMnKTsKKworICAg
IHNldChvdXRsZXRzLCBvdXRsZXROYW1lLCBudWxsKTsKKyAgfQorfSk7CisKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZworKi8KKwordmFyIGdldCA9IEVtYmVy
LmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKgorICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUg
YGxvY2F0aW9uYCBBUEkgdXNlZCBieSBFbWJlcidzIHJvdXRlci4KKworICBUaGF0IEFQSSBpczoK
KworICBnZXRVUkw6IHJldHVybnMgdGhlIGN1cnJlbnQgVVJMCisgIHNldFVSTChwYXRoKTogc2V0
cyB0aGUgY3VycmVudCBVUkwKKyAgcmVwbGFjZVVSTChwYXRoKTogcmVwbGFjZSB0aGUgY3VycmVu
dCBVUkwgKG9wdGlvbmFsKQorICBvblVwZGF0ZVVSTChjYWxsYmFjayk6IHRyaWdnZXJzIHRoZSBj
YWxsYmFjayB3aGVuIHRoZSBVUkwgY2hhbmdlcworICBmb3JtYXRVUkwodXJsKTogZm9ybWF0cyBg
dXJsYCB0byBiZSBwbGFjZWQgaW50byBgaHJlZmAgYXR0cmlidXRlCisKKyAgQ2FsbGluZyBzZXRV
Ukwgb3IgcmVwbGFjZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRlVVJMIGNhbGxiYWNrcy4K
KworICBUT0RPOiBUaGlzIHNob3VsZCBwZXJoYXBzIGJlIG1vdmVkIHNvIHRoYXQgaXQncyB2aXNp
YmxlIGluIHRoZSBkb2Mgb3V0cHV0LgorKi8KKworLyoqCisgIEVtYmVyLkxvY2F0aW9uIHJldHVy
bnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YKKyAgdGhlIGBs
b2NhdGlvbmAgQVBJLgorCisgIFlvdSBjYW4gcGFzcyBpdCBhIGBpbXBsZW1lbnRhdGlvbmAgKCdo
YXNoJywgJ2hpc3RvcnknLCAnbm9uZScpIHRvIGZvcmNlIGEKKyAgcGFydGljdWxhciBpbXBsZW1l
bnRhdGlvbi4KKworICBAY2xhc3MgTG9jYXRpb24KKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAc3Rh
dGljCisqLworRW1iZXIuTG9jYXRpb24gPSB7CisgIGNyZWF0ZTogZnVuY3Rpb24ob3B0aW9ucykg
eworICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbXBsZW1lbnRh
dGlvbjsKKyAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9uLmNyZWF0ZTogeW91IG11c3Qg
c3BlY2lmeSBhICdpbXBsZW1lbnRhdGlvbicgb3B0aW9uIiwgISFpbXBsZW1lbnRhdGlvbik7CisK
KyAgICB2YXIgaW1wbGVtZW50YXRpb25DbGFzcyA9IHRoaXMuaW1wbGVtZW50YXRpb25zW2ltcGxl
bWVudGF0aW9uXTsKKyAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9uLmNyZWF0ZTogIiAr
IGltcGxlbWVudGF0aW9uICsgIiBpcyBub3QgYSB2YWxpZCBpbXBsZW1lbnRhdGlvbiIsICEhaW1w
bGVtZW50YXRpb25DbGFzcyk7CisKKyAgICByZXR1cm4gaW1wbGVtZW50YXRpb25DbGFzcy5jcmVh
dGUuYXBwbHkoaW1wbGVtZW50YXRpb25DbGFzcywgYXJndW1lbnRzKTsKKyAgfSwKKworICByZWdp
c3RlckltcGxlbWVudGF0aW9uOiBmdW5jdGlvbihuYW1lLCBpbXBsZW1lbnRhdGlvbikgeworICAg
IHRoaXMuaW1wbGVtZW50YXRpb25zW25hbWVdID0gaW1wbGVtZW50YXRpb247CisgIH0sCisKKyAg
aW1wbGVtZW50YXRpb25zOiB7fQorfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8q
KgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisqLworCit2YXIgZ2V0
ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKKy8qKgorICBFbWJlci5Ob25lTG9jYXRp
b24gZG9lcyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgYnJvd3Nlci4gSXQgaXMgdXNlZnVsIGZvcgor
ICB0ZXN0aW5nLCBvciB3aGVuIHlvdSBuZWVkIHRvIG1hbmFnZSBzdGF0ZSB3aXRoIHlvdXIgUm91
dGVyLCBidXQgdGVtcG9yYXJpbHkKKyAgZG9uJ3Qgd2FudCBpdCB0byBtdWNrIHdpdGggdGhlIFVS
TCAoZm9yIGV4YW1wbGUgd2hlbiB5b3UgZW1iZWQgeW91cgorICBhcHBsaWNhdGlvbiBpbiBhIGxh
cmdlciBwYWdlKS4KKworICBAY2xhc3MgTm9uZUxvY2F0aW9uCisgIEBuYW1lc3BhY2UgRW1iZXIK
KyAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisqLworRW1iZXIuTm9uZUxvY2F0aW9uID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7CisgIHBhdGg6ICcnLAorCisgIGdldFVSTDogZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuIGdldCh0aGlzLCAncGF0aCcpOworICB9LAorCisgIHNldFVSTDogZnVuY3Rpb24o
cGF0aCkgeworICAgIHNldCh0aGlzLCAncGF0aCcsIHBhdGgpOworICB9LAorCisgIG9uVXBkYXRl
VVJMOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sgPSBjYWxs
YmFjazsKKyAgfSwKKworICBoYW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgeworICAgIHNldCh0aGlz
LCAncGF0aCcsIHVybCk7CisgICAgdGhpcy51cGRhdGVDYWxsYmFjayh1cmwpOworICB9LAorCisg
IGZvcm1hdFVSTDogZnVuY3Rpb24odXJsKSB7CisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBu
b3Qgb3Zlcmx5IG1lYW5pbmdmdWwsIGJ1dCB3ZSBkbyBub3Qgd2FudCB0byB0aHJvdworICAgIC8v
IGVycm9ycyB3aGVuIHRlc3QgY29kZSByZW5kZXJzIHRlbXBsYXRlcyBjb250YWluaW5nIHt7YWN0
aW9uIGhyZWY9dHJ1ZX19CisgICAgLy8gaGVscGVycy4KKyAgICByZXR1cm4gdXJsOworICB9Cit9
KTsKKworRW1iZXIuTG9jYXRpb24ucmVnaXN0ZXJJbXBsZW1lbnRhdGlvbignbm9uZScsIEVtYmVy
Lk5vbmVMb2NhdGlvbik7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZworKi8KKwordmFyIGdldCA9IEVtYmVy
LmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAgRW1iZXIuSGFzaExvY2F0aW9uIGltcGxl
bWVudHMgdGhlIGxvY2F0aW9uIEFQSSB1c2luZyB0aGUgYnJvd3NlcidzCisgIGhhc2guIEF0IHBy
ZXNlbnQsIGl0IHJlbGllcyBvbiBhIGhhc2hjaGFuZ2UgZXZlbnQgZXhpc3RpbmcgaW4gdGhlCisg
IGJyb3dzZXIuCisKKyAgQGNsYXNzIEhhc2hMb2NhdGlvbgorICBAbmFtZXNwYWNlIEVtYmVyCisg
IEBleHRlbmRzIEVtYmVyLk9iamVjdAorKi8KK0VtYmVyLkhhc2hMb2NhdGlvbiA9IEVtYmVyLk9i
amVjdC5leHRlbmQoeworCisgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgIHNldCh0aGlzLCAnbG9j
YXRpb24nLCBnZXQodGhpcywgJ2xvY2F0aW9uJykgfHwgd2luZG93LmxvY2F0aW9uKTsKKyAgfSwK
KworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBgbG9jYXRp
b24uaGFzaGAsIG1pbnVzIHRoZSAnIycgYXQgdGhlIGZyb250LgorCisgICAgQG1ldGhvZCBnZXRV
UkwKKyAgKi8KKyAgZ2V0VVJMOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZ2V0KHRoaXMsICds
b2NhdGlvbicpLmhhc2guc3Vic3RyKDEpOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisK
KyAgICBTZXQgdGhlIGBsb2NhdGlvbi5oYXNoYCBhbmQgcmVtZW1iZXJzIHdoYXQgd2FzIHNldC4g
VGhpcyBwcmV2ZW50cworICAgIGBvblVwZGF0ZVVSTGAgY2FsbGJhY2tzIGZyb20gdHJpZ2dlcmlu
ZyB3aGVuIHRoZSBoYXNoIHdhcyBzZXQgYnkKKyAgICBgSGFzaExvY2F0aW9uYC4KKworICAgIEBt
ZXRob2Qgc2V0VVJMCisgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgKi8KKyAgc2V0VVJMOiBm
dW5jdGlvbihwYXRoKSB7CisgICAgZ2V0KHRoaXMsICdsb2NhdGlvbicpLmhhc2ggPSBwYXRoOwor
ICAgIHNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBhdGgpOworICB9LAorCisgIC8qKgorICAgIEBw
cml2YXRlCisKKyAgICBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUg
aGFzaCBjaGFuZ2VzLiBUaGVzZQorICAgIGNhbGxiYWNrcyB3aWxsIGV4ZWN1dGUgd2hlbiB0aGUg
dXNlciBwcmVzc2VzIHRoZSBiYWNrIG9yIGZvcndhcmQKKyAgICBidXR0b24sIGJ1dCBub3QgYWZ0
ZXIgYHNldFVSTGAgaXMgaW52b2tlZC4KKworICAgIEBtZXRob2Qgb25VcGRhdGVVUkwKKyAgICBA
cGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufQorICAqLworICBvblVwZGF0ZVVSTDogZnVuY3Rpb24o
Y2FsbGJhY2spIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIGd1aWQgPSBFbWJlci5n
dWlkRm9yKHRoaXMpOworCisgICAgRW1iZXIuJCh3aW5kb3cpLmJpbmQoJ2hhc2hjaGFuZ2UuZW1i
ZXItbG9jYXRpb24tJytndWlkLCBmdW5jdGlvbigpIHsKKyAgICAgIEVtYmVyLnJ1bihmdW5jdGlv
bigpIHsKKyAgICAgICAgdmFyIHBhdGggPSBsb2NhdGlvbi5oYXNoLnN1YnN0cigxKTsKKyAgICAg
ICAgaWYgKGdldChzZWxmLCAnbGFzdFNldFVSTCcpID09PSBwYXRoKSB7IHJldHVybjsgfQorCisg
ICAgICAgIHNldChzZWxmLCAnbGFzdFNldFVSTCcsIG51bGwpOworCisgICAgICAgIGNhbGxiYWNr
KGxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKTsKKyAgICAgIH0pOworICAgIH0pOworICB9LAorCisg
IC8qKgorICAgIEBwcml2YXRlCisKKyAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0byBiZSBw
bGFjZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0CisgICAgb2YgYW4gZWxlbWVudCdzIGBocmVmYCBh
dHRyaWJ1dGUuCisKKyAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHRo
ZSB7e2FjdGlvbn19IGhlbHBlcgorICAgIHRvIGdlbmVyYXRlIGEgVVJMIGJhc2VkIG9uIGFuIGV2
ZW50LgorCisgICAgQG1ldGhvZCBmb3JtYXRVUkwKKyAgICBAcGFyYW0gdXJsIHtTdHJpbmd9Cisg
ICovCisgIGZvcm1hdFVSTDogZnVuY3Rpb24odXJsKSB7CisgICAgcmV0dXJuICcjJyt1cmw7Cisg
IH0sCisKKyAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIHZhciBndWlkID0gRW1iZXIu
Z3VpZEZvcih0aGlzKTsKKworICAgIEVtYmVyLiQod2luZG93KS51bmJpbmQoJ2hhc2hjaGFuZ2Uu
ZW1iZXItbG9jYXRpb24tJytndWlkKTsKKyAgfQorfSk7CisKK0VtYmVyLkxvY2F0aW9uLnJlZ2lz
dGVySW1wbGVtZW50YXRpb24oJ2hhc2gnLCBFbWJlci5IYXNoTG9jYXRpb24pOworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVy
LXJvdXRpbmcKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK3Zh
ciBwb3BzdGF0ZVJlYWR5ID0gZmFsc2U7CisKKy8qKgorICBFbWJlci5IaXN0b3J5TG9jYXRpb24g
aW1wbGVtZW50cyB0aGUgbG9jYXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2VyJ3MKKyAgaGlzdG9y
eS5wdXNoU3RhdGUgQVBJLgorCisgIEBjbGFzcyBIaXN0b3J5TG9jYXRpb24KKyAgQG5hbWVzcGFj
ZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKyovCitFbWJlci5IaXN0b3J5TG9jYXRp
b24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICBz
ZXQodGhpcywgJ2xvY2F0aW9uJywgZ2V0KHRoaXMsICdsb2NhdGlvbicpIHx8IHdpbmRvdy5sb2Nh
dGlvbik7CisgICAgdGhpcy5pbml0U3RhdGUoKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0
ZQorCisgICAgVXNlZCB0byBzZXQgc3RhdGUgb24gZmlyc3QgY2FsbCB0byBzZXRVUkwKKworICAg
IEBtZXRob2QgaW5pdFN0YXRlCisgICovCisgIGluaXRTdGF0ZTogZnVuY3Rpb24oKSB7CisgICAg
dGhpcy5yZXBsYWNlU3RhdGUodGhpcy5mb3JtYXRVUkwodGhpcy5nZXRVUkwoKSkpOworICAgIHNl
dCh0aGlzLCAnaGlzdG9yeScsIHdpbmRvdy5oaXN0b3J5KTsKKyAgfSwKKworICAvKioKKyAgICBX
aWxsIGJlIHByZS1wZW5kZWQgdG8gcGF0aCB1cG9uIHN0YXRlIGNoYW5nZQorCisgICAgQHByb3Bl
cnR5IHJvb3RVUkwKKyAgICBAZGVmYXVsdCAnLycKKyAgKi8KKyAgcm9vdFVSTDogJy8nLAorCisg
IC8qKgorICAgIEBwcml2YXRlCisKKyAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlvbi5w
YXRobmFtZWAgd2l0aG91dCByb290VVJMCisKKyAgICBAbWV0aG9kIGdldFVSTAorICAqLworICBn
ZXRVUkw6IGZ1bmN0aW9uKCkgeworICAgIHZhciByb290VVJMID0gZ2V0KHRoaXMsICdyb290VVJM
JyksCisgICAgICAgIHVybCA9IGdldCh0aGlzLCAnbG9jYXRpb24nKS5wYXRobmFtZTsKKworICAg
IHJvb3RVUkwgPSByb290VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKKyAgICB1cmwgPSB1cmwucmVw
bGFjZShyb290VVJMLCAnJyk7CisKKyAgICByZXR1cm4gdXJsOworICB9LAorCisgIC8qKgorICAg
IEBwcml2YXRlCisKKyAgICBVc2VzIGBoaXN0b3J5LnB1c2hTdGF0ZWAgdG8gdXBkYXRlIHRoZSB1
cmwgd2l0aG91dCBhIHBhZ2UgcmVsb2FkLgorCisgICAgQG1ldGhvZCBzZXRVUkwKKyAgICBAcGFy
YW0gcGF0aCB7U3RyaW5nfQorICAqLworICBzZXRVUkw6IGZ1bmN0aW9uKHBhdGgpIHsKKyAgICBw
YXRoID0gdGhpcy5mb3JtYXRVUkwocGF0aCk7CisKKyAgICBpZiAodGhpcy5nZXRTdGF0ZSgpICYm
IHRoaXMuZ2V0U3RhdGUoKS5wYXRoICE9PSBwYXRoKSB7CisgICAgICBwb3BzdGF0ZVJlYWR5ID0g
dHJ1ZTsKKyAgICAgIHRoaXMucHVzaFN0YXRlKHBhdGgpOworICAgIH0KKyAgfSwKKworICAvKioK
KyAgICBAcHJpdmF0ZQorCisgICAgVXNlcyBgaGlzdG9yeS5yZXBsYWNlU3RhdGVgIHRvIHVwZGF0
ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZAorICAgIG9yIGhpc3RvcnkgbW9kaWZpY2F0
aW9uLgorCisgICAgQG1ldGhvZCByZXBsYWNlVVJMCisgICAgQHBhcmFtIHBhdGgge1N0cmluZ30K
KyAgKi8KKyAgcmVwbGFjZVVSTDogZnVuY3Rpb24ocGF0aCkgeworICAgIHBhdGggPSB0aGlzLmZv
cm1hdFVSTChwYXRoKTsKKworICAgIGlmICh0aGlzLmdldFN0YXRlKCkgJiYgdGhpcy5nZXRTdGF0
ZSgpLnBhdGggIT09IHBhdGgpIHsKKyAgICAgIHBvcHN0YXRlUmVhZHkgPSB0cnVlOworICAgICAg
dGhpcy5yZXBsYWNlU3RhdGUocGF0aCk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgQHByaXZh
dGUKKworICAgR2V0IHRoZSBjdXJyZW50IGBoaXN0b3J5LnN0YXRlYAorCisgICBAbWV0aG9kIGdl
dFN0YXRlCisgICovCisgIGdldFN0YXRlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZ2V0KHRo
aXMsICdoaXN0b3J5Jykuc3RhdGU7CisgIH0sCisKKyAgLyoqCisgICBAcHJpdmF0ZQorCisgICBQ
dXNoZXMgYSBuZXcgc3RhdGUKKworICAgQG1ldGhvZCBwdXNoU3RhdGUKKyAgIEBwYXJhbSBwYXRo
IHtTdHJpbmd9CisgICovCisgIHB1c2hTdGF0ZTogZnVuY3Rpb24ocGF0aCkgeworICAgIHdpbmRv
dy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHBhdGg6IHBhdGggfSwgbnVsbCwgcGF0aCk7CisgIH0sCisK
KyAgLyoqCisgICBAcHJpdmF0ZQorCisgICBSZXBsYWNlcyB0aGUgY3VycmVudCBzdGF0ZQorCisg
ICBAbWV0aG9kIHJlcGxhY2VTdGF0ZQorICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgKi8KKyAg
cmVwbGFjZVN0YXRlOiBmdW5jdGlvbihwYXRoKSB7CisgICAgd2luZG93Lmhpc3RvcnkucmVwbGFj
ZVN0YXRlKHsgcGF0aDogcGF0aCB9LCBudWxsLCBwYXRoKTsKKyAgfSwKKworICAvKioKKyAgICBA
cHJpdmF0ZQorCisgICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW5ldmVy
IHRoZSBicm93c2VyCisgICAgaGlzdG9yeSBjaGFuZ2VzLCBpbmNsdWRpbmcgdXNpbmcgZm9yd2Fy
ZCBhbmQgYmFjayBidXR0b25zLgorCisgICAgQG1ldGhvZCBvblVwZGF0ZVVSTAorICAgIEBwYXJh
bSBjYWxsYmFjayB7RnVuY3Rpb259CisgICovCisgIG9uVXBkYXRlVVJMOiBmdW5jdGlvbihjYWxs
YmFjaykgeworICAgIHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKSwKKyAgICAgICAgc2Vs
ZiA9IHRoaXM7CisKKyAgICBFbWJlci4kKHdpbmRvdykuYmluZCgncG9wc3RhdGUuZW1iZXItbG9j
YXRpb24tJytndWlkLCBmdW5jdGlvbihlKSB7CisgICAgICBpZighcG9wc3RhdGVSZWFkeSkgewor
ICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjYWxsYmFjayhzZWxmLmdldFVSTCgpKTsK
KyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgVXNlZCB3aGVuIHVz
aW5nIGB7e2FjdGlvbn19YCBoZWxwZXIuICBUaGUgdXJsIGlzIGFsd2F5cyBhcHBlbmRlZCB0byB0
aGUgcm9vdFVSTC4KKworICAgIEBtZXRob2QgZm9ybWF0VVJMCisgICAgQHBhcmFtIHVybCB7U3Ry
aW5nfQorICAqLworICBmb3JtYXRVUkw6IGZ1bmN0aW9uKHVybCkgeworICAgIHZhciByb290VVJM
ID0gZ2V0KHRoaXMsICdyb290VVJMJyk7CisKKyAgICBpZiAodXJsICE9PSAnJykgeworICAgICAg
cm9vdFVSTCA9IHJvb3RVUkwucmVwbGFjZSgvXC8kLywgJycpOworICAgIH0KKworICAgIHJldHVy
biByb290VVJMICsgdXJsOworICB9LAorCisgIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgZ3VpZCA9IEVtYmVyLmd1aWRGb3IodGhpcyk7CisKKyAgICBFbWJlci4kKHdpbmRvdyku
dW5iaW5kKCdwb3BzdGF0ZS5lbWJlci1sb2NhdGlvbi0nK2d1aWQpOworICB9Cit9KTsKKworRW1i
ZXIuTG9jYXRpb24ucmVnaXN0ZXJJbXBsZW1lbnRhdGlvbignaGlzdG9yeScsIEVtYmVyLkhpc3Rv
cnlMb2NhdGlvbik7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7CisvKioKK0VtYmVyIFJvdXRpbmcKKworQG1vZHVsZSBlbWJlcgorQHN1
Ym1vZHVsZSBlbWJlci1yb3V0aW5nCitAcmVxdWlyZXMgZW1iZXItc3RhdGVzCitAcmVxdWlyZXMg
ZW1iZXItdmlld3MKKyovCisKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKK2Z1bmN0aW9uIHZpc2l0
KHZlcnRleCwgZm4sIHZpc2l0ZWQsIHBhdGgpIHsKKyAgdmFyIG5hbWUgPSB2ZXJ0ZXgubmFtZSwK
KyAgICB2ZXJ0aWNlcyA9IHZlcnRleC5pbmNvbWluZywKKyAgICBuYW1lcyA9IHZlcnRleC5pbmNv
bWluZ05hbWVzLAorICAgIGxlbiA9IG5hbWVzLmxlbmd0aCwKKyAgICBpOworICBpZiAoIXZpc2l0
ZWQpIHsKKyAgICB2aXNpdGVkID0ge307CisgIH0KKyAgaWYgKCFwYXRoKSB7CisgICAgcGF0aCA9
IFtdOworICB9CisgIGlmICh2aXNpdGVkLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgcmV0
dXJuOworICB9CisgIHBhdGgucHVzaChuYW1lKTsKKyAgdmlzaXRlZFtuYW1lXSA9IHRydWU7Cisg
IGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHZpc2l0KHZlcnRpY2VzW25hbWVzW2ld
XSwgZm4sIHZpc2l0ZWQsIHBhdGgpOworICB9CisgIGZuKHZlcnRleCwgcGF0aCk7CisgIHBhdGgu
cG9wKCk7Cit9CisKK2Z1bmN0aW9uIERBRygpIHsKKyAgdGhpcy5uYW1lcyA9IFtdOworICB0aGlz
LnZlcnRpY2VzID0ge307Cit9CisKK0RBRy5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obmFtZSkg
eworICBpZiAoIW5hbWUpIHsgcmV0dXJuOyB9CisgIGlmICh0aGlzLnZlcnRpY2VzLmhhc093blBy
b3BlcnR5KG5hbWUpKSB7CisgICAgcmV0dXJuIHRoaXMudmVydGljZXNbbmFtZV07CisgIH0KKyAg
dmFyIHZlcnRleCA9IHsKKyAgICBuYW1lOiBuYW1lLCBpbmNvbWluZzoge30sIGluY29taW5nTmFt
ZXM6IFtdLCBoYXNPdXRnb2luZzogZmFsc2UsIHZhbHVlOiBudWxsCisgIH07CisgIHRoaXMudmVy
dGljZXNbbmFtZV0gPSB2ZXJ0ZXg7CisgIHRoaXMubmFtZXMucHVzaChuYW1lKTsKKyAgcmV0dXJu
IHZlcnRleDsKK307CisKK0RBRy5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24obmFtZSwgdmFsdWUp
IHsKKyAgdGhpcy5hZGQobmFtZSkudmFsdWUgPSB2YWx1ZTsKK307CisKK0RBRy5wcm90b3R5cGUu
YWRkRWRnZSA9IGZ1bmN0aW9uKGZyb21OYW1lLCB0b05hbWUpIHsKKyAgaWYgKCFmcm9tTmFtZSB8
fCAhdG9OYW1lIHx8IGZyb21OYW1lID09PSB0b05hbWUpIHsKKyAgICByZXR1cm47CisgIH0KKyAg
dmFyIGZyb20gPSB0aGlzLmFkZChmcm9tTmFtZSksIHRvID0gdGhpcy5hZGQodG9OYW1lKTsKKyAg
aWYgKHRvLmluY29taW5nLmhhc093blByb3BlcnR5KGZyb21OYW1lKSkgeworICAgIHJldHVybjsK
KyAgfQorICBmdW5jdGlvbiBjaGVja0N5Y2xlKHZlcnRleCwgcGF0aCkgeworICAgIGlmICh2ZXJ0
ZXgubmFtZSA9PT0gdG9OYW1lKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIGRldGVj
dGVkOiAiICsgdG9OYW1lICsgIiA8LSAiICsgcGF0aC5qb2luKCIgPC0gIikpOworICAgIH0KKyAg
fQorICB2aXNpdChmcm9tLCBjaGVja0N5Y2xlKTsKKyAgZnJvbS5oYXNPdXRnb2luZyA9IHRydWU7
CisgIHRvLmluY29taW5nW2Zyb21OYW1lXSA9IGZyb207CisgIHRvLmluY29taW5nTmFtZXMucHVz
aChmcm9tTmFtZSk7Cit9OworCitEQUcucHJvdG90eXBlLnRvcHNvcnQgPSBmdW5jdGlvbihmbikg
eworICB2YXIgdmlzaXRlZCA9IHt9LAorICAgIHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcywKKyAg
ICBuYW1lcyA9IHRoaXMubmFtZXMsCisgICAgbGVuID0gbmFtZXMubGVuZ3RoLAorICAgIGksIHZl
cnRleDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmVydGV4ID0gdmVydGlj
ZXNbbmFtZXNbaV1dOworICAgIGlmICghdmVydGV4Lmhhc091dGdvaW5nKSB7CisgICAgICB2aXNp
dCh2ZXJ0ZXgsIGZuLCB2aXNpdGVkKTsKKyAgICB9CisgIH0KK307CisKK0RBRy5wcm90b3R5cGUu
YWRkRWRnZXMgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgYmVmb3JlLCBhZnRlcikgeworICB2YXIg
aTsKKyAgdGhpcy5tYXAobmFtZSwgdmFsdWUpOworICBpZiAoYmVmb3JlKSB7CisgICAgaWYgKHR5
cGVvZiBiZWZvcmUgPT09ICdzdHJpbmcnKSB7CisgICAgICB0aGlzLmFkZEVkZ2UobmFtZSwgYmVm
b3JlKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IGJlZm9yZS5sZW5ndGg7
IGkrKykgeworICAgICAgICB0aGlzLmFkZEVkZ2UobmFtZSwgYmVmb3JlW2ldKTsKKyAgICAgIH0K
KyAgICB9CisgIH0KKyAgaWYgKGFmdGVyKSB7CisgICAgaWYgKHR5cGVvZiBhZnRlciA9PT0gJ3N0
cmluZycpIHsKKyAgICAgIHRoaXMuYWRkRWRnZShhZnRlciwgbmFtZSk7CisgICAgfSBlbHNlIHsK
KyAgICAgIGZvciAoaSA9IDA7IGkgPCBhZnRlci5sZW5ndGg7IGkrKykgeworICAgICAgICB0aGlz
LmFkZEVkZ2UoYWZ0ZXJbaV0sIG5hbWUpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworRW1i
ZXIuREFHID0gREFHOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxl
IGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCisqLworCit2YXIgZ2V0ID0gRW1i
ZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsCisgICAgY2xhc3NpZnkgPSBFbWJlci5TdHJpbmcuY2xh
c3NpZnksCisgICAgZGVjYW1lbGl6ZSA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplOworCisvKioK
KyAgQW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkFwcGxpY2F0aW9uYCBpcyB0aGUgc3RhcnRpbmcgcG9p
bnQgZm9yIGV2ZXJ5IEVtYmVyCisgIGFwcGxpY2F0aW9uLiBJdCBoZWxwcyB0byBpbnN0YW50aWF0
ZSwgaW5pdGlhbGl6ZSBhbmQgY29vcmRpbmF0ZSB0aGUgbWFueQorICBvYmplY3RzIHRoYXQgbWFr
ZSB1cCB5b3VyIGFwcC4KKworICBFYWNoIEVtYmVyIGFwcCBoYXMgb25lIGFuZCBvbmx5IG9uZSBg
RW1iZXIuQXBwbGljYXRpb25gIG9iamVjdC4gSW4gZmFjdCwgdGhlCisgIHZlcnkgZmlyc3QgdGhp
bmcgeW91IHNob3VsZCBkbyBpbiB5b3VyIGFwcGxpY2F0aW9uIGlzIGNyZWF0ZSB0aGUgaW5zdGFu
Y2U6CisKKyAgYGBgamF2YXNjcmlwdAorICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24u
Y3JlYXRlKCk7CisgIGBgYAorCisgIFR5cGljYWxseSwgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBp
cyB0aGUgb25seSBnbG9iYWwgdmFyaWFibGUuIEFsbCBvdGhlcgorICBjbGFzc2VzIGluIHlvdXIg
YXBwIHNob3VsZCBiZSBwcm9wZXJ0aWVzIG9uIHRoZSBgRW1iZXIuQXBwbGljYXRpb25gIGluc3Rh
bmNlLAorICB3aGljaCBoaWdobGlnaHRzIGl0cyBmaXJzdCByb2xlOiBhIGdsb2JhbCBuYW1lc3Bh
Y2UuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgYSB2aWV3IGNsYXNzLCBpdCBtaWdo
dCBsb29rIGxpa2UgdGhpczoKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5NeVZpZXcgPSBFbWJl
ci5WaWV3LmV4dGVuZCgpOworICBgYGAKKworICBCeSBkZWZhdWx0LCBjYWxsaW5nIGBFbWJlci5B
cHBsaWNhdGlvbi5jcmVhdGUoKWAgd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUKKyAgeW91
ciAgYXBwbGljYXRpb24gYnkgY2FsbGluZyB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxp
emUoKWAgbWV0aG9kLiBJZgorICB5b3UgbmVlZCB0byBkZWxheSBpbml0aWFsaXphdGlvbiwgeW91
IGNhbiBjYWxsIHlvdXIgYXBwJ3MgYGRlZmVyUmVhZGluZXNzKClgCisgIG1ldGhvZC4gV2hlbiB5
b3UgYXJlIHJlYWR5IGZvciB5b3VyIGFwcCB0byBiZSBpbml0aWFsaXplZCwgY2FsbCBpdHMKKyAg
YGFkdmFuY2VSZWFkaW5lc3MoKWAgbWV0aG9kLgorCisgIEJlY2F1c2UgYEVtYmVyLkFwcGxpY2F0
aW9uYCBpbmhlcml0cyBmcm9tIGBFbWJlci5OYW1lc3BhY2VgLCBhbnkgY2xhc3NlcworICB5b3Ug
Y3JlYXRlIHdpbGwgaGF2ZSB1c2VmdWwgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyB3aGVuIGNhbGxp
bmcgYHRvU3RyaW5nKClgLgorICBTZWUgdGhlIGBFbWJlci5OYW1lc3BhY2VgIGRvY3VtZW50YXRp
b24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgV2hpbGUgeW91IGNhbiB0aGluayBvZiB5b3Vy
IGBFbWJlci5BcHBsaWNhdGlvbmAgYXMgYSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUKKyAgb3Ro
ZXIgY2xhc3NlcyBpbiB5b3VyIGFwcGxpY2F0aW9uLCB0aGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBy
ZXNwb25zaWJpbGl0aWVzCisgIGdvaW5nIG9uIHVuZGVyLXRoZS1ob29kIHRoYXQgeW91IG1heSB3
YW50IHRvIHVuZGVyc3RhbmQuCisKKyAgIyMjIEV2ZW50IERlbGVnYXRpb24KKworICBFbWJlciB1
c2VzIGEgdGVjaG5pcXVlIGNhbGxlZCBfZXZlbnQgZGVsZWdhdGlvbl8uIFRoaXMgYWxsb3dzIHRo
ZSBmcmFtZXdvcmsKKyAgdG8gc2V0IHVwIGEgZ2xvYmFsLCBzaGFyZWQgZXZlbnQgbGlzdGVuZXIg
aW5zdGVhZCBvZiByZXF1aXJpbmcgZWFjaCB2aWV3IHRvCisgIGRvIGl0IG1hbnVhbGx5LiBGb3Ig
ZXhhbXBsZSwgaW5zdGVhZCBvZiBlYWNoIHZpZXcgcmVnaXN0ZXJpbmcgaXRzIG93bgorICBgbW91
c2Vkb3duYCBsaXN0ZW5lciBvbiBpdHMgYXNzb2NpYXRlZCBlbGVtZW50LCBFbWJlciBzZXRzIHVw
IGEgYG1vdXNlZG93bmAKKyAgbGlzdGVuZXIgb24gdGhlIGBib2R5YC4KKworICBJZiBhIGBtb3Vz
ZWRvd25gIGV2ZW50IG9jY3VycywgRW1iZXIgd2lsbCBsb29rIGF0IHRoZSB0YXJnZXQgb2YgdGhl
IGV2ZW50IGFuZAorICBzdGFydCB3YWxraW5nIHVwIHRoZSBET00gbm9kZSB0cmVlLCBmaW5kaW5n
IGNvcnJlc3BvbmRpbmcgdmlld3MgYW5kIGludm9raW5nCisgIHRoZWlyIGBtb3VzZURvd25gIG1l
dGhvZCBhcyBpdCBnb2VzLgorCisgIGBFbWJlci5BcHBsaWNhdGlvbmAgaGFzIGEgbnVtYmVyIG9m
IGRlZmF1bHQgZXZlbnRzIHRoYXQgaXQgbGlzdGVucyBmb3IsIGFzCisgIHdlbGwgYXMgYSBtYXBw
aW5nIGZyb20gbG93ZXJjYXNlIGV2ZW50cyB0byBjYW1lbC1jYXNlZCB2aWV3IG1ldGhvZCBuYW1l
cy4gRm9yCisgIGV4YW1wbGUsIHRoZSBga2V5cHJlc3NgIGV2ZW50IGNhdXNlcyB0aGUgYGtleVBy
ZXNzYCBtZXRob2Qgb24gdGhlIHZpZXcgdG8gYmUKKyAgY2FsbGVkLCB0aGUgYGRibGNsaWNrYCBl
dmVudCBjYXVzZXMgYGRvdWJsZUNsaWNrYCB0byBiZSBjYWxsZWQsIGFuZCBzbyBvbi4KKworICBJ
ZiB0aGVyZSBpcyBhIGJyb3dzZXIgZXZlbnQgdGhhdCBFbWJlciBkb2VzIG5vdCBsaXN0ZW4gZm9y
IGJ5IGRlZmF1bHQsIHlvdQorICBjYW4gc3BlY2lmeSBjdXN0b20gZXZlbnRzIGFuZCB0aGVpciBj
b3JyZXNwb25kaW5nIHZpZXcgbWV0aG9kIG5hbWVzIGJ5CisgIHNldHRpbmcgdGhlIGFwcGxpY2F0
aW9uJ3MgYGN1c3RvbUV2ZW50c2AgcHJvcGVydHk6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAg
PSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoeworICAgIGN1c3RvbUV2ZW50czogeworICAgICAg
Ly8gYWRkIHN1cHBvcnQgZm9yIHRoZSBsb2FkZWRtZXRhZGF0YSBtZWRpYQorICAgICAgLy8gcGxh
eWVyIGV2ZW50CisgICAgICAnbG9hZGVkbWV0YWRhdGEnOiAibG9hZGVkTWV0YWRhdGEiCisgICAg
fQorICB9KTsKKyAgYGBgCisKKyAgQnkgZGVmYXVsdCwgdGhlIGFwcGxpY2F0aW9uIHNldHMgdXAg
dGhlc2UgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBkb2N1bWVudAorICBib2R5LiBIb3dldmVyLCBp
biBjYXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGluZyBhbiBFbWJlciBhcHBsaWNhdGlvbiBpbnNp
ZGUKKyAgYW4gZXhpc3RpbmcgcGFnZSwgeW91IG1heSB3YW50IGl0IHRvIHNldCB1cCB0aGUgbGlz
dGVuZXJzIG9uIGFuIGVsZW1lbnQKKyAgaW5zaWRlIHRoZSBib2R5LgorCisgIEZvciBleGFtcGxl
LCBpZiBvbmx5IGV2ZW50cyBpbnNpZGUgYSBET00gZWxlbWVudCB3aXRoIHRoZSBJRCBvZiBgZW1i
ZXItYXBwYAorICBzaG91bGQgYmUgZGVsZWdhdGVkLCBzZXQgeW91ciBhcHBsaWNhdGlvbidzIGBy
b290RWxlbWVudGAgcHJvcGVydHk6CisKKyAgYGBgamF2YXNjcmlwdAorICB3aW5kb3cuQXBwID0g
RW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICByb290RWxlbWVudDogJyNlbWJlci1hcHAn
CisgIH0pOworICBgYGAKKworICBUaGUgYHJvb3RFbGVtZW50YCBjYW4gYmUgZWl0aGVyIGEgRE9N
IGVsZW1lbnQgb3IgYSBqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvcgorICBzdHJpbmcuIE5vdGUg
dGhhdCAqdmlld3MgYXBwZW5kZWQgdG8gdGhlIERPTSBvdXRzaWRlIHRoZSByb290IGVsZW1lbnQg
d2lsbAorICBub3QgcmVjZWl2ZSBldmVudHMuKiBJZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290
IGVsZW1lbnQsIG1ha2Ugc3VyZSB5b3Ugb25seQorICBhcHBlbmQgdmlld3MgaW5zaWRlIGl0IQor
CisgIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGFkdmFudGFnZXMgb2YgZXZlbnQgZGVsZWdhdGlv
biBhbmQgdGhlIEVtYmVyIHZpZXcKKyAgbGF5ZXIsIGFuZCBhIGxpc3Qgb2YgdGhlIGV2ZW50IGxp
c3RlbmVycyB0aGF0IGFyZSBzZXR1cCBieSBkZWZhdWx0LCB2aXNpdCB0aGUKKyAgW0VtYmVyIFZp
ZXcgTGF5ZXIgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvdmlld19sYXllciN0b2Nf
ZXZlbnQtZGVsZWdhdGlvbikuCisKKyAgIyMjIEluaXRpYWxpemVycworCisgIExpYnJhcmllcyBv
biB0b3Agb2YgRW1iZXIgY2FuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgaW5pdGlhbGl6ZXJzLCBsaWtl
IHNvOgorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIo
eworICAgIG5hbWU6ICJzdG9yZSIsCisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWlu
ZXIsIGFwcGxpY2F0aW9uKSB7CisgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3N0b3JlJywgJ21h
aW4nLCBhcHBsaWNhdGlvbi5TdG9yZSk7CisgICAgfQorICB9KTsKKyAgYGBgCisKKyAgIyMjIFJv
dXRpbmcKKworICBJbiBhZGRpdGlvbiB0byBjcmVhdGluZyB5b3VyIGFwcGxpY2F0aW9uJ3Mgcm91
dGVyLCBgRW1iZXIuQXBwbGljYXRpb25gIGlzCisgIGFsc28gcmVzcG9uc2libGUgZm9yIHRlbGxp
bmcgdGhlIHJvdXRlciB3aGVuIHRvIHN0YXJ0IHJvdXRpbmcuIFRyYW5zaXRpb25zCisgIGJldHdl
ZW4gcm91dGVzIGNhbiBiZSBsb2dnZWQgd2l0aCB0aGUgTE9HX1RSQU5TSVRJT05TIGZsYWc6CisK
KyAgYGBgamF2YXNjcmlwdAorICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRl
KHsKKyAgICBMT0dfVFJBTlNJVElPTlM6IHRydWUKKyAgfSk7CisgIGBgYAorCisgIEJ5IGRlZmF1
bHQsIHRoZSByb3V0ZXIgd2lsbCBiZWdpbiB0cnlpbmcgdG8gdHJhbnNsYXRlIHRoZSBjdXJyZW50
IFVSTCBpbnRvCisgIGFwcGxpY2F0aW9uIHN0YXRlIG9uY2UgdGhlIGJyb3dzZXIgZW1pdHMgdGhl
IGBET01Db250ZW50UmVhZHlgIGV2ZW50LiBJZiB5b3UKKyAgbmVlZCB0byBkZWZlciByb3V0aW5n
LCB5b3UgY2FuIGNhbGwgdGhlIGFwcGxpY2F0aW9uJ3MgYGRlZmVyUmVhZGluZXNzKClgCisgIG1l
dGhvZC4gT25jZSByb3V0aW5nIGNhbiBiZWdpbiwgY2FsbCB0aGUgYGFkdmFuY2VSZWFkaW5lc3Mo
KWAgbWV0aG9kLgorCisgIElmIHRoZXJlIGlzIGFueSBzZXR1cCByZXF1aXJlZCBiZWZvcmUgcm91
dGluZyBiZWdpbnMsIHlvdSBjYW4gaW1wbGVtZW50IGEKKyAgYHJlYWR5KClgIG1ldGhvZCBvbiB5
b3VyIGFwcCB0aGF0IHdpbGwgYmUgaW52b2tlZCBpbW1lZGlhdGVseSBiZWZvcmUgcm91dGluZwor
ICBiZWdpbnMuCisKKyAgVG8gYmVnaW4gcm91dGluZywgeW91IG11c3QgaGF2ZSBhdCBhIG1pbmlt
dW0gYSB0b3AtbGV2ZWwgY29udHJvbGxlciBhbmQgdmlldy4KKyAgWW91IGRlZmluZSB0aGVzZSBh
cyBgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlcmAgYW5kIGBBcHAuQXBwbGljYXRpb25WaWV3YCwK
KyAgcmVzcGVjdGl2ZWx5LiBZb3VyIGFwcGxpY2F0aW9uIHdpbGwgbm90IHdvcmsgaWYgeW91IGRv
IG5vdCBkZWZpbmUgdGhlc2UgdHdvCisgIG1hbmRhdG9yeSBjbGFzc2VzLiBGb3IgZXhhbXBsZToK
KworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5BcHBsaWNhdGlvblZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZCh7CisgICAgdGVtcGxhdGVOYW1lOiAnYXBwbGljYXRpb24nCisgIH0pOworICBBcHAuQXBw
bGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoKTsKKyAgYGBgCisK
KyAgQGNsYXNzIEFwcGxpY2F0aW9uCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1i
ZXIuTmFtZXNwYWNlCisqLwordmFyIEFwcGxpY2F0aW9uID0gRW1iZXIuQXBwbGljYXRpb24gPSBF
bWJlci5OYW1lc3BhY2UuZXh0ZW5kKHsKKworICAvKioKKyAgICBUaGUgcm9vdCBET00gZWxlbWVu
dCBvZiB0aGUgQXBwbGljYXRpb24uIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBhcyBhbgorICAgIGVs
ZW1lbnQgb3IgYQorICAgIFtqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvciBzdHJpbmddKGh0dHA6
Ly9hcGkuanF1ZXJ5LmNvbS9jYXRlZ29yeS9zZWxlY3RvcnMvKS4KKworICAgIFRoaXMgaXMgdGhl
IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgQXBwbGljYXRpb24ncywKKyAgICBg
ZXZlbnREaXNwYXRjaGVyYCwgd2hpY2ggc2V0cyB1cCB0aGUgbGlzdGVuZXJzIGZvciBldmVudCBk
ZWxlZ2F0aW9uLiBFdmVyeQorICAgIHZpZXcgaW4geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgYmUg
YSBjaGlsZCBvZiB0aGUgZWxlbWVudCB5b3Ugc3BlY2lmeSBoZXJlLgorCisgICAgQHByb3BlcnR5
IHJvb3RFbGVtZW50CisgICAgQHR5cGUgRE9NRWxlbWVudAorICAgIEBkZWZhdWx0ICdib2R5Jwor
ICAqLworICByb290RWxlbWVudDogJ2JvZHknLAorCisgIC8qKgorICAgIFRoZSBgRW1iZXIuRXZl
bnREaXNwYXRjaGVyYCByZXNwb25zaWJsZSBmb3IgZGVsZWdhdGluZyBldmVudHMgdG8gdGhpcwor
ICAgIGFwcGxpY2F0aW9uJ3Mgdmlld3MuCisKKyAgICBUaGUgZXZlbnQgZGlzcGF0Y2hlciBpcyBj
cmVhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhdCBpbml0aWFsaXphdGlvbiB0aW1lCisgICAgYW5k
IHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBET00gZWxlbWVudCBkZXNjcmliZWQgYnkg
dGhlCisgICAgYXBwbGljYXRpb24ncyBgcm9vdEVsZW1lbnRgIHByb3BlcnR5LgorCisgICAgU2Vl
IHRoZSBkb2N1bWVudGF0aW9uIGZvciBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBmb3IgbW9yZSBp
bmZvcm1hdGlvbi4KKworICAgIEBwcm9wZXJ0eSBldmVudERpc3BhdGNoZXIKKyAgICBAdHlwZSBF
bWJlci5FdmVudERpc3BhdGNoZXIKKyAgICBAZGVmYXVsdCBudWxsCisgICovCisgIGV2ZW50RGlz
cGF0Y2hlcjogbnVsbCwKKworICAvKioKKyAgICBUaGUgRE9NIGV2ZW50cyBmb3Igd2hpY2ggdGhl
IGV2ZW50IGRpc3BhdGNoZXIgc2hvdWxkIGxpc3Rlbi4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSBh
cHBsaWNhdGlvbidzIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGxpc3RlbnMKKyAgICBmb3IgYSBz
ZXQgb2Ygc3RhbmRhcmQgRE9NIGV2ZW50cywgc3VjaCBhcyBgbW91c2Vkb3duYCBhbmQKKyAgICBg
a2V5dXBgLCBhbmQgZGVsZWdhdGVzIHRoZW0gdG8geW91ciBhcHBsaWNhdGlvbidzIGBFbWJlci5W
aWV3YAorICAgIGluc3RhbmNlcy4KKworICAgIElmIHlvdSB3b3VsZCBsaWtlIGFkZGl0aW9uYWwg
ZXZlbnRzIHRvIGJlIGRlbGVnYXRlZCB0byB5b3VyCisgICAgdmlld3MsIHNldCB5b3VyIGBFbWJl
ci5BcHBsaWNhdGlvbmAncyBgY3VzdG9tRXZlbnRzYCBwcm9wZXJ0eQorICAgIHRvIGEgaGFzaCBj
b250YWluaW5nIHRoZSBET00gZXZlbnQgbmFtZSBhcyB0aGUga2V5IGFuZCB0aGUKKyAgICBjb3Jy
ZXNwb25kaW5nIHZpZXcgbWV0aG9kIG5hbWUgYXMgdGhlIHZhbHVlLiBGb3IgZXhhbXBsZToKKwor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoewor
ICAgICAgY3VzdG9tRXZlbnRzOiB7CisgICAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciB0aGUgbG9h
ZGVkbWV0YWRhdGEgbWVkaWEKKyAgICAgICAgLy8gcGxheWVyIGV2ZW50CisgICAgICAgICdsb2Fk
ZWRtZXRhZGF0YSc6ICJsb2FkZWRNZXRhZGF0YSIKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAK
KworICAgIEBwcm9wZXJ0eSBjdXN0b21FdmVudHMKKyAgICBAdHlwZSBPYmplY3QKKyAgICBAZGVm
YXVsdCBudWxsCisgICovCisgIGN1c3RvbUV2ZW50czogbnVsbCwKKworICBpc0luaXRpYWxpemVk
OiBmYWxzZSwKKworICAvLyBTdGFydCBvZmYgdGhlIG51bWJlciBvZiBkZWZlcnJhbHMgYXQgMS4g
VGhpcyB3aWxsIGJlCisgIC8vIGRlY3JlbWVudGVkIGJ5IHRoZSBBcHBsaWNhdGlvbidzIG93biBg
aW5pdGlhbGl6ZWAgbWV0aG9kLgorICBfcmVhZGluZXNzRGVmZXJyYWxzOiAxLAorCisgIGluaXQ6
IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy4kKSB7IHRoaXMuJCA9IEVtYmVyLiQ7IH0KKyAg
ICB0aGlzLl9fY29udGFpbmVyX18gPSB0aGlzLmJ1aWxkQ29udGFpbmVyKCk7CisKKyAgICB0aGlz
LlJvdXRlciA9IHRoaXMuUm91dGVyIHx8IHRoaXMuZGVmYXVsdFJvdXRlcigpOworICAgIGlmICh0
aGlzLlJvdXRlcikgeyB0aGlzLlJvdXRlci5uYW1lc3BhY2UgPSB0aGlzOyB9CisKKyAgICB0aGlz
Ll9zdXBlcigpOworCisgICAgdGhpcy5kZWZlclVudGlsRE9NUmVhZHkoKTsKKyAgICB0aGlzLnNj
aGVkdWxlSW5pdGlhbGl6ZSgpOworCisgICAgRW1iZXIuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0nKTsKKyAgICBFbWJlci5kZWJ1ZygnRW1iZXIuVkVSU0lPTiA6ICcgKyBF
bWJlci5WRVJTSU9OKTsKKyAgICBFbWJlci5kZWJ1ZygnSGFuZGxlYmFycy5WRVJTSU9OIDogJyAr
IEVtYmVyLkhhbmRsZWJhcnMuVkVSU0lPTik7CisgICAgRW1iZXIuZGVidWcoJ2pRdWVyeS5WRVJT
SU9OIDogJyArIEVtYmVyLiQoKS5qcXVlcnkpOworICAgIEVtYmVyLmRlYnVnKCctLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKwor
ICAgIEJ1aWxkIHRoZSBjb250YWluZXIgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLgorCisg
ICAgQWxzbyByZWdpc3RlciBhIGRlZmF1bHQgYXBwbGljYXRpb24gdmlldyBpbiBjYXNlIHRoZSBh
cHBsaWNhdGlvbgorICAgIGl0c2VsZiBkb2VzIG5vdC4KKworICAgIEBtZXRob2QgYnVpbGRDb250
YWluZXIKKyAgICBAcmV0dXJuIHtFbWJlci5Db250YWluZXJ9IHRoZSBjb25maWd1cmVkIGNvbnRh
aW5lcgorICAqLworICBidWlsZENvbnRhaW5lcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRh
aW5lciA9IHRoaXMuX19jb250YWluZXJfXyA9IEFwcGxpY2F0aW9uLmJ1aWxkQ29udGFpbmVyKHRo
aXMpOworCisgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0
ZQorCisgICAgSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3B0ZWQgb3V0IG9mIHJvdXRpbmcg
YW5kIGhhcyBub3QgZXhwbGljaXRseQorICAgIGRlZmluZWQgYSByb3V0ZXIsIHN1cHBseSBhIGRl
ZmF1bHQgcm91dGVyIGZvciB0aGUgYXBwbGljYXRpb24gYXV0aG9yCisgICAgdG8gY29uZmlndXJl
LgorCisgICAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb24gZGV2ZWxvcGVycyB0byBkbzoKKworICAg
IGBgYGphdmFzY3JpcHQKKyAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKwor
ICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBtYXRjaCgiLyIpLnRv
KCJpbmRleCIpOworICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCBkZWZhdWx0Um91dGVy
CisgICAgQHJldHVybiB7RW1iZXIuUm91dGVyfSB0aGUgZGVmYXVsdCByb3V0ZXIKKyAgKi8KKyAg
ZGVmYXVsdFJvdXRlcjogZnVuY3Rpb24oKSB7CisgICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBBcHAu
Um91dGVyIGlmIG9uZSB3YXMgbm90IHN1cHBsaWVkIHRvIG1ha2UKKyAgICAvLyBpdCBwb3NzaWJs
ZSB0byBkbyBBcHAuUm91dGVyLm1hcCguLi4pIHdpdGhvdXQgZXhwbGljaXRseQorICAgIC8vIGNy
ZWF0aW5nIGEgcm91dGVyIGZpcnN0LgorICAgIGlmICh0aGlzLnJvdXRlciA9PT0gdW5kZWZpbmVk
KSB7CisgICAgICByZXR1cm4gRW1iZXIuUm91dGVyLmV4dGVuZCgpOworICAgIH0KKyAgfSwKKwor
ICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgRGVmZXIgRW1iZXIgcmVhZGluZXNzIHVudGlsIERP
TSByZWFkaW5lc3MuIEJ5IGRlZmF1bHQsIEVtYmVyCisgICAgd2lsbCB3YWl0IGZvciBib3RoIERP
TSByZWFkaW5lc3MgYW5kIGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uLAorICAgIGFzIHdlbGwg
YXMgYW55IGRlZmVycmFscyByZWdpc3RlcmVkIGJ5IGluaXRpYWxpemVycy4KKworICAgIEBtZXRo
b2QgZGVmZXJVbnRpbERPTVJlYWR5CisgICovCisgIGRlZmVyVW50aWxET01SZWFkeTogZnVuY3Rp
b24oKSB7CisgICAgdGhpcy5kZWZlclJlYWRpbmVzcygpOworCisgICAgdmFyIHNlbGYgPSB0aGlz
OworICAgIHRoaXMuJCgpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgICAgc2VsZi5hZHZhbmNlUmVh
ZGluZXNzKCk7CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIEF1
dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24gb25jZSB0aGUgRE9NIGhhcwor
ICAgIGJlY29tZSByZWFkeS4KKworICAgIFRoZSBpbml0aWFsaXphdGlvbiBpdHNlbGYgaXMgZGVm
ZXJyZWQgdXNpbmcgRW1iZXIucnVuLm9uY2UsCisgICAgd2hpY2ggZW5zdXJlcyB0aGF0IGFwcGxp
Y2F0aW9uIGxvYWRpbmcgZmluaXNoZXMgYmVmb3JlCisgICAgYm9vdGluZy4KKworICAgIElmIHlv
dSBhcmUgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBjb2RlLCB5b3Ugc2hvdWxkIGNhbGwKKyAgICBg
ZGVmZXJSZWFkaW5lc3MoKWAgdG8gZGVmZXIgYm9vdGluZywgYW5kIHRoZW4gY2FsbAorICAgIGBh
ZHZhbmNlUmVhZGluZXNzKClgIG9uY2UgYWxsIG9mIHlvdXIgY29kZSBoYXMgZmluaXNoZWQKKyAg
ICBsb2FkaW5nLgorCisgICAgQG1ldGhvZCBzY2hlZHVsZUluaXRpYWxpemUKKyAgKi8KKyAgc2No
ZWR1bGVJbml0aWFsaXplOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAg
dGhpcy4kKCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgICBpZiAoc2VsZi5pc0Rlc3Ryb3llZCB8
fCBzZWxmLmlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKyAgICAgIEVtYmVyLnJ1bi5vbmNlKHNlbGYs
ICdpbml0aWFsaXplJyk7CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAgVXNlIHRoaXMgdG8g
ZGVmZXIgcmVhZGluZXNzIHVudGlsIHNvbWUgY29uZGl0aW9uIGlzIHRydWUuCisKKyAgICBFeGFt
cGxlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNy
ZWF0ZSgpOworICAgIEFwcC5kZWZlclJlYWRpbmVzcygpOworCisgICAgalF1ZXJ5LmdldEpTT04o
Ii9hdXRoLXRva2VuIiwgZnVuY3Rpb24odG9rZW4pIHsKKyAgICAgIEFwcC50b2tlbiA9IHRva2Vu
OworICAgICAgQXBwLmFkdmFuY2VSZWFkaW5lc3MoKTsKKyAgICB9KTsKKyAgICBgYGAKKworICAg
IFRoaXMgYWxsb3dzIHlvdSB0byBwZXJmb3JtIGFzeW5jaHJvbm91cyBzZXR1cCBsb2dpYyBhbmQg
ZGVmZXIKKyAgICBib290aW5nIHlvdXIgYXBwbGljYXRpb24gdW50aWwgdGhlIHNldHVwIGhhcyBm
aW5pc2hlZC4KKworICAgIEhvd2V2ZXIsIGlmIHRoZSBzZXR1cCByZXF1aXJlcyBhIGxvYWRpbmcg
VUksIGl0IG1pZ2h0IGJlIGJldHRlcgorICAgIHRvIHVzZSB0aGUgcm91dGVyIGZvciB0aGlzIHB1
cnBvc2UuCisKKyAgICBAbWV0aG9kIGRlZmVyUmVhZGluZXNzCisgICovCisgIGRlZmVyUmVhZGlu
ZXNzOiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgZGVmZXIgcmVh
ZGluZXNzIHNpbmNlIHRoZSBgcmVhZHkoKWAgaG9vayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4i
LCB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPiAwKTsKKyAgICB0aGlzLl9yZWFkaW5lc3NEZWZl
cnJhbHMrKzsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIGFkdmFuY2VSZWFkaW5lc3MKKyAg
ICBAc2VlIHtFbWJlci5BcHBsaWNhdGlvbiNkZWZlclJlYWRpbmVzc30KKyAgKi8KKyAgYWR2YW5j
ZVJlYWRpbmVzczogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzLS07
CisKKyAgICBpZiAodGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzID09PSAwKSB7CisgICAgICBFbWJl
ci5ydW4ub25jZSh0aGlzLCB0aGlzLmRpZEJlY29tZVJlYWR5KTsKKyAgICB9CisgIH0sCisKKyAg
LyoqCisgICAgcmVnaXN0ZXJzIGEgZmFjdG9yeSBmb3IgbGF0ZXIgaW5qZWN0aW9uCisKKyAgICBF
eGFtcGxlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9u
LmNyZWF0ZSgpOworCisgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoe30pOwor
ICAgIEFwcC5PcmFuZ2UgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHt9KTsKKyAgICBBcHAuRW1haWwg
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7fSk7CisKKyAgICBBcHAucmVnaXN0ZXIoJ21vZGVsOnVz
ZXInLCBBcHAuUGVyc29uLCB7c2luZ2xldG9uOiBmYWxzZSB9KTsKKyAgICBBcHAucmVnaXN0ZXIo
J2ZydWl0OmZhdm9yaXRlJywgQXBwLk9yYW5nZSk7CisgICAgQXBwLnJlZ2lzdGVyKCdjb21tdW5p
Y2F0aW9uOm1haW4nLCBBcHAuRW1haWwsIHtzaW5nbGV0b246IGZhbHNlfSk7CisgICAgYGBgCisK
KyAgICBAbWV0aG9kIHJlZ2lzdGVyCisgICAgQHBhcmFtICB0eXBlIHtTdHJpbmd9CisgICAgQHBh
cmFtICBuYW1lIHtTdHJpbmd9CisgICAgQHBhcmFtICBmYWN0b3J5IHtTdHJpbmd9CisgICAgQHBh
cmFtICBvcHRpb25zIHtTdHJpbmd9IChvcHRpb25hbCkKKyAgKiovCisgIHJlZ2lzdGVyOiBmdW5j
dGlvbigpIHsKKyAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOworICAgIGNv
bnRhaW5lci5yZWdpc3Rlci5hcHBseShjb250YWluZXIsIGFyZ3VtZW50cyk7CisgIH0sCisgIC8q
KgorICAgIGRlZmluZXMgYW4gaW5qZWN0aW9uIG9yIHR5cGVJbmplY3Rpb24KKworICAgIEV4YW1w
bGU6CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLmluamVjdCg8ZnVsbF9uYW1lIG9yIHR5
cGU+LCA8cHJvcGVydHkgbmFtZT4sIDxmdWxsX25hbWU+KQorICAgIEFwcC5pbmplY3QoJ21vZGVs
OnVzZXInLCAnZW1haWwnLCAnbW9kZWw6ZW1haWwnKQorICAgIEFwcC5pbmplY3QoJ21vZGVsJywg
J3NvdXJjZScsICdzb3VyY2U6bWFpbicpCisgICAgYGBgCisKKyAgICBAbWV0aG9kIGluamVjdAor
ICAgIEBwYXJhbSAgZmFjdG9yeU5hbWVPclR5cGUge1N0cmluZ30KKyAgICBAcGFyYW0gIHByb3Bl
cnR5IHtTdHJpbmd9CisgICAgQHBhcmFtICBpbmplY3Rpb25OYW1lIHtTdHJpbmd9CisgICoqLwor
ICBpbmplY3Q6IGZ1bmN0aW9uKCl7CisgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX19jb250YWlu
ZXJfXzsKKyAgICBjb250YWluZXIuaW5qZWN0aW9uLmFwcGx5KGNvbnRhaW5lciwgYXJndW1lbnRz
KTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgSW5pdGlhbGl6ZSB0aGUgYXBw
bGljYXRpb24uIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgorCisgICAgUnVuIGFueSBpbml0
aWFsaXplcnMgYW5kIHJ1biB0aGUgYXBwbGljYXRpb24gbG9hZCBob29rLiBUaGVzZSBob29rcyBt
YXkKKyAgICBjaG9vc2UgdG8gZGVmZXIgcmVhZGluZXNzLiBGb3IgZXhhbXBsZSwgYW4gYXV0aGVu
dGljYXRpb24gaG9vayBtaWdodCB3YW50CisgICAgdG8gZGVmZXIgcmVhZGluZXNzIHVudGlsIHRo
ZSBhdXRoIHRva2VuIGhhcyBiZWVuIHJldHJpZXZlZC4KKworICAgIEBtZXRob2QgaW5pdGlhbGl6
ZQorICAqLworICBpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5hc3NlcnQoIkFw
cGxpY2F0aW9uIGluaXRpYWxpemUgbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UiLCAhdGhpcy5pc0lu
aXRpYWxpemVkKTsKKyAgICBFbWJlci5hc3NlcnQoIkNhbm5vdCBpbml0aWFsaXplIGEgZGVzdHJv
eWVkIGFwcGxpY2F0aW9uIiwgIXRoaXMuaXNEZXN0cm95ZWQpOworICAgIHRoaXMuaXNJbml0aWFs
aXplZCA9IHRydWU7CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgQXBwLlJvdXRlciBtdXN0
IGFscmVhZHkgYmUgYXNzaWduZWQKKyAgICB0aGlzLl9fY29udGFpbmVyX18ucmVnaXN0ZXIoJ3Jv
dXRlcicsICdtYWluJywgdGhpcy5Sb3V0ZXIpOworCisgICAgdGhpcy5ydW5Jbml0aWFsaXplcnMo
KTsKKyAgICBFbWJlci5ydW5Mb2FkSG9va3MoJ2FwcGxpY2F0aW9uJywgdGhpcyk7CisKKyAgICAv
LyBBdCB0aGlzIHBvaW50LCBhbnkgaW5pdGlhbGl6ZXJzIG9yIGxvYWQgaG9va3MgdGhhdCB3b3Vs
ZCBoYXZlIHdhbnRlZAorICAgIC8vIHRvIGRlZmVyIHJlYWRpbmVzcyBoYXZlIGZpcmVkLiBJbiBn
ZW5lcmFsLCBhZHZhbmNpbmcgcmVhZGluZXNzIGhlcmUKKyAgICAvLyB3aWxsIHByb2NlZWQgdG8g
ZGlkQmVjb21lUmVhZHkuCisgICAgdGhpcy5hZHZhbmNlUmVhZGluZXNzKCk7CisKKyAgICByZXR1
cm4gdGhpczsKKyAgfSwKKworICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgZ2V0KHRoaXMsICdf
X2NvbnRhaW5lcl9fJykuZGVzdHJveSgpOworICAgIHRoaXMuYnVpbGRDb250YWluZXIoKTsKKwor
ICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgIHRoaXMuaW5pdGlhbGl6ZSgpOwor
ICAgIHRoaXMuc3RhcnRSb3V0aW5nKCk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAg
ICBAbWV0aG9kIHJ1bkluaXRpYWxpemVycworICAqLworICBydW5Jbml0aWFsaXplcnM6IGZ1bmN0
aW9uKCkgeworICAgIHZhciBpbml0aWFsaXplcnMgPSBnZXQodGhpcy5jb25zdHJ1Y3RvciwgJ2lu
aXRpYWxpemVycycpLAorICAgICAgICBjb250YWluZXIgPSB0aGlzLl9fY29udGFpbmVyX18sCisg
ICAgICAgIGdyYXBoID0gbmV3IEVtYmVyLkRBRygpLAorICAgICAgICBuYW1lc3BhY2UgPSB0aGlz
LAorICAgICAgICBwcm9wZXJ0aWVzLCBpLCBpbml0aWFsaXplcjsKKworICAgIGZvciAoaT0wOyBp
PGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykgeworICAgICAgaW5pdGlhbGl6ZXIgPSBpbml0aWFs
aXplcnNbaV07CisgICAgICBncmFwaC5hZGRFZGdlcyhpbml0aWFsaXplci5uYW1lLCBpbml0aWFs
aXplci5pbml0aWFsaXplLCBpbml0aWFsaXplci5iZWZvcmUsIGluaXRpYWxpemVyLmFmdGVyKTsK
KyAgICB9CisKKyAgICBncmFwaC50b3Bzb3J0KGZ1bmN0aW9uICh2ZXJ0ZXgpIHsKKyAgICAgIHZh
ciBpbml0aWFsaXplciA9IHZlcnRleC52YWx1ZTsKKyAgICAgIGluaXRpYWxpemVyKGNvbnRhaW5l
ciwgbmFtZXNwYWNlKTsKKyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2QgZGlkQmVjb21lUmVhZHkKKyAgKi8KKyAgZGlkQmVjb21lUmVhZHk6IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMuc2V0dXBFdmVudERpc3BhdGNoZXIoKTsKKyAgICB0aGlzLnJlYWR5KCk7
IC8vIHVzZXIgaG9vaworICAgIHRoaXMuc3RhcnRSb3V0aW5nKCk7CisKKyAgICBpZiAoIUVtYmVy
LnRlc3RpbmcpIHsKKyAgICAgIC8vIEVhZ2VybHkgbmFtZSBhbGwgY2xhc3NlcyB0aGF0IGFyZSBh
bHJlYWR5IGxvYWRlZAorICAgICAgRW1iZXIuTmFtZXNwYWNlLnByb2Nlc3NBbGwoKTsKKyAgICAg
IEVtYmVyLkJPT1RFRCA9IHRydWU7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIEBwcml2YXRl
CisKKyAgICBTZXR1cCB1cCB0aGUgZXZlbnQgZGlzcGF0Y2hlciB0byByZWNlaXZlIGV2ZW50cyBv
biB0aGUKKyAgICBhcHBsaWNhdGlvbidzIGByb290RWxlbWVudGAgd2l0aCBhbnkgcmVnaXN0ZXJl
ZAorICAgIGBjdXN0b21FdmVudHNgLgorCisgICAgQG1ldGhvZCBzZXR1cEV2ZW50RGlzcGF0Y2hl
cgorICAqLworICBzZXR1cEV2ZW50RGlzcGF0Y2hlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGV2
ZW50RGlzcGF0Y2hlciA9IHRoaXMuY3JlYXRlRXZlbnREaXNwYXRjaGVyKCksCisgICAgICAgIGN1
c3RvbUV2ZW50cyAgICA9IGdldCh0aGlzLCAnY3VzdG9tRXZlbnRzJyk7CisKKyAgICBldmVudERp
c3BhdGNoZXIuc2V0dXAoY3VzdG9tRXZlbnRzKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0
ZQorCisgICAgQ3JlYXRlIGFuIGV2ZW50IGRpc3BhdGNoZXIgZm9yIHRoZSBhcHBsaWNhdGlvbidz
IGByb290RWxlbWVudGAuCisKKyAgICBAbWV0aG9kIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlcgorICAq
LworICBjcmVhdGVFdmVudERpc3BhdGNoZXI6IGZ1bmN0aW9uKCkgeworICAgIHZhciByb290RWxl
bWVudCA9IGdldCh0aGlzLCAncm9vdEVsZW1lbnQnKSwKKyAgICAgICAgZXZlbnREaXNwYXRjaGVy
ID0gRW1iZXIuRXZlbnREaXNwYXRjaGVyLmNyZWF0ZSh7CisgICAgICAgICAgcm9vdEVsZW1lbnQ6
IHJvb3RFbGVtZW50CisgICAgICAgIH0pOworCisgICAgc2V0KHRoaXMsICdldmVudERpc3BhdGNo
ZXInLCBldmVudERpc3BhdGNoZXIpOworICAgIHJldHVybiBldmVudERpc3BhdGNoZXI7CisgIH0s
CisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIElmIHRoZSBhcHBsaWNhdGlvbiBoYXMgYSBy
b3V0ZXIsIHVzZSBpdCB0byByb3V0ZSB0byB0aGUgY3VycmVudCBVUkwsIGFuZAorICAgIHRyaWdn
ZXIgYSBuZXcgY2FsbCB0byBgcm91dGVgIHdoZW5ldmVyIHRoZSBVUkwgY2hhbmdlcy4KKworICAg
IEBtZXRob2Qgc3RhcnRSb3V0aW5nCisgICAgQHByb3BlcnR5IHJvdXRlciB7RW1iZXIuUm91dGVy
fQorICAqLworICBzdGFydFJvdXRpbmc6IGZ1bmN0aW9uKCkgeworICAgIHZhciByb3V0ZXIgPSB0
aGlzLl9fY29udGFpbmVyX18ubG9va3VwKCdyb3V0ZXI6bWFpbicpOworICAgIGlmICghcm91dGVy
KSB7IHJldHVybjsgfQorCisgICAgcm91dGVyLnN0YXJ0Um91dGluZygpOworICB9LAorCisgIGhh
bmRsZVVSTDogZnVuY3Rpb24odXJsKSB7CisgICAgdmFyIHJvdXRlciA9IHRoaXMuX19jb250YWlu
ZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJyk7CisKKyAgICByb3V0ZXIuaGFuZGxlVVJMKHVybCk7
CisgIH0sCisKKyAgLyoqCisgICAgQ2FsbGVkIHdoZW4gdGhlIEFwcGxpY2F0aW9uIGhhcyBiZWNv
bWUgcmVhZHkuCisgICAgVGhlIGNhbGwgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBET00gaGFz
IGJlY29tZSByZWFkeS4KKworICAgIEBldmVudCByZWFkeQorICAqLworICByZWFkeTogRW1iZXIu
SywKKworICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgRW1iZXIuQk9PVEVEID0gZmFs
c2U7CisKKyAgICB2YXIgZXZlbnREaXNwYXRjaGVyID0gZ2V0KHRoaXMsICdldmVudERpc3BhdGNo
ZXInKTsKKyAgICBpZiAoZXZlbnREaXNwYXRjaGVyKSB7IGV2ZW50RGlzcGF0Y2hlci5kZXN0cm95
KCk7IH0KKworICAgIGdldCh0aGlzLCAnX19jb250YWluZXJfXycpLmRlc3Ryb3koKTsKKyAgfSwK
KworICBpbml0aWFsaXplcjogZnVuY3Rpb24ob3B0aW9ucykgeworICAgIHRoaXMuY29uc3RydWN0
b3IuaW5pdGlhbGl6ZXIob3B0aW9ucyk7CisgIH0KK30pOworCitFbWJlci5BcHBsaWNhdGlvbi5y
ZW9wZW5DbGFzcyh7CisgIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IFsnaW5pdGlhbGl6ZXJzJ10s
CisgIGluaXRpYWxpemVyczogRW1iZXIuQSgpLAorICBpbml0aWFsaXplcjogZnVuY3Rpb24oaW5p
dGlhbGl6ZXIpIHsKKyAgICB2YXIgaW5pdGlhbGl6ZXJzID0gZ2V0KHRoaXMsICdpbml0aWFsaXpl
cnMnKTsKKworICAgIEVtYmVyLmFzc2VydCgiVGhlIGluaXRpYWxpemVyICciICsgaW5pdGlhbGl6
ZXIubmFtZSArICInIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIsICFpbml0aWFsaXplcnMu
ZmluZFByb3BlcnR5KCduYW1lJywgaW5pdGlhbGl6ZXJzLm5hbWUpKTsKKyAgICBFbWJlci5hc3Nl
cnQoIkFuIGluamVjdGlvbiBjYW5ub3QgYmUgcmVnaXN0ZXJlZCB3aXRoIGJvdGggYSBiZWZvcmUg
YW5kIGFuIGFmdGVyIiwgIShpbml0aWFsaXplci5iZWZvcmUgJiYgaW5pdGlhbGl6ZXIuYWZ0ZXIp
KTsKKyAgICBFbWJlci5hc3NlcnQoIkFuIGluamVjdGlvbiBjYW5ub3QgYmUgcmVnaXN0ZXJlZCB3
aXRob3V0IGFuIGluamVjdGlvbiBmdW5jdGlvbiIsIEVtYmVyLmNhbkludm9rZShpbml0aWFsaXpl
ciwgJ2luaXRpYWxpemUnKSk7CisKKyAgICBpbml0aWFsaXplcnMucHVzaChpbml0aWFsaXplcik7
CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFRoaXMgY3JlYXRlcyBhIGNvbnRh
aW5lciB3aXRoIHRoZSBkZWZhdWx0IEVtYmVyIG5hbWluZyBjb252ZW50aW9ucy4KKworICAgIEl0
IGFsc28gY29uZmlndXJlcyB0aGUgY29udGFpbmVyOgorCisgICAgKiByZWdpc3RlcmVkIHZpZXdz
IGFyZSBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhleSBhcmUgbG9va2VkIHVwICh0aGV5IGFyZQorICAg
ICAgbm90IHNpbmdsZXRvbnMpCisgICAgKiByZWdpc3RlcmVkIHRlbXBsYXRlcyBhcmUgbm90IGZh
Y3RvcmllczsgdGhlIHJlZ2lzdGVyZWQgdmFsdWUgaXMKKyAgICAgIHJldHVybmVkIGRpcmVjdGx5
LgorICAgICogdGhlIHJvdXRlciByZWNlaXZlcyB0aGUgYXBwbGljYXRpb24gYXMgaXRzIGBuYW1l
c3BhY2VgIHByb3BlcnR5CisgICAgKiBhbGwgY29udHJvbGxlcnMgcmVjZWl2ZSB0aGUgcm91dGVy
IGFzIHRoZWlyIGB0YXJnZXRgIGFuZCBgY29udHJvbGxlcnNgCisgICAgICBwcm9wZXJ0aWVzCisg
ICAgKiBhbGwgY29udHJvbGxlcnMgcmVjZWl2ZSB0aGUgYXBwbGljYXRpb24gYXMgdGhlaXIgYG5h
bWVzcGFjZWAgcHJvcGVydHkKKyAgICAqIHRoZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRo
ZSBhcHBsaWNhdGlvbiBjb250cm9sbGVyIGFzIGl0cworICAgICAgYGNvbnRyb2xsZXJgIHByb3Bl
cnR5CisgICAgKiB0aGUgYXBwbGljYXRpb24gdmlldyByZWNlaXZlcyB0aGUgYXBwbGljYXRpb24g
dGVtcGxhdGUgYXMgaXRzCisgICAgICBgZGVmYXVsdFRlbXBsYXRlYCBwcm9wZXJ0eQorCisgICAg
QG1ldGhvZCBidWlsZENvbnRhaW5lcgorICAgIEBzdGF0aWMKKyAgICBAcGFyYW0ge0VtYmVyLkFw
cGxpY2F0aW9ufSBuYW1lc3BhY2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJ1aWxkIHRoZQorICAgICAg
Y29udGFpbmVyIGZvci4KKyAgICBAcmV0dXJuIHtFbWJlci5Db250YWluZXJ9IHRoZSBidWlsdCBj
b250YWluZXIKKyAgKi8KKyAgYnVpbGRDb250YWluZXI6IGZ1bmN0aW9uKG5hbWVzcGFjZSkgewor
ICAgIHZhciBjb250YWluZXIgPSBuZXcgRW1iZXIuQ29udGFpbmVyKCk7CisgICAgRW1iZXIuQ29u
dGFpbmVyLmRlZmF1bHRDb250YWluZXIgPSBFbWJlci5Db250YWluZXIuZGVmYXVsdENvbnRhaW5l
ciB8fCBjb250YWluZXI7CisKKyAgICBjb250YWluZXIuc2V0ID0gRW1iZXIuc2V0OworICAgIGNv
bnRhaW5lci5yZXNvbHZlciA9IHJlc29sdmVyRm9yKG5hbWVzcGFjZSk7CisgICAgY29udGFpbmVy
Lm9wdGlvbnNGb3JUeXBlKCd2aWV3JywgeyBzaW5nbGV0b246IGZhbHNlIH0pOworICAgIGNvbnRh
aW5lci5vcHRpb25zRm9yVHlwZSgndGVtcGxhdGUnLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsK
KyAgICBjb250YWluZXIucmVnaXN0ZXIoJ2FwcGxpY2F0aW9uJywgJ21haW4nLCBuYW1lc3BhY2Us
IHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOworICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ3JvdXRl
cjptYWluJywgJ25hbWVzcGFjZScsICdhcHBsaWNhdGlvbjptYWluJyk7CisKKyAgICBjb250YWlu
ZXIudHlwZUluamVjdGlvbignY29udHJvbGxlcicsICd0YXJnZXQnLCAncm91dGVyOm1haW4nKTsK
KyAgICBjb250YWluZXIudHlwZUluamVjdGlvbignY29udHJvbGxlcicsICduYW1lc3BhY2UnLCAn
YXBwbGljYXRpb246bWFpbicpOworCisgICAgY29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ3JvdXRl
JywgJ3JvdXRlcicsICdyb3V0ZXI6bWFpbicpOworCisgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAg
fQorfSk7CisKKy8qKgorICBAcHJpdmF0ZQorCisgIFRoaXMgZnVuY3Rpb24gZGVmaW5lcyB0aGUg
ZGVmYXVsdCBsb29rdXAgcnVsZXMgZm9yIGNvbnRhaW5lciBsb29rdXBzOgorCisgICogdGVtcGxh
dGVzIGFyZSBsb29rZWQgdXAgb24gYEVtYmVyLlRFTVBMQVRFU2AKKyAgKiBvdGhlciBuYW1lcyBh
cmUgbG9va2VkIHVwIG9uIHRoZSBhcHBsaWNhdGlvbiBhZnRlciBjbGFzc2lmeWluZyB0aGUgbmFt
ZS4KKyAgICBGb3IgZXhhbXBsZSwgYGNvbnRyb2xsZXI6cG9zdGAgbG9va3MgdXAgYEFwcC5Qb3N0
Q29udHJvbGxlcmAgYnkgZGVmYXVsdC4KKyAgKiBpZiB0aGUgZGVmYXVsdCBsb29rdXAgZmFpbHMs
IGxvb2sgZm9yIHJlZ2lzdGVyZWQgY2xhc3NlcyBvbiB0aGUgY29udGFpbmVyCisKKyAgVGhpcyBh
bGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHJlZ2lzdGVyIGRlZmF1bHQgaW5qZWN0aW9ucyBpbiB0
aGUgY29udGFpbmVyCisgIHRoYXQgY291bGQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgbm9ybWFsIG5h
bWluZyBjb252ZW50aW9uLgorCisgIEBwYXJhbSB7RW1iZXIuTmFtZXNwYWNlfSBuYW1lc3BhY2Ug
dGhlIG5hbWVzcGFjZSB0byBsb29rIGZvciBjbGFzc2VzCisgIEByZXR1cm4ge2FueX0gdGhlIHJl
c29sdmVkIHZhbHVlIGZvciBhIGdpdmVuIGxvb2t1cAorKi8KK2Z1bmN0aW9uIHJlc29sdmVyRm9y
KG5hbWVzcGFjZSkgeworICByZXR1cm4gZnVuY3Rpb24oZnVsbE5hbWUpIHsKKyAgICB2YXIgbmFt
ZVBhcnRzID0gZnVsbE5hbWUuc3BsaXQoIjoiKSwKKyAgICAgICAgdHlwZSA9IG5hbWVQYXJ0c1sw
XSwgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKKworICAgIGlmICh0eXBlID09PSAndGVtcGxhdGUnKSB7
CisgICAgICB2YXIgdGVtcGxhdGVOYW1lID0gbmFtZS5yZXBsYWNlKC9cLi9nLCAnLycpOworICAg
ICAgaWYgKEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdKSB7CisgICAgICAgIHJldHVybiBF
bWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGVO
YW1lID0gZGVjYW1lbGl6ZSh0ZW1wbGF0ZU5hbWUpOworICAgICAgaWYgKEVtYmVyLlRFTVBMQVRF
U1t0ZW1wbGF0ZU5hbWVdKSB7CisgICAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbdGVtcGxh
dGVOYW1lXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHlwZSA9PT0gJ2NvbnRyb2xsZXIn
IHx8IHR5cGUgPT09ICdyb3V0ZScgfHwgdHlwZSA9PT0gJ3ZpZXcnKSB7CisgICAgICBuYW1lID0g
bmFtZS5yZXBsYWNlKC9cLi9nLCAnXycpOworICAgIH0KKworICAgIHZhciBjbGFzc05hbWUgPSBj
bGFzc2lmeShuYW1lKSArIGNsYXNzaWZ5KHR5cGUpOworICAgIHZhciBmYWN0b3J5ID0gZ2V0KG5h
bWVzcGFjZSwgY2xhc3NOYW1lKTsKKworICAgIGlmIChmYWN0b3J5KSB7IHJldHVybiBmYWN0b3J5
OyB9CisgIH07Cit9CisKK0VtYmVyLnJ1bkxvYWRIb29rcygnRW1iZXIuQXBwbGljYXRpb24nLCBF
bWJlci5BcHBsaWNhdGlvbik7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKworfSko
KTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBl
bWJlci1yb3V0aW5nCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
Cit2YXIgQ29udHJvbGxlcnNQcm94eSA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICBjb250cm9s
bGVyOiBudWxsLAorCisgIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24oY29udHJvbGxlck5hbWUp
IHsKKyAgICB2YXIgY29udHJvbGxlciA9IGdldCh0aGlzLCAnY29udHJvbGxlcicpLAorICAgICAg
bmVlZHMgPSBnZXQoY29udHJvbGxlciwgJ25lZWRzJyksCisgICAgICBjb250YWluZXIgPSBjb250
cm9sbGVyLmdldCgnY29udGFpbmVyJyksCisgICAgICBkZXBlbmRlbmN5OworCisgICAgZm9yICh2
YXIgaT0wLCBsPW5lZWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIGRlcGVuZGVuY3kgPSBu
ZWVkc1tpXTsKKyAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBjb250cm9sbGVyTmFtZSkgeworICAg
ICAgICByZXR1cm4gY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlck5h
bWUpOworICAgICAgfQorICAgIH0KKyAgfQorfSk7CisKK2Z1bmN0aW9uIHZlcmlmeURlcGVuZGVu
Y2llcyhjb250cm9sbGVyKSB7CisgIHZhciBuZWVkcyA9IGdldChjb250cm9sbGVyLCAnbmVlZHMn
KSwKKyAgICAgIGNvbnRhaW5lciA9IGdldChjb250cm9sbGVyLCAnY29udGFpbmVyJyksCisgICAg
ICBkZXBlbmRlbmN5LCBzYXRpc2ZpZWQgPSB0cnVlOworCisgIGZvciAodmFyIGk9MCwgbD1uZWVk
cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgZGVwZW5kZW5jeSA9IG5lZWRzW2ldOworICAgIGlm
IChkZXBlbmRlbmN5LmluZGV4T2YoJzonKSA9PT0gLTEpIHsKKyAgICAgIGRlcGVuZGVuY3kgPSAi
Y29udHJvbGxlcjoiICsgZGVwZW5kZW5jeTsKKyAgICB9CisKKyAgICBpZiAoIWNvbnRhaW5lci5o
YXMoZGVwZW5kZW5jeSkpIHsKKyAgICAgIHNhdGlzZmllZCA9IGZhbHNlOworICAgICAgRW1iZXIu
YXNzZXJ0KGNvbnRyb2xsZXIgKyAiIG5lZWRzICIgKyBkZXBlbmRlbmN5ICsgIiBidXQgaXQgZG9l
cyBub3QgZXhpc3QiLCBmYWxzZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNhdGlzZmllZDsK
K30KKworRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7CisgIGNvbmNhdGVuYXRlZFByb3Bl
cnRpZXM6IFsnbmVlZHMnXSwKKyAgbmVlZHM6IFtdLAorCisgIGluaXQ6IGZ1bmN0aW9uKCkgewor
ICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAvLyBTdHJ1Y3R1
cmUgYXNzZXJ0cyB0byBzdGlsbCBkbyB2ZXJpZmljYXRpb24gYnV0IG5vdCBzdHJpbmcgY29uY2F0
IGluIHByb2R1Y3Rpb24KKyAgICBpZighdmVyaWZ5RGVwZW5kZW5jaWVzKHRoaXMpKSB7CisgICAg
ICBFbWJlci5hc3NlcnQoIk1pc3NpbmcgZGVwZW5kZW5jaWVzIiwgZmFsc2UpOworICAgIH0KKyAg
fSwKKworICBjb250cm9sbGVyRm9yOiBmdW5jdGlvbihjb250cm9sbGVyTmFtZSkgeworICAgIEVt
YmVyLmRlcHJlY2F0ZSgiQ29udHJvbGxlciNjb250cm9sbGVyRm9yIGlzIGRlcGNyZWNhdGVkLCBw
bGVhc2UgdXNlIENvbnRyb2xsZXIjbmVlZHMgaW5zdGVhZCIpOworICAgIHZhciBjb250YWluZXIg
PSBnZXQodGhpcywgJ2NvbnRhaW5lcicpOworICAgIHJldHVybiBjb250YWluZXIubG9va3VwKCdj
b250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZSk7CisgIH0sCisKKyAgY29udHJvbGxlcnM6IEVt
YmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBDb250cm9sbGVyc1Byb3h5LmNy
ZWF0ZSh7IGNvbnRyb2xsZXI6IHRoaXMgfSk7CisgIH0pCit9KTsKKworfSkoKTsKKworCisKKyhm
dW5jdGlvbigpIHsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorRW1iZXIgQXBw
bGljYXRpb24KKworQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgor
QHJlcXVpcmVzIGVtYmVyLXZpZXdzLCBlbWJlci1zdGF0ZXMsIGVtYmVyLXJvdXRpbmcKKyovCisK
K30pKCk7CisKKyhmdW5jdGlvbigpIHsKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKKworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXN0YXRlcworKi8K
KworLyoqCisgIEBjbGFzcyBTdGF0ZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVt
YmVyLk9iamVjdAorICBAdXNlcyBFbWJlci5FdmVudGVkCisqLworRW1iZXIuU3RhdGUgPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsCisvKiogQHNjb3BlIEVtYmVyLlN0YXRlLnBy
b3RvdHlwZSAqL3sKKyAgaXNTdGF0ZTogdHJ1ZSwKKworICAvKioKKyAgICBBIHJlZmVyZW5jZSB0
byB0aGUgcGFyZW50IHN0YXRlLgorCisgICAgQHByb3BlcnR5IHBhcmVudFN0YXRlCisgICAgQHR5
cGUgRW1iZXIuU3RhdGUKKyAgKi8KKyAgcGFyZW50U3RhdGU6IG51bGwsCisgIHN0YXJ0OiBudWxs
LAorCisgIC8qKgorICAgIFRoZSBuYW1lIG9mIHRoaXMgc3RhdGUuCisKKyAgICBAcHJvcGVydHkg
bmFtZQorICAgIEB0eXBlIFN0cmluZworICAqLworICBuYW1lOiBudWxsLAorCisgIC8qKgorICAg
IFRoZSBmdWxsIHBhdGggdG8gdGhpcyBzdGF0ZS4KKworICAgIEBwcm9wZXJ0eSBwYXRoCisgICAg
QHR5cGUgU3RyaW5nCisgICovCisgIHBhdGg6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewor
ICAgIHZhciBwYXJlbnRQYXRoID0gZ2V0KHRoaXMsICdwYXJlbnRTdGF0ZS5wYXRoJyksCisgICAg
ICAgIHBhdGggPSBnZXQodGhpcywgJ25hbWUnKTsKKworICAgIGlmIChwYXJlbnRQYXRoKSB7Cisg
ICAgICBwYXRoID0gcGFyZW50UGF0aCArICcuJyArIHBhdGg7CisgICAgfQorCisgICAgcmV0dXJu
IHBhdGg7CisgIH0pLAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBPdmVycmlkZSB0aGUg
ZGVmYXVsdCBldmVudCBmaXJpbmcgZnJvbSBgRW1iZXIuRXZlbnRlZGAgdG8KKyAgICBhbHNvIGNh
bGwgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCisgICAgQG1ldGhvZCB0cmlnZ2VyCisg
ICAgQHBhcmFtIG5hbWUKKyAgKi8KKyAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSkgeworICAgIGlm
ICh0aGlzW25hbWVdKSB7CisgICAgICB0aGlzW25hbWVdLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNh
bGwoYXJndW1lbnRzLCAxKSk7CisgICAgfQorICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgIH0sCisKKyAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHN0YXRlcyA9
IGdldCh0aGlzLCAnc3RhdGVzJyksIGZvdW5kU3RhdGVzOworICAgIHNldCh0aGlzLCAnY2hpbGRT
dGF0ZXMnLCBFbWJlci5BKCkpOworICAgIHNldCh0aGlzLCAnZXZlbnRUcmFuc2l0aW9ucycsIGdl
dCh0aGlzLCAnZXZlbnRUcmFuc2l0aW9ucycpIHx8IHt9KTsKKworICAgIHZhciBuYW1lLCB2YWx1
ZSwgdHJhbnNpdGlvblRhcmdldDsKKworICAgIC8vIEFzIGEgY29udmVuaWVuY2UsIGxvb3Agb3Zl
ciB0aGUgcHJvcGVydGllcworICAgIC8vIG9mIHRoaXMgc3RhdGUgYW5kIGxvb2sgZm9yIGFueSB0
aGF0IGFyZSBvdGhlcgorICAgIC8vIEVtYmVyLlN0YXRlIGluc3RhbmNlcyBvciBjbGFzc2VzLCBh
bmQgbW92ZSB0aGVtCisgICAgLy8gdG8gdGhlIGBzdGF0ZXNgIGhhc2guIFRoaXMgYXZvaWRzIGhh
dmluZyB0bworICAgIC8vIGNyZWF0ZSBhbiBleHBsaWNpdCBzZXBhcmF0ZSBoYXNoLgorCisgICAg
aWYgKCFzdGF0ZXMpIHsKKyAgICAgIHN0YXRlcyA9IHt9OworCisgICAgICBmb3IgKG5hbWUgaW4g
dGhpcykgeworICAgICAgICBpZiAobmFtZSA9PT0gImNvbnN0cnVjdG9yIikgeyBjb250aW51ZTsg
fQorCisgICAgICAgIGlmICh2YWx1ZSA9IHRoaXNbbmFtZV0pIHsKKyAgICAgICAgICBpZiAodHJh
bnNpdGlvblRhcmdldCA9IHZhbHVlLnRyYW5zaXRpb25UYXJnZXQpIHsKKyAgICAgICAgICAgIHRo
aXMuZXZlbnRUcmFuc2l0aW9uc1tuYW1lXSA9IHRyYW5zaXRpb25UYXJnZXQ7CisgICAgICAgICAg
fQorCisgICAgICAgICAgdGhpcy5zZXR1cENoaWxkKHN0YXRlcywgbmFtZSwgdmFsdWUpOworICAg
ICAgICB9CisgICAgICB9CisKKyAgICAgIHNldCh0aGlzLCAnc3RhdGVzJywgc3RhdGVzKTsKKyAg
ICB9IGVsc2UgeworICAgICAgZm9yIChuYW1lIGluIHN0YXRlcykgeworICAgICAgICB0aGlzLnNl
dHVwQ2hpbGQoc3RhdGVzLCBuYW1lLCBzdGF0ZXNbbmFtZV0pOworICAgICAgfQorICAgIH0KKwor
ICAgIHNldCh0aGlzLCAncGF0aHNDYWNoZScsIHt9KTsKKyAgICBzZXQodGhpcywgJ3BhdGhzQ2Fj
aGVOb0NvbnRleHQnLCB7fSk7CisgIH0sCisKKyAgc2V0dXBDaGlsZDogZnVuY3Rpb24oc3RhdGVz
LCBuYW1lLCB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAg
ICBpZiAodmFsdWUuaXNTdGF0ZSkgeworICAgICAgc2V0KHZhbHVlLCAnbmFtZScsIG5hbWUpOwor
ICAgIH0gZWxzZSBpZiAoRW1iZXIuU3RhdGUuZGV0ZWN0KHZhbHVlKSkgeworICAgICAgdmFsdWUg
PSB2YWx1ZS5jcmVhdGUoeworICAgICAgICBuYW1lOiBuYW1lCisgICAgICB9KTsKKyAgICB9CisK
KyAgICBpZiAodmFsdWUuaXNTdGF0ZSkgeworICAgICAgc2V0KHZhbHVlLCAncGFyZW50U3RhdGUn
LCB0aGlzKTsKKyAgICAgIGdldCh0aGlzLCAnY2hpbGRTdGF0ZXMnKS5wdXNoT2JqZWN0KHZhbHVl
KTsKKyAgICAgIHN0YXRlc1tuYW1lXSA9IHZhbHVlOworICAgICAgcmV0dXJuIHZhbHVlOworICAg
IH0KKyAgfSwKKworICBsb29rdXBFdmVudFRyYW5zaXRpb246IGZ1bmN0aW9uKG5hbWUpIHsKKyAg
ICB2YXIgcGF0aCwgc3RhdGUgPSB0aGlzOworCisgICAgd2hpbGUoc3RhdGUgJiYgIXBhdGgpIHsK
KyAgICAgIHBhdGggPSBzdGF0ZS5ldmVudFRyYW5zaXRpb25zW25hbWVdOworICAgICAgc3RhdGUg
PSBzdGF0ZS5nZXQoJ3BhcmVudFN0YXRlJyk7CisgICAgfQorCisgICAgcmV0dXJuIHBhdGg7Cisg
IH0sCisKKyAgLyoqCisgICAgQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUg
c3RhdGUgaXMgYSBsZWFmIHN0YXRlCisgICAgaW4gdGhlIHN0YXRlIGhpZXJhcmNoeS4gVGhpcyBp
cyBgZmFsc2VgIGlmIHRoZSBzdGF0ZSBoYXMgY2hpbGQKKyAgICBzdGF0ZXM7IG90aGVyd2lzZSBp
dCBpcyB0cnVlLgorCisgICAgQHByb3BlcnR5IGlzTGVhZgorICAgIEB0eXBlIEJvb2xlYW4KKyAg
Ki8KKyAgaXNMZWFmOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gIWdl
dCh0aGlzLCAnY2hpbGRTdGF0ZXMnKS5sZW5ndGg7CisgIH0pLAorCisgIC8qKgorICAgIEEgYm9v
bGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN0YXRlIHRha2VzIGEgY29udGV4dC4K
KyAgICBCeSBkZWZhdWx0IHdlIGFzc3VtZSBhbGwgc3RhdGVzIHRha2UgY29udGV4dHMuCisKKyAg
ICBAcHJvcGVydHkgaGFzQ29udGV4dAorICAgIEBkZWZhdWx0IHRydWUKKyAgKi8KKyAgaGFzQ29u
dGV4dDogdHJ1ZSwKKworICAvKioKKyAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHRyYW5zaXRpb24g
ZXZlbnQuCisKKyAgICBAZXZlbnQgc2V0dXAKKyAgICBAcGFyYW0ge0VtYmVyLlN0YXRlTWFuYWdl
cn0gbWFuYWdlcgorICAgIEBwYXJhbSBjb250ZXh0CisgICAgQHNlZSBFbWJlci5TdGF0ZU1hbmFn
ZXIjdHJhbnNpdGlvbkV2ZW50CisgICovCisgIHNldHVwOiBFbWJlci5LLAorCisgIC8qKgorICAg
IFRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgc3RhdGUgaXMgZW50ZXJlZC4KKworICAgIEBldmVu
dCBlbnRlcgorICAgIEBwYXJhbSB7RW1iZXIuU3RhdGVNYW5hZ2VyfSBtYW5hZ2VyCisgICovCisg
IGVudGVyOiBFbWJlci5LLAorCisgIC8qKgorICAgIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUg
c3RhdGUgaXMgZXhpdGVkLgorCisgICAgQGV2ZW50IGV4aXQKKyAgICBAcGFyYW0ge0VtYmVyLlN0
YXRlTWFuYWdlcn0gbWFuYWdlcgorICAqLworICBleGl0OiBFbWJlci5LCit9KTsKKworRW1iZXIu
U3RhdGUucmVvcGVuQ2xhc3MoeworCisgIC8qKgorICAgIENyZWF0ZXMgYW4gYWN0aW9uIGZ1bmN0
aW9uIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBuYW1lZCBzdGF0ZSB3aGlsZQorICAgIHByZXNl
cnZpbmcgY29udGV4dC4KKworICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBTdGF0ZU1hbmFnZXJz
IGFyZSBlcXVpdmFsZW50OgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIGFNYW5hZ2VyID0gRW1i
ZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7CisgICAgICBzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3Jl
YXRlKHsKKyAgICAgICAgY2hhbmdlVG9TdGF0ZVR3bzogRW1iZXIuU3RhdGUudHJhbnNpdGlvblRv
KCdzdGF0ZVR3bycpCisgICAgICB9KSwKKyAgICAgIHN0YXRlVHdvOiBFbWJlci5TdGF0ZS5jcmVh
dGUoe30pCisgICAgfSkKKworICAgIGJNYW5hZ2VyID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0
ZSh7CisgICAgICBzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHsKKyAgICAgICAgY2hhbmdl
VG9TdGF0ZVR3bzogZnVuY3Rpb24obWFuYWdlciwgY29udGV4dCl7CisgICAgICAgICAgbWFuYWdl
ci50cmFuc2l0aW9uVG8oJ3N0YXRlVHdvJywgY29udGV4dCkKKyAgICAgICAgfQorICAgICAgfSks
CisgICAgICBzdGF0ZVR3bzogRW1iZXIuU3RhdGUuY3JlYXRlKHt9KQorICAgIH0pCisgICAgYGBg
CisKKyAgICBAbWV0aG9kIHRyYW5zaXRpb25UbworICAgIEBzdGF0aWMKKyAgICBAcGFyYW0ge1N0
cmluZ30gdGFyZ2V0CisgICovCisKKyAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbih0YXJnZXQpIHsK
KworICAgIHZhciB0cmFuc2l0aW9uRnVuY3Rpb24gPSBmdW5jdGlvbihzdGF0ZU1hbmFnZXIsIGNv
bnRleHRPckV2ZW50KSB7CisgICAgICB2YXIgY29udGV4dHMgPSBbXSwgdHJhbnNpdGlvbkFyZ3Ms
CisgICAgICAgICAgRXZlbnQgPSBFbWJlci4kICYmIEVtYmVyLiQuRXZlbnQ7CisKKyAgICAgIGlm
IChjb250ZXh0T3JFdmVudCAmJiAoRXZlbnQgJiYgY29udGV4dE9yRXZlbnQgaW5zdGFuY2VvZiBF
dmVudCkpIHsKKyAgICAgICAgaWYgKGNvbnRleHRPckV2ZW50Lmhhc093blByb3BlcnR5KCdjb250
ZXh0cycpKSB7CisgICAgICAgICAgY29udGV4dHMgPSBjb250ZXh0T3JFdmVudC5jb250ZXh0cy5z
bGljZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29udGV4
dHMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICB9CisKKyAgICAgIGNvbnRl
eHRzLnVuc2hpZnQodGFyZ2V0KTsKKyAgICAgIHN0YXRlTWFuYWdlci50cmFuc2l0aW9uVG8uYXBw
bHkoc3RhdGVNYW5hZ2VyLCBjb250ZXh0cyk7CisgICAgfTsKKworICAgIHRyYW5zaXRpb25GdW5j
dGlvbi50cmFuc2l0aW9uVGFyZ2V0ID0gdGFyZ2V0OworCisgICAgcmV0dXJuIHRyYW5zaXRpb25G
dW5jdGlvbjsKKyAgfQorCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgor
QG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1zdGF0ZXMKKyovCisKK3ZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKK3ZhciBh
cnJheUZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoOworLyoqCisgIEEgVHJh
bnNpdGlvbiB0YWtlcyB0aGUgZW50ZXIsIGV4aXQgYW5kIHJlc29sdmUgc3RhdGVzIGFuZCBub3Jt
YWxpemVzCisgIHRoZW06CisKKyAgKiB0YWtlcyBhbnkgcGFzc2VkIGluIGNvbnRleHRzIGludG8g
Y29uc2lkZXJhdGlvbgorICAqIGFkZHMgaW4gYGluaXRpYWxTdGF0ZWBzCisKKyAgQGNsYXNzIFRy
YW5zaXRpb24KKyAgQHByaXZhdGUKKyovCit2YXIgVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKHJhdykg
eworICB0aGlzLmVudGVyU3RhdGVzID0gcmF3LmVudGVyU3RhdGVzLnNsaWNlKCk7CisgIHRoaXMu
ZXhpdFN0YXRlcyA9IHJhdy5leGl0U3RhdGVzLnNsaWNlKCk7CisgIHRoaXMucmVzb2x2ZVN0YXRl
ID0gcmF3LnJlc29sdmVTdGF0ZTsKKworICB0aGlzLmZpbmFsU3RhdGUgPSByYXcuZW50ZXJTdGF0
ZXNbcmF3LmVudGVyU3RhdGVzLmxlbmd0aCAtIDFdIHx8IHJhdy5yZXNvbHZlU3RhdGU7Cit9Owor
CitUcmFuc2l0aW9uLnByb3RvdHlwZSA9IHsKKyAgLyoqCisgICAgTm9ybWFsaXplIHRoZSBwYXNz
ZWQgaW4gZW50ZXIsIGV4aXQgYW5kIHJlc29sdmUgc3RhdGVzLgorCisgICAgVGhpcyBwcm9jZXNz
IGFsc28gYWRkcyBgZmluYWxTdGF0ZWAgYW5kIGBjb250ZXh0c2AgdG8gdGhlIFRyYW5zaXRpb24g
b2JqZWN0LgorCisgICAgQG1ldGhvZCBub3JtYWxpemUKKyAgICBAcGFyYW0ge0VtYmVyLlN0YXRl
TWFuYWdlcn0gbWFuYWdlciB0aGUgc3RhdGUgbWFuYWdlciBydW5uaW5nIHRoZSB0cmFuc2l0aW9u
CisgICAgQHBhcmFtIHtBcnJheX0gY29udGV4dHMgYSBsaXN0IG9mIGNvbnRleHRzIHBhc3NlZCBp
bnRvIGB0cmFuc2l0aW9uVG9gCisgICovCisgIG5vcm1hbGl6ZTogZnVuY3Rpb24obWFuYWdlciwg
Y29udGV4dHMpIHsKKyAgICB0aGlzLm1hdGNoQ29udGV4dHNUb1N0YXRlcyhjb250ZXh0cyk7Cisg
ICAgdGhpcy5hZGRJbml0aWFsU3RhdGVzKCk7CisgICAgdGhpcy5yZW1vdmVVbmNoYW5nZWRDb250
ZXh0cyhtYW5hZ2VyKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBNYXRj
aCBlYWNoIG9mIHRoZSBjb250ZXh0cyBwYXNzZWQgdG8gYHRyYW5zaXRpb25Ub2AgdG8gYSBzdGF0
ZS4KKyAgICBUaGlzIHByb2Nlc3MgbWF5IGFsc28gcmVxdWlyZSBhZGRpbmcgYWRkaXRpb25hbCBl
bnRlciBhbmQgZXhpdAorICAgIHN0YXRlcyBpZiB0aGVyZSBhcmUgbW9yZSBjb250ZXh0cyB0aGFu
IGVudGVyIHN0YXRlcy4KKworICAgIEBtZXRob2QgbWF0Y2hDb250ZXh0c1RvU3RhdGVzCisgICAg
QHBhcmFtIHtBcnJheX0gY29udGV4dHMgYSBsaXN0IG9mIGNvbnRleHRzIHBhc3NlZCBpbnRvIGB0
cmFuc2l0aW9uVG9gCisgICovCisgIG1hdGNoQ29udGV4dHNUb1N0YXRlczogZnVuY3Rpb24oY29u
dGV4dHMpIHsKKyAgICB2YXIgc3RhdGVJZHggPSB0aGlzLmVudGVyU3RhdGVzLmxlbmd0aCAtIDEs
CisgICAgICAgIG1hdGNoZWRDb250ZXh0cyA9IFtdLAorICAgICAgICBzdGF0ZSwKKyAgICAgICAg
Y29udGV4dDsKKworICAgIC8vIE5leHQsIHdlIHdpbGwgbWF0Y2ggdGhlIHBhc3NlZCBpbiBjb250
ZXh0cyB0byB0aGUgc3RhdGVzIHRoZXkKKyAgICAvLyByZXByZXNlbnQuCisgICAgLy8KKyAgICAv
LyBGaXJzdCwgYXNzaWduIGEgY29udGV4dCB0byBlYWNoIGVudGVyIHN0YXRlIGluIHJldmVyc2Ug
b3JkZXIuIElmCisgICAgLy8gYW55IGNvbnRleHRzIGFyZSBsZWZ0LCBhZGQgYSBwYXJlbnQgc3Rh
dGUgdG8gdGhlIGxpc3Qgb2Ygc3RhdGVzCisgICAgLy8gdG8gZW50ZXIgYW5kIGV4aXQsIGFuZCBh
c3NpZ24gYSBjb250ZXh0IHRvIHRoZSBwYXJlbnQgc3RhdGUuCisgICAgLy8KKyAgICAvLyBJZiB0
aGVyZSBhcmUgc3RpbGwgY29udGV4dHMgbGVmdCB3aGVuIHRoZSBzdGF0ZSBtYW5hZ2VyIGlzCisg
ICAgLy8gcmVhY2hlZCwgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgIC8vCisgICAgLy8gVGhpcyBh
bGxvd3MgdGhlIGZvbGxvd2luZzoKKyAgICAvLworICAgIC8vIHwtIHJvb3QKKyAgICAvLyB8IHwt
IHBvc3QKKyAgICAvLyB8IHwgfC0gY29tbWVudHMKKyAgICAvLyB8IHwtIGFib3V0ICgqIGN1cnJl
bnQgc3RhdGUpCisgICAgLy8KKyAgICAvLyBGb3IgYHRyYW5zaXRpb25UbygncG9zdC5jb21tZW50
cycsIHBvc3QsIHBvc3QuZ2V0KCdjb21tZW50cycpYCwKKyAgICAvLyB0aGUgZmlyc3QgY29udGV4
dCAoYHBvc3RgKSB3aWxsIGJlIGFzc2lnbmVkIHRvIGByb290LnBvc3RgLCBhbmQKKyAgICAvLyB0
aGUgc2Vjb25kIGNvbnRleHQgKGBwb3N0LmdldCgnY29tbWVudHMnKWApIHdpbGwgYmUgYXNzaWdu
ZWQKKyAgICAvLyB0byBgcm9vdC5wb3N0LmNvbW1lbnRzYC4KKyAgICAvLworICAgIC8vIEZvciB0
aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gfC0gcm9vdAorICAgIC8vIHwgfC0gcG9zdAor
ICAgIC8vIHwgfCB8LSBpbmRleCAoKiBjdXJyZW50IHN0YXRlKQorICAgIC8vIHwgfCB8LSBjb21t
ZW50cworICAgIC8vCisgICAgLy8gRm9yIGB0cmFuc2l0aW9uVG8oJ3Bvc3QuY29tbWVudHMnLCBv
dGhlclBvc3QsIG90aGVyUG9zdC5nZXQoJ2NvbW1lbnRzJylgLAorICAgIC8vIHRoZSBgPHJvb3Qu
cG9zdD5gIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZW50ZXIgYW5kIGV4aXQK
KyAgICAvLyBzdGF0ZXMgYmVjYXVzZSBpdHMgY29udGV4dCBoYXMgY2hhbmdlZC4KKworICAgIHdo
aWxlIChjb250ZXh0cy5sZW5ndGggPiAwKSB7CisgICAgICBpZiAoc3RhdGVJZHggPj0gMCkgewor
ICAgICAgICBzdGF0ZSA9IHRoaXMuZW50ZXJTdGF0ZXNbc3RhdGVJZHgtLV07CisgICAgICB9IGVs
c2UgeworICAgICAgICBpZiAodGhpcy5lbnRlclN0YXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICBz
dGF0ZSA9IGdldCh0aGlzLmVudGVyU3RhdGVzWzBdLCAncGFyZW50U3RhdGUnKTsKKyAgICAgICAg
ICBpZiAoIXN0YXRlKSB7IHRocm93ICJDYW5ub3QgbWF0Y2ggYWxsIGNvbnRleHRzIHRvIHN0YXRl
cyI7IH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJZiByZS1lbnRlcmluZyB0aGUg
Y3VycmVudCBzdGF0ZSB3aXRoIGEgY29udGV4dCwgdGhlIHJlc29sdmUKKyAgICAgICAgICAvLyBz
dGF0ZSB3aWxsIGJlIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAgICAgIHN0YXRlID0gdGhpcy5y
ZXNvbHZlU3RhdGU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmVudGVyU3RhdGVzLnVuc2hp
ZnQoc3RhdGUpOworICAgICAgICB0aGlzLmV4aXRTdGF0ZXMudW5zaGlmdChzdGF0ZSk7CisgICAg
ICB9CisKKyAgICAgIC8vIGluIHJvdXRlcnMsIG9ubHkgc3RhdGVzIHdpdGggZHluYW1pYyBzZWdt
ZW50cyBoYXZlIGEgY29udGV4dAorICAgICAgaWYgKGdldChzdGF0ZSwgJ2hhc0NvbnRleHQnKSkg
eworICAgICAgICBjb250ZXh0ID0gY29udGV4dHMucG9wKCk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgbWF0Y2hlZENvbnRleHRzLnVu
c2hpZnQoY29udGV4dCk7CisgICAgfQorCisgICAgdGhpcy5jb250ZXh0cyA9IG1hdGNoZWRDb250
ZXh0czsKKyAgfSwKKworICAvKioKKyAgICBBZGQgYW55IGBpbml0aWFsU3RhdGVgcyB0byB0aGUg
bGlzdCBvZiBlbnRlciBzdGF0ZXMuCisKKyAgICBAbWV0aG9kIGFkZEluaXRpYWxTdGF0ZXMKKyAg
Ki8KKyAgYWRkSW5pdGlhbFN0YXRlczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGZpbmFsU3RhdGUg
PSB0aGlzLmZpbmFsU3RhdGUsIGluaXRpYWxTdGF0ZTsKKworICAgIHdoaWxlKHRydWUpIHsKKyAg
ICAgIGluaXRpYWxTdGF0ZSA9IGdldChmaW5hbFN0YXRlLCAnaW5pdGlhbFN0YXRlJykgfHwgJ3N0
YXJ0JzsKKyAgICAgIGZpbmFsU3RhdGUgPSBnZXQoZmluYWxTdGF0ZSwgJ3N0YXRlcy4nICsgaW5p
dGlhbFN0YXRlKTsKKworICAgICAgaWYgKCFmaW5hbFN0YXRlKSB7IGJyZWFrOyB9CisKKyAgICAg
IHRoaXMuZmluYWxTdGF0ZSA9IGZpbmFsU3RhdGU7CisgICAgICB0aGlzLmVudGVyU3RhdGVzLnB1
c2goZmluYWxTdGF0ZSk7CisgICAgICB0aGlzLmNvbnRleHRzLnB1c2godW5kZWZpbmVkKTsKKyAg
ICB9CisgIH0sCisKKyAgLyoqCisgICAgUmVtb3ZlIGFueSBzdGF0ZXMgdGhhdCB3ZXJlIGFkZGVk
IGJlY2F1c2UgdGhlIG51bWJlciBvZiBjb250ZXh0cworICAgIGV4Y2VlZGVkIHRoZSBudW1iZXIg
b2YgZXhwbGljaXQgZW50ZXIgc3RhdGVzLCBidXQgdGhlIGNvbnRleHQgaGFzCisgICAgbm90IGNo
YW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgc3RhdGUgd2FzIGVudGVyZWQuCisKKyAgICBA
bWV0aG9kIHJlbW92ZVVuY2hhbmdlZENvbnRleHRzCisgICAgQHBhcmFtIHtFbWJlci5TdGF0ZU1h
bmFnZXJ9IG1hbmFnZXIgcGFzc2VkIGluIHRvIGxvb2sgdXAgdGhlIGxhc3QKKyAgICAgIGNvbnRl
eHQgZm9yIGEgc3RhdGVzCisgICovCisgIHJlbW92ZVVuY2hhbmdlZENvbnRleHRzOiBmdW5jdGlv
bihtYW5hZ2VyKSB7CisgICAgLy8gU3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlbnRl
ciBzdGF0ZXMuIElmIHRoZSBzdGF0ZSB3YXMgYWRkZWQKKyAgICAvLyB0byB0aGUgbGlzdCBkdXJp
bmcgdGhlIGNvbnRleHQgbWF0Y2hpbmcgcGhhc2UsIG1ha2Ugc3VyZSB0aGUgY29udGV4dAorICAg
IC8vIGhhcyBhY3R1YWxseSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIHN0YXRlIHdh
cyBlbnRlcmVkLgorICAgIHdoaWxlICh0aGlzLmVudGVyU3RhdGVzLmxlbmd0aCA+IDApIHsKKyAg
ICAgIGlmICh0aGlzLmVudGVyU3RhdGVzWzBdICE9PSB0aGlzLmV4aXRTdGF0ZXNbMF0pIHsgYnJl
YWs7IH0KKworICAgICAgaWYgKHRoaXMuZW50ZXJTdGF0ZXMubGVuZ3RoID09PSB0aGlzLmNvbnRl
eHRzLmxlbmd0aCkgeworICAgICAgICBpZiAobWFuYWdlci5nZXRTdGF0ZU1ldGEodGhpcy5lbnRl
clN0YXRlc1swXSwgJ2NvbnRleHQnKSAhPT0gdGhpcy5jb250ZXh0c1swXSkgeyBicmVhazsgfQor
ICAgICAgICB0aGlzLmNvbnRleHRzLnNoaWZ0KCk7CisgICAgICB9CisKKyAgICAgIHRoaXMucmVz
b2x2ZVN0YXRlID0gdGhpcy5lbnRlclN0YXRlcy5zaGlmdCgpOworICAgICAgdGhpcy5leGl0U3Rh
dGVzLnNoaWZ0KCk7CisgICAgfQorICB9Cit9OworCit2YXIgc2VuZFJlY3Vyc2l2ZWx5ID0gZnVu
Y3Rpb24oZXZlbnQsIGN1cnJlbnRTdGF0ZSwgaXNVbmhhbmRsZWRQYXNzKSB7CisgIHZhciBsb2cg
PSB0aGlzLmVuYWJsZUxvZ2dpbmcsCisgICAgICBldmVudE5hbWUgPSBpc1VuaGFuZGxlZFBhc3Mg
PyAndW5oYW5kbGVkRXZlbnQnIDogZXZlbnQsCisgICAgICBhY3Rpb24gPSBjdXJyZW50U3RhdGVb
ZXZlbnROYW1lXSwKKyAgICAgIGNvbnRleHRzLCBzZW5kUmVjdXJzaXZlQXJndW1lbnRzLCBhY3Rp
b25Bcmd1bWVudHM7CisKKyAgY29udGV4dHMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7
CisKKyAgLy8gVGVzdCB0byBzZWUgaWYgdGhlIGFjdGlvbiBpcyBhIG1ldGhvZCB0aGF0CisgIC8v
IGNhbiBiZSBpbnZva2VkLiBEb24ndCBibGluZGx5IGNoZWNrIGp1c3QgZm9yCisgIC8vIGV4aXN0
ZW5jZSwgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGUgc3RhdGUKKyAgLy8gbWFuYWdlciBoYXMg
YSBjaGlsZCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbmFtZSwKKyAgLy8gYW5kIHdlIHNob3VsZCBzdGls
bCByYWlzZSBhbiBleGNlcHRpb24gaW4gdGhhdAorICAvLyBjYXNlLgorICBpZiAodHlwZW9mIGFj
dGlvbiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIGlmIChsb2cpIHsKKyAgICAgIGlmIChpc1VuaGFu
ZGxlZFBhc3MpIHsKKyAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZyhmbXQoIlNUQVRFTUFOQUdFUjog
VW5oYW5kbGVkIGV2ZW50ICclQCcgYmVpbmcgc2VudCB0byBzdGF0ZSAlQC4iLCBbZXZlbnQsIGdl
dChjdXJyZW50U3RhdGUsICdwYXRoJyldKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbWJl
ci5Mb2dnZXIubG9nKGZtdCgiU1RBVEVNQU5BR0VSOiBTZW5kaW5nIGV2ZW50ICclQCcgdG8gc3Rh
dGUgJUAuIiwgW2V2ZW50LCBnZXQoY3VycmVudFN0YXRlLCAncGF0aCcpXSkpOworICAgICAgfQor
ICAgIH0KKworICAgIGFjdGlvbkFyZ3VtZW50cyA9IGNvbnRleHRzOworICAgIGlmIChpc1VuaGFu
ZGxlZFBhc3MpIHsKKyAgICAgIGFjdGlvbkFyZ3VtZW50cy51bnNoaWZ0KGV2ZW50KTsKKyAgICB9
CisgICAgYWN0aW9uQXJndW1lbnRzLnVuc2hpZnQodGhpcyk7CisKKyAgICByZXR1cm4gYWN0aW9u
LmFwcGx5KGN1cnJlbnRTdGF0ZSwgYWN0aW9uQXJndW1lbnRzKTsKKyAgfSBlbHNlIHsKKyAgICB2
YXIgcGFyZW50U3RhdGUgPSBnZXQoY3VycmVudFN0YXRlLCAncGFyZW50U3RhdGUnKTsKKyAgICBp
ZiAocGFyZW50U3RhdGUpIHsKKworICAgICAgc2VuZFJlY3Vyc2l2ZUFyZ3VtZW50cyA9IGNvbnRl
eHRzOworICAgICAgc2VuZFJlY3Vyc2l2ZUFyZ3VtZW50cy51bnNoaWZ0KGV2ZW50LCBwYXJlbnRT
dGF0ZSwgaXNVbmhhbmRsZWRQYXNzKTsKKworICAgICAgcmV0dXJuIHNlbmRSZWN1cnNpdmVseS5h
cHBseSh0aGlzLCBzZW5kUmVjdXJzaXZlQXJndW1lbnRzKTsKKyAgICB9IGVsc2UgaWYgKCFpc1Vu
aGFuZGxlZFBhc3MpIHsKKyAgICAgIHJldHVybiBzZW5kRXZlbnQuY2FsbCh0aGlzLCBldmVudCwg
Y29udGV4dHMsIHRydWUpOworICAgIH0KKyAgfQorfTsKKwordmFyIHNlbmRFdmVudCA9IGZ1bmN0
aW9uKGV2ZW50TmFtZSwgc2VuZFJlY3Vyc2l2ZUFyZ3VtZW50cywgaXNVbmhhbmRsZWRQYXNzKSB7
CisgIHNlbmRSZWN1cnNpdmVBcmd1bWVudHMudW5zaGlmdChldmVudE5hbWUsIGdldCh0aGlzLCAn
Y3VycmVudFN0YXRlJyksIGlzVW5oYW5kbGVkUGFzcyk7CisgIHJldHVybiBzZW5kUmVjdXJzaXZl
bHkuYXBwbHkodGhpcywgc2VuZFJlY3Vyc2l2ZUFyZ3VtZW50cyk7Cit9OworCisvKioKKyAgU3Rh
dGVNYW5hZ2VyIGlzIHBhcnQgb2YgRW1iZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBhIGZpbml0ZSBz
dGF0ZSBtYWNoaW5lLiBBCisgIFN0YXRlTWFuYWdlciBpbnN0YW5jZSBtYW5hZ2VzIGEgbnVtYmVy
IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgaW5zdGFuY2VzIG9mCisgIGBFbWJlci5TdGF0ZWAsCisg
IHRyYWNrcyB0aGUgY3VycmVudCBhY3RpdmUgc3RhdGUsIGFuZCB0cmlnZ2VycyBjYWxsYmFja3Mg
d2hlbiBzdGF0ZXMgaGF2ZSBjaGFuZ2VkLgorCisgICMjIERlZmluaW5nIFN0YXRlcworCisgIFRo
ZSBzdGF0ZXMgb2YgU3RhdGVNYW5hZ2VyIGNhbiBiZSBkZWNsYXJlZCBpbiBvbmUgb2YgdHdvIHdh
eXMuIEZpcnN0LCB5b3UgY2FuCisgIGRlZmluZSBhIGBzdGF0ZXNgIHByb3BlcnR5IHRoYXQgY29u
dGFpbnMgYWxsIHRoZSBzdGF0ZXM6CisKKyAgYGBgamF2YXNjcmlwdAorICBtYW5hZ2VyQSA9IEVt
YmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoeworICAgIHN0YXRlczogeworICAgICAgc3RhdGVPbmU6
IEVtYmVyLlN0YXRlLmNyZWF0ZSgpLAorICAgICAgc3RhdGVUd286IEVtYmVyLlN0YXRlLmNyZWF0
ZSgpCisgICAgfQorICB9KQorCisgIG1hbmFnZXJBLmdldCgnc3RhdGVzJykKKyAgLy8geworICAv
LyAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoKSwKKyAgLy8gICBzdGF0ZVR3bzogRW1i
ZXIuU3RhdGUuY3JlYXRlKCkKKyAgLy8gfQorICBgYGAKKworICBZb3UgY2FuIGFsc28gYWRkIGlu
c3RhbmNlcyBvZiBgRW1iZXIuU3RhdGVgIChvciBhbiBgRW1iZXIuU3RhdGVgIHN1YmNsYXNzKQor
ICBkaXJlY3RseSBhcyBwcm9wZXJ0aWVzIG9mIGEgU3RhdGVNYW5hZ2VyLiBUaGVzZSBzdGF0ZXMg
d2lsbCBiZSBjb2xsZWN0ZWQgaW50bworICB0aGUgYHN0YXRlc2AgcHJvcGVydHkgZm9yIHlvdS4K
KworICBgYGBqYXZhc2NyaXB0CisgIG1hbmFnZXJBID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0
ZSh7CisgICAgc3RhdGVPbmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSgpLAorICAgIHN0YXRlVHdvOiBF
bWJlci5TdGF0ZS5jcmVhdGUoKQorICB9KQorCisgIG1hbmFnZXJBLmdldCgnc3RhdGVzJykKKyAg
Ly8geworICAvLyAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoKSwKKyAgLy8gICBzdGF0
ZVR3bzogRW1iZXIuU3RhdGUuY3JlYXRlKCkKKyAgLy8gfQorICBgYGAKKworICAjIyBUaGUgSW5p
dGlhbCBTdGF0ZQorCisgIFdoZW4gY3JlYXRlZCBhIFN0YXRlTWFuYWdlciBpbnN0YW5jZSB3aWxs
IGltbWVkaWF0ZWx5IGVudGVyIGludG8gdGhlIHN0YXRlCisgIGRlZmluZWQgYXMgaXRzIGBzdGFy
dGAgcHJvcGVydHkgb3IgdGhlIHN0YXRlIHJlZmVyZW5jZWQgYnkgbmFtZSBpbiBpdHMKKyAgYGlu
aXRpYWxTdGF0ZWAgcHJvcGVydHk6CisKKyAgYGBgamF2YXNjcmlwdAorICBtYW5hZ2VyQSA9IEVt
YmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoeworICAgIHN0YXJ0OiBFbWJlci5TdGF0ZS5jcmVhdGUo
e30pCisgIH0pCisKKyAgbWFuYWdlckEuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdzdGFy
dCcKKworICBtYW5hZ2VyQiA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoeworICAgIGluaXRp
YWxTdGF0ZTogJ2JlZ2luSGVyZScsCisgICAgYmVnaW5IZXJlOiBFbWJlci5TdGF0ZS5jcmVhdGUo
e30pCisgIH0pCisKKyAgbWFuYWdlckIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdiZWdp
bkhlcmUnCisgIGBgYAorCisgIEJlY2F1c2UgaXQgaXMgYSBwcm9wZXJ0eSB5b3UgbWF5IGFsc28g
cHJvdmlkZSBhIGNvbXB1dGVkIGZ1bmN0aW9uIGlmIHlvdSB3aXNoCisgIHRvIGRlcml2ZSBhbiBg
aW5pdGlhbFN0YXRlYCBwcm9ncmFtbWF0aWNhbGx5OgorCisgIGBgYGphdmFzY3JpcHQKKyAgbWFu
YWdlckMgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsKKyAgICBpbml0aWFsU3RhdGU6IGZ1
bmN0aW9uKCl7CisgICAgICBpZiAoc29tZUxvZ2ljKSB7CisgICAgICAgIHJldHVybiAnYWN0aXZl
JzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAncGFzc2l2ZSc7CisgICAgICB9Cisg
ICAgfS5wcm9wZXJ0eSgpLAorICAgIGFjdGl2ZTogRW1iZXIuU3RhdGUuY3JlYXRlKHt9KSwKKyAg
ICBwYXNzaXZlOiBFbWJlci5TdGF0ZS5jcmVhdGUoe30pCisgIH0pCisgIGBgYAorCisgICMjIE1v
dmluZyBCZXR3ZWVuIFN0YXRlcworCisgIEEgU3RhdGVNYW5hZ2VyIGNhbiBoYXZlIGFueSBudW1i
ZXIgb2YgYEVtYmVyLlN0YXRlYCBvYmplY3RzIGFzIHByb3BlcnRpZXMKKyAgYW5kIGNhbiBoYXZl
IGEgc2luZ2xlIG9uZSBvZiB0aGVzZSBzdGF0ZXMgYXMgaXRzIGN1cnJlbnQgc3RhdGUuCisKKyAg
Q2FsbGluZyBgdHJhbnNpdGlvblRvYCB0cmFuc2l0aW9ucyBiZXR3ZWVuIHN0YXRlczoKKworICBg
YGBqYXZhc2NyaXB0CisgIHJvYm90TWFuYWdlciA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUo
eworICAgIGluaXRpYWxTdGF0ZTogJ3Bvd2VyZWREb3duJywKKyAgICBwb3dlcmVkRG93bjogRW1i
ZXIuU3RhdGUuY3JlYXRlKHt9KSwKKyAgICBwb3dlcmVkVXA6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7
fSkKKyAgfSkKKworICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdw
b3dlcmVkRG93bicKKyAgcm9ib3RNYW5hZ2VyLnRyYW5zaXRpb25UbygncG93ZXJlZFVwJykKKyAg
cm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAncG93ZXJlZFVwJworICBg
YGAKKworICBCZWZvcmUgdHJhbnNpdGlvbmluZyBpbnRvIGEgbmV3IHN0YXRlIHRoZSBleGlzdGlu
ZyBgY3VycmVudFN0YXRlYCB3aWxsIGhhdmUKKyAgaXRzIGBleGl0YCBtZXRob2QgY2FsbGVkIHdp
dGggdGhlIFN0YXRlTWFuYWdlciBpbnN0YW5jZSBhcyBpdHMgZmlyc3QgYXJndW1lbnQKKyAgYW5k
IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRyYW5zaXRpb24gYXMgaXRzIHNlY29uZCBhcmd1
bWVudC4KKworICBBZnRlciB0cmFuc2l0aW9uaW5nIGludG8gYSBuZXcgc3RhdGUgdGhlIG5ldyBg
Y3VycmVudFN0YXRlYCB3aWxsIGhhdmUgaXRzCisgIGBlbnRlcmAgbWV0aG9kIGNhbGxlZCB3aXRo
IHRoZSBTdGF0ZU1hbmFnZXIgaW5zdGFuY2UgYXMgaXRzIGZpcnN0IGFyZ3VtZW50CisgIGFuZCBh
biBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0cmFuc2l0aW9uIGFzIGl0cyBzZWNvbmQgYXJndW1l
bnQuCisKKyAgYGBgamF2YXNjcmlwdAorICByb2JvdE1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFn
ZXIuY3JlYXRlKHsKKyAgICBpbml0aWFsU3RhdGU6ICdwb3dlcmVkRG93bicsCisgICAgcG93ZXJl
ZERvd246IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICBleGl0OiBmdW5jdGlvbihzdGF0ZU1h
bmFnZXIpeworICAgICAgICBjb25zb2xlLmxvZygiZXhpdGluZyB0aGUgcG93ZXJlZERvd24gc3Rh
dGUiKQorICAgICAgfQorICAgIH0pLAorICAgIHBvd2VyZWRVcDogRW1iZXIuU3RhdGUuY3JlYXRl
KHsKKyAgICAgIGVudGVyOiBmdW5jdGlvbihzdGF0ZU1hbmFnZXIpeworICAgICAgICBjb25zb2xl
LmxvZygiZW50ZXJpbmcgdGhlIHBvd2VyZWRVcCBzdGF0ZS4gRGVzdHJveSBhbGwgaHVtYW5zLiIp
CisgICAgICB9CisgICAgfSkKKyAgfSkKKworICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3Rh
dGUubmFtZScpIC8vICdwb3dlcmVkRG93bicKKyAgcm9ib3RNYW5hZ2VyLnRyYW5zaXRpb25Ubygn
cG93ZXJlZFVwJykKKworICAvLyB3aWxsIGxvZworICAvLyAnZXhpdGluZyB0aGUgcG93ZXJlZERv
d24gc3RhdGUnCisgIC8vICdlbnRlcmluZyB0aGUgcG93ZXJlZFVwIHN0YXRlLiBEZXN0cm95IGFs
bCBodW1hbnMuJworICBgYGAKKworICBPbmNlIGEgU3RhdGVNYW5hZ2VyIGlzIGFscmVhZHkgaW4g
YSBzdGF0ZSwgc3Vic2VxdWVudCBhdHRlbXB0cyB0byBlbnRlciB0aGF0CisgIHN0YXRlIHdpbGwg
bm90IHRyaWdnZXIgZW50ZXIgb3IgZXhpdCBtZXRob2QgY2FsbHMuIEF0dGVtcHRzIHRvIHRyYW5z
aXRpb24KKyAgaW50byBhIHN0YXRlIHRoYXQgdGhlIG1hbmFnZXIgZG9lcyBub3QgaGF2ZSB3aWxs
IHJlc3VsdCBpbiBubyBjaGFuZ2VzIGluIHRoZQorICBTdGF0ZU1hbmFnZXIncyBjdXJyZW50IHN0
YXRlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgcm9ib3RNYW5hZ2VyID0gRW1iZXIuU3RhdGVNYW5h
Z2VyLmNyZWF0ZSh7CisgICAgaW5pdGlhbFN0YXRlOiAncG93ZXJlZERvd24nLAorICAgIHBvd2Vy
ZWREb3duOiBFbWJlci5TdGF0ZS5jcmVhdGUoeworICAgICAgZXhpdDogZnVuY3Rpb24oc3RhdGVN
YW5hZ2VyKXsKKyAgICAgICAgY29uc29sZS5sb2coImV4aXRpbmcgdGhlIHBvd2VyZWREb3duIHN0
YXRlIikKKyAgICAgIH0KKyAgICB9KSwKKyAgICBwb3dlcmVkVXA6IEVtYmVyLlN0YXRlLmNyZWF0
ZSh7CisgICAgICBlbnRlcjogZnVuY3Rpb24oc3RhdGVNYW5hZ2VyKXsKKyAgICAgICAgY29uc29s
ZS5sb2coImVudGVyaW5nIHRoZSBwb3dlcmVkVXAgc3RhdGUuIERlc3Ryb3kgYWxsIGh1bWFucy4i
KQorICAgICAgfQorICAgIH0pCisgIH0pCisKKyAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0
YXRlLm5hbWUnKSAvLyAncG93ZXJlZERvd24nCisgIHJvYm90TWFuYWdlci50cmFuc2l0aW9uVG8o
J3Bvd2VyZWRVcCcpCisgIC8vIHdpbGwgbG9nCisgIC8vICdleGl0aW5nIHRoZSBwb3dlcmVkRG93
biBzdGF0ZScKKyAgLy8gJ2VudGVyaW5nIHRoZSBwb3dlcmVkVXAgc3RhdGUuIERlc3Ryb3kgYWxs
IGh1bWFucy4nCisgIHJvYm90TWFuYWdlci50cmFuc2l0aW9uVG8oJ3Bvd2VyZWRVcCcpIC8vIG5v
IGxvZ2dpbmcsIG5vIHN0YXRlIGNoYW5nZQorCisgIHJvYm90TWFuYWdlci50cmFuc2l0aW9uVG8o
J3NvbWVVbmtub3duU3RhdGUnKSAvLyBzaWxlbnRseSBmYWlscworICByb2JvdE1hbmFnZXIuZ2V0
KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdwb3dlcmVkVXAnCisgIGBgYAorCisgIEVhY2ggc3Rh
dGUgcHJvcGVydHkgbWF5IGl0c2VsZiBjb250YWluIHByb3BlcnRpZXMgdGhhdCBhcmUgaW5zdGFu
Y2VzIG9mCisgIGBFbWJlci5TdGF0ZWAuIFRoZSBTdGF0ZU1hbmFnZXIgY2FuIHRyYW5zaXRpb24g
dG8gc3BlY2lmaWMgc3ViLXN0YXRlcyBpbiBhCisgIHNlcmllcyBvZiB0cmFuc2l0aW9uVG8gbWV0
aG9kIGNhbGxzIG9yIHZpYSBhIHNpbmdsZSB0cmFuc2l0aW9uVG8gd2l0aCB0aGUKKyAgZnVsbCBw
YXRoIHRvIHRoZSBzcGVjaWZpYyBzdGF0ZS4gVGhlIFN0YXRlTWFuYWdlciB3aWxsIGFsc28ga2Vl
cCB0cmFjayBvZiB0aGUKKyAgZnVsbCBwYXRoIHRvIGl0cyBjdXJyZW50U3RhdGUKKworICBgYGBq
YXZhc2NyaXB0CisgIHJvYm90TWFuYWdlciA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoewor
ICAgIGluaXRpYWxTdGF0ZTogJ3Bvd2VyZWREb3duJywKKyAgICBwb3dlcmVkRG93bjogRW1iZXIu
U3RhdGUuY3JlYXRlKHsKKyAgICAgIGNoYXJnaW5nOiBFbWJlci5TdGF0ZS5jcmVhdGUoKSwKKyAg
ICAgIGNoYXJnZWQ6IEVtYmVyLlN0YXRlLmNyZWF0ZSgpCisgICAgfSksCisgICAgcG93ZXJlZFVw
OiBFbWJlci5TdGF0ZS5jcmVhdGUoeworICAgICAgbW9iaWxlOiBFbWJlci5TdGF0ZS5jcmVhdGUo
KSwKKyAgICAgIHN0YXRpb25hcnk6IEVtYmVyLlN0YXRlLmNyZWF0ZSgpCisgICAgfSkKKyAgfSkK
KworICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdwb3dlcmVkRG93
bicKKworICByb2JvdE1hbmFnZXIudHJhbnNpdGlvblRvKCdwb3dlcmVkVXAnKQorICByb2JvdE1h
bmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdwb3dlcmVkVXAnCisKKyAgcm9ib3RN
YW5hZ2VyLnRyYW5zaXRpb25UbygnbW9iaWxlJykKKyAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVu
dFN0YXRlLm5hbWUnKSAvLyAnbW9iaWxlJworCisgIC8vIHRyYW5zaXRpb24gdmlhIGEgc3RhdGUg
cGF0aAorICByb2JvdE1hbmFnZXIudHJhbnNpdGlvblRvKCdwb3dlcmVkRG93bi5jaGFyZ2luZycp
CisgIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRTdGF0ZS5uYW1lJykgLy8gJ2NoYXJnaW5nJwor
CisgIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRTdGF0ZS5wYXRoJykgLy8gJ3Bvd2VyZWREb3du
LmNoYXJnaW5nJworICBgYGAKKworICBFbnRlciB0cmFuc2l0aW9uIG1ldGhvZHMgd2lsbCBiZSBj
YWxsZWQgZm9yIGVhY2ggc3RhdGUgYW5kIG5lc3RlZCBjaGlsZCBzdGF0ZQorICBpbiB0aGVpciBo
aWVyYXJjaGljYWwgb3JkZXIuIEV4aXQgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBz
dGF0ZSBhbmQKKyAgaXRzIG5lc3RlZCBzdGF0ZXMgaW4gcmV2ZXJzZSBoaWVyYXJjaGljYWwgb3Jk
ZXIuCisKKyAgRXhpdCB0cmFuc2l0aW9ucyBmb3IgYSBwYXJlbnQgc3RhdGUgYXJlIG5vdCBjYWxs
ZWQgd2hlbiBlbnRlcmluZyBpbnRvIG9uZSBvZgorICBpdHMgY2hpbGQgc3RhdGVzLCBvbmx5IHdo
ZW4gdHJhbnNpdGlvbmluZyB0byBhIG5ldyBzZWN0aW9uIG9mIHBvc3NpYmxlIHN0YXRlcworICBp
biB0aGUgaGllcmFyY2h5LgorCisgIGBgYGphdmFzY3JpcHQKKyAgcm9ib3RNYW5hZ2VyID0gRW1i
ZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7CisgICAgaW5pdGlhbFN0YXRlOiAncG93ZXJlZERvd24n
LAorICAgIHBvd2VyZWREb3duOiBFbWJlci5TdGF0ZS5jcmVhdGUoeworICAgICAgZW50ZXI6IGZ1
bmN0aW9uKCl7fSwKKyAgICAgIGV4aXQ6IGZ1bmN0aW9uKCl7CisgICAgICAgIGNvbnNvbGUubG9n
KCJleGl0ZWQgcG93ZXJlZERvd24gc3RhdGUiKQorICAgICAgfSwKKyAgICAgIGNoYXJnaW5nOiBF
bWJlci5TdGF0ZS5jcmVhdGUoeworICAgICAgICBlbnRlcjogZnVuY3Rpb24oKXt9LAorICAgICAg
ICBleGl0OiBmdW5jdGlvbigpe30KKyAgICAgIH0pLAorICAgICAgY2hhcmdlZDogRW1iZXIuU3Rh
dGUuY3JlYXRlKHsKKyAgICAgICAgZW50ZXI6IGZ1bmN0aW9uKCl7CisgICAgICAgICAgY29uc29s
ZS5sb2coImVudGVyZWQgY2hhcmdlZCBzdGF0ZSIpCisgICAgICAgIH0sCisgICAgICAgIGV4aXQ6
IGZ1bmN0aW9uKCl7CisgICAgICAgICAgY29uc29sZS5sb2coImV4aXRlZCBjaGFyZ2VkIHN0YXRl
IikKKyAgICAgICAgfQorICAgICAgfSkKKyAgICB9KSwKKyAgICBwb3dlcmVkVXA6IEVtYmVyLlN0
YXRlLmNyZWF0ZSh7CisgICAgICBlbnRlcjogZnVuY3Rpb24oKXsKKyAgICAgICAgY29uc29sZS5s
b2coImVudGVyZWQgcG93ZXJlZFVwIHN0YXRlIikKKyAgICAgIH0sCisgICAgICBleGl0OiBmdW5j
dGlvbigpe30sCisgICAgICBtb2JpbGU6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICAgIGVu
dGVyOiBmdW5jdGlvbigpeworICAgICAgICAgIGNvbnNvbGUubG9nKCJlbnRlcmVkIG1vYmlsZSBz
dGF0ZSIpCisgICAgICAgIH0sCisgICAgICAgIGV4aXQ6IGZ1bmN0aW9uKCl7fQorICAgICAgfSks
CisgICAgICBzdGF0aW9uYXJ5OiBFbWJlci5TdGF0ZS5jcmVhdGUoeworICAgICAgICBlbnRlcjog
ZnVuY3Rpb24oKXt9LAorICAgICAgICBleGl0OiBmdW5jdGlvbigpe30KKyAgICAgIH0pCisgICAg
fSkKKyAgfSkKKworCisgIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRTdGF0ZS5wYXRoJykgLy8g
J3Bvd2VyZWREb3duJworICByb2JvdE1hbmFnZXIudHJhbnNpdGlvblRvKCdjaGFyZ2VkJykKKyAg
Ly8gbG9ncyAnZW50ZXJlZCBjaGFyZ2VkIHN0YXRlJworICAvLyBidXQgZG9lcyAqbm90KiBsb2cg
ICdleGl0ZWQgcG93ZXJlZERvd24gc3RhdGUnCisgIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRT
dGF0ZS5uYW1lJykgLy8gJ2NoYXJnZWQKKworICByb2JvdE1hbmFnZXIudHJhbnNpdGlvblRvKCdw
b3dlcmVkVXAubW9iaWxlJykKKyAgLy8gbG9ncworICAvLyAnZXhpdGVkIGNoYXJnZWQgc3RhdGUn
CisgIC8vICdleGl0ZWQgcG93ZXJlZERvd24gc3RhdGUnCisgIC8vICdlbnRlcmVkIHBvd2VyZWRV
cCBzdGF0ZScKKyAgLy8gJ2VudGVyZWQgbW9iaWxlIHN0YXRlJworICBgYGAKKworICBEdXJpbmcg
ZGV2ZWxvcG1lbnQgeW91IGNhbiBzZXQgYSBTdGF0ZU1hbmFnZXIncyBgZW5hYmxlTG9nZ2luZ2Ag
cHJvcGVydHkgdG8KKyAgYHRydWVgIHRvIHJlY2VpdmUgY29uc29sZSBtZXNzYWdlcyBvZiBzdGF0
ZSB0cmFuc2l0aW9ucy4KKworICBgYGBqYXZhc2NyaXB0CisgIHJvYm90TWFuYWdlciA9IEVtYmVy
LlN0YXRlTWFuYWdlci5jcmVhdGUoeworICAgIGVuYWJsZUxvZ2dpbmc6IHRydWUKKyAgfSkKKyAg
YGBgCisKKyAgIyMgTWFuYWdpbmcgY3VycmVudFN0YXRlIHdpdGggQWN0aW9ucworCisgIFRvIGNv
bnRyb2wgd2hpY2ggdHJhbnNpdGlvbnMgYXJlIHBvc3NpYmxlIGZvciBhIGdpdmVuIHN0YXRlLCBh
bmQKKyAgYXBwcm9wcmlhdGVseSBoYW5kbGUgZXh0ZXJuYWwgZXZlbnRzLCB0aGUgU3RhdGVNYW5h
Z2VyIGNhbiByZWNlaXZlIGFuZAorICByb3V0ZSBhY3Rpb24gbWVzc2FnZXMgdG8gaXRzIHN0YXRl
cyB2aWEgdGhlIGBzZW5kYCBtZXRob2QuIENhbGxpbmcgdG8KKyAgYHNlbmRgIHdpdGggYW4gYWN0
aW9uIG5hbWUgd2lsbCBiZWdpbiBzZWFyY2hpbmcgZm9yIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUK
KyAgbmFtZSBzdGFydGluZyBhdCB0aGUgY3VycmVudCBzdGF0ZSBhbmQgbW92aW5nIHVwIHRocm91
Z2ggdGhlIHBhcmVudCBzdGF0ZXMKKyAgaW4gYSBzdGF0ZSBoaWVyYXJjaHkgdW50aWwgYW4gYXBw
cm9wcmlhdGUgbWV0aG9kIGlzIGZvdW5kIG9yIHRoZSBTdGF0ZU1hbmFnZXIKKyAgaW5zdGFuY2Ug
aXRzZWxmIGlzIHJlYWNoZWQuCisKKyAgSWYgYW4gYXBwcm9wcmlhdGVseSBuYW1lZCBtZXRob2Qg
aXMgZm91bmQgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc3RhdGUKKyAgbWFuYWdlciBhcyB0
aGUgZmlyc3QgYXJndW1lbnQgYW5kIGFuIG9wdGlvbmFsIGBjb250ZXh0YCBvYmplY3QgYXMgdGhl
IHNlY29uZAorICBhcmd1bWVudC4KKworICBgYGBqYXZhc2NyaXB0CisgIG1hbmFnZXJBID0gRW1i
ZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7CisgICAgaW5pdGlhbFN0YXRlOiAnc3RhdGVPbmUuc3Vi
c3RhdGVPbmUuc3Vic3Vic3RhdGVPbmUnLAorICAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVh
dGUoeworICAgICAgc3Vic3RhdGVPbmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICAgIGFu
QWN0aW9uOiBmdW5jdGlvbihtYW5hZ2VyLCBjb250ZXh0KXsKKyAgICAgICAgICBjb25zb2xlLmxv
ZygiYW4gYWN0aW9uIHdhcyBjYWxsZWQiKQorICAgICAgICB9LAorICAgICAgICBzdWJzdWJzdGF0
ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHt9KQorICAgICAgfSkKKyAgICB9KQorICB9KQorCisg
IG1hbmFnZXJBLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAnc3Vic3Vic3RhdGVPbmUnCisg
IG1hbmFnZXJBLnNlbmQoJ2FuQWN0aW9uJykKKyAgLy8gJ3N0YXRlT25lLnN1YnN0YXRlT25lLnN1
YnN1YnN0YXRlT25lJyBoYXMgbm8gYW5BY3Rpb24gbWV0aG9kCisgIC8vIHNvIHRoZSAnYW5BY3Rp
b24nIG1ldGhvZCBvZiAnc3RhdGVPbmUuc3Vic3RhdGVPbmUnIGlzIGNhbGxlZAorICAvLyBhbmQg
bG9ncyAiYW4gYWN0aW9uIHdhcyBjYWxsZWQiCisgIC8vIHdpdGggbWFuYWdlckEgYXMgdGhlIGZp
cnN0IGFyZ3VtZW50CisgIC8vIGFuZCBubyBzZWNvbmQgYXJndW1lbnQKKworICBzb21lT2JqZWN0
ID0ge30KKyAgbWFuYWdlckEuc2VuZCgnYW5BY3Rpb24nLCBzb21lT2JqZWN0KQorICAvLyB0aGUg
J2FuQWN0aW9uJyBtZXRob2Qgb2YgJ3N0YXRlT25lLnN1YnN0YXRlT25lJyBpcyBjYWxsZWQgYWdh
aW4KKyAgLy8gd2l0aCBtYW5hZ2VyQSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgYW5kCisgIC8vIHNv
bWVPYmplY3QgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KKyAgYGBgCisKKyAgSWYgdGhlIFN0YXRl
TWFuYWdlciBhdHRlbXB0cyB0byBzZW5kIGFuIGFjdGlvbiBidXQgZG9lcyBub3QgZmluZCBhbiBh
cHByb3ByaWF0ZWx5IG5hbWVkCisgIG1ldGhvZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBvciB3aGls
ZSBtb3ZpbmcgdXB3YXJkcyB0aHJvdWdoIHRoZSBzdGF0ZSBoaWVyYXJjaHksIGl0IHdpbGwKKyAg
cmVwZWF0IHRoZSBwcm9jZXNzIGxvb2tpbmcgZm9yIGEgYHVuaGFuZGxlZEV2ZW50YCBtZXRob2Qu
IElmIGFuIGB1bmhhbmRsZWRFdmVudGAgbWV0aG9kIGlzCisgIGZvdW5kLCBpdCB3aWxsIGJlIGNh
bGxlZCB3aXRoIHRoZSBvcmlnaW5hbCBldmVudCBuYW1lIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQu
IElmIGFuCisgIGB1bmhhbmRsZWRFdmVudGAgbWV0aG9kIGlzIG5vdCBmb3VuZCwgdGhlIFN0YXRl
TWFuYWdlciB3aWxsIHRocm93IGEgbmV3IEVtYmVyLkVycm9yLgorCisgIGBgYGphdmFzY3JpcHQK
KyAgbWFuYWdlckIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsKKyAgICBpbml0aWFsU3Rh
dGU6ICdzdGF0ZU9uZS5zdWJzdGF0ZU9uZS5zdWJzdWJzdGF0ZU9uZScsCisgICAgc3RhdGVPbmU6
IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICBzdWJzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3Jl
YXRlKHsKKyAgICAgICAgc3Vic3Vic3RhdGVPbmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7fSksCisg
ICAgICAgIHVuaGFuZGxlZEV2ZW50OiBmdW5jdGlvbihtYW5hZ2VyLCBldmVudE5hbWUsIGNvbnRl
eHQpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZygiZ290IGFuIHVuaGFuZGxlZEV2ZW50IHdpdGgg
bmFtZSAiICsgZXZlbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgfSkKKyAgICB9KQorICB9KQor
CisgIG1hbmFnZXJCLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAnc3Vic3Vic3RhdGVPbmUn
CisgIG1hbmFnZXJCLnNlbmQoJ2FuQWN0aW9uJykKKyAgLy8gbmVpdGhlciBgc3RhdGVPbmUuc3Vi
c3RhdGVPbmUuc3Vic3Vic3RhdGVPbmVgIG5vciBhbnkgb2YgaXQncworICAvLyBwYXJlbnQgc3Rh
dGVzIGhhdmUgYSBoYW5kbGVyIGZvciBgYW5BY3Rpb25gLiBgc3Vic3Vic3RhdGVPbmVgCisgIC8v
IGFsc28gZG9lcyBub3QgaGF2ZSBhIGB1bmhhbmRsZWRFdmVudGAgbWV0aG9kLCBidXQgaXRzIHBh
cmVudAorICAvLyBzdGF0ZSwgYHN1YnN0YXRlT25lYCwgZG9lcywgYW5kIGl0IGdldHMgZmlyZWQu
IEl0IHdpbGwgbG9nCisgIC8vICJnb3QgYW4gdW5oYW5kbGVkRXZlbnQgd2l0aCBuYW1lIGFuQWN0
aW9uIgorICBgYGAKKworICBBY3Rpb24gZGV0ZWN0aW9uIG9ubHkgbW92ZXMgdXB3YXJkcyB0aHJv
dWdoIHRoZSBzdGF0ZSBoaWVyYXJjaHkgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS4KKyAgSXQgZG9l
cyBub3Qgc2VhcmNoIGluIG90aGVyIHBvcnRpb25zIG9mIHRoZSBoaWVyYXJjaHkuCisKKyAgYGBg
amF2YXNjcmlwdAorICBtYW5hZ2VyQyA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoeworICAg
IGluaXRpYWxTdGF0ZTogJ3N0YXRlT25lLnN1YnN0YXRlT25lLnN1YnN1YnN0YXRlT25lJywKKyAg
ICBzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHsKKyAgICAgIHN1YnN0YXRlT25lOiBFbWJl
ci5TdGF0ZS5jcmVhdGUoeworICAgICAgICBzdWJzdWJzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3Jl
YXRlKHt9KQorICAgICAgfSkKKyAgICB9KSwKKyAgICBzdGF0ZVR3bzogRW1iZXIuU3RhdGUuY3Jl
YXRlKHsKKyAgICAgYW5BY3Rpb246IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpeworICAgICAg
IC8vIHdpbGwgbm90IGJlIGNhbGxlZCBiZWxvdyBiZWNhdXNlIGl0IGlzCisgICAgICAgLy8gbm90
IGEgcGFyZW50IG9mIHRoZSBjdXJyZW50IHN0YXRlCisgICAgIH0KKyAgICB9KQorICB9KQorCisg
IG1hbmFnZXJDLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAnc3Vic3Vic3RhdGVPbmUnCisg
IG1hbmFnZXJDLnNlbmQoJ2FuQWN0aW9uJykKKyAgLy8gRXJyb3I6IDxFbWJlci5TdGF0ZU1hbmFn
ZXI6ZW1iZXIxMzI+IGNvdWxkIG5vdAorICAvLyByZXNwb25kIHRvIGV2ZW50IGFuQWN0aW9uIGlu
IHN0YXRlIHN0YXRlT25lLnN1YnN0YXRlT25lLnN1YnN1YnN0YXRlT25lLgorICBgYGAKKworICBJ
bnNpZGUgb2YgYW4gYWN0aW9uIG1ldGhvZCB0aGUgZ2l2ZW4gc3RhdGUgc2hvdWxkIGRlbGVnYXRl
IGB0cmFuc2l0aW9uVG9gIGNhbGxzIG9uIGl0cworICBTdGF0ZU1hbmFnZXIuCisKKyAgYGBgamF2
YXNjcmlwdAorICByb2JvdE1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsKKyAg
ICBpbml0aWFsU3RhdGU6ICdwb3dlcmVkRG93bi5jaGFyZ2luZycsCisgICAgcG93ZXJlZERvd246
IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICBjaGFyZ2luZzogRW1iZXIuU3RhdGUuY3JlYXRl
KHsKKyAgICAgICAgY2hhcmdlQ29tcGxldGU6IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpewor
ICAgICAgICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdjaGFyZ2VkJykKKyAgICAgICAgfQorICAg
ICAgfSksCisgICAgICBjaGFyZ2VkOiBFbWJlci5TdGF0ZS5jcmVhdGUoeworICAgICAgICBib290
OiBmdW5jdGlvbihtYW5hZ2VyLCBjb250ZXh0KXsKKyAgICAgICAgICBtYW5hZ2VyLnRyYW5zaXRp
b25UbygncG93ZXJlZFVwJykKKyAgICAgICAgfQorICAgICAgfSkKKyAgICB9KSwKKyAgICBwb3dl
cmVkVXA6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICBiZWdpbkV4dGVybWluYXRpb246IGZ1
bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpeworICAgICAgICBtYW5hZ2VyLnRyYW5zaXRpb25Ubygn
cmFtcGFnaW5nJykKKyAgICAgIH0sCisgICAgICByYW1wYWdpbmc6IEVtYmVyLlN0YXRlLmNyZWF0
ZSgpCisgICAgfSkKKyAgfSkKKworICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFt
ZScpIC8vICdjaGFyZ2luZycKKyAgcm9ib3RNYW5hZ2VyLnNlbmQoJ2Jvb3QnKSAvLyB0aHJvd3Mg
ZXJyb3IsIG5vIGJvb3QgYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4g
Y3VycmVudCBoaWVyYXJjaHkKKyAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLm5hbWUn
KSAvLyByZW1haW5zICdjaGFyZ2luZycKKworICByb2JvdE1hbmFnZXIuc2VuZCgnYmVnaW5FeHRl
cm1pbmF0aW9uJykgLy8gdGhyb3dzIGVycm9yLCBubyBiZWdpbkV4dGVybWluYXRpb24KKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbiBpbiBjdXJyZW50
IGhpZXJhcmNoeQorICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpICAgLy8g
cmVtYWlucyAnY2hhcmdpbmcnCisKKyAgcm9ib3RNYW5hZ2VyLnNlbmQoJ2NoYXJnZUNvbXBsZXRl
JykKKyAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAgIC8vICdjaGFyZ2Vk
JworCisgIHJvYm90TWFuYWdlci5zZW5kKCdib290JykKKyAgcm9ib3RNYW5hZ2VyLmdldCgnY3Vy
cmVudFN0YXRlLm5hbWUnKSAgIC8vICdwb3dlcmVkVXAnCisKKyAgcm9ib3RNYW5hZ2VyLnNlbmQo
J2JlZ2luRXh0ZXJtaW5hdGlvbicsIGFsbEh1bWFucykKKyAgcm9ib3RNYW5hZ2VyLmdldCgnY3Vy
cmVudFN0YXRlLm5hbWUnKSAgIC8vICdyYW1wYWdpbmcnCisgIGBgYAorCisgIFRyYW5zaXRpb24g
YWN0aW9ucyBjYW4gYWxzbyBiZSBjcmVhdGVkIHVzaW5nIHRoZSBgdHJhbnNpdGlvblRvYCBtZXRo
b2Qgb2YgdGhlIGBFbWJlci5TdGF0ZWAgY2xhc3MuIFRoZQorICBmb2xsb3dpbmcgZXhhbXBsZSBT
dGF0ZU1hbmFnZXJzIGFyZSBlcXVpdmFsZW50OgorCisgIGBgYGphdmFzY3JpcHQKKyAgYU1hbmFn
ZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsKKyAgICBzdGF0ZU9uZTogRW1iZXIuU3Rh
dGUuY3JlYXRlKHsKKyAgICAgIGNoYW5nZVRvU3RhdGVUd286IEVtYmVyLlN0YXRlLnRyYW5zaXRp
b25Ubygnc3RhdGVUd28nKQorICAgIH0pLAorICAgIHN0YXRlVHdvOiBFbWJlci5TdGF0ZS5jcmVh
dGUoe30pCisgIH0pCisKKyAgYk1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsK
KyAgICBzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHsKKyAgICAgIGNoYW5nZVRvU3RhdGVU
d286IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpeworICAgICAgICBtYW5hZ2VyLnRyYW5zaXRp
b25Ubygnc3RhdGVUd28nLCBjb250ZXh0KQorICAgICAgfQorICAgIH0pLAorICAgIHN0YXRlVHdv
OiBFbWJlci5TdGF0ZS5jcmVhdGUoe30pCisgIH0pCisgIGBgYAorCisgIEBjbGFzcyBTdGF0ZU1h
bmFnZXIKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5TdGF0ZQorKiovCitF
bWJlci5TdGF0ZU1hbmFnZXIgPSBFbWJlci5TdGF0ZS5leHRlbmQoeworICAvKioKKyAgICBAcHJp
dmF0ZQorCisgICAgV2hlbiBjcmVhdGluZyBhIG5ldyBzdGF0ZW1hbmFnZXIsIGxvb2sgZm9yIGEg
ZGVmYXVsdCBzdGF0ZSB0byB0cmFuc2l0aW9uCisgICAgaW50by4gVGhpcyBzdGF0ZSBjYW4gZWl0
aGVyIGJlIG5hbWVkIGBzdGFydGAsIG9yIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlCisgICAg
YGluaXRpYWxTdGF0ZWAgcHJvcGVydHkuCisKKyAgICBAbWV0aG9kIGluaXQKKyAgKi8KKyAgaW5p
dDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKworICAgIHNldCh0aGlzLCAnc3Rh
dGVNZXRhJywgRW1iZXIuTWFwLmNyZWF0ZSgpKTsKKworICAgIHZhciBpbml0aWFsU3RhdGUgPSBn
ZXQodGhpcywgJ2luaXRpYWxTdGF0ZScpOworCisgICAgaWYgKCFpbml0aWFsU3RhdGUgJiYgZ2V0
KHRoaXMsICdzdGF0ZXMuc3RhcnQnKSkgeworICAgICAgaW5pdGlhbFN0YXRlID0gJ3N0YXJ0JzsK
KyAgICB9CisKKyAgICBpZiAoaW5pdGlhbFN0YXRlKSB7CisgICAgICB0aGlzLnRyYW5zaXRpb25U
byhpbml0aWFsU3RhdGUpOworICAgICAgRW1iZXIuYXNzZXJ0KCdGYWlsZWQgdG8gdHJhbnNpdGlv
biB0byBpbml0aWFsIHN0YXRlICInICsgaW5pdGlhbFN0YXRlICsgJyInLCAhIWdldCh0aGlzLCAn
Y3VycmVudFN0YXRlJykpOworICAgIH0KKyAgfSwKKworICBzdGF0ZU1ldGFGb3I6IGZ1bmN0aW9u
KHN0YXRlKSB7CisgICAgdmFyIG1ldGEgPSBnZXQodGhpcywgJ3N0YXRlTWV0YScpLAorICAgICAg
ICBzdGF0ZU1ldGEgPSBtZXRhLmdldChzdGF0ZSk7CisKKyAgICBpZiAoIXN0YXRlTWV0YSkgewor
ICAgICAgc3RhdGVNZXRhID0ge307CisgICAgICBtZXRhLnNldChzdGF0ZSwgc3RhdGVNZXRhKTsK
KyAgICB9CisKKyAgICByZXR1cm4gc3RhdGVNZXRhOworICB9LAorCisgIHNldFN0YXRlTWV0YTog
ZnVuY3Rpb24oc3RhdGUsIGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gc2V0KHRoaXMuc3RhdGVN
ZXRhRm9yKHN0YXRlKSwga2V5LCB2YWx1ZSk7CisgIH0sCisKKyAgZ2V0U3RhdGVNZXRhOiBmdW5j
dGlvbihzdGF0ZSwga2V5KSB7CisgICAgcmV0dXJuIGdldCh0aGlzLnN0YXRlTWV0YUZvcihzdGF0
ZSksIGtleSk7CisgIH0sCisKKyAgLyoqCisgICAgVGhlIGN1cnJlbnQgc3RhdGUgZnJvbSBhbW9u
ZyB0aGUgbWFuYWdlcidzIHBvc3NpYmxlIHN0YXRlcy4gVGhpcyBwcm9wZXJ0eSBzaG91bGQKKyAg
ICBub3QgYmUgc2V0IGRpcmVjdGx5LiBVc2UgYHRyYW5zaXRpb25Ub2AgdG8gbW92ZSBiZXR3ZWVu
IHN0YXRlcyBieSBuYW1lLgorCisgICAgQHByb3BlcnR5IGN1cnJlbnRTdGF0ZQorICAgIEB0eXBl
IEVtYmVyLlN0YXRlCisgICovCisgIGN1cnJlbnRTdGF0ZTogbnVsbCwKKworICAvKioKKyAgIFRo
ZSBwYXRoIG9mIHRoZSBjdXJyZW50IHN0YXRlLiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0
aW9uIG9mIHRoZSBjdXJyZW50CisgICBzdGF0ZS4KKworICAgQHByb3BlcnR5IGN1cnJlbnRQYXRo
CisgICBAdHlwZSBTdHJpbmcKKyAgKi8KKyAgY3VycmVudFBhdGg6IEVtYmVyLmNvbXB1dGVkLmFs
aWFzKCdjdXJyZW50U3RhdGUucGF0aCcpLAorCisgIC8qKgorICAgIFRoZSBuYW1lIG9mIHRyYW5z
aXRpb25FdmVudCB0aGF0IHRoaXMgc3RhdGVNYW5hZ2VyIHdpbGwgZGlzcGF0Y2gKKworICAgIEBw
cm9wZXJ0eSB0cmFuc2l0aW9uRXZlbnQKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCAn
c2V0dXAnCisgICovCisgIHRyYW5zaXRpb25FdmVudDogJ3NldHVwJywKKworICAvKioKKyAgICBJ
ZiBzZXQgdG8gdHJ1ZSwgYGVycm9yT25VbmhhbmRsZWRFdmVudHNgIHdpbGwgY2F1c2UgYW4gZXhj
ZXB0aW9uIHRvIGJlCisgICAgcmFpc2VkIGlmIHlvdSBhdHRlbXB0IHRvIHNlbmQgYW4gZXZlbnQg
dG8gYSBzdGF0ZSBtYW5hZ2VyIHRoYXQgaXMgbm90CisgICAgaGFuZGxlZCBieSB0aGUgY3VycmVu
dCBzdGF0ZSBvciBhbnkgb2YgaXRzIHBhcmVudCBzdGF0ZXMuCisKKyAgICBAcHJvcGVydHkgZXJy
b3JPblVuaGFuZGxlZEV2ZW50cworICAgIEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVsdCB0cnVl
CisgICovCisgIGVycm9yT25VbmhhbmRsZWRFdmVudDogdHJ1ZSwKKworICBzZW5kOiBmdW5jdGlv
bihldmVudCkgeworICAgIHZhciBjb250ZXh0cyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAx
KTsKKyAgICBFbWJlci5hc3NlcnQoJ0Nhbm5vdCBzZW5kIGV2ZW50ICInICsgZXZlbnQgKyAnIiB3
aGlsZSBjdXJyZW50U3RhdGUgaXMgJyArIGdldCh0aGlzLCAnY3VycmVudFN0YXRlJyksIGdldCh0
aGlzLCAnY3VycmVudFN0YXRlJykpOworICAgIHJldHVybiBzZW5kRXZlbnQuY2FsbCh0aGlzLCBl
dmVudCwgY29udGV4dHMsIGZhbHNlKTsKKyAgfSwKKyAgdW5oYW5kbGVkRXZlbnQ6IGZ1bmN0aW9u
KG1hbmFnZXIsIGV2ZW50KSB7CisgICAgaWYgKGdldCh0aGlzLCAnZXJyb3JPblVuaGFuZGxlZEV2
ZW50JykpIHsKKyAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcih0aGlzLnRvU3RyaW5nKCkgKyAi
IGNvdWxkIG5vdCByZXNwb25kIHRvIGV2ZW50ICIgKyBldmVudCArICIgaW4gc3RhdGUgIiArIGdl
dCh0aGlzLCAnY3VycmVudFN0YXRlLnBhdGgnKSArICIuIik7CisgICAgfQorICB9LAorCisgIC8q
KgorICAgIEZpbmRzIGEgc3RhdGUgYnkgaXRzIHN0YXRlIHBhdGguCisKKyAgICBFeGFtcGxlOgor
CisgICAgYGBgamF2YXNjcmlwdAorICAgIG1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3Jl
YXRlKHsKKyAgICAgIHJvb3Q6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7CisgICAgICAgIGRhc2hib2Fy
ZDogRW1iZXIuU3RhdGUuY3JlYXRlKCkKKyAgICAgIH0pCisgICAgfSk7CisKKyAgICBtYW5hZ2Vy
LmdldFN0YXRlQnlQYXRoKG1hbmFnZXIsICJyb290LmRhc2hib2FyZCIpCisKKyAgICAvLyByZXR1
cm5zIHRoZSBkYXNoYm9hcmQgc3RhdGUKKyAgICBgYGAKKworICAgIEBtZXRob2QgZ2V0U3RhdGVC
eVBhdGgKKyAgICBAcGFyYW0ge0VtYmVyLlN0YXRlfSByb290IHRoZSBzdGF0ZSB0byBzdGFydCBz
ZWFyY2hpbmcgZnJvbQorICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRoZSBzdGF0ZSBwYXRoIHRv
IGZvbGxvdworICAgIEByZXR1cm4ge0VtYmVyLlN0YXRlfSB0aGUgc3RhdGUgYXQgdGhlIGVuZCBv
ZiB0aGUgcGF0aAorICAqLworICBnZXRTdGF0ZUJ5UGF0aDogZnVuY3Rpb24ocm9vdCwgcGF0aCkg
eworICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKSwKKyAgICAgICAgc3RhdGUgPSByb290
OworCisgICAgZm9yICh2YXIgaT0wLCBsZW49cGFydHMubGVuZ3RoOyBpPGxlbjsgaSsrKSB7Cisg
ICAgICBzdGF0ZSA9IGdldChnZXQoc3RhdGUsICdzdGF0ZXMnKSwgcGFydHNbaV0pOworICAgICAg
aWYgKCFzdGF0ZSkgeyBicmVhazsgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0ZTsKKyAgfSwK
KworICBmaW5kU3RhdGVCeVBhdGg6IGZ1bmN0aW9uKHN0YXRlLCBwYXRoKSB7CisgICAgdmFyIHBv
c3NpYmxlOworCisgICAgd2hpbGUgKCFwb3NzaWJsZSAmJiBzdGF0ZSkgeworICAgICAgcG9zc2li
bGUgPSB0aGlzLmdldFN0YXRlQnlQYXRoKHN0YXRlLCBwYXRoKTsKKyAgICAgIHN0YXRlID0gZ2V0
KHN0YXRlLCAncGFyZW50U3RhdGUnKTsKKyAgICB9CisKKyAgICByZXR1cm4gcG9zc2libGU7Cisg
IH0sCisKKyAgLyoqCisgICAgQSBzdGF0ZSBzdG9yZXMgaXRzIGNoaWxkIHN0YXRlcyBpbiBpdHMg
YHN0YXRlc2AgaGFzaC4KKyAgICBUaGlzIGNvZGUgdGFrZXMgYSBwYXRoIGxpa2UgYHBvc3RzLnNo
b3dgIGFuZCBsb29rcworICAgIHVwIGByb290LnN0YXRlcy5wb3N0cy5zdGF0ZXMuc2hvd2AuCisK
KyAgICBJdCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHN0YXRlcyBmcm9tIHRoZQorICAg
IHJvb3QsIHdoaWNoIGlzIHRoZSBsaXN0IG9mIHN0YXRlcyB0byBjYWxsIGBlbnRlcmAKKyAgICBv
bi4KKworICAgIEBtZXRob2QgZ2V0U3RhdGVzSW5QYXRoCisgICAgQHBhcmFtIHJvb3QKKyAgICBA
cGFyYW0gcGF0aAorICAqLworICBnZXRTdGF0ZXNJblBhdGg6IGZ1bmN0aW9uKHJvb3QsIHBhdGgp
IHsKKyAgICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gIiIpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfQor
ICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKSwKKyAgICAgICAgcmVzdWx0ID0gW10sCisg
ICAgICAgIHN0YXRlcywKKyAgICAgICAgc3RhdGU7CisKKyAgICBmb3IgKHZhciBpPTAsIGxlbj1w
YXJ0cy5sZW5ndGg7IGk8bGVuOyBpKyspIHsKKyAgICAgIHN0YXRlcyA9IGdldChyb290LCAnc3Rh
dGVzJyk7CisgICAgICBpZiAoIXN0YXRlcykgeyByZXR1cm4gdW5kZWZpbmVkOyB9CisgICAgICBz
dGF0ZSA9IGdldChzdGF0ZXMsIHBhcnRzW2ldKTsKKyAgICAgIGlmIChzdGF0ZSkgeyByb290ID0g
c3RhdGU7IHJlc3VsdC5wdXNoKHN0YXRlKTsgfQorICAgICAgZWxzZSB7IHJldHVybiB1bmRlZmlu
ZWQ7IH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGdvVG9TdGF0ZTog
ZnVuY3Rpb24oKSB7CisgICAgLy8gbm90IGRlcHJlY2F0aW5nIHRoaXMgeWV0IHNvIHBlb3BsZSBk
b24ndCBjb25zdGFudGx5IG5lZWQgdG8KKyAgICAvLyBtYWtlIHRyaXZpYWwgY2hhbmdlcyBmb3Ig
bGl0dGxlIHJlYXNvbi4KKyAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8uYXBwbHkodGhpcywg
YXJndW1lbnRzKTsKKyAgfSwKKworICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHBhdGgsIGNvbnRl
eHQpIHsKKyAgICAvLyBYWFggV2hlbiBpcyB0cmFuc2l0aW9uVG8gY2FsbGVkIHdpdGggbm8gcGF0
aAorICAgIGlmIChFbWJlci5pc0VtcHR5KHBhdGgpKSB7IHJldHVybjsgfQorCisgICAgLy8gVGhl
IEVTNiBzaWduYXR1cmUgb2YgdGhpcyBmdW5jdGlvbiBpcyBgcGF0aCwgLi4uY29udGV4dHNgCisg
ICAgdmFyIGNvbnRleHRzID0gY29udGV4dCA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFy
Z3VtZW50cywgMSkgOiBbXSwKKyAgICAgICAgY3VycmVudFN0YXRlID0gZ2V0KHRoaXMsICdjdXJy
ZW50U3RhdGUnKSB8fCB0aGlzOworCisgICAgLy8gRmlyc3QsIGdldCB0aGUgZW50ZXIsIGV4aXQg
YW5kIHJlc29sdmUgc3RhdGVzIGZvciB0aGUgY3VycmVudCBzdGF0ZQorICAgIC8vIGFuZCBzcGVj
aWZpZWQgcGF0aC4gSWYgcG9zc2libGUsIHVzZSBhbiBleGlzdGluZyBjYWNoZS4KKyAgICB2YXIg
aGFzaCA9IHRoaXMuY29udGV4dEZyZWVUcmFuc2l0aW9uKGN1cnJlbnRTdGF0ZSwgcGF0aCk7CisK
KyAgICAvLyBOZXh0LCBwcm9jZXNzIHRoZSByYXcgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBj
b250ZXh0cyBwYXNzZWQgaW4uCisgICAgdmFyIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbiho
YXNoKS5ub3JtYWxpemUodGhpcywgY29udGV4dHMpOworCisgICAgdGhpcy5lbnRlclN0YXRlKHRy
YW5zaXRpb24pOworICAgIHRoaXMudHJpZ2dlclNldHVwQ29udGV4dCh0cmFuc2l0aW9uKTsKKyAg
fSwKKworICBjb250ZXh0RnJlZVRyYW5zaXRpb246IGZ1bmN0aW9uKGN1cnJlbnRTdGF0ZSwgcGF0
aCkgeworICAgIHZhciBjYWNoZSA9IGN1cnJlbnRTdGF0ZS5wYXRoc0NhY2hlW3BhdGhdOworICAg
IGlmIChjYWNoZSkgeyByZXR1cm4gY2FjaGU7IH0KKworICAgIHZhciBlbnRlclN0YXRlcyA9IHRo
aXMuZ2V0U3RhdGVzSW5QYXRoKGN1cnJlbnRTdGF0ZSwgcGF0aCksCisgICAgICAgIGV4aXRTdGF0
ZXMgPSBbXSwKKyAgICAgICAgcmVzb2x2ZVN0YXRlID0gY3VycmVudFN0YXRlOworCisgICAgLy8g
V2FsayB1cCB0aGUgc3RhdGVzLiBGb3IgZWFjaCBzdGF0ZSwgY2hlY2sgd2hldGhlciBhIHN0YXRl
IG1hdGNoaW5nCisgICAgLy8gdGhlIGBwYXRoYCBpcyBuZXN0ZWQgdW5kZXJuZWF0aC4gVGhpcyB3
aWxsIGZpbmQgdGhlIGNsb3Nlc3QKKyAgICAvLyBwYXJlbnQgc3RhdGUgY29udGFpbmluZyBgcGF0
aGAuCisgICAgLy8KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBwYXNzIGluIGEgcmVs
YXRpdmUgcGF0aC4gRm9yIGV4YW1wbGUsIGZvcgorICAgIC8vIHRoZSBmb2xsb3dpbmcgc3RhdGUg
aGllcmFyY2h5OgorICAgIC8vCisgICAgLy8gICAgfCB8cm9vdAorICAgIC8vICAgIHwgfC0gcG9z
dHMKKyAgICAvLyAgICB8IHwgfC0gc2hvdyAoKiBjdXJyZW50KQorICAgIC8vICAgIHwgfC0gY29t
bWVudHMKKyAgICAvLyAgICB8IHwgfC0gc2hvdworICAgIC8vCisgICAgLy8gSWYgdGhlIGN1cnJl
bnQgc3RhdGUgaXMgYDxyb290LnBvc3RzLnNob3c+YCwgYW4gYXR0ZW1wdCB0bworICAgIC8vIHRy
YW5zaXRpb24gdG8gYGNvbW1lbnRzLnNob3dgIHdpbGwgbWF0Y2ggYDxyb290LmNvbW1lbnRzLnNo
b3c+YC4KKyAgICAvLworICAgIC8vIEZpcnN0LCB0aGlzIGNvZGUgd2lsbCBsb29rIGZvciByb290
LnBvc3RzLnNob3cuY29tbWVudHMuc2hvdy4KKyAgICAvLyBOZXh0LCBpdCB3aWxsIGxvb2sgZm9y
IHJvb3QucG9zdHMuY29tbWVudHMuc2hvdy4gRmluYWxseSwKKyAgICAvLyBpdCB3aWxsIGxvb2sg
Zm9yIGByb290LmNvbW1lbnRzLnNob3dgLCBhbmQgZmluZCB0aGUgc3RhdGUuCisgICAgLy8KKyAg
ICAvLyBBZnRlciB0aGlzIHByb2Nlc3MsIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHdpbGwgZXhp
c3Q6CisgICAgLy8KKyAgICAvLyAqIHJlc29sdmVTdGF0ZTogYSBjb21tb24gcGFyZW50IHN0YXRl
IGJldHdlZW4gdGhlIGN1cnJlbnQKKyAgICAvLyAgIGFuZCB0YXJnZXQgc3RhdGUuIEluIHRoZSBh
Ym92ZSBleGFtcGxlLCBgPHJvb3Q+YCBpcyB0aGUKKyAgICAvLyAgIGByZXNvbHZlU3RhdGVgLgor
ICAgIC8vICogZW50ZXJTdGF0ZXM6IGEgbGlzdCBvZiBhbGwgb2YgdGhlIHN0YXRlcyByZXByZXNl
bnRlZAorICAgIC8vICAgYnkgdGhlIHBhdGggZnJvbSB0aGUgYHJlc29sdmVTdGF0ZWAuIEZvciBl
eGFtcGxlLCBmb3IKKyAgICAvLyAgIHRoZSBwYXRoIGByb290LmNvbW1lbnRzLnNob3dgLCBgZW50
ZXJTdGF0ZXNgIHdvdWxkIGhhdmUKKyAgICAvLyAgIGBbPHJvb3QuY29tbWVudHM+LCA8cm9vdC5j
b21tZW50cy5zaG93Pl1gCisgICAgLy8gKiBleGl0U3RhdGVzOiBhIGxpc3Qgb2YgYWxsIG9mIHRo
ZSBzdGF0ZXMgZnJvbSB0aGUKKyAgICAvLyAgIGByZXNvbHZlU3RhdGVgIHRvIHRoZSBgY3VycmVu
dFN0YXRlYC4gSW4gdGhlIGFib3ZlCisgICAgLy8gICBleGFtcGxlLCBgZXhpdFN0YXRlc2Agd291
bGQgaGF2ZQorICAgIC8vICAgYFs8cm9vdC5wb3N0cz5gLCBgPHJvb3QucG9zdHMuc2hvdz5dYC4K
KyAgICB3aGlsZSAocmVzb2x2ZVN0YXRlICYmICFlbnRlclN0YXRlcykgeworICAgICAgZXhpdFN0
YXRlcy51bnNoaWZ0KHJlc29sdmVTdGF0ZSk7CisKKyAgICAgIHJlc29sdmVTdGF0ZSA9IGdldChy
ZXNvbHZlU3RhdGUsICdwYXJlbnRTdGF0ZScpOworICAgICAgaWYgKCFyZXNvbHZlU3RhdGUpIHsK
KyAgICAgICAgZW50ZXJTdGF0ZXMgPSB0aGlzLmdldFN0YXRlc0luUGF0aCh0aGlzLCBwYXRoKTsK
KyAgICAgICAgaWYgKCFlbnRlclN0YXRlcykgeworICAgICAgICAgIEVtYmVyLmFzc2VydCgnQ291
bGQgbm90IGZpbmQgc3RhdGUgZm9yIHBhdGg6ICInK3BhdGgrJyInKTsKKyAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVudGVyU3RhdGVzID0gdGhpcy5nZXRTdGF0
ZXNJblBhdGgocmVzb2x2ZVN0YXRlLCBwYXRoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgcGF0
aCBjb250YWlucyBzb21lIHN0YXRlcyB0aGF0IGFyZSBwYXJlbnRzIG9mIGJvdGggdGhlCisgICAg
Ly8gY3VycmVudCBzdGF0ZSBhbmQgdGhlIHRhcmdldCBzdGF0ZSwgcmVtb3ZlIHRoZW0uCisgICAg
Ly8KKyAgICAvLyBGb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6CisgICAg
Ly8KKyAgICAvLyB8LSByb290CisgICAgLy8gfCB8LSBwb3N0CisgICAgLy8gfCB8IHwtIGluZGV4
ICgqIGN1cnJlbnQpCisgICAgLy8gfCB8IHwtIHNob3cKKyAgICAvLworICAgIC8vIElmIHRoZSBg
cGF0aGAgaXMgYHJvb3QucG9zdC5zaG93YCwgdGhlIHRocmVlIHZhcmlhYmxlcyB3aWxsCisgICAg
Ly8gYmU6CisgICAgLy8KKyAgICAvLyAqIHJlc29sdmVTdGF0ZTogYDxzdGF0ZSBtYW5hZ2VyPmAK
KyAgICAvLyAqIGVudGVyU3RhdGVzOiBgWzxyb290PiwgPHJvb3QucG9zdD4sIDxyb290LnBvc3Qu
c2hvdz5dYAorICAgIC8vICogZXhpdFN0YXRlczogYFs8cm9vdD4sIDxyb290LnBvc3Q+LCA8cm9v
dC5wb3N0LmluZGV4Pl1gCisgICAgLy8KKyAgICAvLyBUaGUgZ29hbCBvZiB0aGlzIGNvZGUgaXMg
dG8gcmVtb3ZlIHRoZSBjb21tb24gc3RhdGVzLCBzbyB3ZQorICAgIC8vIGhhdmU6CisgICAgLy8K
KyAgICAvLyAqIHJlc29sdmVTdGF0ZTogYDxyb290LnBvc3Q+YAorICAgIC8vICogZW50ZXJTdGF0
ZXM6IGBbPHJvb3QucG9zdC5zaG93Pl1gCisgICAgLy8gKiBleGl0U3RhdGVzOiBgWzxyb290LnBv
c3QuaW5kZXg+XWAKKyAgICAvLworICAgIC8vIFRoaXMgYXZvaWQgdW5uZWNlc3NhcnkgY2FsbHMg
dG8gdGhlIGVudGVyIGFuZCBleGl0IHRyYW5zaXRpb25zLgorICAgIHdoaWxlIChlbnRlclN0YXRl
cy5sZW5ndGggPiAwICYmIGVudGVyU3RhdGVzWzBdID09PSBleGl0U3RhdGVzWzBdKSB7CisgICAg
ICByZXNvbHZlU3RhdGUgPSBlbnRlclN0YXRlcy5zaGlmdCgpOworICAgICAgZXhpdFN0YXRlcy5z
aGlmdCgpOworICAgIH0KKworICAgIC8vIENhY2hlIHRoZSBlbnRlclN0YXRlcywgZXhpdFN0YXRl
cywgYW5kIHJlc29sdmVTdGF0ZSBmb3IgdGhlCisgICAgLy8gY3VycmVudCBzdGF0ZSBhbmQgdGhl
IGBwYXRoYC4KKyAgICB2YXIgdHJhbnNpdGlvbnMgPSBjdXJyZW50U3RhdGUucGF0aHNDYWNoZVtw
YXRoXSA9IHsKKyAgICAgIGV4aXRTdGF0ZXM6IGV4aXRTdGF0ZXMsCisgICAgICBlbnRlclN0YXRl
czogZW50ZXJTdGF0ZXMsCisgICAgICByZXNvbHZlU3RhdGU6IHJlc29sdmVTdGF0ZQorICAgIH07
CisKKyAgICByZXR1cm4gdHJhbnNpdGlvbnM7CisgIH0sCisKKyAgdHJpZ2dlclNldHVwQ29udGV4
dDogZnVuY3Rpb24odHJhbnNpdGlvbnMpIHsKKyAgICB2YXIgY29udGV4dHMgPSB0cmFuc2l0aW9u
cy5jb250ZXh0cywKKyAgICAgICAgb2Zmc2V0ID0gdHJhbnNpdGlvbnMuZW50ZXJTdGF0ZXMubGVu
Z3RoIC0gY29udGV4dHMubGVuZ3RoLAorICAgICAgICBlbnRlclN0YXRlcyA9IHRyYW5zaXRpb25z
LmVudGVyU3RhdGVzLAorICAgICAgICB0cmFuc2l0aW9uRXZlbnQgPSBnZXQodGhpcywgJ3RyYW5z
aXRpb25FdmVudCcpOworCisgICAgRW1iZXIuYXNzZXJ0KCJNb3JlIGNvbnRleHRzIHByb3ZpZGVk
IHRoYW4gc3RhdGVzIiwgb2Zmc2V0ID49IDApOworCisgICAgYXJyYXlGb3JFYWNoLmNhbGwoZW50
ZXJTdGF0ZXMsIGZ1bmN0aW9uKHN0YXRlLCBpZHgpIHsKKyAgICAgIHN0YXRlLnRyaWdnZXIodHJh
bnNpdGlvbkV2ZW50LCB0aGlzLCBjb250ZXh0c1tpZHgtb2Zmc2V0XSk7CisgICAgfSwgdGhpcyk7
CisgIH0sCisKKyAgZ2V0U3RhdGU6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICB2YXIgc3RhdGUgPSBn
ZXQodGhpcywgbmFtZSksCisgICAgICAgIHBhcmVudFN0YXRlID0gZ2V0KHRoaXMsICdwYXJlbnRT
dGF0ZScpOworCisgICAgaWYgKHN0YXRlKSB7CisgICAgICByZXR1cm4gc3RhdGU7CisgICAgfSBl
bHNlIGlmIChwYXJlbnRTdGF0ZSkgeworICAgICAgcmV0dXJuIHBhcmVudFN0YXRlLmdldFN0YXRl
KG5hbWUpOworICAgIH0KKyAgfSwKKworICBlbnRlclN0YXRlOiBmdW5jdGlvbih0cmFuc2l0aW9u
KSB7CisgICAgdmFyIGxvZyA9IHRoaXMuZW5hYmxlTG9nZ2luZzsKKworICAgIHZhciBleGl0U3Rh
dGVzID0gdHJhbnNpdGlvbi5leGl0U3RhdGVzLnNsaWNlKDApLnJldmVyc2UoKTsKKyAgICBhcnJh
eUZvckVhY2guY2FsbChleGl0U3RhdGVzLCBmdW5jdGlvbihzdGF0ZSkgeworICAgICAgc3RhdGUu
dHJpZ2dlcignZXhpdCcsIHRoaXMpOworICAgIH0sIHRoaXMpOworCisgICAgYXJyYXlGb3JFYWNo
LmNhbGwodHJhbnNpdGlvbi5lbnRlclN0YXRlcywgZnVuY3Rpb24oc3RhdGUpIHsKKyAgICAgIGlm
IChsb2cpIHsgRW1iZXIuTG9nZ2VyLmxvZygiU1RBVEVNQU5BR0VSOiBFbnRlcmluZyAiICsgZ2V0
KHN0YXRlLCAncGF0aCcpKTsgfQorICAgICAgc3RhdGUudHJpZ2dlcignZW50ZXInLCB0aGlzKTsK
KyAgICB9LCB0aGlzKTsKKworICAgIHNldCh0aGlzLCAnY3VycmVudFN0YXRlJywgdHJhbnNpdGlv
bi5maW5hbFN0YXRlKTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cisv
KioKK0VtYmVyIFN0YXRlcworCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXN0YXRl
cworQHJlcXVpcmVzIGVtYmVyLXJ1bnRpbWUKKyovCisKK30pKCk7CisKKworfSkoKTsKKy8vIFZl
cnNpb246IHYxLjAuMC1yYy4xCisvLyBMYXN0IGNvbW1pdDogOGIwNjFiNCAoMjAxMy0wMi0xNSAx
MjoxMDoyMiAtMDgwMCkKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0VtYmVyCisKK0Btb2R1bGUg
ZW1iZXIKKyovCisKK30pKCk7CisKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVs
eVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9ib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9oYW5kbGVi
YXJzL2hhbmRsZWJhcnMuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENv
bXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9oYW5kbGViYXJzL2hhbmRsZWJhcnMuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwyMjAxIEBACisvKgorCitDb3B5cmlnaHQgKEMpIDIwMTEgYnkg
WWVodWRhIEthdHoKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFy
Z2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQg
YXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwK
K2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBs
aW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlz
aCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29m
dHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVy
bmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKwor
VGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hh
bGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2Yg
dGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9V
VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJV
VCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZP
UiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBB
Q1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQg
T0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVS
IERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKKyovCisKKy8vIGxpYi9oYW5kbGViYXJzL2Jh
c2UuanMKKworLypqc2hpbnQgZXFudWxsOnRydWUqLwordGhpcy5IYW5kbGViYXJzID0ge307CisK
KyhmdW5jdGlvbihIYW5kbGViYXJzKSB7CisKK0hhbmRsZWJhcnMuVkVSU0lPTiA9ICIxLjAuMC1y
Yy4zIjsKK0hhbmRsZWJhcnMuQ09NUElMRVJfUkVWSVNJT04gPSAyOworCitIYW5kbGViYXJzLlJF
VklTSU9OX0NIQU5HRVMgPSB7CisgIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFj
dHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0CisgIDI6ICc+PSAxLjAuMC1yYy4zJwor
fTsKKworSGFuZGxlYmFycy5oZWxwZXJzICA9IHt9OworSGFuZGxlYmFycy5wYXJ0aWFscyA9IHt9
OworCitIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyID0gZnVuY3Rpb24obmFtZSwgZm4sIGludmVy
c2UpIHsKKyAgaWYoaW52ZXJzZSkgeyBmbi5ub3QgPSBpbnZlcnNlOyB9CisgIHRoaXMuaGVscGVy
c1tuYW1lXSA9IGZuOworfTsKKworSGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwgPSBmdW5jdGlv
bihuYW1lLCBzdHIpIHsKKyAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHN0cjsKK307CisKK0hhbmRs
ZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihhcmcpIHsKKyAg
aWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgIHJldHVybiB1bmRlZmluZWQ7CisgIH0g
ZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBwcm9wZXJ0eSAnIiAr
IGFyZyArICInIik7CisgIH0KK30pOworCit2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBl
LnRvU3RyaW5nLCBmdW5jdGlvblR5cGUgPSAiW29iamVjdCBGdW5jdGlvbl0iOworCitIYW5kbGVi
YXJzLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0
LCBvcHRpb25zKSB7CisgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlIHx8IGZ1bmN0aW9u
KCkge30sIGZuID0gb3B0aW9ucy5mbjsKKworCisgIHZhciByZXQgPSAiIjsKKyAgdmFyIHR5cGUg
PSB0b1N0cmluZy5jYWxsKGNvbnRleHQpOworCisgIGlmKHR5cGUgPT09IGZ1bmN0aW9uVHlwZSkg
eyBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9CisKKyAgaWYoY29udGV4dCA9PT0gdHJ1
ZSkgeworICAgIHJldHVybiBmbih0aGlzKTsKKyAgfSBlbHNlIGlmKGNvbnRleHQgPT09IGZhbHNl
IHx8IGNvbnRleHQgPT0gbnVsbCkgeworICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOworICB9IGVs
c2UgaWYodHlwZSA9PT0gIltvYmplY3QgQXJyYXldIikgeworICAgIGlmKGNvbnRleHQubGVuZ3Ro
ID4gMCkgeworICAgICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVycy5lYWNoKGNvbnRleHQsIG9w
dGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTsKKyAgICB9
CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZuKGNvbnRleHQpOworICB9Cit9KTsKKworSGFuZGxl
YmFycy5LID0gZnVuY3Rpb24oKSB7fTsKKworSGFuZGxlYmFycy5jcmVhdGVGcmFtZSA9IE9iamVj
dC5jcmVhdGUgfHwgZnVuY3Rpb24ob2JqZWN0KSB7CisgIEhhbmRsZWJhcnMuSy5wcm90b3R5cGUg
PSBvYmplY3Q7CisgIHZhciBvYmogPSBuZXcgSGFuZGxlYmFycy5LKCk7CisgIEhhbmRsZWJhcnMu
Sy5wcm90b3R5cGUgPSBudWxsOworICByZXR1cm4gb2JqOworfTsKKworSGFuZGxlYmFycy5sb2dn
ZXIgPSB7CisgIERFQlVHOiAwLCBJTkZPOiAxLCBXQVJOOiAyLCBFUlJPUjogMywgbGV2ZWw6IDMs
CisKKyAgbWV0aG9kTWFwOiB7MDogJ2RlYnVnJywgMTogJ2luZm8nLCAyOiAnd2FybicsIDM6ICdl
cnJvcid9LAorCisgIC8vIGNhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50
CisgIGxvZzogZnVuY3Rpb24obGV2ZWwsIG9iaikgeworICAgIGlmIChIYW5kbGViYXJzLmxvZ2dl
ci5sZXZlbCA8PSBsZXZlbCkgeworICAgICAgdmFyIG1ldGhvZCA9IEhhbmRsZWJhcnMubG9nZ2Vy
Lm1ldGhvZE1hcFtsZXZlbF07CisgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmlu
ZWQnICYmIGNvbnNvbGVbbWV0aG9kXSkgeworICAgICAgICBjb25zb2xlW21ldGhvZF0uY2FsbChj
b25zb2xlLCBvYmopOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworSGFuZGxlYmFycy5sb2cg
PSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7IEhhbmRsZWJhcnMubG9nZ2VyLmxvZyhsZXZlbCwgb2Jq
KTsgfTsKKworSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRl
eHQsIG9wdGlvbnMpIHsKKyAgdmFyIGZuID0gb3B0aW9ucy5mbiwgaW52ZXJzZSA9IG9wdGlvbnMu
aW52ZXJzZTsKKyAgdmFyIGkgPSAwLCByZXQgPSAiIiwgZGF0YTsKKworICBpZiAob3B0aW9ucy5k
YXRhKSB7CisgICAgZGF0YSA9IEhhbmRsZWJhcnMuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsK
KyAgfQorCisgIGlmKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7Cisg
ICAgaWYoY29udGV4dCBpbnN0YW5jZW9mIEFycmF5KXsKKyAgICAgIGZvcih2YXIgaiA9IGNvbnRl
eHQubGVuZ3RoOyBpPGo7IGkrKykgeworICAgICAgICBpZiAoZGF0YSkgeyBkYXRhLmluZGV4ID0g
aTsgfQorICAgICAgICByZXQgPSByZXQgKyBmbihjb250ZXh0W2ldLCB7IGRhdGE6IGRhdGEgfSk7
CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcih2YXIga2V5IGluIGNvbnRleHQpIHsK
KyAgICAgICAgaWYoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgaWYo
ZGF0YSkgeyBkYXRhLmtleSA9IGtleTsgfQorICAgICAgICAgIHJldCA9IHJldCArIGZuKGNvbnRl
eHRba2V5XSwge2RhdGE6IGRhdGF9KTsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAg
IH0KKyAgICB9CisgIH0KKworICBpZihpID09PSAwKXsKKyAgICByZXQgPSBpbnZlcnNlKHRoaXMp
OworICB9CisKKyAgcmV0dXJuIHJldDsKK30pOworCitIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCdpZicsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgdmFyIHR5cGUgPSB0b1N0cmlu
Zy5jYWxsKGNvbnRleHQpOworICBpZih0eXBlID09PSBmdW5jdGlvblR5cGUpIHsgY29udGV4dCA9
IGNvbnRleHQuY2FsbCh0aGlzKTsgfQorCisgIGlmKCFjb250ZXh0IHx8IEhhbmRsZWJhcnMuVXRp
bHMuaXNFbXB0eShjb250ZXh0KSkgeworICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7
CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7CisgIH0KK30pOworCitI
YW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRp
b25zKSB7CisgIHZhciBmbiA9IG9wdGlvbnMuZm4sIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7
CisgIG9wdGlvbnMuZm4gPSBpbnZlcnNlOworICBvcHRpb25zLmludmVyc2UgPSBmbjsKKworICBy
ZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzWydpZiddLmNhbGwodGhpcywgY29udGV4dCwgb3B0aW9u
cyk7Cit9KTsKKworSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uKGNv
bnRleHQsIG9wdGlvbnMpIHsKKyAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7Cit9KTsKKwor
SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9u
cykgeworICB2YXIgbGV2ZWwgPSBvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhLmxldmVsICE9
IG51bGwgPyBwYXJzZUludChvcHRpb25zLmRhdGEubGV2ZWwsIDEwKSA6IDE7CisgIEhhbmRsZWJh
cnMubG9nKGxldmVsLCBjb250ZXh0KTsKK30pOworCit9KHRoaXMuSGFuZGxlYmFycykpOworOwor
Ly8gbGliL2hhbmRsZWJhcnMvY29tcGlsZXIvcGFyc2VyLmpzCisvKiBKaXNvbiBnZW5lcmF0ZWQg
cGFyc2VyICovCit2YXIgaGFuZGxlYmFycyA9IChmdW5jdGlvbigpewordmFyIHBhcnNlciA9IHt0
cmFjZTogZnVuY3Rpb24gdHJhY2UoKSB7IH0sCit5eToge30sCitzeW1ib2xzXzogeyJlcnJvciI6
Miwicm9vdCI6MywicHJvZ3JhbSI6NCwiRU9GIjo1LCJzaW1wbGVJbnZlcnNlIjo2LCJzdGF0ZW1l
bnRzIjo3LCJzdGF0ZW1lbnQiOjgsIm9wZW5JbnZlcnNlIjo5LCJjbG9zZUJsb2NrIjoxMCwib3Bl
bkJsb2NrIjoxMSwibXVzdGFjaGUiOjEyLCJwYXJ0aWFsIjoxMywiQ09OVEVOVCI6MTQsIkNPTU1F
TlQiOjE1LCJPUEVOX0JMT0NLIjoxNiwiaW5NdXN0YWNoZSI6MTcsIkNMT1NFIjoxOCwiT1BFTl9J
TlZFUlNFIjoxOSwiT1BFTl9FTkRCTE9DSyI6MjAsInBhdGgiOjIxLCJPUEVOIjoyMiwiT1BFTl9V
TkVTQ0FQRUQiOjIzLCJPUEVOX1BBUlRJQUwiOjI0LCJwYXJ0aWFsTmFtZSI6MjUsInBhcmFtcyI6
MjYsImhhc2giOjI3LCJEQVRBIjoyOCwicGFyYW0iOjI5LCJTVFJJTkciOjMwLCJJTlRFR0VSIjoz
MSwiQk9PTEVBTiI6MzIsImhhc2hTZWdtZW50cyI6MzMsImhhc2hTZWdtZW50IjozNCwiSUQiOjM1
LCJFUVVBTFMiOjM2LCJQQVJUSUFMX05BTUUiOjM3LCJwYXRoU2VnbWVudHMiOjM4LCJTRVAiOjM5
LCIkYWNjZXB0IjowLCIkZW5kIjoxfSwKK3Rlcm1pbmFsc186IHsyOiJlcnJvciIsNToiRU9GIiwx
NDoiQ09OVEVOVCIsMTU6IkNPTU1FTlQiLDE2OiJPUEVOX0JMT0NLIiwxODoiQ0xPU0UiLDE5OiJP
UEVOX0lOVkVSU0UiLDIwOiJPUEVOX0VOREJMT0NLIiwyMjoiT1BFTiIsMjM6Ik9QRU5fVU5FU0NB
UEVEIiwyNDoiT1BFTl9QQVJUSUFMIiwyODoiREFUQSIsMzA6IlNUUklORyIsMzE6IklOVEVHRVIi
LDMyOiJCT09MRUFOIiwzNToiSUQiLDM2OiJFUVVBTFMiLDM3OiJQQVJUSUFMX05BTUUiLDM5OiJT
RVAifSwKK3Byb2R1Y3Rpb25zXzogWzAsWzMsMl0sWzQsMl0sWzQsM10sWzQsMl0sWzQsMV0sWzQs
MV0sWzQsMF0sWzcsMV0sWzcsMl0sWzgsM10sWzgsM10sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0s
WzExLDNdLFs5LDNdLFsxMCwzXSxbMTIsM10sWzEyLDNdLFsxMywzXSxbMTMsNF0sWzYsMl0sWzE3
LDNdLFsxNywyXSxbMTcsMl0sWzE3LDFdLFsxNywxXSxbMjYsMl0sWzI2LDFdLFsyOSwxXSxbMjks
MV0sWzI5LDFdLFsyOSwxXSxbMjksMV0sWzI3LDFdLFszMywyXSxbMzMsMV0sWzM0LDNdLFszNCwz
XSxbMzQsM10sWzM0LDNdLFszNCwzXSxbMjUsMV0sWzIxLDFdLFszOCwzXSxbMzgsMV1dLAorcGVy
Zm9ybUFjdGlvbjogZnVuY3Rpb24gYW5vbnltb3VzKHl5dGV4dCx5eWxlbmcseXlsaW5lbm8seXks
eXlzdGF0ZSwkJCxfJCkgeworCit2YXIgJDAgPSAkJC5sZW5ndGggLSAxOworc3dpdGNoICh5eXN0
YXRlKSB7CitjYXNlIDE6IHJldHVybiAkJFskMC0xXTsgCiticmVhazsKK2Nhc2UgMjogdGhpcy4k
ID0gbmV3IHl5LlByb2dyYW1Ob2RlKFtdLCAkJFskMF0pOyAKK2JyZWFrOworY2FzZSAzOiB0aGlz
LiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAtMl0sICQkWyQwXSk7IAorYnJlYWs7CitjYXNl
IDQ6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZSgkJFskMC0xXSwgW10pOyAKK2JyZWFrOwor
Y2FzZSA1OiB0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDBdKTsgCiticmVhazsKK2Nh
c2UgNjogdGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKFtdLCBbXSk7IAorYnJlYWs7CitjYXNl
IDc6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSk7IAorYnJlYWs7CitjYXNlIDg6IHRo
aXMuJCA9IFskJFskMF1dOyAKK2JyZWFrOworY2FzZSA5OiAkJFskMC0xXS5wdXNoKCQkWyQwXSk7
IHRoaXMuJCA9ICQkWyQwLTFdOyAKK2JyZWFrOworY2FzZSAxMDogdGhpcy4kID0gbmV3IHl5LkJs
b2NrTm9kZSgkJFskMC0yXSwgJCRbJDAtMV0uaW52ZXJzZSwgJCRbJDAtMV0sICQkWyQwXSk7IAor
YnJlYWs7CitjYXNlIDExOiB0aGlzLiQgPSBuZXcgeXkuQmxvY2tOb2RlKCQkWyQwLTJdLCAkJFsk
MC0xXSwgJCRbJDAtMV0uaW52ZXJzZSwgJCRbJDBdKTsgCiticmVhazsKK2Nhc2UgMTI6IHRoaXMu
JCA9ICQkWyQwXTsgCiticmVhazsKK2Nhc2UgMTM6IHRoaXMuJCA9ICQkWyQwXTsgCiticmVhazsK
K2Nhc2UgMTQ6IHRoaXMuJCA9IG5ldyB5eS5Db250ZW50Tm9kZSgkJFskMF0pOyAKK2JyZWFrOwor
Y2FzZSAxNTogdGhpcy4kID0gbmV3IHl5LkNvbW1lbnROb2RlKCQkWyQwXSk7IAorYnJlYWs7Citj
YXNlIDE2OiB0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2RlKCQkWyQwLTFdWzBdLCAkJFskMC0x
XVsxXSk7IAorYnJlYWs7CitjYXNlIDE3OiB0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2RlKCQk
WyQwLTFdWzBdLCAkJFskMC0xXVsxXSk7IAorYnJlYWs7CitjYXNlIDE4OiB0aGlzLiQgPSAkJFsk
MC0xXTsgCiticmVhazsKK2Nhc2UgMTk6IHRoaXMuJCA9IG5ldyB5eS5NdXN0YWNoZU5vZGUoJCRb
JDAtMV1bMF0sICQkWyQwLTFdWzFdKTsgCiticmVhazsKK2Nhc2UgMjA6IHRoaXMuJCA9IG5ldyB5
eS5NdXN0YWNoZU5vZGUoJCRbJDAtMV1bMF0sICQkWyQwLTFdWzFdLCB0cnVlKTsgCiticmVhazsK
K2Nhc2UgMjE6IHRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTm9kZSgkJFskMC0xXSk7IAorYnJlYWs7
CitjYXNlIDIyOiB0aGlzLiQgPSBuZXcgeXkuUGFydGlhbE5vZGUoJCRbJDAtMl0sICQkWyQwLTFd
KTsgCiticmVhazsKK2Nhc2UgMjM6IAorYnJlYWs7CitjYXNlIDI0OiB0aGlzLiQgPSBbWyQkWyQw
LTJdXS5jb25jYXQoJCRbJDAtMV0pLCAkJFskMF1dOyAKK2JyZWFrOworY2FzZSAyNTogdGhpcy4k
ID0gW1skJFskMC0xXV0uY29uY2F0KCQkWyQwXSksIG51bGxdOyAKK2JyZWFrOworY2FzZSAyNjog
dGhpcy4kID0gW1skJFskMC0xXV0sICQkWyQwXV07IAorYnJlYWs7CitjYXNlIDI3OiB0aGlzLiQg
PSBbWyQkWyQwXV0sIG51bGxdOyAKK2JyZWFrOworY2FzZSAyODogdGhpcy4kID0gW1tuZXcgeXku
RGF0YU5vZGUoJCRbJDBdKV0sIG51bGxdOyAKK2JyZWFrOworY2FzZSAyOTogJCRbJDAtMV0ucHVz
aCgkJFskMF0pOyB0aGlzLiQgPSAkJFskMC0xXTsgCiticmVhazsKK2Nhc2UgMzA6IHRoaXMuJCA9
IFskJFskMF1dOyAKK2JyZWFrOworY2FzZSAzMTogdGhpcy4kID0gJCRbJDBdOyAKK2JyZWFrOwor
Y2FzZSAzMjogdGhpcy4kID0gbmV3IHl5LlN0cmluZ05vZGUoJCRbJDBdKTsgCiticmVhazsKK2Nh
c2UgMzM6IHRoaXMuJCA9IG5ldyB5eS5JbnRlZ2VyTm9kZSgkJFskMF0pOyAKK2JyZWFrOworY2Fz
ZSAzNDogdGhpcy4kID0gbmV3IHl5LkJvb2xlYW5Ob2RlKCQkWyQwXSk7IAorYnJlYWs7CitjYXNl
IDM1OiB0aGlzLiQgPSBuZXcgeXkuRGF0YU5vZGUoJCRbJDBdKTsgCiticmVhazsKK2Nhc2UgMzY6
IHRoaXMuJCA9IG5ldyB5eS5IYXNoTm9kZSgkJFskMF0pOyAKK2JyZWFrOworY2FzZSAzNzogJCRb
JDAtMV0ucHVzaCgkJFskMF0pOyB0aGlzLiQgPSAkJFskMC0xXTsgCiticmVhazsKK2Nhc2UgMzg6
IHRoaXMuJCA9IFskJFskMF1dOyAKK2JyZWFrOworY2FzZSAzOTogdGhpcy4kID0gWyQkWyQwLTJd
LCAkJFskMF1dOyAKK2JyZWFrOworY2FzZSA0MDogdGhpcy4kID0gWyQkWyQwLTJdLCBuZXcgeXku
U3RyaW5nTm9kZSgkJFskMF0pXTsgCiticmVhazsKK2Nhc2UgNDE6IHRoaXMuJCA9IFskJFskMC0y
XSwgbmV3IHl5LkludGVnZXJOb2RlKCQkWyQwXSldOyAKK2JyZWFrOworY2FzZSA0MjogdGhpcy4k
ID0gWyQkWyQwLTJdLCBuZXcgeXkuQm9vbGVhbk5vZGUoJCRbJDBdKV07IAorYnJlYWs7CitjYXNl
IDQzOiB0aGlzLiQgPSBbJCRbJDAtMl0sIG5ldyB5eS5EYXRhTm9kZSgkJFskMF0pXTsgCiticmVh
azsKK2Nhc2UgNDQ6IHRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTmFtZU5vZGUoJCRbJDBdKTsgCiti
cmVhazsKK2Nhc2UgNDU6IHRoaXMuJCA9IG5ldyB5eS5JZE5vZGUoJCRbJDBdKTsgCiticmVhazsK
K2Nhc2UgNDY6ICQkWyQwLTJdLnB1c2goJCRbJDBdKTsgdGhpcy4kID0gJCRbJDAtMl07IAorYnJl
YWs7CitjYXNlIDQ3OiB0aGlzLiQgPSBbJCRbJDBdXTsgCiticmVhazsKK30KK30sCit0YWJsZTog
W3szOjEsNDoyLDU6WzIsN10sNjozLDc6NCw4OjYsOTo3LDExOjgsMTI6OSwxMzoxMCwxNDpbMSwx
MV0sMTU6WzEsMTJdLDE2OlsxLDEzXSwxOTpbMSw1XSwyMjpbMSwxNF0sMjM6WzEsMTVdLDI0Olsx
LDE2XX0sezE6WzNdfSx7NTpbMSwxN119LHs1OlsyLDZdLDc6MTgsODo2LDk6NywxMTo4LDEyOjks
MTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsMTldLDIwOlsyLDZdLDIy
OlsxLDE0XSwyMzpbMSwxNV0sMjQ6WzEsMTZdfSx7NTpbMiw1XSw2OjIwLDg6MjEsOTo3LDExOjgs
MTI6OSwxMzoxMCwxNDpbMSwxMV0sMTU6WzEsMTJdLDE2OlsxLDEzXSwxOTpbMSw1XSwyMDpbMiw1
XSwyMjpbMSwxNF0sMjM6WzEsMTVdLDI0OlsxLDE2XX0sezE3OjIzLDE4OlsxLDIyXSwyMToyNCwy
ODpbMSwyNV0sMzU6WzEsMjddLDM4OjI2fSx7NTpbMiw4XSwxNDpbMiw4XSwxNTpbMiw4XSwxNjpb
Miw4XSwxOTpbMiw4XSwyMDpbMiw4XSwyMjpbMiw4XSwyMzpbMiw4XSwyNDpbMiw4XX0sezQ6Mjgs
NjozLDc6NCw4OjYsOTo3LDExOjgsMTI6OSwxMzoxMCwxNDpbMSwxMV0sMTU6WzEsMTJdLDE2Olsx
LDEzXSwxOTpbMSw1XSwyMDpbMiw3XSwyMjpbMSwxNF0sMjM6WzEsMTVdLDI0OlsxLDE2XX0sezQ6
MjksNjozLDc6NCw4OjYsOTo3LDExOjgsMTI6OSwxMzoxMCwxNDpbMSwxMV0sMTU6WzEsMTJdLDE2
OlsxLDEzXSwxOTpbMSw1XSwyMDpbMiw3XSwyMjpbMSwxNF0sMjM6WzEsMTVdLDI0OlsxLDE2XX0s
ezU6WzIsMTJdLDE0OlsyLDEyXSwxNTpbMiwxMl0sMTY6WzIsMTJdLDE5OlsyLDEyXSwyMDpbMiwx
Ml0sMjI6WzIsMTJdLDIzOlsyLDEyXSwyNDpbMiwxMl19LHs1OlsyLDEzXSwxNDpbMiwxM10sMTU6
WzIsMTNdLDE2OlsyLDEzXSwxOTpbMiwxM10sMjA6WzIsMTNdLDIyOlsyLDEzXSwyMzpbMiwxM10s
MjQ6WzIsMTNdfSx7NTpbMiwxNF0sMTQ6WzIsMTRdLDE1OlsyLDE0XSwxNjpbMiwxNF0sMTk6WzIs
MTRdLDIwOlsyLDE0XSwyMjpbMiwxNF0sMjM6WzIsMTRdLDI0OlsyLDE0XX0sezU6WzIsMTVdLDE0
OlsyLDE1XSwxNTpbMiwxNV0sMTY6WzIsMTVdLDE5OlsyLDE1XSwyMDpbMiwxNV0sMjI6WzIsMTVd
LDIzOlsyLDE1XSwyNDpbMiwxNV19LHsxNzozMCwyMToyNCwyODpbMSwyNV0sMzU6WzEsMjddLDM4
OjI2fSx7MTc6MzEsMjE6MjQsMjg6WzEsMjVdLDM1OlsxLDI3XSwzODoyNn0sezE3OjMyLDIxOjI0
LDI4OlsxLDI1XSwzNTpbMSwyN10sMzg6MjZ9LHsyNTozMywzNzpbMSwzNF19LHsxOlsyLDFdfSx7
NTpbMiwyXSw4OjIxLDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpb
MSwxM10sMTk6WzEsMTldLDIwOlsyLDJdLDIyOlsxLDE0XSwyMzpbMSwxNV0sMjQ6WzEsMTZdfSx7
MTc6MjMsMjE6MjQsMjg6WzEsMjVdLDM1OlsxLDI3XSwzODoyNn0sezU6WzIsNF0sNzozNSw4OjYs
OTo3LDExOjgsMTI6OSwxMzoxMCwxNDpbMSwxMV0sMTU6WzEsMTJdLDE2OlsxLDEzXSwxOTpbMSwx
OV0sMjA6WzIsNF0sMjI6WzEsMTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHs1OlsyLDldLDE0Olsy
LDldLDE1OlsyLDldLDE2OlsyLDldLDE5OlsyLDldLDIwOlsyLDldLDIyOlsyLDldLDIzOlsyLDld
LDI0OlsyLDldfSx7NTpbMiwyM10sMTQ6WzIsMjNdLDE1OlsyLDIzXSwxNjpbMiwyM10sMTk6WzIs
MjNdLDIwOlsyLDIzXSwyMjpbMiwyM10sMjM6WzIsMjNdLDI0OlsyLDIzXX0sezE4OlsxLDM2XX0s
ezE4OlsyLDI3XSwyMTo0MSwyNjozNywyNzozOCwyODpbMSw0NV0sMjk6MzksMzA6WzEsNDJdLDMx
OlsxLDQzXSwzMjpbMSw0NF0sMzM6NDAsMzQ6NDYsMzU6WzEsNDddLDM4OjI2fSx7MTg6WzIsMjhd
fSx7MTg6WzIsNDVdLDI4OlsyLDQ1XSwzMDpbMiw0NV0sMzE6WzIsNDVdLDMyOlsyLDQ1XSwzNTpb
Miw0NV0sMzk6WzEsNDhdfSx7MTg6WzIsNDddLDI4OlsyLDQ3XSwzMDpbMiw0N10sMzE6WzIsNDdd
LDMyOlsyLDQ3XSwzNTpbMiw0N10sMzk6WzIsNDddfSx7MTA6NDksMjA6WzEsNTBdfSx7MTA6NTEs
MjA6WzEsNTBdfSx7MTg6WzEsNTJdfSx7MTg6WzEsNTNdfSx7MTg6WzEsNTRdfSx7MTg6WzEsNTVd
LDIxOjU2LDM1OlsxLDI3XSwzODoyNn0sezE4OlsyLDQ0XSwzNTpbMiw0NF19LHs1OlsyLDNdLDg6
MjEsOTo3LDExOjgsMTI6OSwxMzoxMCwxNDpbMSwxMV0sMTU6WzEsMTJdLDE2OlsxLDEzXSwxOTpb
MSwxOV0sMjA6WzIsM10sMjI6WzEsMTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHsxNDpbMiwxN10s
MTU6WzIsMTddLDE2OlsyLDE3XSwxOTpbMiwxN10sMjA6WzIsMTddLDIyOlsyLDE3XSwyMzpbMiwx
N10sMjQ6WzIsMTddfSx7MTg6WzIsMjVdLDIxOjQxLDI3OjU3LDI4OlsxLDQ1XSwyOTo1OCwzMDpb
MSw0Ml0sMzE6WzEsNDNdLDMyOlsxLDQ0XSwzMzo0MCwzNDo0NiwzNTpbMSw0N10sMzg6MjZ9LHsx
ODpbMiwyNl19LHsxODpbMiwzMF0sMjg6WzIsMzBdLDMwOlsyLDMwXSwzMTpbMiwzMF0sMzI6WzIs
MzBdLDM1OlsyLDMwXX0sezE4OlsyLDM2XSwzNDo1OSwzNTpbMSw2MF19LHsxODpbMiwzMV0sMjg6
WzIsMzFdLDMwOlsyLDMxXSwzMTpbMiwzMV0sMzI6WzIsMzFdLDM1OlsyLDMxXX0sezE4OlsyLDMy
XSwyODpbMiwzMl0sMzA6WzIsMzJdLDMxOlsyLDMyXSwzMjpbMiwzMl0sMzU6WzIsMzJdfSx7MTg6
WzIsMzNdLDI4OlsyLDMzXSwzMDpbMiwzM10sMzE6WzIsMzNdLDMyOlsyLDMzXSwzNTpbMiwzM119
LHsxODpbMiwzNF0sMjg6WzIsMzRdLDMwOlsyLDM0XSwzMTpbMiwzNF0sMzI6WzIsMzRdLDM1Olsy
LDM0XX0sezE4OlsyLDM1XSwyODpbMiwzNV0sMzA6WzIsMzVdLDMxOlsyLDM1XSwzMjpbMiwzNV0s
MzU6WzIsMzVdfSx7MTg6WzIsMzhdLDM1OlsyLDM4XX0sezE4OlsyLDQ3XSwyODpbMiw0N10sMzA6
WzIsNDddLDMxOlsyLDQ3XSwzMjpbMiw0N10sMzU6WzIsNDddLDM2OlsxLDYxXSwzOTpbMiw0N119
LHszNTpbMSw2Ml19LHs1OlsyLDEwXSwxNDpbMiwxMF0sMTU6WzIsMTBdLDE2OlsyLDEwXSwxOTpb
MiwxMF0sMjA6WzIsMTBdLDIyOlsyLDEwXSwyMzpbMiwxMF0sMjQ6WzIsMTBdfSx7MjE6NjMsMzU6
WzEsMjddLDM4OjI2fSx7NTpbMiwxMV0sMTQ6WzIsMTFdLDE1OlsyLDExXSwxNjpbMiwxMV0sMTk6
WzIsMTFdLDIwOlsyLDExXSwyMjpbMiwxMV0sMjM6WzIsMTFdLDI0OlsyLDExXX0sezE0OlsyLDE2
XSwxNTpbMiwxNl0sMTY6WzIsMTZdLDE5OlsyLDE2XSwyMDpbMiwxNl0sMjI6WzIsMTZdLDIzOlsy
LDE2XSwyNDpbMiwxNl19LHs1OlsyLDE5XSwxNDpbMiwxOV0sMTU6WzIsMTldLDE2OlsyLDE5XSwx
OTpbMiwxOV0sMjA6WzIsMTldLDIyOlsyLDE5XSwyMzpbMiwxOV0sMjQ6WzIsMTldfSx7NTpbMiwy
MF0sMTQ6WzIsMjBdLDE1OlsyLDIwXSwxNjpbMiwyMF0sMTk6WzIsMjBdLDIwOlsyLDIwXSwyMjpb
MiwyMF0sMjM6WzIsMjBdLDI0OlsyLDIwXX0sezU6WzIsMjFdLDE0OlsyLDIxXSwxNTpbMiwyMV0s
MTY6WzIsMjFdLDE5OlsyLDIxXSwyMDpbMiwyMV0sMjI6WzIsMjFdLDIzOlsyLDIxXSwyNDpbMiwy
MV19LHsxODpbMSw2NF19LHsxODpbMiwyNF19LHsxODpbMiwyOV0sMjg6WzIsMjldLDMwOlsyLDI5
XSwzMTpbMiwyOV0sMzI6WzIsMjldLDM1OlsyLDI5XX0sezE4OlsyLDM3XSwzNTpbMiwzN119LHsz
NjpbMSw2MV19LHsyMTo2NSwyODpbMSw2OV0sMzA6WzEsNjZdLDMxOlsxLDY3XSwzMjpbMSw2OF0s
MzU6WzEsMjddLDM4OjI2fSx7MTg6WzIsNDZdLDI4OlsyLDQ2XSwzMDpbMiw0Nl0sMzE6WzIsNDZd
LDMyOlsyLDQ2XSwzNTpbMiw0Nl0sMzk6WzIsNDZdfSx7MTg6WzEsNzBdfSx7NTpbMiwyMl0sMTQ6
WzIsMjJdLDE1OlsyLDIyXSwxNjpbMiwyMl0sMTk6WzIsMjJdLDIwOlsyLDIyXSwyMjpbMiwyMl0s
MjM6WzIsMjJdLDI0OlsyLDIyXX0sezE4OlsyLDM5XSwzNTpbMiwzOV19LHsxODpbMiw0MF0sMzU6
WzIsNDBdfSx7MTg6WzIsNDFdLDM1OlsyLDQxXX0sezE4OlsyLDQyXSwzNTpbMiw0Ml19LHsxODpb
Miw0M10sMzU6WzIsNDNdfSx7NTpbMiwxOF0sMTQ6WzIsMThdLDE1OlsyLDE4XSwxNjpbMiwxOF0s
MTk6WzIsMThdLDIwOlsyLDE4XSwyMjpbMiwxOF0sMjM6WzIsMThdLDI0OlsyLDE4XX1dLAorZGVm
YXVsdEFjdGlvbnM6IHsxNzpbMiwxXSwyNTpbMiwyOF0sMzg6WzIsMjZdLDU3OlsyLDI0XX0sCitw
YXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgeworICAgIHRocm93IG5l
dyBFcnJvcihzdHIpOworfSwKK3BhcnNlOiBmdW5jdGlvbiBwYXJzZShpbnB1dCkgeworICAgIHZh
ciBzZWxmID0gdGhpcywgc3RhY2sgPSBbMF0sIHZzdGFjayA9IFtudWxsXSwgbHN0YWNrID0gW10s
IHRhYmxlID0gdGhpcy50YWJsZSwgeXl0ZXh0ID0gIiIsIHl5bGluZW5vID0gMCwgeXlsZW5nID0g
MCwgcmVjb3ZlcmluZyA9IDAsIFRFUlJPUiA9IDIsIEVPRiA9IDE7CisgICAgdGhpcy5sZXhlci5z
ZXRJbnB1dChpbnB1dCk7CisgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7CisgICAgdGhpcy55
eS5sZXhlciA9IHRoaXMubGV4ZXI7CisgICAgdGhpcy55eS5wYXJzZXIgPSB0aGlzOworICAgIGlm
ICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVmaW5lZCIpCisgICAgICAgIHRoaXMu
bGV4ZXIueXlsbG9jID0ge307CisgICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7Cisg
ICAgbHN0YWNrLnB1c2goeXlsb2MpOworICAgIHZhciByYW5nZXMgPSB0aGlzLmxleGVyLm9wdGlv
bnMgJiYgdGhpcy5sZXhlci5vcHRpb25zLnJhbmdlczsKKyAgICBpZiAodHlwZW9mIHRoaXMueXku
cGFyc2VFcnJvciA9PT0gImZ1bmN0aW9uIikKKyAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdGhp
cy55eS5wYXJzZUVycm9yOworICAgIGZ1bmN0aW9uIHBvcFN0YWNrKG4pIHsKKyAgICAgICAgc3Rh
Y2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47CisgICAgICAgIHZzdGFjay5sZW5ndGgg
PSB2c3RhY2subGVuZ3RoIC0gbjsKKyAgICAgICAgbHN0YWNrLmxlbmd0aCA9IGxzdGFjay5sZW5n
dGggLSBuOworICAgIH0KKyAgICBmdW5jdGlvbiBsZXgoKSB7CisgICAgICAgIHZhciB0b2tlbjsK
KyAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7CisgICAgICAgIGlmICh0eXBl
b2YgdG9rZW4gIT09ICJudW1iZXIiKSB7CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuc3ltYm9s
c19bdG9rZW5dIHx8IHRva2VuOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAg
ICB9CisgICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIs
IHl5dmFsID0ge30sIHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkOworICAgIHdoaWxlICh0cnVl
KSB7CisgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CisgICAgICAgIGlm
ICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgeworICAgICAgICAgICAgYWN0aW9uID0gdGhp
cy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
ZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKKyAg
ICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTsKKyAgICAgICAg
fQorICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5s
ZW5ndGggfHwgIWFjdGlvblswXSkgeworICAgICAgICAgICAgdmFyIGVyclN0ciA9ICIiOworICAg
ICAgICAgICAgaWYgKCFyZWNvdmVyaW5nKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBb
XTsKKyAgICAgICAgICAgICAgICBmb3IgKHAgaW4gdGFibGVbc3RhdGVdKQorICAgICAgICAgICAg
ICAgICAgICBpZiAodGhpcy50ZXJtaW5hbHNfW3BdICYmIHAgPiAyKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5z
aG93UG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9y
IG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjpcbiIgKyB0aGlzLmxleGVyLnNob3dQb3Np
dGlvbigpICsgIlxuRXhwZWN0aW5nICIgKyBleHBlY3RlZC5qb2luKCIsICIpICsgIiwgZ290ICci
ICsgKHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyAiJyI7CisgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9y
IG9uIGxpbmUgIiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9
PSAxPyJlbmQgb2YgaW5wdXQiOiInIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1i
b2wpICsgIiciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5wYXJz
ZUVycm9yKGVyclN0ciwge3RleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1p
bmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzog
eXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZH0pOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmIChhY3Rpb25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4g
MSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUg
YWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBzeW1i
b2wpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7CisgICAgICAgIGNh
c2UgMToKKyAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTsKKyAgICAgICAgICAgIHZzdGFj
ay5wdXNoKHRoaXMubGV4ZXIueXl0ZXh0KTsKKyAgICAgICAgICAgIGxzdGFjay5wdXNoKHRoaXMu
bGV4ZXIueXlsbG9jKTsKKyAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTsKKyAgICAg
ICAgICAgIHN5bWJvbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoIXByZUVycm9yU3ltYm9sKSB7
CisgICAgICAgICAgICAgICAgeXlsZW5nID0gdGhpcy5sZXhlci55eWxlbmc7CisgICAgICAgICAg
ICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7CisgICAgICAgICAgICAgICAgeXlsaW5l
bm8gPSB0aGlzLmxleGVyLnl5bGluZW5vOworICAgICAgICAgICAgICAgIHl5bG9jID0gdGhpcy5s
ZXhlci55eWxsb2M7CisgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKQorICAgICAg
ICAgICAgICAgICAgICByZWNvdmVyaW5nLS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOworICAgICAgICAgICAgICAgIHByZUVy
cm9yU3ltYm9sID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIDI6CisgICAgICAgICAgICBsZW4gPSB0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25b
MV1dWzFdOworICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVu
XTsKKyAgICAgICAgICAgIHl5dmFsLl8kID0ge2ZpcnN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVu
Z3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfbGluZSwgbGFzdF9saW5lOiBsc3RhY2tbbHN0YWNrLmxl
bmd0aCAtIDFdLmxhc3RfbGluZSwgZmlyc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAt
IChsZW4gfHwgMSldLmZpcnN0X2NvbHVtbiwgbGFzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVu
Z3RoIC0gMV0ubGFzdF9jb2x1bW59OworICAgICAgICAgICAgaWYgKHJhbmdlcykgeworICAgICAg
ICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8
fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5dmFs
LCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNrLCBs
c3RhY2spOworICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgeworICAg
ICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxl
bikgeworICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4gKiAy
KTsKKyAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOwor
ICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2FjdGlv
blsxXV1bMF0pOworICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7CisgICAgICAgICAg
ICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CisgICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxlW3N0
YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07CisgICAgICAg
ICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIDM6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KK307CisvKiBKaXNvbiBnZW5lcmF0ZWQgbGV4ZXIgKi8KK3ZhciBsZXhl
ciA9IChmdW5jdGlvbigpewordmFyIGxleGVyID0gKHtFT0Y6MSwKK3BhcnNlRXJyb3I6ZnVuY3Rp
b24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKKyAgICAgICAgaWYgKHRoaXMueXkucGFyc2VyKSB7
CisgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTsKKyAgICAgICAg
fQorICAgIH0sCitzZXRJbnB1dDpmdW5jdGlvbiAoaW5wdXQpIHsKKyAgICAgICAgdGhpcy5faW5w
dXQgPSBpbnB1dDsKKyAgICAgICAgdGhpcy5fbW9yZSA9IHRoaXMuX2xlc3MgPSB0aGlzLmRvbmUg
PSBmYWxzZTsKKyAgICAgICAgdGhpcy55eWxpbmVubyA9IHRoaXMueXlsZW5nID0gMDsKKyAgICAg
ICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gJyc7CisgICAgICAg
IHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbJ0lOSVRJQUwnXTsKKyAgICAgICAgdGhpcy55eWxsb2Mg
PSB7Zmlyc3RfbGluZToxLGZpcnN0X2NvbHVtbjowLGxhc3RfbGluZToxLGxhc3RfY29sdW1uOjB9
OworICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2UgPSBb
MCwwXTsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSAwOworICAgICAgICByZXR1cm4gdGhpczsKKyAg
ICB9LAoraW5wdXQ6ZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgY2ggPSB0aGlzLl9pbnB1dFsw
XTsKKyAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CisgICAgICAgIHRoaXMueXlsZW5nKys7Cisg
ICAgICAgIHRoaXMub2Zmc2V0Kys7CisgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CisgICAgICAg
IHRoaXMubWF0Y2hlZCArPSBjaDsKKyAgICAgICAgdmFyIGxpbmVzID0gY2gubWF0Y2goLyg/Olxy
XG4/fFxuKS4qL2cpOworICAgICAgICBpZiAobGluZXMpIHsKKyAgICAgICAgICAgIHRoaXMueXls
aW5lbm8rKzsKKyAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfbGluZSsrOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgdGhpcy55eWxsb2MubGFzdF9jb2x1bW4rKzsKKyAgICAgICAg
fQorICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0r
KzsKKworICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKDEpOworICAgICAg
ICByZXR1cm4gY2g7CisgICAgfSwKK3VucHV0OmZ1bmN0aW9uIChjaCkgeworICAgICAgICB2YXIg
bGVuID0gY2gubGVuZ3RoOworICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98
XG4pL2cpOworCisgICAgICAgIHRoaXMuX2lucHV0ID0gY2ggKyB0aGlzLl9pbnB1dDsKKyAgICAg
ICAgdGhpcy55eXRleHQgPSB0aGlzLnl5dGV4dC5zdWJzdHIoMCwgdGhpcy55eXRleHQubGVuZ3Ro
LWxlbi0xKTsKKyAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47CisgICAgICAgIHRoaXMub2Zm
c2V0IC09IGxlbjsKKyAgICAgICAgdmFyIG9sZExpbmVzID0gdGhpcy5tYXRjaC5zcGxpdCgvKD86
XHJcbj98XG4pL2cpOworICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwg
dGhpcy5tYXRjaC5sZW5ndGgtMSk7CisgICAgICAgIHRoaXMubWF0Y2hlZCA9IHRoaXMubWF0Y2hl
ZC5zdWJzdHIoMCwgdGhpcy5tYXRjaGVkLmxlbmd0aC0xKTsKKworICAgICAgICBpZiAobGluZXMu
bGVuZ3RoLTEpIHRoaXMueXlsaW5lbm8gLT0gbGluZXMubGVuZ3RoLTE7CisgICAgICAgIHZhciBy
ID0gdGhpcy55eWxsb2MucmFuZ2U7CisKKyAgICAgICAgdGhpcy55eWxsb2MgPSB7Zmlyc3RfbGlu
ZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSwKKyAgICAgICAgICBsYXN0X2xpbmU6IHRoaXMueXls
aW5lbm8rMSwKKyAgICAgICAgICBmaXJzdF9jb2x1bW46IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVt
biwKKyAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPworICAgICAgICAgICAgICAobGluZXMu
bGVuZ3RoID09PSBvbGRMaW5lcy5sZW5ndGggPyB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gOiAw
KSArIG9sZExpbmVzW29sZExpbmVzLmxlbmd0aCAtIGxpbmVzLmxlbmd0aF0ubGVuZ3RoIC0gbGlu
ZXNbMF0ubGVuZ3RoOgorICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBs
ZW4KKyAgICAgICAgICB9OworCisgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSB7Cisg
ICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcg
LSBsZW5dOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0sCittb3JlOmZ1
bmN0aW9uICgpIHsKKyAgICAgICAgdGhpcy5fbW9yZSA9IHRydWU7CisgICAgICAgIHJldHVybiB0
aGlzOworICAgIH0sCitsZXNzOmZ1bmN0aW9uIChuKSB7CisgICAgICAgIHRoaXMudW5wdXQodGhp
cy5tYXRjaC5zbGljZShuKSk7CisgICAgfSwKK3Bhc3RJbnB1dDpmdW5jdGlvbiAoKSB7CisgICAg
ICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3Ro
IC0gdGhpcy5tYXRjaC5sZW5ndGgpOworICAgICAgICByZXR1cm4gKHBhc3QubGVuZ3RoID4gMjAg
PyAnLi4uJzonJykgKyBwYXN0LnN1YnN0cigtMjApLnJlcGxhY2UoL1xuL2csICIiKTsKKyAgICB9
LAordXBjb21pbmdJbnB1dDpmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBuZXh0ID0gdGhpcy5t
YXRjaDsKKyAgICAgICAgaWYgKG5leHQubGVuZ3RoIDwgMjApIHsKKyAgICAgICAgICAgIG5leHQg
Kz0gdGhpcy5faW5wdXQuc3Vic3RyKDAsIDIwLW5leHQubGVuZ3RoKTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gKG5leHQuc3Vic3RyKDAsMjApKyhuZXh0Lmxlbmd0aCA+IDIwID8gJy4uLic6
JycpKS5yZXBsYWNlKC9cbi9nLCAiIik7CisgICAgfSwKK3Nob3dQb3NpdGlvbjpmdW5jdGlvbiAo
KSB7CisgICAgICAgIHZhciBwcmUgPSB0aGlzLnBhc3RJbnB1dCgpOworICAgICAgICB2YXIgYyA9
IG5ldyBBcnJheShwcmUubGVuZ3RoICsgMSkuam9pbigiLSIpOworICAgICAgICByZXR1cm4gcHJl
ICsgdGhpcy51cGNvbWluZ0lucHV0KCkgKyAiXG4iICsgYysiXiI7CisgICAgfSwKK25leHQ6ZnVu
Y3Rpb24gKCkgeworICAgICAgICBpZiAodGhpcy5kb25lKSB7CisgICAgICAgICAgICByZXR1cm4g
dGhpcy5FT0Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0aGlzLl9pbnB1dCkgdGhpcy5kb25l
ID0gdHJ1ZTsKKworICAgICAgICB2YXIgdG9rZW4sCisgICAgICAgICAgICBtYXRjaCwKKyAgICAg
ICAgICAgIHRlbXBNYXRjaCwKKyAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgY29sLAor
ICAgICAgICAgICAgbGluZXM7CisgICAgICAgIGlmICghdGhpcy5fbW9yZSkgeworICAgICAgICAg
ICAgdGhpcy55eXRleHQgPSAnJzsKKyAgICAgICAgICAgIHRoaXMubWF0Y2ggPSAnJzsKKyAgICAg
ICAgfQorICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLl9jdXJyZW50UnVsZXMoKTsKKyAgICAgICAg
Zm9yICh2YXIgaT0wO2kgPCBydWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGVtcE1h
dGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pOworICAgICAgICAg
ICAgaWYgKHRlbXBNYXRjaCAmJiAoIW1hdGNoIHx8IHRlbXBNYXRjaFswXS5sZW5ndGggPiBtYXRj
aFswXS5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSB0ZW1wTWF0Y2g7CisgICAg
ICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25z
LmZsZXgpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXRj
aCkgeworICAgICAgICAgICAgbGluZXMgPSBtYXRjaFswXS5tYXRjaCgvKD86XHJcbj98XG4pLiov
Zyk7CisgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3Ro
OworICAgICAgICAgICAgdGhpcy55eWxsb2MgPSB7Zmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFz
dF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGlu
ZW5vKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9jb2x1bW46IHRoaXMueXls
bG9jLmxhc3RfY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46
IGxpbmVzID8gbGluZXNbbGluZXMubGVuZ3RoLTFdLmxlbmd0aC1saW5lc1tsaW5lcy5sZW5ndGgt
MV0ubWF0Y2goL1xyP1xuPy8pWzBdLmxlbmd0aCA6IHRoaXMueXlsbG9jLmxhc3RfY29sdW1uICsg
bWF0Y2hbMF0ubGVuZ3RofTsKKyAgICAgICAgICAgIHRoaXMueXl0ZXh0ICs9IG1hdGNoWzBdOwor
ICAgICAgICAgICAgdGhpcy5tYXRjaCArPSBtYXRjaFswXTsKKyAgICAgICAgICAgIHRoaXMubWF0
Y2hlcyA9IG1hdGNoOworICAgICAgICAgICAgdGhpcy55eWxlbmcgPSB0aGlzLnl5dGV4dC5sZW5n
dGg7CisgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgeworICAgICAgICAgICAg
ICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlz
Lnl5bGVuZ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9tb3JlID0gZmFsc2U7
CisgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxl
bmd0aCk7CisgICAgICAgICAgICB0aGlzLm1hdGNoZWQgKz0gbWF0Y2hbMF07CisgICAgICAgICAg
ICB0b2tlbiA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHRoaXMsIHRoaXMueXksIHRoaXMsIHJ1
bGVzW2luZGV4XSx0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3Ro
LTFdKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9u
ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHRva2VuKSByZXR1cm4gdG9rZW47CisgICAgICAg
ICAgICBlbHNlIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5faW5wdXQgPT09
ICIiKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUVycm9yKCdMZXhpY2FsIGVycm9yIG9uIGxpbmUg
JysodGhpcy55eWxpbmVubysxKSsnLiBVbnJlY29nbml6ZWQgdGV4dC5cbicrdGhpcy5zaG93UG9z
aXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAge3RleHQ6ICIiLCB0b2tlbjogbnVsbCwgbGlu
ZTogdGhpcy55eWxpbmVub30pOworICAgICAgICB9CisgICAgfSwKK2xleDpmdW5jdGlvbiBsZXgo
KSB7CisgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7CisgICAgICAgIGlmICh0eXBlb2YgciAh
PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV4KCk7CisgICAgICAgIH0KKyAgICB9LAorYmVn
aW46ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZGl0aW9uU3Rh
Y2sucHVzaChjb25kaXRpb24pOworICAgIH0sCitwb3BTdGF0ZTpmdW5jdGlvbiBwb3BTdGF0ZSgp
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2sucG9wKCk7CisgICAgfSwKK19j
dXJyZW50UnVsZXM6ZnVuY3Rpb24gX2N1cnJlbnRSdWxlcygpIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMuY29uZGl0aW9uc1t0aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVu
Z3RoLTFdXS5ydWxlczsKKyAgICB9LAordG9wU3RhdGU6ZnVuY3Rpb24gKCkgeworICAgICAgICBy
ZXR1cm4gdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0yXTsK
KyAgICB9LAorcHVzaFN0YXRlOmZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikgeworICAgICAgICB0
aGlzLmJlZ2luKGNvbmRpdGlvbik7CisgICAgfX0pOworbGV4ZXIub3B0aW9ucyA9IHt9OworbGV4
ZXIucGVyZm9ybUFjdGlvbiA9IGZ1bmN0aW9uIGFub255bW91cyh5eSx5eV8sJGF2b2lkaW5nX25h
bWVfY29sbGlzaW9ucyxZWV9TVEFSVCkgeworCit2YXIgWVlTVEFURT1ZWV9TVEFSVAorc3dpdGNo
KCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMpIHsKK2Nhc2UgMDoKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYoeXlfLnl5dGV4dC5zbGljZSgtMSkgIT09ICJcXCIpIHRoaXMu
YmVnaW4oIm11Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHl5Xy55
eXRleHQuc2xpY2UoLTEpID09PSAiXFwiKSB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIo
MCx5eV8ueXlsZW5nLTEpLCB0aGlzLmJlZ2luKCJlbXUiKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYoeXlfLnl5dGV4dCkgcmV0dXJuIDE0OworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiticmVhazsKK2Nhc2UgMTogcmV0dXJuIDE0OyAKK2JyZWFrOwor
Y2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0
LnNsaWNlKC0xKSAhPT0gIlxcIikgdGhpcy5wb3BTdGF0ZSgpOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgeXlfLnl5
dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDAseXlfLnl5bGVuZy0xKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCiticmVhazsKK2Nhc2UgMzogeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3Ry
KDAsIHl5Xy55eWxlbmctNCk7IHRoaXMucG9wU3RhdGUoKTsgcmV0dXJuIDE1OyAKK2JyZWFrOwor
Y2FzZSA0OiB0aGlzLmJlZ2luKCJwYXIiKTsgcmV0dXJuIDI0OyAKK2JyZWFrOworY2FzZSA1OiBy
ZXR1cm4gMTY7IAorYnJlYWs7CitjYXNlIDY6IHJldHVybiAyMDsgCiticmVhazsKK2Nhc2UgNzog
cmV0dXJuIDE5OyAKK2JyZWFrOworY2FzZSA4OiByZXR1cm4gMTk7IAorYnJlYWs7CitjYXNlIDk6
IHJldHVybiAyMzsgCiticmVhazsKK2Nhc2UgMTA6IHJldHVybiAyMzsgCiticmVhazsKK2Nhc2Ug
MTE6IHRoaXMucG9wU3RhdGUoKTsgdGhpcy5iZWdpbignY29tJyk7IAorYnJlYWs7CitjYXNlIDEy
OiB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIoMyx5eV8ueXlsZW5nLTUpOyB0aGlzLnBv
cFN0YXRlKCk7IHJldHVybiAxNTsgCiticmVhazsKK2Nhc2UgMTM6IHJldHVybiAyMjsgCiticmVh
azsKK2Nhc2UgMTQ6IHJldHVybiAzNjsgCiticmVhazsKK2Nhc2UgMTU6IHJldHVybiAzNTsgCiti
cmVhazsKK2Nhc2UgMTY6IHJldHVybiAzNTsgCiticmVhazsKK2Nhc2UgMTc6IHJldHVybiAzOTsg
CiticmVhazsKK2Nhc2UgMTg6IC8qaWdub3JlIHdoaXRlc3BhY2UqLyAKK2JyZWFrOworY2FzZSAx
OTogdGhpcy5wb3BTdGF0ZSgpOyByZXR1cm4gMTg7IAorYnJlYWs7CitjYXNlIDIwOiB0aGlzLnBv
cFN0YXRlKCk7IHJldHVybiAxODsgCiticmVhazsKK2Nhc2UgMjE6IHl5Xy55eXRleHQgPSB5eV8u
eXl0ZXh0LnN1YnN0cigxLHl5Xy55eWxlbmctMikucmVwbGFjZSgvXFwiL2csJyInKTsgcmV0dXJu
IDMwOyAKK2JyZWFrOworY2FzZSAyMjogeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDEs
eXlfLnl5bGVuZy0yKS5yZXBsYWNlKC9cXCcvZywiJyIpOyByZXR1cm4gMzA7IAorYnJlYWs7Citj
YXNlIDIzOiB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIoMSk7IHJldHVybiAyODsgCiti
cmVhazsKK2Nhc2UgMjQ6IHJldHVybiAzMjsgCiticmVhazsKK2Nhc2UgMjU6IHJldHVybiAzMjsg
CiticmVhazsKK2Nhc2UgMjY6IHJldHVybiAzMTsgCiticmVhazsKK2Nhc2UgMjc6IHJldHVybiAz
NTsgCiticmVhazsKK2Nhc2UgMjg6IHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cigxLCB5
eV8ueXlsZW5nLTIpOyByZXR1cm4gMzU7IAorYnJlYWs7CitjYXNlIDI5OiByZXR1cm4gJ0lOVkFM
SUQnOyAKK2JyZWFrOworY2FzZSAzMDogLyppZ25vcmUgd2hpdGVzcGFjZSovIAorYnJlYWs7Citj
YXNlIDMxOiB0aGlzLnBvcFN0YXRlKCk7IHJldHVybiAzNzsgCiticmVhazsKK2Nhc2UgMzI6IHJl
dHVybiA1OyAKK2JyZWFrOworfQorfTsKK2xleGVyLnJ1bGVzID0gWy9eKD86W15ceDAwXSo/KD89
KFx7XHspKSkvLC9eKD86W15ceDAwXSspLywvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fCQpKSkv
LC9eKD86W1xzXFNdKj8tLVx9XH0pLywvXig/Olx7XHs+KS8sL14oPzpce1x7IykvLC9eKD86XHtc
e1wvKS8sL14oPzpce1x7XF4pLywvXig/Olx7XHtccyplbHNlXGIpLywvXig/Olx7XHtceykvLC9e
KD86XHtceyYpLywvXig/Olx7XHshLS0pLywvXig/Olx7XHshW1xzXFNdKj9cfVx9KS8sL14oPzpc
e1x7KS8sL14oPzo9KS8sL14oPzpcLig/PVt9IF0pKS8sL14oPzpcLlwuKS8sL14oPzpbXC8uXSkv
LC9eKD86XHMrKS8sL14oPzpcfVx9XH0pLywvXig/Olx9XH0pLywvXig/OiIoXFxbIl18W14iXSkq
IikvLC9eKD86JyhcXFsnXXxbXiddKSonKS8sL14oPzpAW2EtekEtWl0rKS8sL14oPzp0cnVlKD89
W31cc10pKS8sL14oPzpmYWxzZSg/PVt9XHNdKSkvLC9eKD86WzAtOV0rKD89W31cc10pKS8sL14o
PzpbYS16QS1aMC05XyQtXSsoPz1bPX1cc1wvLl0pKS8sL14oPzpcW1teXF1dKlxdKS8sL14oPzou
KS8sL14oPzpccyspLywvXig/OlthLXpBLVowLTlfJC0vXSspLywvXig/OiQpL107CitsZXhlci5j
b25kaXRpb25zID0geyJtdSI6eyJydWxlcyI6WzQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1
LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMyXSwiaW5jbHVzaXZl
IjpmYWxzZX0sImVtdSI6eyJydWxlcyI6WzJdLCJpbmNsdXNpdmUiOmZhbHNlfSwiY29tIjp7InJ1
bGVzIjpbM10sImluY2x1c2l2ZSI6ZmFsc2V9LCJwYXIiOnsicnVsZXMiOlszMCwzMV0sImluY2x1
c2l2ZSI6ZmFsc2V9LCJJTklUSUFMIjp7InJ1bGVzIjpbMCwxLDMyXSwiaW5jbHVzaXZlIjp0cnVl
fX07CityZXR1cm4gbGV4ZXI7fSkoKQorcGFyc2VyLmxleGVyID0gbGV4ZXI7CitmdW5jdGlvbiBQ
YXJzZXIgKCkgeyB0aGlzLnl5ID0ge307IH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNl
ci5QYXJzZXIgPSBQYXJzZXI7CityZXR1cm4gbmV3IFBhcnNlcjsKK30pKCk7OworLy8gbGliL2hh
bmRsZWJhcnMvY29tcGlsZXIvYmFzZS5qcworSGFuZGxlYmFycy5QYXJzZXIgPSBoYW5kbGViYXJz
OworCitIYW5kbGViYXJzLnBhcnNlID0gZnVuY3Rpb24oaW5wdXQpIHsKKworICAvLyBKdXN0IHJl
dHVybiBpZiBhbiBhbHJlYWR5LWNvbXBpbGUgQVNUIHdhcyBwYXNzZWQgaW4uCisgIGlmKGlucHV0
LmNvbnN0cnVjdG9yID09PSBIYW5kbGViYXJzLkFTVC5Qcm9ncmFtTm9kZSkgeyByZXR1cm4gaW5w
dXQ7IH0KKworICBIYW5kbGViYXJzLlBhcnNlci55eSA9IEhhbmRsZWJhcnMuQVNUOworICByZXR1
cm4gSGFuZGxlYmFycy5QYXJzZXIucGFyc2UoaW5wdXQpOworfTsKKworSGFuZGxlYmFycy5wcmlu
dCA9IGZ1bmN0aW9uKGFzdCkgeworICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuUHJpbnRWaXNpdG9y
KCkuYWNjZXB0KGFzdCk7Cit9OzsKKy8vIGxpYi9oYW5kbGViYXJzL2NvbXBpbGVyL2FzdC5qcwor
KGZ1bmN0aW9uKCkgeworCisgIEhhbmRsZWJhcnMuQVNUID0ge307CisKKyAgSGFuZGxlYmFycy5B
U1QuUHJvZ3JhbU5vZGUgPSBmdW5jdGlvbihzdGF0ZW1lbnRzLCBpbnZlcnNlKSB7CisgICAgdGhp
cy50eXBlID0gInByb2dyYW0iOworICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7Cisg
ICAgaWYoaW52ZXJzZSkgeyB0aGlzLmludmVyc2UgPSBuZXcgSGFuZGxlYmFycy5BU1QuUHJvZ3Jh
bU5vZGUoaW52ZXJzZSk7IH0KKyAgfTsKKworICBIYW5kbGViYXJzLkFTVC5NdXN0YWNoZU5vZGUg
PSBmdW5jdGlvbihyYXdQYXJhbXMsIGhhc2gsIHVuZXNjYXBlZCkgeworICAgIHRoaXMudHlwZSA9
ICJtdXN0YWNoZSI7CisgICAgdGhpcy5lc2NhcGVkID0gIXVuZXNjYXBlZDsKKyAgICB0aGlzLmhh
c2ggPSBoYXNoOworCisgICAgdmFyIGlkID0gdGhpcy5pZCA9IHJhd1BhcmFtc1swXTsKKyAgICB2
YXIgcGFyYW1zID0gdGhpcy5wYXJhbXMgPSByYXdQYXJhbXMuc2xpY2UoMSk7CisKKyAgICAvLyBh
IG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBpZjoKKyAgICAvLyAqIGl0cyBpZCBpcyBz
aW1wbGUgKGEgc2luZ2xlIHBhcnQsIG5vdCBgdGhpc2Agb3IgYC4uYCkKKyAgICB2YXIgZWxpZ2li
bGVIZWxwZXIgPSB0aGlzLmVsaWdpYmxlSGVscGVyID0gaWQuaXNTaW1wbGU7CisKKyAgICAvLyBh
IG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CisgICAgLy8gKiBpdCBpcyBhbiBl
bGlnaWJsZSBoZWxwZXIsIGFuZAorICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJhbWV0
ZXIgb3IgaGFzaCBzZWdtZW50CisgICAgdGhpcy5pc0hlbHBlciA9IGVsaWdpYmxlSGVscGVyICYm
IChwYXJhbXMubGVuZ3RoIHx8IGhhc2gpOworCisgICAgLy8gaWYgYSBtdXN0YWNoZSBpcyBhbiBl
bGlnaWJsZSBoZWxwZXIgYnV0IG5vdCBhIGRlZmluaXRlCisgICAgLy8gaGVscGVyLCBpdCBpcyBh
bWJpZ3VvdXMsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGluIGEgbGF0ZXIKKyAgICAvLyBwYXNzIG9y
IGF0IHJ1bnRpbWUuCisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuUGFydGlhbE5vZGUgPSBmdW5j
dGlvbihwYXJ0aWFsTmFtZSwgY29udGV4dCkgeworICAgIHRoaXMudHlwZSAgICAgICAgID0gInBh
cnRpYWwiOworICAgIHRoaXMucGFydGlhbE5hbWUgID0gcGFydGlhbE5hbWU7CisgICAgdGhpcy5j
b250ZXh0ICAgICAgPSBjb250ZXh0OworICB9OworCisgIHZhciB2ZXJpZnlNYXRjaCA9IGZ1bmN0
aW9uKG9wZW4sIGNsb3NlKSB7CisgICAgaWYob3Blbi5vcmlnaW5hbCAhPT0gY2xvc2Uub3JpZ2lu
YWwpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlvbihvcGVuLm9yaWdpbmFs
ICsgIiBkb2Vzbid0IG1hdGNoICIgKyBjbG9zZS5vcmlnaW5hbCk7CisgICAgfQorICB9OworCisg
IEhhbmRsZWJhcnMuQVNULkJsb2NrTm9kZSA9IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFtLCBp
bnZlcnNlLCBjbG9zZSkgeworICAgIHZlcmlmeU1hdGNoKG11c3RhY2hlLmlkLCBjbG9zZSk7Cisg
ICAgdGhpcy50eXBlID0gImJsb2NrIjsKKyAgICB0aGlzLm11c3RhY2hlID0gbXVzdGFjaGU7Cisg
ICAgdGhpcy5wcm9ncmFtICA9IHByb2dyYW07CisgICAgdGhpcy5pbnZlcnNlICA9IGludmVyc2U7
CisKKyAgICBpZiAodGhpcy5pbnZlcnNlICYmICF0aGlzLnByb2dyYW0pIHsKKyAgICAgIHRoaXMu
aXNJbnZlcnNlID0gdHJ1ZTsKKyAgICB9CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuQ29udGVu
dE5vZGUgPSBmdW5jdGlvbihzdHJpbmcpIHsKKyAgICB0aGlzLnR5cGUgPSAiY29udGVudCI7Cisg
ICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuSGFzaE5v
ZGUgPSBmdW5jdGlvbihwYWlycykgeworICAgIHRoaXMudHlwZSA9ICJoYXNoIjsKKyAgICB0aGlz
LnBhaXJzID0gcGFpcnM7CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuSWROb2RlID0gZnVuY3Rp
b24ocGFydHMpIHsKKyAgICB0aGlzLnR5cGUgPSAiSUQiOworICAgIHRoaXMub3JpZ2luYWwgPSBw
YXJ0cy5qb2luKCIuIik7CisKKyAgICB2YXIgZGlnID0gW10sIGRlcHRoID0gMDsKKworICAgIGZv
cih2YXIgaT0wLGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgdmFyIHBhcnQgPSBw
YXJ0c1tpXTsKKworICAgICAgaWYgKHBhcnQgPT09ICIuLiIgfHwgcGFydCA9PT0gIi4iIHx8IHBh
cnQgPT09ICJ0aGlzIikgeworICAgICAgICBpZiAoZGlnLmxlbmd0aCA+IDApIHsgdGhyb3cgbmV3
IEhhbmRsZWJhcnMuRXhjZXB0aW9uKCJJbnZhbGlkIHBhdGg6ICIgKyB0aGlzLm9yaWdpbmFsKTsg
fQorICAgICAgICBlbHNlIGlmIChwYXJ0ID09PSAiLi4iKSB7IGRlcHRoKys7IH0KKyAgICAgICAg
ZWxzZSB7IHRoaXMuaXNTY29wZWQgPSB0cnVlOyB9CisgICAgICB9CisgICAgICBlbHNlIHsgZGln
LnB1c2gocGFydCk7IH0KKyAgICB9CisKKyAgICB0aGlzLnBhcnRzICAgID0gZGlnOworICAgIHRo
aXMuc3RyaW5nICAgPSBkaWcuam9pbignLicpOworICAgIHRoaXMuZGVwdGggICAgPSBkZXB0aDsK
KworICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRo
YXQgcGFydCBpcyBub3QKKyAgICAvLyBgLi5gIG9yIGB0aGlzYC4KKyAgICB0aGlzLmlzU2ltcGxl
ID0gcGFydHMubGVuZ3RoID09PSAxICYmICF0aGlzLmlzU2NvcGVkICYmIGRlcHRoID09PSAwOwor
CisgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSB0aGlzLnN0cmluZzsKKyAgfTsKKworICBIYW5k
bGViYXJzLkFTVC5QYXJ0aWFsTmFtZU5vZGUgPSBmdW5jdGlvbihuYW1lKSB7CisgICAgdGhpcy50
eXBlID0gIlBBUlRJQUxfTkFNRSI7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfTsKKworICBI
YW5kbGViYXJzLkFTVC5EYXRhTm9kZSA9IGZ1bmN0aW9uKGlkKSB7CisgICAgdGhpcy50eXBlID0g
IkRBVEEiOworICAgIHRoaXMuaWQgPSBpZDsKKyAgfTsKKworICBIYW5kbGViYXJzLkFTVC5TdHJp
bmdOb2RlID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgICAgdGhpcy50eXBlID0gIlNUUklORyI7Cisg
ICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBzdHJp
bmc7CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuSW50ZWdlck5vZGUgPSBmdW5jdGlvbihpbnRl
Z2VyKSB7CisgICAgdGhpcy50eXBlID0gIklOVEVHRVIiOworICAgIHRoaXMuaW50ZWdlciA9IGlu
dGVnZXI7CisgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBOdW1iZXIoaW50ZWdlcik7CisgIH07
CisKKyAgSGFuZGxlYmFycy5BU1QuQm9vbGVhbk5vZGUgPSBmdW5jdGlvbihib29sKSB7CisgICAg
dGhpcy50eXBlID0gIkJPT0xFQU4iOworICAgIHRoaXMuYm9vbCA9IGJvb2w7CisgICAgdGhpcy5z
dHJpbmdNb2RlVmFsdWUgPSBib29sID09PSAidHJ1ZSI7CisgIH07CisKKyAgSGFuZGxlYmFycy5B
U1QuQ29tbWVudE5vZGUgPSBmdW5jdGlvbihjb21tZW50KSB7CisgICAgdGhpcy50eXBlID0gImNv
bW1lbnQiOworICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgIH07CisKK30pKCk7OworLy8g
bGliL2hhbmRsZWJhcnMvdXRpbHMuanMKKwordmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9u
JywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcics
ICdzdGFjayddOworCitIYW5kbGViYXJzLkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsK
KyAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworCisgIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFyZSBub3QgZW51bWVyYWJsZSBp
biBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRtcGAgZG9lc24ndCB3b3JrLgor
ICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHsKKyAg
ICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTsKKyAgfQorfTsK
K0hhbmRsZWJhcnMuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOworCisvLyBCdWls
ZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZQorSGFuZGxlYmFycy5TYWZlU3RyaW5nID0g
ZnVuY3Rpb24oc3RyaW5nKSB7CisgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworfTsKK0hhbmRsZWJh
cnMuU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJu
IHRoaXMuc3RyaW5nLnRvU3RyaW5nKCk7Cit9OworCisoZnVuY3Rpb24oKSB7CisgIHZhciBlc2Nh
cGUgPSB7CisgICAgIiYiOiAiJmFtcDsiLAorICAgICI8IjogIiZsdDsiLAorICAgICI+IjogIiZn
dDsiLAorICAgICciJzogIiZxdW90OyIsCisgICAgIiciOiAiJiN4Mjc7IiwKKyAgICAiYCI6ICIm
I3g2MDsiCisgIH07CisKKyAgdmFyIGJhZENoYXJzID0gL1smPD4iJ2BdL2c7CisgIHZhciBwb3Nz
aWJsZSA9IC9bJjw+IidgXS87CisKKyAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihjaHIpIHsK
KyAgICByZXR1cm4gZXNjYXBlW2Nocl0gfHwgIiZhbXA7IjsKKyAgfTsKKworICBIYW5kbGViYXJz
LlV0aWxzID0geworICAgIGVzY2FwZUV4cHJlc3Npb246IGZ1bmN0aW9uKHN0cmluZykgeworICAg
ICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2Fm
ZQorICAgICAgaWYgKHN0cmluZyBpbnN0YW5jZW9mIEhhbmRsZWJhcnMuU2FmZVN0cmluZykgewor
ICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmlu
ZyA9PSBudWxsIHx8IHN0cmluZyA9PT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAg
ICAgfQorCisgICAgICBpZighcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7
IH0KKyAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cisg
ICAgfSwKKworICAgIGlzRW1wdHk6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVl
ICYmIHZhbHVlICE9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlm
KE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICJbb2JqZWN0IEFycmF5
XSIgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfTsKK30p
KCk7OworLy8gbGliL2hhbmRsZWJhcnMvY29tcGlsZXIvY29tcGlsZXIuanMKKworLypqc2hpbnQg
ZXFudWxsOnRydWUqLworSGFuZGxlYmFycy5Db21waWxlciA9IGZ1bmN0aW9uKCkge307CitIYW5k
bGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CisKKyhmdW5jdGlvbihD
b21waWxlciwgSmF2YVNjcmlwdENvbXBpbGVyKSB7CisgIC8vIHRoZSBmb3VuZEhlbHBlciByZWdp
c3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIgbG9va3VwIGZyb20gZmluZGluZyBhCisgIC8v
IGZ1bmN0aW9uIGluIGEgY29udGV4dC4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIG11c3RhY2hlIGNv
bXBhdGliaWxpdHksIHdoaWNoCisgIC8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMg
aW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAorICAvLyBhbmQg
dGhlbiBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRvIGJs
b2NrSGVscGVyTWlzc2luZy4KKworICBDb21waWxlci5wcm90b3R5cGUgPSB7CisgICAgY29tcGls
ZXI6IENvbXBpbGVyLAorCisgICAgZGlzYXNzZW1ibGU6IGZ1bmN0aW9uKCkgeworICAgICAgdmFy
IG9wY29kZXMgPSB0aGlzLm9wY29kZXMsIG9wY29kZSwgb3V0ID0gW10sIHBhcmFtcywgcGFyYW07
CisKKyAgICAgIGZvciAodmFyIGk9MCwgbD1vcGNvZGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAg
ICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKKworICAgICAgICBpZiAob3Bjb2RlLm9wY29kZSA9
PT0gJ0RFQ0xBUkUnKSB7CisgICAgICAgICAgb3V0LnB1c2goIkRFQ0xBUkUgIiArIG9wY29kZS5u
YW1lICsgIj0iICsgb3Bjb2RlLnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBw
YXJhbXMgPSBbXTsKKyAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8b3Bjb2RlLmFyZ3MubGVuZ3Ro
OyBqKyspIHsKKyAgICAgICAgICAgIHBhcmFtID0gb3Bjb2RlLmFyZ3Nbal07CisgICAgICAgICAg
ICBpZiAodHlwZW9mIHBhcmFtID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICBwYXJhbSA9
ICJcIiIgKyBwYXJhbS5yZXBsYWNlKCJcbiIsICJcXG4iKSArICJcIiI7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7CisgICAgICAgICAgfQorICAgICAgICAg
IG91dC5wdXNoKG9wY29kZS5vcGNvZGUgKyAiICIgKyBwYXJhbXMuam9pbigiICIpKTsKKyAgICAg
ICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gb3V0LmpvaW4oIlxuIik7CisgICAgfSwKKyAg
ICBlcXVhbHM6IGZ1bmN0aW9uKG90aGVyKSB7CisgICAgICB2YXIgbGVuID0gdGhpcy5vcGNvZGVz
Lmxlbmd0aDsKKyAgICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBs
ZW47IGkrKykgeworICAgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAorICAgICAg
ICAgICAgb3RoZXJPcGNvZGUgPSBvdGhlci5vcGNvZGVzW2ldOworICAgICAgICBpZiAob3Bjb2Rl
Lm9wY29kZSAhPT0gb3RoZXJPcGNvZGUub3Bjb2RlIHx8IG9wY29kZS5hcmdzLmxlbmd0aCAhPT0g
b3RoZXJPcGNvZGUuYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvcGNvZGUuYXJncy5sZW5ndGg7IGor
KykgeworICAgICAgICAgIGlmIChvcGNvZGUuYXJnc1tqXSAhPT0gb3RoZXJPcGNvZGUuYXJnc1tq
XSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIGd1aWQ6IDAsCisKKyAg
ICBjb21waWxlOiBmdW5jdGlvbihwcm9ncmFtLCBvcHRpb25zKSB7CisgICAgICB0aGlzLmNoaWxk
cmVuID0gW107CisgICAgICB0aGlzLmRlcHRocyA9IHtsaXN0OiBbXX07CisgICAgICB0aGlzLm9w
dGlvbnMgPSBvcHRpb25zOworCisgICAgICAvLyBUaGVzZSBjaGFuZ2VzIHdpbGwgcHJvcGFnYXRl
IHRvIHRoZSBvdGhlciBjb21waWxlciBjb21wb25lbnRzCisgICAgICB2YXIga25vd25IZWxwZXJz
ID0gdGhpcy5vcHRpb25zLmtub3duSGVscGVyczsKKyAgICAgIHRoaXMub3B0aW9ucy5rbm93bkhl
bHBlcnMgPSB7CisgICAgICAgICdoZWxwZXJNaXNzaW5nJzogdHJ1ZSwKKyAgICAgICAgJ2Jsb2Nr
SGVscGVyTWlzc2luZyc6IHRydWUsCisgICAgICAgICdlYWNoJzogdHJ1ZSwKKyAgICAgICAgJ2lm
JzogdHJ1ZSwKKyAgICAgICAgJ3VubGVzcyc6IHRydWUsCisgICAgICAgICd3aXRoJzogdHJ1ZSwK
KyAgICAgICAgJ2xvZyc6IHRydWUKKyAgICAgIH07CisgICAgICBpZiAoa25vd25IZWxwZXJzKSB7
CisgICAgICAgIGZvciAodmFyIG5hbWUgaW4ga25vd25IZWxwZXJzKSB7CisgICAgICAgICAgdGhp
cy5vcHRpb25zLmtub3duSGVscGVyc1tuYW1lXSA9IGtub3duSGVscGVyc1tuYW1lXTsKKyAgICAg
ICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5wcm9ncmFtKHByb2dyYW0pOworICAg
IH0sCisKKyAgICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIHJldHVybiB0aGlzW25v
ZGUudHlwZV0obm9kZSk7CisgICAgfSwKKworICAgIHByb2dyYW06IGZ1bmN0aW9uKHByb2dyYW0p
IHsKKyAgICAgIHZhciBzdGF0ZW1lbnRzID0gcHJvZ3JhbS5zdGF0ZW1lbnRzLCBzdGF0ZW1lbnQ7
CisgICAgICB0aGlzLm9wY29kZXMgPSBbXTsKKworICAgICAgZm9yKHZhciBpPTAsIGw9c3RhdGVt
ZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudHNb
aV07CisgICAgICAgIHRoaXNbc3RhdGVtZW50LnR5cGVdKHN0YXRlbWVudCk7CisgICAgICB9Cisg
ICAgICB0aGlzLmlzU2ltcGxlID0gbCA9PT0gMTsKKworICAgICAgdGhpcy5kZXB0aHMubGlzdCA9
IHRoaXMuZGVwdGhzLmxpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7CisgICAgICAgIHJldHVybiBh
IC0gYjsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgY29t
cGlsZVByb2dyYW06IGZ1bmN0aW9uKHByb2dyYW0pIHsKKyAgICAgIHZhciByZXN1bHQgPSBuZXcg
dGhpcy5jb21waWxlcigpLmNvbXBpbGUocHJvZ3JhbSwgdGhpcy5vcHRpb25zKTsKKyAgICAgIHZh
ciBndWlkID0gdGhpcy5ndWlkKyssIGRlcHRoOworCisgICAgICB0aGlzLnVzZVBhcnRpYWwgPSB0
aGlzLnVzZVBhcnRpYWwgfHwgcmVzdWx0LnVzZVBhcnRpYWw7CisKKyAgICAgIHRoaXMuY2hpbGRy
ZW5bZ3VpZF0gPSByZXN1bHQ7CisKKyAgICAgIGZvcih2YXIgaT0wLCBsPXJlc3VsdC5kZXB0aHMu
bGlzdC5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGRlcHRoID0gcmVzdWx0LmRlcHRocy5s
aXN0W2ldOworCisgICAgICAgIGlmKGRlcHRoIDwgMikgeyBjb250aW51ZTsgfQorICAgICAgICBl
bHNlIHsgdGhpcy5hZGREZXB0aChkZXB0aCAtIDEpOyB9CisgICAgICB9CisKKyAgICAgIHJldHVy
biBndWlkOworICAgIH0sCisKKyAgICBibG9jazogZnVuY3Rpb24oYmxvY2spIHsKKyAgICAgIHZh
ciBtdXN0YWNoZSA9IGJsb2NrLm11c3RhY2hlLAorICAgICAgICAgIHByb2dyYW0gPSBibG9jay5w
cm9ncmFtLAorICAgICAgICAgIGludmVyc2UgPSBibG9jay5pbnZlcnNlOworCisgICAgICBpZiAo
cHJvZ3JhbSkgeworICAgICAgICBwcm9ncmFtID0gdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFt
KTsKKyAgICAgIH0KKworICAgICAgaWYgKGludmVyc2UpIHsKKyAgICAgICAgaW52ZXJzZSA9IHRo
aXMuY29tcGlsZVByb2dyYW0oaW52ZXJzZSk7CisgICAgICB9CisKKyAgICAgIHZhciB0eXBlID0g
dGhpcy5jbGFzc2lmeU11c3RhY2hlKG11c3RhY2hlKTsKKworICAgICAgaWYgKHR5cGUgPT09ICJo
ZWxwZXIiKSB7CisgICAgICAgIHRoaXMuaGVscGVyTXVzdGFjaGUobXVzdGFjaGUsIHByb2dyYW0s
IGludmVyc2UpOworICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAic2ltcGxlIikgeworICAgICAg
ICB0aGlzLnNpbXBsZU11c3RhY2hlKG11c3RhY2hlKTsKKworICAgICAgICAvLyBub3cgdGhhdCB0
aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGV2
YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYAorICAgICAgICB0aGlz
Lm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ3B1
c2hQcm9ncmFtJywgaW52ZXJzZSk7CisgICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsK
KyAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHRoaXMuYW1iaWd1b3VzTXVzdGFjaGUobXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UpOwor
CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQsIHdl
IG5lZWQgdG8KKyAgICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBl
ck1pc3NpbmdgCisgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwor
ICAgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKKyAgICAgICAgdGhp
cy5vcGNvZGUoJ2VtcHR5SGFzaCcpOworICAgICAgICB0aGlzLm9wY29kZSgnYW1iaWd1b3VzQmxv
Y2tWYWx1ZScpOworICAgICAgfQorCisgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7CisgICAg
fSwKKworICAgIGhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKKyAgICAgIHZhciBwYWlycyA9IGhhc2gu
cGFpcnMsIHBhaXIsIHZhbDsKKworICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CisKKyAg
ICAgIGZvcih2YXIgaT0wLCBsPXBhaXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgcGFp
ciA9IHBhaXJzW2ldOworICAgICAgICB2YWwgID0gcGFpclsxXTsKKworICAgICAgICBpZiAodGhp
cy5vcHRpb25zLnN0cmluZ1BhcmFtcykgeworICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoU3Ry
aW5nUGFyYW0nLCB2YWwuc3RyaW5nTW9kZVZhbHVlLCB2YWwudHlwZSk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgdGhpcy5hY2NlcHQodmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRo
aXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyWzBdKTsKKyAgICAgIH0KKyAgICAgIHRoaXMu
b3Bjb2RlKCdwb3BIYXNoJyk7CisgICAgfSwKKworICAgIHBhcnRpYWw6IGZ1bmN0aW9uKHBhcnRp
YWwpIHsKKyAgICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwucGFydGlhbE5hbWU7CisgICAg
ICB0aGlzLnVzZVBhcnRpYWwgPSB0cnVlOworCisgICAgICBpZihwYXJ0aWFsLmNvbnRleHQpIHsK
KyAgICAgICAgdGhpcy5JRChwYXJ0aWFsLmNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgdGhpcy5vcGNvZGUoJ3B1c2gnLCAnZGVwdGgwJyk7CisgICAgICB9CisKKyAgICAgIHRoaXMu
b3Bjb2RlKCdpbnZva2VQYXJ0aWFsJywgcGFydGlhbE5hbWUubmFtZSk7CisgICAgICB0aGlzLm9w
Y29kZSgnYXBwZW5kJyk7CisgICAgfSwKKworICAgIGNvbnRlbnQ6IGZ1bmN0aW9uKGNvbnRlbnQp
IHsKKyAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRDb250ZW50JywgY29udGVudC5zdHJpbmcpOwor
ICAgIH0sCisKKyAgICBtdXN0YWNoZTogZnVuY3Rpb24obXVzdGFjaGUpIHsKKyAgICAgIHZhciBv
cHRpb25zID0gdGhpcy5vcHRpb25zOworICAgICAgdmFyIHR5cGUgPSB0aGlzLmNsYXNzaWZ5TXVz
dGFjaGUobXVzdGFjaGUpOworCisgICAgICBpZiAodHlwZSA9PT0gInNpbXBsZSIpIHsKKyAgICAg
ICAgdGhpcy5zaW1wbGVNdXN0YWNoZShtdXN0YWNoZSk7CisgICAgICB9IGVsc2UgaWYgKHR5cGUg
PT09ICJoZWxwZXIiKSB7CisgICAgICAgIHRoaXMuaGVscGVyTXVzdGFjaGUobXVzdGFjaGUpOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5hbWJpZ3VvdXNNdXN0YWNoZShtdXN0YWNoZSk7
CisgICAgICB9CisKKyAgICAgIGlmKG11c3RhY2hlLmVzY2FwZWQgJiYgIW9wdGlvbnMubm9Fc2Nh
cGUpIHsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKKyAgICAgIH0KKyAgICB9LAorCisg
ICAgYW1iaWd1b3VzTXVzdGFjaGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFtLCBpbnZlcnNl
KSB7CisgICAgICB2YXIgaWQgPSBtdXN0YWNoZS5pZCwKKyAgICAgICAgICBuYW1lID0gaWQucGFy
dHNbMF0sCisgICAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9
IG51bGw7CisKKyAgICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgaWQuZGVwdGgpOworCisg
ICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKKyAgICAgIHRoaXMub3Bj
b2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOworCisgICAgICB0aGlzLm9wY29kZSgnaW52b2tl
QW1iaWd1b3VzJywgbmFtZSwgaXNCbG9jayk7CisgICAgfSwKKworICAgIHNpbXBsZU11c3RhY2hl
OiBmdW5jdGlvbihtdXN0YWNoZSkgeworICAgICAgdmFyIGlkID0gbXVzdGFjaGUuaWQ7CisKKyAg
ICAgIGlmIChpZC50eXBlID09PSAnREFUQScpIHsKKyAgICAgICAgdGhpcy5EQVRBKGlkKTsKKyAg
ICAgIH0gZWxzZSBpZiAoaWQucGFydHMubGVuZ3RoKSB7CisgICAgICAgIHRoaXMuSUQoaWQpOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2ltcGxpZmllZCBJRCBmb3IgYHRoaXNgCisgICAg
ICAgIHRoaXMuYWRkRGVwdGgoaWQuZGVwdGgpOworICAgICAgICB0aGlzLm9wY29kZSgnZ2V0Q29u
dGV4dCcsIGlkLmRlcHRoKTsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7Cisg
ICAgICB9CisKKyAgICAgIHRoaXMub3Bjb2RlKCdyZXNvbHZlUG9zc2libGVMYW1iZGEnKTsKKyAg
ICB9LAorCisgICAgaGVscGVyTXVzdGFjaGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFtLCBp
bnZlcnNlKSB7CisgICAgICB2YXIgcGFyYW1zID0gdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFt
cyhtdXN0YWNoZSwgcHJvZ3JhbSwgaW52ZXJzZSksCisgICAgICAgICAgbmFtZSA9IG11c3RhY2hl
LmlkLnBhcnRzWzBdOworCisgICAgICBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc1tuYW1l
XSkgeworICAgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVu
Z3RoLCBuYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5rbm93bkhlbHBlcnNPbmx5KSB7Cisg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBi
dXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgIiArIG5hbWUpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy5vcGNvZGUoJ2ludm9rZUhlbHBlcicsIHBhcmFtcy5sZW5ndGgsIG5hbWUpOwor
ICAgICAgfQorICAgIH0sCisKKyAgICBJRDogZnVuY3Rpb24oaWQpIHsKKyAgICAgIHRoaXMuYWRk
RGVwdGgoaWQuZGVwdGgpOworICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBpZC5kZXB0
aCk7CisKKyAgICAgIHZhciBuYW1lID0gaWQucGFydHNbMF07CisgICAgICBpZiAoIW5hbWUpIHsK
KyAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICB0aGlzLm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgaWQucGFydHNbMF0pOworICAgICAg
fQorCisgICAgICBmb3IodmFyIGk9MSwgbD1pZC5wYXJ0cy5sZW5ndGg7IGk8bDsgaSsrKSB7Cisg
ICAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXAnLCBpZC5wYXJ0c1tpXSk7CisgICAgICB9CisgICAg
fSwKKworICAgIERBVEE6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHRoaXMub3B0aW9ucy5kYXRh
ID0gdHJ1ZTsKKyAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBEYXRhJywgZGF0YS5pZCk7CisgICAg
fSwKKworICAgIFNUUklORzogZnVuY3Rpb24oc3RyaW5nKSB7CisgICAgICB0aGlzLm9wY29kZSgn
cHVzaFN0cmluZycsIHN0cmluZy5zdHJpbmcpOworICAgIH0sCisKKyAgICBJTlRFR0VSOiBmdW5j
dGlvbihpbnRlZ2VyKSB7CisgICAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBpbnRlZ2Vy
LmludGVnZXIpOworICAgIH0sCisKKyAgICBCT09MRUFOOiBmdW5jdGlvbihib29sKSB7CisgICAg
ICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLmJvb2wpOworICAgIH0sCisKKyAgICBj
b21tZW50OiBmdW5jdGlvbigpIHt9LAorCisgICAgLy8gSEVMUEVSUworICAgIG9wY29kZTogZnVu
Y3Rpb24obmFtZSkgeworICAgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUsIGFy
Z3M6IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSB9KTsKKyAgICB9LAorCisgICAgZGVjbGFy
ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKKyAgICAgIHRoaXMub3Bjb2Rlcy5wdXNoKHsgb3Bj
b2RlOiAnREVDTEFSRScsIG5hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZSB9KTsKKyAgICB9LAorCisg
ICAgYWRkRGVwdGg6IGZ1bmN0aW9uKGRlcHRoKSB7CisgICAgICBpZihpc05hTihkZXB0aCkpIHsg
dGhyb3cgbmV3IEVycm9yKCJFV09UIik7IH0KKyAgICAgIGlmKGRlcHRoID09PSAwKSB7IHJldHVy
bjsgfQorCisgICAgICBpZighdGhpcy5kZXB0aHNbZGVwdGhdKSB7CisgICAgICAgIHRoaXMuZGVw
dGhzW2RlcHRoXSA9IHRydWU7CisgICAgICAgIHRoaXMuZGVwdGhzLmxpc3QucHVzaChkZXB0aCk7
CisgICAgICB9CisgICAgfSwKKworICAgIGNsYXNzaWZ5TXVzdGFjaGU6IGZ1bmN0aW9uKG11c3Rh
Y2hlKSB7CisgICAgICB2YXIgaXNIZWxwZXIgICA9IG11c3RhY2hlLmlzSGVscGVyOworICAgICAg
dmFyIGlzRWxpZ2libGUgPSBtdXN0YWNoZS5lbGlnaWJsZUhlbHBlcjsKKyAgICAgIHZhciBvcHRp
b25zICAgID0gdGhpcy5vcHRpb25zOworCisgICAgICAvLyBpZiBhbWJpZ3VvdXMsIHdlIGNhbiBw
b3NzaWJseSByZXNvbHZlIHRoZSBhbWJpZ3VpdHkgbm93CisgICAgICBpZiAoaXNFbGlnaWJsZSAm
JiAhaXNIZWxwZXIpIHsKKyAgICAgICAgdmFyIG5hbWUgPSBtdXN0YWNoZS5pZC5wYXJ0c1swXTsK
KworICAgICAgICBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0pIHsKKyAgICAgICAgICBp
c0hlbHBlciA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNP
bmx5KSB7CisgICAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9
CisKKyAgICAgIGlmIChpc0hlbHBlcikgeyByZXR1cm4gImhlbHBlciI7IH0KKyAgICAgIGVsc2Ug
aWYgKGlzRWxpZ2libGUpIHsgcmV0dXJuICJhbWJpZ3VvdXMiOyB9CisgICAgICBlbHNlIHsgcmV0
dXJuICJzaW1wbGUiOyB9CisgICAgfSwKKworICAgIHB1c2hQYXJhbXM6IGZ1bmN0aW9uKHBhcmFt
cykgeworICAgICAgdmFyIGkgPSBwYXJhbXMubGVuZ3RoLCBwYXJhbTsKKworICAgICAgd2hpbGUo
aS0tKSB7CisgICAgICAgIHBhcmFtID0gcGFyYW1zW2ldOworCisgICAgICAgIGlmKHRoaXMub3B0
aW9ucy5zdHJpbmdQYXJhbXMpIHsKKyAgICAgICAgICBpZihwYXJhbS5kZXB0aCkgeworICAgICAg
ICAgICAgdGhpcy5hZGREZXB0aChwYXJhbS5kZXB0aCk7CisgICAgICAgICAgfQorCisgICAgICAg
ICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXJhbS5kZXB0aCB8fCAwKTsKKyAgICAgICAg
ICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgcGFyYW0uc3RyaW5nTW9kZVZhbHVlLCBw
YXJhbS50eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzW3BhcmFtLnR5cGVd
KHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICBzZXR1cE11c3RhY2hl
UGFyYW1zOiBmdW5jdGlvbihtdXN0YWNoZSkgeworICAgICAgdmFyIHBhcmFtcyA9IG11c3RhY2hl
LnBhcmFtczsKKyAgICAgIHRoaXMucHVzaFBhcmFtcyhwYXJhbXMpOworCisgICAgICBpZihtdXN0
YWNoZS5oYXNoKSB7CisgICAgICAgIHRoaXMuaGFzaChtdXN0YWNoZS5oYXNoKTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsKKyAgICAgIH0KKworICAg
ICAgcmV0dXJuIHBhcmFtczsKKyAgICB9LAorCisgICAgLy8gdGhpcyB3aWxsIHJlcGxhY2Ugc2V0
dXBNdXN0YWNoZVBhcmFtcyB3aGVuIHdlJ3JlIGRvbmUKKyAgICBzZXR1cEZ1bGxNdXN0YWNoZVBh
cmFtczogZnVuY3Rpb24obXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UpIHsKKyAgICAgIHZhciBw
YXJhbXMgPSBtdXN0YWNoZS5wYXJhbXM7CisgICAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsK
KworICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CisgICAgICB0aGlz
Lm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKKworICAgICAgaWYobXVzdGFjaGUuaGFz
aCkgeworICAgICAgICB0aGlzLmhhc2gobXVzdGFjaGUuaGFzaCk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJyk7CisgICAgICB9CisKKyAgICAgIHJldHVy
biBwYXJhbXM7CisgICAgfQorICB9OworCisgIHZhciBMaXRlcmFsID0gZnVuY3Rpb24odmFsdWUp
IHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH07CisKKyAgSmF2YVNjcmlwdENvbXBpbGVy
LnByb3RvdHlwZSA9IHsKKyAgICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNl
IG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCisgICAgLy8gYWx0ZXJuYXRpdmUgY29t
cGlsZWQgZm9ybXMgZm9yIG5hbWUgbG9va3VwIGFuZCBidWZmZXJpbmcgc2VtYW50aWNzCisgICAg
bmFtZUxvb2t1cDogZnVuY3Rpb24ocGFyZW50LCBuYW1lIC8qICwgdHlwZSovKSB7CisgICAgICBp
ZiAoL15bMC05XSskLy50ZXN0KG5hbWUpKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgKyAiWyIg
KyBuYW1lICsgIl0iOworICAgICAgfSBlbHNlIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxp
ZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCAr
ICIuIiArIG5hbWU7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBhcmVu
dCArICJbJyIgKyBuYW1lICsgIiddIjsKKyAgICAgIH0KKyAgICB9LAorCisgICAgYXBwZW5kVG9C
dWZmZXI6IGZ1bmN0aW9uKHN0cmluZykgeworICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNT
aW1wbGUpIHsKKyAgICAgICAgcmV0dXJuICJyZXR1cm4gIiArIHN0cmluZyArICI7IjsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgYXBwZW5kVG9CdWZmZXI6IHRy
dWUsCisgICAgICAgICAgY29udGVudDogc3RyaW5nLAorICAgICAgICAgIHRvU3RyaW5nOiBmdW5j
dGlvbigpIHsgcmV0dXJuICJidWZmZXIgKz0gIiArIHN0cmluZyArICI7IjsgfQorICAgICAgICB9
OworICAgICAgfQorICAgIH0sCisKKyAgICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbigpIHsK
KyAgICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygiIik7CisgICAgfSwKKworICAgIG5hbWVz
cGFjZTogIkhhbmRsZWJhcnMiLAorICAgIC8vIEVORCBQVUJMSUMgQVBJCisKKyAgICBjb21waWxl
OiBmdW5jdGlvbihlbnZpcm9ubWVudCwgb3B0aW9ucywgY29udGV4dCwgYXNPYmplY3QpIHsKKyAg
ICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKKyAgICAgIHRoaXMub3B0aW9ucyA9
IG9wdGlvbnMgfHwge307CisKKyAgICAgIEhhbmRsZWJhcnMubG9nKEhhbmRsZWJhcnMubG9nZ2Vy
LkRFQlVHLCB0aGlzLmVudmlyb25tZW50LmRpc2Fzc2VtYmxlKCkgKyAiXG5cbiIpOworCisgICAg
ICB0aGlzLm5hbWUgPSB0aGlzLmVudmlyb25tZW50Lm5hbWU7CisgICAgICB0aGlzLmlzQ2hpbGQg
PSAhIWNvbnRleHQ7CisgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKKyAgICAgICAg
cHJvZ3JhbXM6IFtdLAorICAgICAgICBlbnZpcm9ubWVudHM6IFtdLAorICAgICAgICBhbGlhc2Vz
OiB7IH0KKyAgICAgIH07CisKKyAgICAgIHRoaXMucHJlYW1ibGUoKTsKKworICAgICAgdGhpcy5z
dGFja1Nsb3QgPSAwOworICAgICAgdGhpcy5zdGFja1ZhcnMgPSBbXTsKKyAgICAgIHRoaXMucmVn
aXN0ZXJzID0geyBsaXN0OiBbXSB9OworICAgICAgdGhpcy5jb21waWxlU3RhY2sgPSBbXTsKKyAg
ICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKKworICAgICAgdGhpcy5jb21waWxlQ2hpbGRyZW4o
ZW52aXJvbm1lbnQsIG9wdGlvbnMpOworCisgICAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50
Lm9wY29kZXMsIG9wY29kZTsKKworICAgICAgdGhpcy5pID0gMDsKKworICAgICAgZm9yKGw9b3Bj
b2Rlcy5sZW5ndGg7IHRoaXMuaTxsOyB0aGlzLmkrKykgeworICAgICAgICBvcGNvZGUgPSBvcGNv
ZGVzW3RoaXMuaV07CisKKyAgICAgICAgaWYob3Bjb2RlLm9wY29kZSA9PT0gJ0RFQ0xBUkUnKSB7
CisgICAgICAgICAgdGhpc1tvcGNvZGUubmFtZV0gPSBvcGNvZGUudmFsdWU7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNvZGUu
YXJncyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRnVu
Y3Rpb25Db250ZXh0KGFzT2JqZWN0KTsKKyAgICB9LAorCisgICAgbmV4dE9wY29kZTogZnVuY3Rp
b24oKSB7CisgICAgICB2YXIgb3Bjb2RlcyA9IHRoaXMuZW52aXJvbm1lbnQub3Bjb2RlczsKKyAg
ICAgIHJldHVybiBvcGNvZGVzW3RoaXMuaSArIDFdOworICAgIH0sCisKKyAgICBlYXQ6IGZ1bmN0
aW9uKCkgeworICAgICAgdGhpcy5pID0gdGhpcy5pICsgMTsKKyAgICB9LAorCisgICAgcHJlYW1i
bGU6IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG91dCA9IFtdOworCisgICAgICBpZiAoIXRoaXMu
aXNDaGlsZCkgeworICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2U7CisgICAg
ICAgIHZhciBjb3BpZXMgPSAiaGVscGVycyA9IGhlbHBlcnMgfHwgIiArIG5hbWVzcGFjZSArICIu
aGVscGVyczsiOworICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsKSB7IGNv
cGllcyA9IGNvcGllcyArICIgcGFydGlhbHMgPSBwYXJ0aWFscyB8fCAiICsgbmFtZXNwYWNlICsg
Ii5wYXJ0aWFsczsiOyB9CisgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkgeyBjb3BpZXMg
PSBjb3BpZXMgKyAiIGRhdGEgPSBkYXRhIHx8IHt9OyI7IH0KKyAgICAgICAgb3V0LnB1c2goY29w
aWVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dC5wdXNoKCcnKTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKCF0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlKSB7CisgICAgICAgIG91dC5wdXNo
KCIsIGJ1ZmZlciA9ICIgKyB0aGlzLmluaXRpYWxpemVCdWZmZXIoKSk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICBvdXQucHVzaCgiIik7CisgICAgICB9CisKKyAgICAgIC8vIHRyYWNrIHRoZSBs
YXN0IGNvbnRleHQgcHVzaGVkIGludG8gcGxhY2UgdG8gYWxsb3cgc2tpcHBpbmcgdGhlCisgICAg
ICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAorICAgICAgdGhp
cy5sYXN0Q29udGV4dCA9IDA7CisgICAgICB0aGlzLnNvdXJjZSA9IG91dDsKKyAgICB9LAorCisg
ICAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbihhc09iamVjdCkgeworICAgICAgdmFy
IGxvY2FscyA9IHRoaXMuc3RhY2tWYXJzLmNvbmNhdCh0aGlzLnJlZ2lzdGVycy5saXN0KTsKKwor
ICAgICAgaWYobG9jYWxzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5zb3VyY2VbMV0gPSB0
aGlzLnNvdXJjZVsxXSArICIsICIgKyBsb2NhbHMuam9pbigiLCAiKTsKKyAgICAgIH0KKworICAg
ICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCisgICAgICBpZiAoIXRoaXMu
aXNDaGlsZCkgeworICAgICAgICBmb3IgKHZhciBhbGlhcyBpbiB0aGlzLmNvbnRleHQuYWxpYXNl
cykgeworICAgICAgICAgIHRoaXMuc291cmNlWzFdID0gdGhpcy5zb3VyY2VbMV0gKyAnLCAnICsg
YWxpYXMgKyAnPScgKyB0aGlzLmNvbnRleHQuYWxpYXNlc1thbGlhc107CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgaWYgKHRoaXMuc291cmNlWzFdKSB7CisgICAgICAgIHRoaXMuc291cmNl
WzFdID0gInZhciAiICsgdGhpcy5zb3VyY2VbMV0uc3Vic3RyaW5nKDIpICsgIjsiOworICAgICAg
fQorCisgICAgICAvLyBNZXJnZSBjaGlsZHJlbgorICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQpIHsK
KyAgICAgICAgdGhpcy5zb3VyY2VbMV0gKz0gJ1xuJyArIHRoaXMuY29udGV4dC5wcm9ncmFtcy5q
b2luKCdcbicpICsgJ1xuJzsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLmVudmlyb25tZW50
LmlzU2ltcGxlKSB7CisgICAgICAgIHRoaXMuc291cmNlLnB1c2goInJldHVybiBidWZmZXI7Iik7
CisgICAgICB9CisKKyAgICAgIHZhciBwYXJhbXMgPSB0aGlzLmlzQ2hpbGQgPyBbImRlcHRoMCIs
ICJkYXRhIl0gOiBbIkhhbmRsZWJhcnMiLCAiZGVwdGgwIiwgImhlbHBlcnMiLCAicGFydGlhbHMi
LCAiZGF0YSJdOworCisgICAgICBmb3IodmFyIGk9MCwgbD10aGlzLmVudmlyb25tZW50LmRlcHRo
cy5saXN0Lmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgcGFyYW1zLnB1c2goImRlcHRoIiAr
IHRoaXMuZW52aXJvbm1lbnQuZGVwdGhzLmxpc3RbaV0pOworICAgICAgfQorCisgICAgICAvLyBQ
ZXJmb3JtIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgb3V0cHV0IHRvIG1lcmdlIGNvbnRlbnQgd2hl
biBwb3NzaWJsZQorICAgICAgdmFyIHNvdXJjZSA9IHRoaXMubWVyZ2VTb3VyY2UoKTsKKworICAg
ICAgaWYgKCF0aGlzLmlzQ2hpbGQpIHsKKyAgICAgICAgdmFyIHJldmlzaW9uID0gSGFuZGxlYmFy
cy5DT01QSUxFUl9SRVZJU0lPTiwKKyAgICAgICAgICAgIHZlcnNpb25zID0gSGFuZGxlYmFycy5S
RVZJU0lPTl9DSEFOR0VTW3JldmlzaW9uXTsKKyAgICAgICAgc291cmNlID0gInRoaXMuY29tcGls
ZXJJbmZvID0gWyIrcmV2aXNpb24rIiwnIit2ZXJzaW9ucysiJ107XG4iK3NvdXJjZTsKKyAgICAg
IH0KKworICAgICAgaWYgKGFzT2JqZWN0KSB7CisgICAgICAgIHBhcmFtcy5wdXNoKHNvdXJjZSk7
CisKKyAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CisgICAgICB9
IGVsc2UgeworICAgICAgICB2YXIgZnVuY3Rpb25Tb3VyY2UgPSAnZnVuY3Rpb24gJyArICh0aGlz
Lm5hbWUgfHwgJycpICsgJygnICsgcGFyYW1zLmpvaW4oJywnKSArICcpIHtcbiAgJyArIHNvdXJj
ZSArICd9JzsKKyAgICAgICAgSGFuZGxlYmFycy5sb2coSGFuZGxlYmFycy5sb2dnZXIuREVCVUcs
IGZ1bmN0aW9uU291cmNlICsgIlxuXG4iKTsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uU291cmNl
OworICAgICAgfQorICAgIH0sCisgICAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uKCkgeworICAgICAg
Ly8gV0FSTjogV2UgYXJlIG5vdCBoYW5kbGluZyB0aGUgY2FzZSB3aGVyZSBidWZmZXIgaXMgc3Rp
bGwgcG9wdWxhdGVkIGFzIHRoZSBzb3VyY2Ugc2hvdWxkCisgICAgICAvLyBub3QgaGF2ZSBidWZm
ZXIgYXBwZW5kIG9wZXJhdGlvbnMgYXMgdGhlaXIgZmluYWwgYWN0aW9uLgorICAgICAgdmFyIHNv
dXJjZSA9ICcnLAorICAgICAgICAgIGJ1ZmZlcjsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4g
PSB0aGlzLnNvdXJjZS5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2YXIgbGluZSA9
IHRoaXMuc291cmNlW2ldOworICAgICAgICBpZiAobGluZS5hcHBlbmRUb0J1ZmZlcikgeworICAg
ICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciArICdcbiAg
ICArICcgKyBsaW5lLmNvbnRlbnQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1
ZmZlciA9IGxpbmUuY29udGVudDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgc291cmNlICs9ICdidWZmZXIgKz0gJyAr
IGJ1ZmZlciArICc7XG4gICc7CisgICAgICAgICAgICBidWZmZXIgPSB1bmRlZmluZWQ7CisgICAg
ICAgICAgfQorICAgICAgICAgIHNvdXJjZSArPSBsaW5lICsgJ1xuICAnOworICAgICAgICB9Cisg
ICAgICB9CisgICAgICByZXR1cm4gc291cmNlOworICAgIH0sCisKKyAgICAvLyBbYmxvY2tWYWx1
ZV0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dy
YW0sIHZhbHVlCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxvY2tI
ZWxwZXJNaXNzaW5nCisgICAgLy8KKyAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIG9wY29kZSBp
cyB0byB0YWtlIGEgYmxvY2sgb2YgdGhlIGZvcm0KKyAgICAvLyBge3sjZm9vfX0uLi57ey9mb299
fWAsIHJlc29sdmUgdGhlIHZhbHVlIG9mIGBmb29gLCBhbmQKKyAgICAvLyByZXBsYWNlIGl0IG9u
IHRoZSBzdGFjayB3aXRoIHRoZSByZXN1bHQgb2YgcHJvcGVybHkKKyAgICAvLyBpbnZva2luZyBi
bG9ja0hlbHBlck1pc3NpbmcuCisgICAgYmxvY2tWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgICB0
aGlzLmNvbnRleHQuYWxpYXNlcy5ibG9ja0hlbHBlck1pc3NpbmcgPSAnaGVscGVycy5ibG9ja0hl
bHBlck1pc3NpbmcnOworCisgICAgICB2YXIgcGFyYW1zID0gWyJkZXB0aDAiXTsKKyAgICAgIHRo
aXMuc2V0dXBQYXJhbXMoMCwgcGFyYW1zKTsKKworICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVu
Y3Rpb24oY3VycmVudCkgeworICAgICAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpOwor
ICAgICAgICByZXR1cm4gImJsb2NrSGVscGVyTWlzc2luZy5jYWxsKCIgKyBwYXJhbXMuam9pbigi
LCAiKSArICIpIjsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICAvLyBbYW1iaWd1b3VzQmxvY2tW
YWx1ZV0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHBy
b2dyYW0sIHZhbHVlCisgICAgLy8gQ29tcGlsZXIgdmFsdWUsIGJlZm9yZTogbGFzdEhlbHBlcj12
YWx1ZSBvZiBsYXN0IGZvdW5kIGhlbHBlciwgaWYgYW55CisgICAgLy8gT24gc3RhY2ssIGFmdGVy
LCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQorICAgIC8vIE9uIHN0YWNr
LCBhZnRlciwgaWYgbGFzdEhlbHBlcjogdmFsdWUKKyAgICBhbWJpZ3VvdXNCbG9ja1ZhbHVlOiBm
dW5jdGlvbigpIHsKKyAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLmJsb2NrSGVscGVyTWlzc2lu
ZyA9ICdoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZyc7CisKKyAgICAgIHZhciBwYXJhbXMgPSBb
ImRlcHRoMCJdOworICAgICAgdGhpcy5zZXR1cFBhcmFtcygwLCBwYXJhbXMpOworCisgICAgICB2
YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKKyAgICAgIHBhcmFtcy5zcGxpY2UoMSwgMCwg
Y3VycmVudCk7CisKKyAgICAgIC8vIFVzZSB0aGUgb3B0aW9ucyB2YWx1ZSBnZW5lcmF0ZWQgZnJv
bSB0aGUgaW52b2NhdGlvbgorICAgICAgcGFyYW1zW3BhcmFtcy5sZW5ndGgtMV0gPSAnb3B0aW9u
cyc7CisKKyAgICAgIHRoaXMuc291cmNlLnB1c2goImlmICghIiArIHRoaXMubGFzdEhlbHBlciAr
ICIpIHsgIiArIGN1cnJlbnQgKyAiID0gYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoIiArIHBhcmFt
cy5qb2luKCIsICIpICsgIik7IH0iKTsKKyAgICB9LAorCisgICAgLy8gW2FwcGVuZENvbnRlbnRd
CisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KKyAgICAvLyBPbiBzdGFjaywg
YWZ0ZXI6IC4uLgorICAgIC8vCisgICAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIGBj
b250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKKyAgICBhcHBlbmRDb250ZW50OiBmdW5jdGlv
bihjb250ZW50KSB7CisgICAgICB0aGlzLnNvdXJjZS5wdXNoKHRoaXMuYXBwZW5kVG9CdWZmZXIo
dGhpcy5xdW90ZWRTdHJpbmcoY29udGVudCkpKTsKKyAgICB9LAorCisgICAgLy8gW2FwcGVuZF0K
KyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KKyAgICAvLyBPbiBz
dGFjaywgYWZ0ZXI6IC4uLgorICAgIC8vCisgICAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3Ry
aW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAvLworICAgIC8v
IElmIGB2YWx1ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2VyY2VkIGludG8gYSBzdHJpbmcg
YW5kIGFwcGVuZGVkCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVu
ZGVkCisgICAgYXBwZW5kOiBmdW5jdGlvbigpIHsKKyAgICAgIC8vIEZvcmNlIGFueXRoaW5nIHRo
YXQgaXMgaW5saW5lZCBvbnRvIHRoZSBzdGFjayBzbyB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0aW9u
CisgICAgICAvLyB3aGVuIHdlIGV4YW1pbmUgbG9jYWwKKyAgICAgIHRoaXMuZmx1c2hJbmxpbmUo
KTsKKyAgICAgIHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTsKKyAgICAgIHRoaXMuc291cmNl
LnB1c2goImlmKCIgKyBsb2NhbCArICIgfHwgIiArIGxvY2FsICsgIiA9PT0gMCkgeyAiICsgdGhp
cy5hcHBlbmRUb0J1ZmZlcihsb2NhbCkgKyAiIH0iKTsKKyAgICAgIGlmICh0aGlzLmVudmlyb25t
ZW50LmlzU2ltcGxlKSB7CisgICAgICAgIHRoaXMuc291cmNlLnB1c2goImVsc2UgeyAiICsgdGhp
cy5hcHBlbmRUb0J1ZmZlcigiJyciKSArICIgfSIpOworICAgICAgfQorICAgIH0sCisKKyAgICAv
LyBbYXBwZW5kRXNjYXBlZF0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVl
LCAuLi4KKyAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgorICAgIC8vCisgICAgLy8gRXNjYXBl
IGB2YWx1ZWAgYW5kIGFwcGVuZCBpdCB0byB0aGUgYnVmZmVyCisgICAgYXBwZW5kRXNjYXBlZDog
ZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5lc2NhcGVFeHByZXNzaW9u
ID0gJ3RoaXMuZXNjYXBlRXhwcmVzc2lvbic7CisKKyAgICAgIHRoaXMuc291cmNlLnB1c2godGhp
cy5hcHBlbmRUb0J1ZmZlcigiZXNjYXBlRXhwcmVzc2lvbigiICsgdGhpcy5wb3BTdGFjaygpICsg
IikiKSk7CisgICAgfSwKKworICAgIC8vIFtnZXRDb250ZXh0XQorICAgIC8vCisgICAgLy8gT24g
c3RhY2ssIGJlZm9yZTogLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KKyAgICAvLyBD
b21waWxlciB2YWx1ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoCisgICAgLy8KKyAgICAvLyBT
ZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBk
ZXB0aAorICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uKGRlcHRoKSB7CisgICAgICBpZih0aGlzLmxh
c3RDb250ZXh0ICE9PSBkZXB0aCkgeworICAgICAgICB0aGlzLmxhc3RDb250ZXh0ID0gZGVwdGg7
CisgICAgICB9CisgICAgfSwKKworICAgIC8vIFtsb29rdXBPbkNvbnRleHRdCisgICAgLy8KKyAg
ICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KKyAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJl
bnRDb250ZXh0W25hbWVdLCAuLi4KKyAgICAvLworICAgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBv
ZiBgbmFtZWAgb24gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVzCisgICAgLy8gaXQgb250
byB0aGUgc3RhY2suCisgICAgbG9va3VwT25Db250ZXh0OiBmdW5jdGlvbihuYW1lKSB7CisgICAg
ICB0aGlzLnB1c2godGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0LCBu
YW1lLCAnY29udGV4dCcpKTsKKyAgICB9LAorCisgICAgLy8gW3B1c2hDb250ZXh0XQorICAgIC8v
CisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiBj
dXJyZW50Q29udGV4dCwgLi4uCisgICAgLy8KKyAgICAvLyBQdXNoZXMgdGhlIHZhbHVlIG9mIHRo
ZSBjdXJyZW50IGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgcHVzaENvbnRleHQ6IGZ1bmN0
aW9uKCkgeworICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkZXB0aCcgKyB0aGlzLmxhc3RD
b250ZXh0KTsKKyAgICB9LAorCisgICAgLy8gW3Jlc29sdmVQb3NzaWJsZUxhbWJkYV0KKyAgICAv
LworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KKyAgICAvLyBPbiBzdGFjaywg
YWZ0ZXI6IHJlc29sdmVkIHZhbHVlLCAuLi4KKyAgICAvLworICAgIC8vIElmIHRoZSBgdmFsdWVg
IGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQorICAgIC8vIHRoZSByZXR1
cm4gdmFsdWUgb2YgdGhlIGxhbWJkYQorICAgIHJlc29sdmVQb3NzaWJsZUxhbWJkYTogZnVuY3Rp
b24oKSB7CisgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlvblR5cGUgPSAnImZ1bmN0
aW9uIic7CisKKyAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGN1cnJlbnQpIHsKKyAg
ICAgICAgcmV0dXJuICJ0eXBlb2YgIiArIGN1cnJlbnQgKyAiID09PSBmdW5jdGlvblR5cGUgPyAi
ICsgY3VycmVudCArICIuYXBwbHkoZGVwdGgwKSA6ICIgKyBjdXJyZW50OworICAgICAgfSk7Cisg
ICAgfSwKKworICAgIC8vIFtsb29rdXBdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3Jl
OiB2YWx1ZSwgLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZVtuYW1lXSwgLi4uCisg
ICAgLy8KKyAgICAvLyBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sgd2l0aCB0aGUgcmVz
dWx0IG9mIGxvb2tpbmcKKyAgICAvLyB1cCBgbmFtZWAgb24gYHZhbHVlYAorICAgIGxvb2t1cDog
ZnVuY3Rpb24obmFtZSkgeworICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24oY3VycmVu
dCkgeworICAgICAgICByZXR1cm4gY3VycmVudCArICIgPT0gbnVsbCB8fCAiICsgY3VycmVudCAr
ICIgPT09IGZhbHNlID8gIiArIGN1cnJlbnQgKyAiIDogIiArIHRoaXMubmFtZUxvb2t1cChjdXJy
ZW50LCBuYW1lLCAnY29udGV4dCcpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8vIFtsb29r
dXBEYXRhXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCisgICAgLy8gT24g
c3RhY2ssIGFmdGVyOiBkYXRhW2lkXSwgLi4uCisgICAgLy8KKyAgICAvLyBQdXNoIHRoZSByZXN1
bHQgb2YgbG9va2luZyB1cCBgaWRgIG9uIHRoZSBjdXJyZW50IGRhdGEKKyAgICBsb29rdXBEYXRh
OiBmdW5jdGlvbihpZCkgeworICAgICAgdGhpcy5wdXNoKHRoaXMubmFtZUxvb2t1cCgnZGF0YScs
IGlkLCAnZGF0YScpKTsKKyAgICB9LAorCisgICAgLy8gW3B1c2hTdHJpbmdQYXJhbV0KKyAgICAv
LworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgorICAgIC8vIE9uIHN0YWNrLCBhZnRlcjog
c3RyaW5nLCBjdXJyZW50Q29udGV4dCwgLi4uCisgICAgLy8KKyAgICAvLyBUaGlzIG9wY29kZSBp
cyBkZXNpZ25lZCBmb3IgdXNlIGluIHN0cmluZyBtb2RlLCB3aGljaAorICAgIC8vIHByb3ZpZGVz
IHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgYWxvbmcgd2l0aCBpdHMKKyAgICAvLyBk
ZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCisgICAgcHVzaFN0cmlu
Z1BhcmFtOiBmdW5jdGlvbihzdHJpbmcsIHR5cGUpIHsKKyAgICAgIHRoaXMucHVzaFN0YWNrTGl0
ZXJhbCgnZGVwdGgnICsgdGhpcy5sYXN0Q29udGV4dCk7CisKKyAgICAgIHRoaXMucHVzaFN0cmlu
Zyh0eXBlKTsKKworICAgICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnKSB7CisgICAg
ICAgIHRoaXMucHVzaFN0cmluZyhzdHJpbmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhp
cy5wdXNoU3RhY2tMaXRlcmFsKHN0cmluZyk7CisgICAgICB9CisgICAgfSwKKworICAgIGVtcHR5
SGFzaDogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ3t9Jyk7CisK
KyAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CisgICAgICAgIHRoaXMucmVn
aXN0ZXIoJ2hhc2hUeXBlcycsICd7fScpOworICAgICAgfQorICAgIH0sCisgICAgcHVzaEhhc2g6
IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5oYXNoID0ge3ZhbHVlczogW10sIHR5cGVzOiBbXX07
CisgICAgfSwKKyAgICBwb3BIYXNoOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBoYXNoID0gdGhp
cy5oYXNoOworICAgICAgdGhpcy5oYXNoID0gdW5kZWZpbmVkOworCisgICAgICBpZiAodGhpcy5v
cHRpb25zLnN0cmluZ1BhcmFtcykgeworICAgICAgICB0aGlzLnJlZ2lzdGVyKCdoYXNoVHlwZXMn
LCAneycgKyBoYXNoLnR5cGVzLmpvaW4oJywnKSArICd9Jyk7CisgICAgICB9CisgICAgICB0aGlz
LnB1c2goJ3tcbiAgICAnICsgaGFzaC52YWx1ZXMuam9pbignLFxuICAgICcpICsgJ1xuICB9Jyk7
CisgICAgfSwKKworICAgIC8vIFtwdXNoU3RyaW5nXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ss
IGJlZm9yZTogLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiBxdW90ZWRTdHJpbmcoc3RyaW5n
KSwgLi4uCisgICAgLy8KKyAgICAvLyBQdXNoIGEgcXVvdGVkIHZlcnNpb24gb2YgYHN0cmluZ2Ag
b250byB0aGUgc3RhY2sKKyAgICBwdXNoU3RyaW5nOiBmdW5jdGlvbihzdHJpbmcpIHsKKyAgICAg
IHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLnF1b3RlZFN0cmluZyhzdHJpbmcpKTsKKyAgICB9
LAorCisgICAgLy8gW3B1c2hdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4K
KyAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGV4cHIsIC4uLgorICAgIC8vCisgICAgLy8gUHVzaCBh
biBleHByZXNzaW9uIG9udG8gdGhlIHN0YWNrCisgICAgcHVzaDogZnVuY3Rpb24oZXhwcikgewor
ICAgICAgdGhpcy5pbmxpbmVTdGFjay5wdXNoKGV4cHIpOworICAgICAgcmV0dXJuIGV4cHI7Cisg
ICAgfSwKKworICAgIC8vIFtwdXNoTGl0ZXJhbF0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBi
ZWZvcmU6IC4uLgorICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogdmFsdWUsIC4uLgorICAgIC8vCisg
ICAgLy8gUHVzaGVzIGEgdmFsdWUgb250byB0aGUgc3RhY2suIFRoaXMgb3BlcmF0aW9uIHByZXZl
bnRzCisgICAgLy8gdGhlIGNvbXBpbGVyIGZyb20gY3JlYXRpbmcgYSB0ZW1wb3JhcnkgdmFyaWFi
bGUgdG8gaG9sZAorICAgIC8vIGl0LgorICAgIHB1c2hMaXRlcmFsOiBmdW5jdGlvbih2YWx1ZSkg
eworICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHZhbHVlKTsKKyAgICB9LAorCisgICAgLy8g
W3B1c2hQcm9ncmFtXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCisgICAg
Ly8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KKyAgICAvLworICAgIC8vIFB1
c2ggYSBwcm9ncmFtIGV4cHJlc3Npb24gb250byB0aGUgc3RhY2suIFRoaXMgdGFrZXMKKyAgICAv
LyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1hY2Nl
c3NpYmxlCisgICAgLy8gZXhwcmVzc2lvbi4KKyAgICBwdXNoUHJvZ3JhbTogZnVuY3Rpb24oZ3Vp
ZCkgeworICAgICAgaWYgKGd1aWQgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnB1c2hTdGFja0xp
dGVyYWwodGhpcy5wcm9ncmFtRXhwcmVzc2lvbihndWlkKSk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CisgICAgICB9CisgICAgfSwKKworICAg
IC8vIFtpbnZva2VIZWxwZXJdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNo
LCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgorICAgIC8vIE9uIHN0YWNrLCBhZnRl
cjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCisgICAgLy8KKyAgICAvLyBQb3BzIG9mZiB0
aGUgaGVscGVyJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgaGVscGVyLAorICAgIC8vIGFuZCBw
dXNoZXMgdGhlIGhlbHBlcidzIHJldHVybiB2YWx1ZSBvbnRvIHRoZSBzdGFjay4KKyAgICAvLwor
ICAgIC8vIElmIHRoZSBoZWxwZXIgaXMgbm90IGZvdW5kLCBgaGVscGVyTWlzc2luZ2AgaXMgY2Fs
bGVkLgorICAgIGludm9rZUhlbHBlcjogZnVuY3Rpb24ocGFyYW1TaXplLCBuYW1lKSB7CisgICAg
ICB0aGlzLmNvbnRleHQuYWxpYXNlcy5oZWxwZXJNaXNzaW5nID0gJ2hlbHBlcnMuaGVscGVyTWlz
c2luZyc7CisKKyAgICAgIHZhciBoZWxwZXIgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLnNldHVw
SGVscGVyKHBhcmFtU2l6ZSwgbmFtZSwgdHJ1ZSk7CisKKyAgICAgIHRoaXMucHVzaChoZWxwZXIu
bmFtZSk7CisgICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbihuYW1lKSB7CisgICAgICAg
IHJldHVybiBuYW1lICsgJyA/ICcgKyBuYW1lICsgJy5jYWxsKCcgKworICAgICAgICAgICAgaGVs
cGVyLmNhbGxQYXJhbXMgKyAiKSAiICsgIjogaGVscGVyTWlzc2luZy5jYWxsKCIgKworICAgICAg
ICAgICAgaGVscGVyLmhlbHBlck1pc3NpbmdQYXJhbXMgKyAiKSI7CisgICAgICB9KTsKKyAgICB9
LAorCisgICAgLy8gW2ludm9rZUtub3duSGVscGVyXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ss
IGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KKyAgICAvLyBP
biBzdGFjaywgYWZ0ZXI6IHJlc3VsdCBvZiBoZWxwZXIgaW52b2NhdGlvbgorICAgIC8vCisgICAg
Ly8gVGhpcyBvcGVyYXRpb24gaXMgdXNlZCB3aGVuIHRoZSBoZWxwZXIgaXMga25vd24gdG8gZXhp
c3QsCisgICAgLy8gc28gYSBgaGVscGVyTWlzc2luZ2AgZmFsbGJhY2sgaXMgbm90IHJlcXVpcmVk
LgorICAgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbihwYXJhbVNpemUsIG5hbWUpIHsKKyAg
ICAgIHZhciBoZWxwZXIgPSB0aGlzLnNldHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSk7CisgICAg
ICB0aGlzLnB1c2goaGVscGVyLm5hbWUgKyAiLmNhbGwoIiArIGhlbHBlci5jYWxsUGFyYW1zICsg
IikiKTsKKyAgICB9LAorCisgICAgLy8gW2ludm9rZUFtYmlndW91c10KKyAgICAvLworICAgIC8v
IE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4u
CisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgZGlzYW1iaWd1YXRpb24KKyAgICAv
LworICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxpa2Ug
YHt7Zm9vfX1gCisgICAgLy8gaXMgcHJvdmlkZWQsIGJ1dCB3ZSBkb24ndCBrbm93IGF0IGNvbXBp
bGUtdGltZSB3aGV0aGVyIGl0CisgICAgLy8gaXMgYSBoZWxwZXIgb3IgYSBwYXRoLgorICAgIC8v
CisgICAgLy8gVGhpcyBvcGVyYXRpb24gZW1pdHMgbW9yZSBjb2RlIHRoYW4gdGhlIG90aGVyIG9w
dGlvbnMsCisgICAgLy8gYW5kIGNhbiBiZSBhdm9pZGVkIGJ5IHBhc3NpbmcgdGhlIGBrbm93bkhl
bHBlcnNgIGFuZAorICAgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxlLXRp
bWUuCisgICAgaW52b2tlQW1iaWd1b3VzOiBmdW5jdGlvbihuYW1lLCBoZWxwZXJDYWxsKSB7Cisg
ICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlvblR5cGUgPSAnImZ1bmN0aW9uIic7CisK
KyAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgne30nKTsgICAgLy8gSGFzaCB2YWx1ZQorICAg
ICAgdmFyIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIoMCwgbmFtZSwgaGVscGVyQ2FsbCk7CisK
KyAgICAgIHZhciBoZWxwZXJOYW1lID0gdGhpcy5sYXN0SGVscGVyID0gdGhpcy5uYW1lTG9va3Vw
KCdoZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpOworCisgICAgICB2YXIgbm9uSGVscGVyID0gdGhp
cy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0LCBuYW1lLCAnY29udGV4dCcp
OworICAgICAgdmFyIG5leHRTdGFjayA9IHRoaXMubmV4dFN0YWNrKCk7CisKKyAgICAgIHRoaXMu
c291cmNlLnB1c2goJ2lmICgnICsgbmV4dFN0YWNrICsgJyA9ICcgKyBoZWxwZXJOYW1lICsgJykg
eyAnICsgbmV4dFN0YWNrICsgJyA9ICcgKyBuZXh0U3RhY2sgKyAnLmNhbGwoJyArIGhlbHBlci5j
YWxsUGFyYW1zICsgJyk7IH0nKTsKKyAgICAgIHRoaXMuc291cmNlLnB1c2goJ2Vsc2UgeyAnICsg
bmV4dFN0YWNrICsgJyA9ICcgKyBub25IZWxwZXIgKyAnOyAnICsgbmV4dFN0YWNrICsgJyA9IHR5
cGVvZiAnICsgbmV4dFN0YWNrICsgJyA9PT0gZnVuY3Rpb25UeXBlID8gJyArIG5leHRTdGFjayAr
ICcuYXBwbHkoZGVwdGgwKSA6ICcgKyBuZXh0U3RhY2sgKyAnOyB9Jyk7CisgICAgfSwKKworICAg
IC8vIFtpbnZva2VQYXJ0aWFsXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogY29u
dGV4dCwgLi4uCisgICAgLy8gT24gc3RhY2sgYWZ0ZXI6IHJlc3VsdCBvZiBwYXJ0aWFsIGludm9j
YXRpb24KKyAgICAvLworICAgIC8vIFRoaXMgb3BlcmF0aW9uIHBvcHMgb2ZmIGEgY29udGV4dCwg
aW52b2tlcyBhIHBhcnRpYWwgd2l0aCB0aGF0IGNvbnRleHQsCisgICAgLy8gYW5kIHB1c2hlcyB0
aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGJhY2suCisgICAgaW52b2tlUGFydGlhbDogZnVu
Y3Rpb24obmFtZSkgeworICAgICAgdmFyIHBhcmFtcyA9IFt0aGlzLm5hbWVMb29rdXAoJ3BhcnRp
YWxzJywgbmFtZSwgJ3BhcnRpYWwnKSwgIiciICsgbmFtZSArICInIiwgdGhpcy5wb3BTdGFjaygp
LCAiaGVscGVycyIsICJwYXJ0aWFscyJdOworCisgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEp
IHsKKyAgICAgICAgcGFyYW1zLnB1c2goImRhdGEiKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5j
b250ZXh0LmFsaWFzZXMuc2VsZiA9ICJ0aGlzIjsKKyAgICAgIHRoaXMucHVzaCgic2VsZi5pbnZv
a2VQYXJ0aWFsKCIgKyBwYXJhbXMuam9pbigiLCAiKSArICIpIik7CisgICAgfSwKKworICAgIC8v
IFthc3NpZ25Ub0hhc2hdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwg
aGFzaCwgLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiBoYXNoLCAuLi4KKyAgICAvLworICAg
IC8vIFBvcHMgYSB2YWx1ZSBhbmQgaGFzaCBvZmYgdGhlIHN0YWNrLCBhc3NpZ25zIGBoYXNoW2tl
eV0gPSB2YWx1ZWAKKyAgICAvLyBhbmQgcHVzaGVzIHRoZSBoYXNoIGJhY2sgb250byB0aGUgc3Rh
Y2suCisgICAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbihrZXkpIHsKKyAgICAgIHZhciB2YWx1ZSA9
IHRoaXMucG9wU3RhY2soKSwKKyAgICAgICAgICB0eXBlOworCisgICAgICBpZiAodGhpcy5vcHRp
b25zLnN0cmluZ1BhcmFtcykgeworICAgICAgICB0eXBlID0gdGhpcy5wb3BTdGFjaygpOworICAg
ICAgICB0aGlzLnBvcFN0YWNrKCk7CisgICAgICB9CisKKyAgICAgIHZhciBoYXNoID0gdGhpcy5o
YXNoOworICAgICAgaWYgKHR5cGUpIHsKKyAgICAgICAgaGFzaC50eXBlcy5wdXNoKCInIiArIGtl
eSArICInOiAiICsgdHlwZSk7CisgICAgICB9CisgICAgICBoYXNoLnZhbHVlcy5wdXNoKCInIiAr
IGtleSArICInOiAoIiArIHZhbHVlICsgIikiKTsKKyAgICB9LAorCisgICAgLy8gSEVMUEVSUwor
CisgICAgY29tcGlsZXI6IEphdmFTY3JpcHRDb21waWxlciwKKworICAgIGNvbXBpbGVDaGlsZHJl
bjogZnVuY3Rpb24oZW52aXJvbm1lbnQsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBjaGlsZHJlbiA9
IGVudmlyb25tZW50LmNoaWxkcmVuLCBjaGlsZCwgY29tcGlsZXI7CisKKyAgICAgIGZvcih2YXIg
aT0wLCBsPWNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgY2hpbGQgPSBjaGls
ZHJlbltpXTsKKyAgICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOworCisgICAg
ICAgIHZhciBpbmRleCA9IHRoaXMubWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpOworCisgICAg
ICAgIGlmIChpbmRleCA9PSBudWxsKSB7CisgICAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1z
LnB1c2goJycpOyAgICAgLy8gUGxhY2Vob2xkZXIgdG8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyBm
b3IgbmVzdGVkIGNoaWxkcmVuCisgICAgICAgICAgaW5kZXggPSB0aGlzLmNvbnRleHQucHJvZ3Jh
bXMubGVuZ3RoOworICAgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgY2hp
bGQubmFtZSA9ICdwcm9ncmFtJyArIGluZGV4OworICAgICAgICAgIHRoaXMuY29udGV4dC5wcm9n
cmFtc1tpbmRleF0gPSBjb21waWxlci5jb21waWxlKGNoaWxkLCBvcHRpb25zLCB0aGlzLmNvbnRl
eHQpOworICAgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hpbGQuaW5kZXggPSBpbmRleDsKKyAgICAg
ICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9LAorICAgIG1hdGNoRXhpc3RpbmdQcm9ncmFtOiBmdW5jdGlvbihjaGlsZCkgeworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHMubGVuZ3Ro
OyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250ZXh0
LmVudmlyb25tZW50c1tpXTsKKyAgICAgICAgaWYgKGVudmlyb25tZW50ICYmIGVudmlyb25tZW50
LmVxdWFscyhjaGlsZCkpIHsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAg
fQorICAgIH0sCisKKyAgICBwcm9ncmFtRXhwcmVzc2lvbjogZnVuY3Rpb24oZ3VpZCkgeworICAg
ICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuc2VsZiA9ICJ0aGlzIjsKKworICAgICAgaWYoZ3VpZCA9
PSBudWxsKSB7CisgICAgICAgIHJldHVybiAic2VsZi5ub29wIjsKKyAgICAgIH0KKworICAgICAg
dmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKKyAgICAgICAgICBk
ZXB0aHMgPSBjaGlsZC5kZXB0aHMubGlzdCwgZGVwdGg7CisKKyAgICAgIHZhciBwcm9ncmFtUGFy
YW1zID0gW2NoaWxkLmluZGV4LCBjaGlsZC5uYW1lLCAiZGF0YSJdOworCisgICAgICBmb3IodmFy
IGk9MCwgbCA9IGRlcHRocy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGRlcHRoID0gZGVw
dGhzW2ldOworCisgICAgICAgIGlmKGRlcHRoID09PSAxKSB7IHByb2dyYW1QYXJhbXMucHVzaCgi
ZGVwdGgwIik7IH0KKyAgICAgICAgZWxzZSB7IHByb2dyYW1QYXJhbXMucHVzaCgiZGVwdGgiICsg
KGRlcHRoIC0gMSkpOyB9CisgICAgICB9CisKKyAgICAgIGlmKGRlcHRocy5sZW5ndGggPT09IDAp
IHsKKyAgICAgICAgcmV0dXJuICJzZWxmLnByb2dyYW0oIiArIHByb2dyYW1QYXJhbXMuam9pbigi
LCAiKSArICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByb2dyYW1QYXJhbXMuc2hpZnQo
KTsKKyAgICAgICAgcmV0dXJuICJzZWxmLnByb2dyYW1XaXRoRGVwdGgoIiArIHByb2dyYW1QYXJh
bXMuam9pbigiLCAiKSArICIpIjsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVnaXN0ZXI6IGZ1
bmN0aW9uKG5hbWUsIHZhbCkgeworICAgICAgdGhpcy51c2VSZWdpc3RlcihuYW1lKTsKKyAgICAg
IHRoaXMuc291cmNlLnB1c2gobmFtZSArICIgPSAiICsgdmFsICsgIjsiKTsKKyAgICB9LAorCisg
ICAgdXNlUmVnaXN0ZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgIGlmKCF0aGlzLnJlZ2lzdGVy
c1tuYW1lXSkgeworICAgICAgICB0aGlzLnJlZ2lzdGVyc1tuYW1lXSA9IHRydWU7CisgICAgICAg
IHRoaXMucmVnaXN0ZXJzLmxpc3QucHVzaChuYW1lKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAg
cHVzaFN0YWNrTGl0ZXJhbDogZnVuY3Rpb24oaXRlbSkgeworICAgICAgcmV0dXJuIHRoaXMucHVz
aChuZXcgTGl0ZXJhbChpdGVtKSk7CisgICAgfSwKKworICAgIHB1c2hTdGFjazogZnVuY3Rpb24o
aXRlbSkgeworICAgICAgdGhpcy5mbHVzaElubGluZSgpOworCisgICAgICB2YXIgc3RhY2sgPSB0
aGlzLmluY3JTdGFjaygpOworICAgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgdGhpcy5zb3VyY2Uu
cHVzaChzdGFjayArICIgPSAiICsgaXRlbSArICI7Iik7CisgICAgICB9CisgICAgICB0aGlzLmNv
bXBpbGVTdGFjay5wdXNoKHN0YWNrKTsKKyAgICAgIHJldHVybiBzdGFjazsKKyAgICB9LAorCisg
ICAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgICAgdmFyIHByZWZpeCA9
ICcnLAorICAgICAgICAgIGlubGluZSA9IHRoaXMuaXNJbmxpbmUoKSwKKyAgICAgICAgICBzdGFj
azsKKworICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbmxpbmUgdGhlbiB3ZSB3YW50IHRv
IG1lcmdlIHRoZSBpbmxpbmUgc3RhdGVtZW50IGludG8gdGhlCisgICAgICAvLyByZXBsYWNlbWVu
dCBzdGF0ZW1lbnQgdmlhICcsJworICAgICAgaWYgKGlubGluZSkgeworICAgICAgICB2YXIgdG9w
ID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKKworICAgICAgICBpZiAodG9wIGluc3RhbmNlb2YgTGl0
ZXJhbCkgeworICAgICAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQK
KyAgICAgICAgICBzdGFjayA9IHRvcC52YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0aGUg
aW5saW5lCisgICAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnN0YWNrU2xvdCA/IHRoaXMudG9wU3Rh
Y2tOYW1lKCkgOiB0aGlzLmluY3JTdGFjaygpOworCisgICAgICAgICAgcHJlZml4ID0gJygnICsg
dGhpcy5wdXNoKG5hbWUpICsgJyA9ICcgKyB0b3AgKyAnKSwnOworICAgICAgICAgIHN0YWNrID0g
dGhpcy50b3BTdGFjaygpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGFj
ayA9IHRoaXMudG9wU3RhY2soKTsKKyAgICAgIH0KKworICAgICAgdmFyIGl0ZW0gPSBjYWxsYmFj
ay5jYWxsKHRoaXMsIHN0YWNrKTsKKworICAgICAgaWYgKGlubGluZSkgeworICAgICAgICBpZiAo
dGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7Cisg
ICAgICAgICAgdGhpcy5wb3BTdGFjaygpOworICAgICAgICB9CisgICAgICAgIHRoaXMucHVzaCgn
KCcgKyBwcmVmaXggKyBpdGVtICsgJyknKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBy
ZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IGRlcHRoIHZhcmlhYmxlLiBUaHJvdWdo
IHJlcGxhY2VTdGFjaworICAgICAgICBpZiAoIS9ec3RhY2svLnRlc3Qoc3RhY2spKSB7CisgICAg
ICAgICAgc3RhY2sgPSB0aGlzLm5leHRTdGFjaygpOworICAgICAgICB9CisKKyAgICAgICAgdGhp
cy5zb3VyY2UucHVzaChzdGFjayArICIgPSAoIiArIHByZWZpeCArIGl0ZW0gKyAiKTsiKTsKKyAg
ICAgIH0KKyAgICAgIHJldHVybiBzdGFjazsKKyAgICB9LAorCisgICAgbmV4dFN0YWNrOiBmdW5j
dGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjaygpOworICAgIH0sCisKKyAgICBp
bmNyU3RhY2s6IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5zdGFja1Nsb3QrKzsKKyAgICAgIGlm
KHRoaXMuc3RhY2tTbG90ID4gdGhpcy5zdGFja1ZhcnMubGVuZ3RoKSB7IHRoaXMuc3RhY2tWYXJz
LnB1c2goInN0YWNrIiArIHRoaXMuc3RhY2tTbG90KTsgfQorICAgICAgcmV0dXJuIHRoaXMudG9w
U3RhY2tOYW1lKCk7CisgICAgfSwKKyAgICB0b3BTdGFja05hbWU6IGZ1bmN0aW9uKCkgeworICAg
ICAgcmV0dXJuICJzdGFjayIgKyB0aGlzLnN0YWNrU2xvdDsKKyAgICB9LAorICAgIGZsdXNoSW5s
aW5lOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBpbmxpbmVTdGFjayA9IHRoaXMuaW5saW5lU3Rh
Y2s7CisgICAgICBpZiAoaW5saW5lU3RhY2subGVuZ3RoKSB7CisgICAgICAgIHRoaXMuaW5saW5l
U3RhY2sgPSBbXTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGlubGluZVN0YWNrLmxl
bmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgdmFyIGVudHJ5ID0gaW5saW5lU3RhY2tb
aV07CisgICAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgTGl0ZXJhbCkgeworICAgICAgICAg
ICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChlbnRyeSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIHRoaXMucHVzaFN0YWNrKGVudHJ5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9LAorICAgIGlzSW5saW5lOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVy
biB0aGlzLmlubGluZVN0YWNrLmxlbmd0aDsKKyAgICB9LAorCisgICAgcG9wU3RhY2s6IGZ1bmN0
aW9uKHdyYXBwZWQpIHsKKyAgICAgIHZhciBpbmxpbmUgPSB0aGlzLmlzSW5saW5lKCksCisgICAg
ICAgICAgaXRlbSA9IChpbmxpbmUgPyB0aGlzLmlubGluZVN0YWNrIDogdGhpcy5jb21waWxlU3Rh
Y2spLnBvcCgpOworCisgICAgICBpZiAoIXdyYXBwZWQgJiYgKGl0ZW0gaW5zdGFuY2VvZiBMaXRl
cmFsKSkgeworICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIGlmICghaW5saW5lKSB7CisgICAgICAgICAgdGhpcy5zdGFja1Nsb3QtLTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgdG9wU3RhY2s6
IGZ1bmN0aW9uKHdyYXBwZWQpIHsKKyAgICAgIHZhciBzdGFjayA9ICh0aGlzLmlzSW5saW5lKCkg
PyB0aGlzLmlubGluZVN0YWNrIDogdGhpcy5jb21waWxlU3RhY2spLAorICAgICAgICAgIGl0ZW0g
PSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKworICAgICAgaWYgKCF3cmFwcGVkICYmIChpdGVt
IGluc3RhbmNlb2YgTGl0ZXJhbCkpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7CisgICAg
ICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgIH0KKyAgICB9LAorCisgICAg
cXVvdGVkU3RyaW5nOiBmdW5jdGlvbihzdHIpIHsKKyAgICAgIHJldHVybiAnIicgKyBzdHIKKyAg
ICAgICAgLnJlcGxhY2UoL1xcL2csICdcXFxcJykKKyAgICAgICAgLnJlcGxhY2UoLyIvZywgJ1xc
IicpCisgICAgICAgIC5yZXBsYWNlKC9cbi9nLCAnXFxuJykKKyAgICAgICAgLnJlcGxhY2UoL1xy
L2csICdcXHInKSArICciJzsKKyAgICB9LAorCisgICAgc2V0dXBIZWxwZXI6IGZ1bmN0aW9uKHBh
cmFtU2l6ZSwgbmFtZSwgbWlzc2luZ1BhcmFtcykgeworICAgICAgdmFyIHBhcmFtcyA9IFtdOwor
ICAgICAgdGhpcy5zZXR1cFBhcmFtcyhwYXJhbVNpemUsIHBhcmFtcywgbWlzc2luZ1BhcmFtcyk7
CisgICAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1l
LCAnaGVscGVyJyk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHBhcmFtczogcGFyYW1zLAor
ICAgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKKyAgICAgICAgY2FsbFBhcmFtczogWyJkZXB0aDAi
XS5jb25jYXQocGFyYW1zKS5qb2luKCIsICIpLAorICAgICAgICBoZWxwZXJNaXNzaW5nUGFyYW1z
OiBtaXNzaW5nUGFyYW1zICYmIFsiZGVwdGgwIiwgdGhpcy5xdW90ZWRTdHJpbmcobmFtZSldLmNv
bmNhdChwYXJhbXMpLmpvaW4oIiwgIikKKyAgICAgIH07CisgICAgfSwKKworICAgIC8vIHRoZSBw
YXJhbXMgYW5kIGNvbnRleHRzIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIGFycmF5cworICAgIC8v
IHRvIGZpbGwgaW4KKyAgICBzZXR1cFBhcmFtczogZnVuY3Rpb24ocGFyYW1TaXplLCBwYXJhbXMs
IHVzZVJlZ2lzdGVyKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IFtdLCBjb250ZXh0cyA9IFtdLCB0
eXBlcyA9IFtdLCBwYXJhbSwgaW52ZXJzZSwgcHJvZ3JhbTsKKworICAgICAgb3B0aW9ucy5wdXNo
KCJoYXNoOiIgKyB0aGlzLnBvcFN0YWNrKCkpOworCisgICAgICBpbnZlcnNlID0gdGhpcy5wb3BT
dGFjaygpOworICAgICAgcHJvZ3JhbSA9IHRoaXMucG9wU3RhY2soKTsKKworICAgICAgLy8gQXZv
aWQgc2V0dGluZyBmbiBhbmQgaW52ZXJzZSBpZiBuZWl0aGVyIGFyZSBzZXQuIFRoaXMgYWxsb3dz
CisgICAgICAvLyBoZWxwZXJzIHRvIGRvIGEgY2hlY2sgZm9yIGBpZiAob3B0aW9ucy5mbilgCisg
ICAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CisgICAgICAgIGlmICghcHJvZ3JhbSkgewor
ICAgICAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLnNlbGYgPSAidGhpcyI7CisgICAgICAgICAg
cHJvZ3JhbSA9ICJzZWxmLm5vb3AiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpbnZlcnNl
KSB7CisgICAgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRoaXMiOworICAgICAg
ICAgIGludmVyc2UgPSAic2VsZi5ub29wIjsKKyAgICAgICAgfQorCisgICAgICAgIG9wdGlvbnMu
cHVzaCgiaW52ZXJzZToiICsgaW52ZXJzZSk7CisgICAgICAgIG9wdGlvbnMucHVzaCgiZm46IiAr
IHByb2dyYW0pOworICAgICAgfQorCisgICAgICBmb3IodmFyIGk9MDsgaTxwYXJhbVNpemU7IGkr
KykgeworICAgICAgICBwYXJhbSA9IHRoaXMucG9wU3RhY2soKTsKKyAgICAgICAgcGFyYW1zLnB1
c2gocGFyYW0pOworCisgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKKyAg
ICAgICAgICB0eXBlcy5wdXNoKHRoaXMucG9wU3RhY2soKSk7CisgICAgICAgICAgY29udGV4dHMu
cHVzaCh0aGlzLnBvcFN0YWNrKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0
aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CisgICAgICAgIG9wdGlvbnMucHVzaCgiY29udGV4
dHM6WyIgKyBjb250ZXh0cy5qb2luKCIsIikgKyAiXSIpOworICAgICAgICBvcHRpb25zLnB1c2go
InR5cGVzOlsiICsgdHlwZXMuam9pbigiLCIpICsgIl0iKTsKKyAgICAgICAgb3B0aW9ucy5wdXNo
KCJoYXNoVHlwZXM6aGFzaFR5cGVzIik7CisgICAgICB9CisKKyAgICAgIGlmKHRoaXMub3B0aW9u
cy5kYXRhKSB7CisgICAgICAgIG9wdGlvbnMucHVzaCgiZGF0YTpkYXRhIik7CisgICAgICB9CisK
KyAgICAgIG9wdGlvbnMgPSAieyIgKyBvcHRpb25zLmpvaW4oIiwiKSArICJ9IjsKKyAgICAgIGlm
ICh1c2VSZWdpc3RlcikgeworICAgICAgICB0aGlzLnJlZ2lzdGVyKCdvcHRpb25zJywgb3B0aW9u
cyk7CisgICAgICAgIHBhcmFtcy5wdXNoKCdvcHRpb25zJyk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBwYXJhbXMucHVzaChvcHRpb25zKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwYXJhbXMu
am9pbigiLCAiKTsKKyAgICB9CisgIH07CisKKyAgdmFyIHJlc2VydmVkV29yZHMgPSAoCisgICAg
ImJyZWFrIGVsc2UgbmV3IHZhciIgKworICAgICIgY2FzZSBmaW5hbGx5IHJldHVybiB2b2lkIiAr
CisgICAgIiBjYXRjaCBmb3Igc3dpdGNoIHdoaWxlIiArCisgICAgIiBjb250aW51ZSBmdW5jdGlv
biB0aGlzIHdpdGgiICsKKyAgICAiIGRlZmF1bHQgaWYgdGhyb3ciICsKKyAgICAiIGRlbGV0ZSBp
biB0cnkiICsKKyAgICAiIGRvIGluc3RhbmNlb2YgdHlwZW9mIiArCisgICAgIiBhYnN0cmFjdCBl
bnVtIGludCBzaG9ydCIgKworICAgICIgYm9vbGVhbiBleHBvcnQgaW50ZXJmYWNlIHN0YXRpYyIg
KworICAgICIgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXIiICsKKyAgICAiIGNoYXIgZmluYWwgbmF0
aXZlIHN5bmNocm9uaXplZCIgKworICAgICIgY2xhc3MgZmxvYXQgcGFja2FnZSB0aHJvd3MiICsK
KyAgICAiIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQiICsKKyAgICAiIGRlYnVnZ2VyIGlt
cGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlIiArCisgICAgIiBkb3VibGUgaW1wb3J0IHB1Ymxp
YyBsZXQgeWllbGQiCisgICkuc3BsaXQoIiAiKTsKKworICB2YXIgY29tcGlsZXJXb3JkcyA9IEph
dmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OworCisgIGZvcih2YXIgaT0wLCBs
PXJlc2VydmVkV29yZHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIGNvbXBpbGVyV29yZHNbcmVz
ZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOworICB9CisKKyAgSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFs
aWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lID0gZnVuY3Rpb24obmFtZSkgeworICAgIGlmKCFKYXZh
U2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYgL15bYS16QS1aXyRdWzAtOWEt
ekEtWl8kXSskLy50ZXN0KG5hbWUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworICB9OworCit9KShIYW5kbGViYXJzLkNvbXBpbGVyLCBIYW5kbGViYXJz
LkphdmFTY3JpcHRDb21waWxlcik7CisKK0hhbmRsZWJhcnMucHJlY29tcGlsZSA9IGZ1bmN0aW9u
KGlucHV0LCBvcHRpb25zKSB7CisgIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0
cmluZycgJiYgaW5wdXQuY29uc3RydWN0b3IgIT09IEhhbmRsZWJhcnMuQVNULlByb2dyYW1Ob2Rl
KSkgeworICAgIHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlvbigiWW91IG11c3QgcGFzcyBh
IHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNz
ZWQgIiArIGlucHV0KTsKKyAgfQorCisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICBpZiAo
ISgnZGF0YScgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLmRhdGEgPSB0cnVlOworICB9Cisg
IHZhciBhc3QgPSBIYW5kbGViYXJzLnBhcnNlKGlucHV0KTsKKyAgdmFyIGVudmlyb25tZW50ID0g
bmV3IEhhbmRsZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7CisgIHJldHVy
biBuZXcgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25tZW50
LCBvcHRpb25zKTsKK307CisKK0hhbmRsZWJhcnMuY29tcGlsZSA9IGZ1bmN0aW9uKGlucHV0LCBv
cHRpb25zKSB7CisgIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycgJiYg
aW5wdXQuY29uc3RydWN0b3IgIT09IEhhbmRsZWJhcnMuQVNULlByb2dyYW1Ob2RlKSkgeworICAg
IHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlvbigiWW91IG11c3QgcGFzcyBhIHN0cmluZyBv
ciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgIiArIGlu
cHV0KTsKKyAgfQorCisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICBpZiAoISgnZGF0YScg
aW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLmRhdGEgPSB0cnVlOworICB9CisgIHZhciBjb21w
aWxlZDsKKyAgZnVuY3Rpb24gY29tcGlsZSgpIHsKKyAgICB2YXIgYXN0ID0gSGFuZGxlYmFycy5w
YXJzZShpbnB1dCk7CisgICAgdmFyIGVudmlyb25tZW50ID0gbmV3IEhhbmRsZWJhcnMuQ29tcGls
ZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7CisgICAgdmFyIHRlbXBsYXRlU3BlYyA9IG5ldyBI
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlv
bnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CisgICAgcmV0dXJuIEhhbmRsZWJhcnMudGVtcGxhdGUodGVt
cGxhdGVTcGVjKTsKKyAgfQorCisgIC8vIFRlbXBsYXRlIGlzIG9ubHkgY29tcGlsZWQgb24gZmly
c3QgdXNlIGFuZCBjYWNoZWQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgcmV0dXJuIGZ1bmN0aW9uKGNv
bnRleHQsIG9wdGlvbnMpIHsKKyAgICBpZiAoIWNvbXBpbGVkKSB7CisgICAgICBjb21waWxlZCA9
IGNvbXBpbGUoKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBpbGVkLmNhbGwodGhpcywgY29udGV4
dCwgb3B0aW9ucyk7CisgIH07Cit9OworOworLy8gbGliL2hhbmRsZWJhcnMvcnVudGltZS5qcwor
SGFuZGxlYmFycy5WTSA9IHsKKyAgdGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlU3BlYykgewor
ICAgIC8vIEp1c3QgYWRkIHdhdGVyCisgICAgdmFyIGNvbnRhaW5lciA9IHsKKyAgICAgIGVzY2Fw
ZUV4cHJlc3Npb246IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbiwKKyAgICAgIGlu
dm9rZVBhcnRpYWw6IEhhbmRsZWJhcnMuVk0uaW52b2tlUGFydGlhbCwKKyAgICAgIHByb2dyYW1z
OiBbXSwKKyAgICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGZuLCBkYXRhKSB7CisgICAgICAgIHZh
ciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV07CisgICAgICAgIGlmKGRhdGEpIHsK
KyAgICAgICAgICByZXR1cm4gSGFuZGxlYmFycy5WTS5wcm9ncmFtKGZuLCBkYXRhKTsKKyAgICAg
ICAgfSBlbHNlIGlmKHByb2dyYW1XcmFwcGVyKSB7CisgICAgICAgICAgcmV0dXJuIHByb2dyYW1X
cmFwcGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb2dyYW1XcmFwcGVyID0gdGhp
cy5wcm9ncmFtc1tpXSA9IEhhbmRsZWJhcnMuVk0ucHJvZ3JhbShmbik7CisgICAgICAgICAgcmV0
dXJuIHByb2dyYW1XcmFwcGVyOworICAgICAgICB9CisgICAgICB9LAorICAgICAgcHJvZ3JhbVdp
dGhEZXB0aDogSGFuZGxlYmFycy5WTS5wcm9ncmFtV2l0aERlcHRoLAorICAgICAgbm9vcDogSGFu
ZGxlYmFycy5WTS5ub29wLAorICAgICAgY29tcGlsZXJJbmZvOiBudWxsCisgICAgfTsKKworICAg
IHJldHVybiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CisgICAgICBvcHRpb25zID0gb3B0
aW9ucyB8fCB7fTsKKyAgICAgIHZhciByZXN1bHQgPSB0ZW1wbGF0ZVNwZWMuY2FsbChjb250YWlu
ZXIsIEhhbmRsZWJhcnMsIGNvbnRleHQsIG9wdGlvbnMuaGVscGVycywgb3B0aW9ucy5wYXJ0aWFs
cywgb3B0aW9ucy5kYXRhKTsKKworICAgICAgdmFyIGNvbXBpbGVySW5mbyA9IGNvbnRhaW5lci5j
b21waWxlckluZm8gfHwgW10sCisgICAgICAgICAgY29tcGlsZXJSZXZpc2lvbiA9IGNvbXBpbGVy
SW5mb1swXSB8fCAxLAorICAgICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IEhhbmRsZWJhcnMuQ09N
UElMRVJfUkVWSVNJT047CisKKyAgICAgIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50
UmV2aXNpb24pIHsKKyAgICAgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNp
b24pIHsKKyAgICAgICAgICB2YXIgcnVudGltZVZlcnNpb25zID0gSGFuZGxlYmFycy5SRVZJU0lP
Tl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCisgICAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lv
bnMgPSBIYW5kbGViYXJzLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07CisgICAg
ICAgICAgdGhyb3cgIlRlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGFuIG9sZGVyIHZlcnNp
b24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICIrCisgICAgICAgICAg
ICAgICAgIlBsZWFzZSB1cGRhdGUgeW91ciBwcmVjb21waWxlciB0byBhIG5ld2VyIHZlcnNpb24g
KCIrcnVudGltZVZlcnNpb25zKyIpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xk
ZXIgdmVyc2lvbiAoIitjb21waWxlclZlcnNpb25zKyIpLiI7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRp
bWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0CisgICAgICAgICAgdGhyb3cg
IlRlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGVi
YXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gIisKKyAgICAgICAgICAgICAgICAiUGxlYXNl
IHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgiK2NvbXBpbGVySW5mb1sx
XSsiKS4iOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fTsKKyAgfSwKKworICBwcm9ncmFtV2l0aERlcHRoOiBmdW5jdGlvbihmbiwgZGF0YSwgJGRlcHRo
KSB7CisgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMs
IDIpOworCisgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIG9w
dGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgW2Nv
bnRleHQsIG9wdGlvbnMuZGF0YSB8fCBkYXRhXS5jb25jYXQoYXJncykpOworICAgIH07CisgIH0s
CisgIHByb2dyYW06IGZ1bmN0aW9uKGZuLCBkYXRhKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKGNv
bnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAg
ICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucy5kYXRhIHx8IGRhdGEpOworICAgIH07CisgIH0s
CisgIG5vb3A6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIiI7IH0sCisgIGludm9rZVBhcnRpYWw6IGZ1
bmN0aW9uKHBhcnRpYWwsIG5hbWUsIGNvbnRleHQsIGhlbHBlcnMsIHBhcnRpYWxzLCBkYXRhKSB7
CisgICAgdmFyIG9wdGlvbnMgPSB7IGhlbHBlcnM6IGhlbHBlcnMsIHBhcnRpYWxzOiBwYXJ0aWFs
cywgZGF0YTogZGF0YSB9OworCisgICAgaWYocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7CisgICAg
ICB0aHJvdyBuZXcgSGFuZGxlYmFycy5FeGNlcHRpb24oIlRoZSBwYXJ0aWFsICIgKyBuYW1lICsg
IiBjb3VsZCBub3QgYmUgZm91bmQiKTsKKyAgICB9IGVsc2UgaWYocGFydGlhbCBpbnN0YW5jZW9m
IEZ1bmN0aW9uKSB7CisgICAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTsKKyAg
ICB9IGVsc2UgaWYgKCFIYW5kbGViYXJzLmNvbXBpbGUpIHsKKyAgICAgIHRocm93IG5ldyBIYW5k
bGViYXJzLkV4Y2VwdGlvbigiVGhlIHBhcnRpYWwgIiArIG5hbWUgKyAiIGNvdWxkIG5vdCBiZSBj
b21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUiKTsKKyAgICB9IGVsc2Ug
eworICAgICAgcGFydGlhbHNbbmFtZV0gPSBIYW5kbGViYXJzLmNvbXBpbGUocGFydGlhbCwge2Rh
dGE6IGRhdGEgIT09IHVuZGVmaW5lZH0pOworICAgICAgcmV0dXJuIHBhcnRpYWxzW25hbWVdKGNv
bnRleHQsIG9wdGlvbnMpOworICAgIH0KKyAgfQorfTsKKworSGFuZGxlYmFycy50ZW1wbGF0ZSA9
IEhhbmRsZWJhcnMuVk0udGVtcGxhdGU7Cis7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENv
bXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9q
cXVlcnkuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlV
bnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsOTU5NyBAQAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjkuMQorICog
aHR0cDovL2pxdWVyeS5jb20vCisgKgorICogSW5jbHVkZXMgU2l6emxlLmpzCisgKiBodHRwOi8v
c2l6emxlanMuY29tLworICoKKyAqIENvcHlyaWdodCAyMDA1LCAyMDEyIGpRdWVyeSBGb3VuZGF0
aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBN
SVQgbGljZW5zZQorICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIw
MTMtMi00CisgKi8KKyhmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CisKKy8vIENhbid0
IGRvIHRoaXMgYmVjYXVzZSBzZXZlcmFsIGFwcHMgaW5jbHVkaW5nIEFTUC5ORVQgdHJhY2UKKy8v
IHRoZSBzdGFjayB2aWEgYXJndW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVmb3ggZGllcyBp
ZgorLy8geW91IHRyeSB0byB0cmFjZSB0aHJvdWdoICJ1c2Ugc3RyaWN0IiBjYWxsIGNoYWlucy4g
KCMxMzMzNSkKKy8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrCisvLyJ1c2Ugc3RyaWN0IjsKK3Zhcgor
ICAgIC8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQorICAgIHJlYWR5TGlzdCwKKwor
ICAgIC8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQor
ICAgIHJvb3RqUXVlcnksCisKKyAgICAvLyBTdXBwb3J0OiBJRTw5CisgICAgLy8gRm9yIGB0eXBl
b2Ygbm9kZS5tZXRob2RgIGluc3RlYWQgb2YgYG5vZGUubWV0aG9kICE9PSB1bmRlZmluZWRgCisg
ICAgY29yZV9zdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAorCisgICAgLy8gVXNlIHRo
ZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5k
Ym94KQorICAgIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LAorICAgIGxvY2F0aW9uID0gd2lu
ZG93LmxvY2F0aW9uLAorCisgICAgLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3Zlcndy
aXRlCisgICAgX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCisKKyAgICAvLyBNYXAgb3ZlciB0aGUg
JCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorICAgIF8kID0gd2luZG93LiQsCisKKyAgICAvLyBbW0Ns
YXNzXV0gLT4gdHlwZSBwYWlycworICAgIGNsYXNzMnR5cGUgPSB7fSwKKworICAgIC8vIExpc3Qg
b2YgZGVsZXRlZCBkYXRhIGNhY2hlIGlkcywgc28gd2UgY2FuIHJldXNlIHRoZW0KKyAgICBjb3Jl
X2RlbGV0ZWRJZHMgPSBbXSwKKworICAgIGNvcmVfdmVyc2lvbiA9ICIxLjkuMSIsCisKKyAgICAv
LyBTYXZlIGEgcmVmZXJlbmNlIHRvIHNvbWUgY29yZSBtZXRob2RzCisgICAgY29yZV9jb25jYXQg
PSBjb3JlX2RlbGV0ZWRJZHMuY29uY2F0LAorICAgIGNvcmVfcHVzaCA9IGNvcmVfZGVsZXRlZElk
cy5wdXNoLAorICAgIGNvcmVfc2xpY2UgPSBjb3JlX2RlbGV0ZWRJZHMuc2xpY2UsCisgICAgY29y
ZV9pbmRleE9mID0gY29yZV9kZWxldGVkSWRzLmluZGV4T2YsCisgICAgY29yZV90b1N0cmluZyA9
IGNsYXNzMnR5cGUudG9TdHJpbmcsCisgICAgY29yZV9oYXNPd24gPSBjbGFzczJ0eXBlLmhhc093
blByb3BlcnR5LAorICAgIGNvcmVfdHJpbSA9IGNvcmVfdmVyc2lvbi50cmltLAorCisgICAgLy8g
RGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKKyAgICBqUXVlcnkgPSBmdW5jdGlvbiggc2Vs
ZWN0b3IsIGNvbnRleHQgKSB7CisgICAgLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkg
anVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCisgICAgcmV0dXJuIG5ldyBqUXVl
cnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKKyAgICB9LAorCisg
ICAgLy8gVXNlZCBmb3IgbWF0Y2hpbmcgbnVtYmVycworICAgIGNvcmVfcG51bSA9IC9bKy1dPyg/
OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLAorCisgICAgLy8gVXNlZCBmb3Ig
c3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UKKyAgICBjb3JlX3Jub3R3aGl0ZSA9IC9cUysvZywKKwor
ICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQg
eW91LCBTYWZhcmkgNS4wIGFuZCBJRSkKKyAgICBydHJpbSA9IC9eW1xzXHVGRUZGXHhBMF0rfFtc
c1x1RkVGRlx4QTBdKyQvZywKKworICAgIC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRN
TCBzdHJpbmdzCisgICAgLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1Mg
dmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQorICAgIC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9u
ICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KQorICAgIHJxdWlja0V4cHIgPSAvXig/Oig8W1x3
XFddKz4pW14+XSp8IyhbXHctXSopKSQvLAorCisgICAgLy8gTWF0Y2ggYSBzdGFuZGFsb25lIHRh
ZworICAgIHJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLAorCisgICAg
Ly8gSlNPTiBSZWdFeHAKKyAgICBydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKKyAgICBy
dmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAorICAgIHJ2YWxpZGVzY2FwZSA9
IC9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZywKKyAgICBydmFsaWR0b2tlbnMg
PSAvIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZCtcLnwpXGQrKD86W2VFXVsr
LV0/XGQrfCkvZywKKworICAgIC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemlu
ZworICAgIHJtc1ByZWZpeCA9IC9eLW1zLS8sCisgICAgcmRhc2hBbHBoYSA9IC8tKFtcZGEtel0p
L2dpLAorCisgICAgLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJl
cGxhY2UoKQorICAgIGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7CisgICAg
cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworICAgIH0sCisKKyAgICAvLyBUaGUgcmVhZHkg
ZXZlbnQgaGFuZGxlcgorICAgIGNvbXBsZXRlZCA9IGZ1bmN0aW9uKCBldmVudCApIHsKKworICAg
IC8vIHJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvIGNh
bGwgdGhlIGRvbSByZWFkeSBpbiBvbGRJRQorICAgIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0
ZW5lciB8fCBldmVudC50eXBlID09PSAibG9hZCIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0g
ImNvbXBsZXRlIiApIHsKKyAgICBkZXRhY2goKTsKKyAgICBqUXVlcnkucmVhZHkoKTsKKyAgICB9
CisgICAgfSwKKyAgICAvLyBDbGVhbi11cCBtZXRob2QgZm9yIGRvbSByZWFkeSBldmVudHMKKyAg
ICBkZXRhY2ggPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVu
ZXIgKSB7CisgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2Fk
ZWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIo
ICJsb2FkIiwgY29tcGxldGVkLCBmYWxzZSApOworCisgICAgfSBlbHNlIHsKKyAgICBkb2N1bWVu
dC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGNvbXBsZXRlZCApOworICAgIHdp
bmRvdy5kZXRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRlZCApOworICAgIH0KKyAgICB9Owor
CitqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0geworICAgIC8vIFRoZSBjdXJyZW50IHZl
cnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKKyAgICBqcXVlcnk6IGNvcmVfdmVyc2lvbiwKKwor
ICAgIGNvbnN0cnVjdG9yOiBqUXVlcnksCisgICAgaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBj
b250ZXh0LCByb290alF1ZXJ5ICkgeworICAgIHZhciBtYXRjaCwgZWxlbTsKKworICAgIC8vIEhB
TkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKKyAgICBpZiAoICFz
ZWxlY3RvciApIHsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgSFRN
TCBzdHJpbmdzCisgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAg
IGlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxl
Y3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKKyAg
ICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBI
VE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVjaworICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3Rv
ciwgbnVsbCBdOworCisgICAgfSBlbHNlIHsKKyAgICBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYygg
c2VsZWN0b3IgKTsKKyAgICB9CisKKyAgICAvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBj
b250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCisgICAgaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0g
fHwgIWNvbnRleHQpICkgeworCisgICAgLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisg
ICAgaWYgKCBtYXRjaFsxXSApIHsKKyAgICBjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpR
dWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OworCisgICAgLy8gc2NyaXB0cyBpcyB0cnVlIGZv
ciBiYWNrLWNvbXBhdAorICAgIGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTCgK
KyAgICBtYXRjaFsxXSwKKyAgICBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0
Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LAorICAgIHRydWUKKyAgICApICk7
CisKKyAgICAvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpCisgICAgaWYgKCByc2luZ2xlVGFnLnRl
c3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHsKKyAg
ICBmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgeworICAgIC8vIFByb3BlcnRpZXMgb2YgY29udGV4
dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGUKKyAgICBpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CisgICAgdGhpc1sgbWF0Y2ggXSggY29udGV4dFsg
bWF0Y2ggXSApOworCisgICAgLy8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlcwor
ICAgIH0gZWxzZSB7CisgICAgdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwor
ICAgIH0KKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisKKyAgICAvLyBIQU5ETEU6
ICQoI2lkKQorICAgIH0gZWxzZSB7CisgICAgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCBtYXRjaFsyXSApOworCisgICAgLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJs
YWNrYmVycnkgNC42IHJldHVybnMKKyAgICAvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4g
dGhlIGRvY3VtZW50ICM2OTYzCisgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsK
KyAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwor
ICAgIC8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAorICAgIGlmICggZWxlbS5pZCAhPT0gbWF0Y2hb
Ml0gKSB7CisgICAgcmV0dXJuIHJvb3RqUXVlcnkuZmluZCggc2VsZWN0b3IgKTsKKyAgICB9CisK
KyAgICAvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRo
ZSBqUXVlcnkgb2JqZWN0CisgICAgdGhpcy5sZW5ndGggPSAxOworICAgIHRoaXNbMF0gPSBlbGVt
OworICAgIH0KKworICAgIHRoaXMuY29udGV4dCA9IGRvY3VtZW50OworICAgIHRoaXMuc2VsZWN0
b3IgPSBzZWxlY3RvcjsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBIQU5ETEU6
ICQoZXhwciwgJCguLi4pKQorICAgIH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1
ZXJ5ICkgeworICAgIHJldHVybiAoIGNvbnRleHQgfHwgcm9vdGpRdWVyeSApLmZpbmQoIHNlbGVj
dG9yICk7CisKKyAgICAvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dCkKKyAgICAvLyAod2hpY2gg
aXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKKyAgICB9IGVsc2Ug
eworICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3Ig
KTsKKyAgICB9CisKKyAgICAvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKKyAgICB9IGVsc2UgaWYg
KCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKKyAgICB0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2Vs
ZWN0b3I7CisgICAgdGhpcy5sZW5ndGggPSAxOworICAgIHJldHVybiB0aGlzOworCisgICAgLy8g
SEFORExFOiAkKGZ1bmN0aW9uKQorICAgIC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQor
ICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgeworICAgIHJl
dHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApOworICAgIH0KKworICAgIGlmICggc2Vs
ZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsKKyAgICB0aGlzLnNlbGVjdG9yID0gc2Vs
ZWN0b3Iuc2VsZWN0b3I7CisgICAgdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKyAg
ICB9CisKKyAgICByZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKyAg
ICB9LAorCisgICAgLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorICAgIHNlbGVjdG9y
OiAiIiwKKworICAgIC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMg
MAorICAgIGxlbmd0aDogMCwKKworICAgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFp
bmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0CisgICAgc2l6ZTogZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuIHRoaXMubGVuZ3RoOworICAgIH0sCisKKyAgICB0b0FycmF5OiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7CisgICAgfSwKKworICAgIC8v
IEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKyAgICAv
LyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorICAg
IGdldDogZnVuY3Rpb24oIG51bSApIHsKKyAgICByZXR1cm4gbnVtID09IG51bGwgPworCisgICAg
Ly8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQorICAgIHRoaXMudG9BcnJheSgpIDoKKworICAgIC8v
IFJldHVybiBqdXN0IHRoZSBvYmplY3QKKyAgICAoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0
aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTsKKyAgICB9LAorCisgICAgLy8gVGFrZSBhbiBhcnJh
eSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjaworICAgIC8vIChyZXR1cm5p
bmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQorICAgIHB1c2hTdGFjazogZnVuY3Rpb24o
IGVsZW1zICkgeworCisgICAgLy8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBz
ZXQKKyAgICB2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1z
ICk7CisKKyAgICAvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVm
ZXJlbmNlKQorICAgIHJldC5wcmV2T2JqZWN0ID0gdGhpczsKKyAgICByZXQuY29udGV4dCA9IHRo
aXMuY29udGV4dDsKKworICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0
CisgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZv
ciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KKyAgICAvLyAoWW91IGNhbiBzZWVk
IHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcworICAgIC8v
IG9ubHkgdXNlZCBpbnRlcm5hbGx5LikKKyAgICBlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFy
Z3MgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwor
ICAgIH0sCisKKyAgICByZWFkeTogZnVuY3Rpb24oIGZuICkgeworICAgIC8vIEFkZCB0aGUgY2Fs
bGJhY2sKKyAgICBqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7CisKKyAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgc2xpY2U6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggY29yZV9zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTsKKyAg
ICB9LAorCisgICAgZmlyc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVxKCAwICk7
CisgICAgfSwKKworICAgIGxhc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVxKCAt
MSApOworICAgIH0sCisKKyAgICBlcTogZnVuY3Rpb24oIGkgKSB7CisgICAgdmFyIGxlbiA9IHRo
aXMubGVuZ3RoLAorICAgIGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CisgICAgcmV0dXJu
IHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsK
KyAgICB9LAorCisgICAgbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisgICAgcmV0dXJuIHRo
aXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworICAg
IHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisgICAgfSkpOworICAgIH0s
CisKKyAgICBlbmQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwg
dGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKKyAgICB9LAorCisgICAgLy8gRm9yIGludGVybmFsIHVz
ZSBvbmx5LgorICAgIC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2Ug
YSBqUXVlcnkgbWV0aG9kLgorICAgIHB1c2g6IGNvcmVfcHVzaCwKKyAgICBzb3J0OiBbXS5zb3J0
LAorICAgIHNwbGljZTogW10uc3BsaWNlCit9OworCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9u
IHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4u
aW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CisKK2pRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4u
ZXh0ZW5kID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5h
bWUsIG9wdGlvbnMsIGNsb25lLAorICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwKKyAg
ICBpID0gMSwKKyAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgIGRlZXAgPSBmYWxz
ZTsKKworICAgIC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKyAgICBpZiAoIHR5cGVv
ZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKKyAgICBkZWVwID0gdGFyZ2V0OworICAgIHRhcmdl
dCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKKyAgICAvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUg
dGFyZ2V0CisgICAgaSA9IDI7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJn
ZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisgICAg
aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFy
Z2V0KSApIHsKKyAgICB0YXJnZXQgPSB7fTsKKyAgICB9CisKKyAgICAvLyBleHRlbmQgalF1ZXJ5
IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQKKyAgICBpZiAoIGxlbmd0aCA9
PT0gaSApIHsKKyAgICB0YXJnZXQgPSB0aGlzOworICAgIC0taTsKKyAgICB9CisKKyAgICBmb3Ig
KCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICAvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91
bmRlZmluZWQgdmFsdWVzCisgICAgaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBu
dWxsICkgeworICAgIC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKyAgICBmb3IgKCBuYW1lIGlu
IG9wdGlvbnMgKSB7CisgICAgc3JjID0gdGFyZ2V0WyBuYW1lIF07CisgICAgY29weSA9IG9wdGlv
bnNbIG5hbWUgXTsKKworICAgIC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKyAgICBpZiAo
IHRhcmdldCA9PT0gY29weSApIHsKKyAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWN1
cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKKyAgICBpZiAoIGRl
ZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJh
eSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkgeworICAgIGlmICggY29weUlzQXJyYXkgKSB7
CisgICAgY29weUlzQXJyYXkgPSBmYWxzZTsKKyAgICBjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNB
cnJheShzcmMpID8gc3JjIDogW107CisKKyAgICB9IGVsc2UgeworICAgIGNsb25lID0gc3JjICYm
IGpRdWVyeS5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTsKKyAgICB9CisKKyAgICAvLyBO
ZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KKyAgICB0YXJnZXRbIG5hbWUg
XSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKyAgICAvLyBEb24ndCBi
cmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCisgICAgfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZp
bmVkICkgeworICAgIHRhcmdldFsgbmFtZSBdID0gY29weTsKKyAgICB9CisgICAgfQorICAgIH0K
KyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAorICAgIHJldHVybiB0
YXJnZXQ7Cit9OworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICBub0NvbmZsaWN0OiBmdW5jdGlvbigg
ZGVlcCApIHsKKyAgICBpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisgICAgd2luZG93LiQg
PSBfJDsKKyAgICB9CisKKyAgICBpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5
ICkgeworICAgIHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OworICAgIH0KKworICAgIHJldHVybiBq
UXVlcnk7CisgICAgfSwKKworICAgIC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0
IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuCisgICAgaXNSZWFkeTogZmFsc2UsCisKKyAgICAvLyBB
IGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCisgICAg
Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKKyAgICByZWFkeVdhaXQ6IDEsCisK
KyAgICAvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKKyAgICBob2xkUmVhZHk6
IGZ1bmN0aW9uKCBob2xkICkgeworICAgIGlmICggaG9sZCApIHsKKyAgICBqUXVlcnkucmVhZHlX
YWl0Kys7CisgICAgfSBlbHNlIHsKKyAgICBqUXVlcnkucmVhZHkoIHRydWUgKTsKKyAgICB9Cisg
ICAgfSwKKworICAgIC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKyAgICByZWFkeTog
ZnVuY3Rpb24oIHdhaXQgKSB7CisKKyAgICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBo
b2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CisgICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1q
UXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CisgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0
cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4KKyAgICBpZiAoICFkb2N1bWVu
dC5ib2R5ICkgeworICAgIHJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTsKKyAgICB9
CisKKyAgICAvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKyAgICBqUXVlcnkuaXNS
ZWFkeSA9IHRydWU7CisKKyAgICAvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQs
IGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQorICAgIGlmICggd2FpdCAhPT0gdHJ1ZSAm
JiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisgICAgcmVhZHlMaXN0
LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApOworCisgICAgLy8gVHJpZ2dlciBh
bnkgYm91bmQgcmVhZHkgZXZlbnRzCisgICAgaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKKyAg
ICBqUXVlcnkoIGRvY3VtZW50ICkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iik7CisgICAg
fQorICAgIH0sCisKKyAgICAvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29u
Y2VybmluZyBpc0Z1bmN0aW9uLgorICAgIC8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9k
cyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKKyAgICAvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5
IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgorICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBv
YmogKSB7CisgICAgcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7CisgICAg
fSwKKworICAgIGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKKyAg
ICByZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKKyAgICB9LAorCisgICAgaXNX
aW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9
PSBvYmoud2luZG93OworICAgIH0sCisKKyAgICBpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7
CisgICAgcmV0dXJuICFpc05hTiggcGFyc2VGbG9hdChvYmopICkgJiYgaXNGaW5pdGUoIG9iaiAp
OworICAgIH0sCisKKyAgICB0eXBlOiBmdW5jdGlvbiggb2JqICkgeworICAgIGlmICggb2JqID09
IG51bGwgKSB7CisgICAgcmV0dXJuIFN0cmluZyggb2JqICk7CisgICAgfQorICAgIHJldHVybiB0
eXBlb2Ygb2JqID09PSAib2JqZWN0IiB8fCB0eXBlb2Ygb2JqID09PSAiZnVuY3Rpb24iID8KKyAg
ICBjbGFzczJ0eXBlWyBjb3JlX3RvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiIDoKKyAg
ICB0eXBlb2Ygb2JqOworICAgIH0sCisKKyAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2Jq
ICkgeworICAgIC8vIE11c3QgYmUgYW4gT2JqZWN0LgorICAgIC8vIEJlY2F1c2Ugb2YgSUUsIHdl
IGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3Bl
cnR5LgorICAgIC8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMg
ZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCisgICAgaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBl
KG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9i
aiApICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0cnkgeworICAgIC8vIE5v
dCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3QKKyAgICBpZiAoIG9iai5j
b25zdHJ1Y3RvciAmJgorICAgICFjb3JlX2hhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIikg
JiYKKyAgICAhY29yZV9oYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAiaXNQ
cm90b3R5cGVPZiIpICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfSBjYXRjaCAo
IGUgKSB7CisgICAgLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9z
dCBvYmplY3RzICM5ODk3CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE93biBw
cm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAorICAgIC8v
IGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgorCisgICAg
dmFyIGtleTsKKyAgICBmb3IgKCBrZXkgaW4gb2JqICkge30KKworICAgIHJldHVybiBrZXkgPT09
IHVuZGVmaW5lZCB8fCBjb3JlX2hhc093bi5jYWxsKCBvYmosIGtleSApOworICAgIH0sCisKKyAg
ICBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgeworICAgIHZhciBuYW1lOworICAgIGZv
ciAoIG5hbWUgaW4gb2JqICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIGVycm9yOiBmdW5jdGlvbiggbXNnICkgeworICAgIHRocm93
IG5ldyBFcnJvciggbXNnICk7CisgICAgfSwKKworICAgIC8vIGRhdGE6IHN0cmluZyBvZiBodG1s
CisgICAgLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3
aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAorICAg
IC8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRz
IHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmcKKyAgICBwYXJzZUhUTUw6IGZ1bmN0aW9uKCBkYXRh
LCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRh
ICE9PSAic3RyaW5nIiApIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKCB0eXBl
b2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgeworICAgIGtlZXBTY3JpcHRzID0gY29udGV4dDsK
KyAgICBjb250ZXh0ID0gZmFsc2U7CisgICAgfQorICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRv
Y3VtZW50OworCisgICAgdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAorICAg
IHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107CisKKyAgICAvLyBTaW5nbGUgdGFnCisgICAg
aWYgKCBwYXJzZWQgKSB7CisgICAgcmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJz
ZWRbMV0gKSBdOworICAgIH0KKworICAgIHBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBb
IGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApOworICAgIGlmICggc2NyaXB0cyApIHsKKyAgICBq
UXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTsKKyAgICB9CisgICAgcmV0dXJuIGpRdWVyeS5tZXJn
ZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7CisgICAgfSwKKworICAgIHBhcnNlSlNPTjogZnVu
Y3Rpb24oIGRhdGEgKSB7CisgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSB1c2luZyB0aGUgbmF0aXZl
IEpTT04gcGFyc2VyIGZpcnN0CisgICAgaWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5w
YXJzZSApIHsKKyAgICByZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsKKyAgICB9CisK
KyAgICBpZiAoIGRhdGEgPT09IG51bGwgKSB7CisgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisg
ICAgaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisKKyAgICAvLyBNYWtlIHN1cmUg
bGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQgKElFIGNhbid0IGhhbmRsZSBp
dCkKKyAgICBkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKKworICAgIGlmICggZGF0YSApIHsK
KyAgICAvLyBNYWtlIHN1cmUgdGhlIGluY29taW5nIGRhdGEgaXMgYWN0dWFsIEpTT04KKyAgICAv
LyBMb2dpYyBib3Jyb3dlZCBmcm9tIGh0dHA6Ly9qc29uLm9yZy9qc29uMi5qcworICAgIGlmICgg
cnZhbGlkY2hhcnMudGVzdCggZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsICJAIiApCisgICAg
LnJlcGxhY2UoIHJ2YWxpZHRva2VucywgIl0iICkKKyAgICAucmVwbGFjZSggcnZhbGlkYnJhY2Vz
LCAiIikpICkgeworCisgICAgcmV0dXJuICggbmV3IEZ1bmN0aW9uKCAicmV0dXJuICIgKyBkYXRh
ICkgKSgpOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgalF1ZXJ5LmVycm9yKCAiSW52YWxp
ZCBKU09OOiAiICsgZGF0YSApOworICAgIH0sCisKKyAgICAvLyBDcm9zcy1icm93c2VyIHhtbCBw
YXJzaW5nCisgICAgcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIHZhciB4bWwsIHRt
cDsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKKyAgICBy
ZXR1cm4gbnVsbDsKKyAgICB9CisgICAgdHJ5IHsKKyAgICBpZiAoIHdpbmRvdy5ET01QYXJzZXIg
KSB7IC8vIFN0YW5kYXJkCisgICAgdG1wID0gbmV3IERPTVBhcnNlcigpOworICAgIHhtbCA9IHRt
cC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94bWwiICk7CisgICAgfSBlbHNlIHsgLy8g
SUUKKyAgICB4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxET00iICk7Cisg
ICAgeG1sLmFzeW5jID0gImZhbHNlIjsKKyAgICB4bWwubG9hZFhNTCggZGF0YSApOworICAgIH0K
KyAgICB9IGNhdGNoKCBlICkgeworICAgIHhtbCA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgaWYg
KCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFt
ZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKKyAgICBqUXVlcnkuZXJyb3IoICJJbnZhbGlk
IFhNTDogIiArIGRhdGEgKTsKKyAgICB9CisgICAgcmV0dXJuIHhtbDsKKyAgICB9LAorCisgICAg
bm9vcDogZnVuY3Rpb24oKSB7fSwKKworICAgIC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGds
b2JhbCBjb250ZXh0CisgICAgLy8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkgSmlt
IERyaXNjb2xsCisgICAgLy8gaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9h
cmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0CisgICAgZ2xv
YmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgaWYgKCBkYXRhICYmIGpRdWVyeS50cmlt
KCBkYXRhICkgKSB7CisgICAgLy8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9y
ZXIKKyAgICAvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBp
cyB3aW5kb3cKKyAgICAvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAorICAgICggd2lu
ZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgd2luZG93WyAiZXZhbCIg
XS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKKyAgICB9ICkoIGRhdGEgKTsKKyAgICB9CisgICAgfSwK
KworICAgIC8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFu
ZCBkYXRhIG1vZHVsZXMKKyAgICAvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVu
ZG9yIHByZWZpeCAoIzk1NzIpCisgICAgY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgewor
ICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJk
YXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKyAgICB9LAorCisgICAgbm9kZU5hbWU6IGZ1bmN0aW9u
KCBlbGVtLCBuYW1lICkgeworICAgIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5h
bWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0sCisKKyAgICAv
LyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAgZWFjaDogZnVuY3Rpb24oIG9i
aiwgY2FsbGJhY2ssIGFyZ3MgKSB7CisgICAgdmFyIHZhbHVlLAorICAgIGkgPSAwLAorICAgIGxl
bmd0aCA9IG9iai5sZW5ndGgsCisgICAgaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTsKKwor
ICAgIGlmICggYXJncyApIHsKKyAgICBpZiAoIGlzQXJyYXkgKSB7CisgICAgZm9yICggOyBpIDwg
bGVuZ3RoOyBpKysgKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFy
Z3MgKTsKKworICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworICAgIGJyZWFrOworICAgIH0K
KyAgICB9CisgICAgfSBlbHNlIHsKKyAgICBmb3IgKCBpIGluIG9iaiApIHsKKyAgICB2YWx1ZSA9
IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOworCisgICAgaWYgKCB2YWx1ZSA9PT0g
ZmFsc2UgKSB7CisgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHNw
ZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAorICAgIH0g
ZWxzZSB7CisgICAgaWYgKCBpc0FycmF5ICkgeworICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsr
ICkgeworICAgIHZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7
CisKKyAgICBpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKyAgICBicmVhazsKKyAgICB9CisgICAg
fQorICAgIH0gZWxzZSB7CisgICAgZm9yICggaSBpbiBvYmogKSB7CisgICAgdmFsdWUgPSBjYWxs
YmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKKworICAgIGlmICggdmFsdWUgPT09
IGZhbHNlICkgeworICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAg
IHJldHVybiBvYmo7CisgICAgfSwKKworICAgIC8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVu
Y3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKKyAgICB0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJp
bS5jYWxsKCJcdUZFRkZceEEwIikgPworICAgIGZ1bmN0aW9uKCB0ZXh0ICkgeworICAgIHJldHVy
biB0ZXh0ID09IG51bGwgPworICAgICIiIDoKKyAgICBjb3JlX3RyaW0uY2FsbCggdGV4dCApOwor
ICAgIH0gOgorCisgICAgLy8gT3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9u
YWxpdHkKKyAgICBmdW5jdGlvbiggdGV4dCApIHsKKyAgICByZXR1cm4gdGV4dCA9PSBudWxsID8K
KyAgICAiIiA6CisgICAgKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKKyAgICB9
LAorCisgICAgLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorICAgIG1ha2VB
cnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHsKKyAgICB2YXIgcmV0ID0gcmVzdWx0cyB8
fCBbXTsKKworICAgIGlmICggYXJyICE9IG51bGwgKSB7CisgICAgaWYgKCBpc0FycmF5bGlrZSgg
T2JqZWN0KGFycikgKSApIHsKKyAgICBqUXVlcnkubWVyZ2UoIHJldCwKKyAgICB0eXBlb2YgYXJy
ID09PSAic3RyaW5nIiA/CisgICAgWyBhcnIgXSA6IGFycgorICAgICk7CisgICAgfSBlbHNlIHsK
KyAgICBjb3JlX3B1c2guY2FsbCggcmV0LCBhcnIgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIHJldDsKKyAgICB9LAorCisgICAgaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSAp
IHsKKyAgICB2YXIgbGVuOworCisgICAgaWYgKCBhcnIgKSB7CisgICAgaWYgKCBjb3JlX2luZGV4
T2YgKSB7CisgICAgcmV0dXJuIGNvcmVfaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTsKKyAg
ICB9CisKKyAgICBsZW4gPSBhcnIubGVuZ3RoOworICAgIGkgPSBpID8gaSA8IDAgPyBNYXRoLm1h
eCggMCwgbGVuICsgaSApIDogaSA6IDA7CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsK
KyAgICAvLyBTa2lwIGFjY2Vzc2luZyBpbiBzcGFyc2UgYXJyYXlzCisgICAgaWYgKCBpIGluIGFy
ciAmJiBhcnJbIGkgXSA9PT0gZWxlbSApIHsKKyAgICByZXR1cm4gaTsKKyAgICB9CisgICAgfQor
ICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgICB9LAorCisgICAgbWVyZ2U6IGZ1bmN0aW9uKCBm
aXJzdCwgc2Vjb25kICkgeworICAgIHZhciBsID0gc2Vjb25kLmxlbmd0aCwKKyAgICBpID0gZmly
c3QubGVuZ3RoLAorICAgIGogPSAwOworCisgICAgaWYgKCB0eXBlb2YgbCA9PT0gIm51bWJlciIg
KSB7CisgICAgZm9yICggOyBqIDwgbDsgaisrICkgeworICAgIGZpcnN0WyBpKysgXSA9IHNlY29u
ZFsgaiBdOworICAgIH0KKyAgICB9IGVsc2UgeworICAgIHdoaWxlICggc2Vjb25kW2pdICE9PSB1
bmRlZmluZWQgKSB7CisgICAgZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKKyAgICB9Cisg
ICAgfQorCisgICAgZmlyc3QubGVuZ3RoID0gaTsKKworICAgIHJldHVybiBmaXJzdDsKKyAgICB9
LAorCisgICAgZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworICAgIHZh
ciByZXRWYWwsCisgICAgcmV0ID0gW10sCisgICAgaSA9IDAsCisgICAgbGVuZ3RoID0gZWxlbXMu
bGVuZ3RoOworICAgIGludiA9ICEhaW52OworCisgICAgLy8gR28gdGhyb3VnaCB0aGUgYXJyYXks
IG9ubHkgc2F2aW5nIHRoZSBpdGVtcworICAgIC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1
bmN0aW9uCisgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisgICAgcmV0VmFsID0gISFj
YWxsYmFjayggZWxlbXNbIGkgXSwgaSApOworICAgIGlmICggaW52ICE9PSByZXRWYWwgKSB7Cisg
ICAgcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJl
dDsKKyAgICB9LAorCisgICAgLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAg
bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CisgICAgdmFyIHZhbHVlLAor
ICAgIGkgPSAwLAorICAgIGxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKKyAgICBpc0FycmF5ID0gaXNB
cnJheWxpa2UoIGVsZW1zICksCisgICAgcmV0ID0gW107CisKKyAgICAvLyBHbyB0aHJvdWdoIHRo
ZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKyAgICBpZiAo
IGlzQXJyYXkgKSB7CisgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisgICAgdmFsdWUg
PSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKyAgICBpZiAoIHZhbHVlICE9IG51
bGwgKSB7CisgICAgcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgfQorCisg
ICAgLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKKyAgICB9IGVsc2Ugewor
ICAgIGZvciAoIGkgaW4gZWxlbXMgKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkg
XSwgaSwgYXJnICk7CisKKyAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7CisgICAgcmV0WyByZXQu
bGVuZ3RoIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZsYXR0ZW4g
YW55IG5lc3RlZCBhcnJheXMKKyAgICByZXR1cm4gY29yZV9jb25jYXQuYXBwbHkoIFtdLCByZXQg
KTsKKyAgICB9LAorCisgICAgLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCisg
ICAgZ3VpZDogMSwKKworICAgIC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlv
bmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQorICAgIC8vIGFyZ3VtZW50cy4KKyAgICBwcm94
eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgeworICAgIHZhciBhcmdzLCBwcm94eSwgdG1wOwor
CisgICAgaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CisgICAgdG1wID0gZm5b
IGNvbnRleHQgXTsKKyAgICBjb250ZXh0ID0gZm47CisgICAgZm4gPSB0bXA7CisgICAgfQorCisg
ICAgLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4g
dGhlIHNwZWMKKyAgICAvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVz
dCByZXR1cm4gdW5kZWZpbmVkLgorICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkg
eworICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgLy8gU2ltdWxhdGVkIGJpbmQK
KyAgICBhcmdzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKKyAgICBwcm94eSA9
IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdz
LmNvbmNhdCggY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CisgICAgfTsKKworICAg
IC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5h
bCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAorICAgIHByb3h5Lmd1aWQgPSBmbi5ndWlk
ID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOworCisgICAgcmV0dXJuIHByb3h5OworICAgIH0s
CisKKyAgICAvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBv
ZiBhIGNvbGxlY3Rpb24KKyAgICAvLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVj
dXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KKyAgICBhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4s
IGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKyAgICB2YXIgaSA9IDAs
CisgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAorICAgIGJ1bGsgPSBrZXkgPT0gbnVsbDsKKwor
ICAgIC8vIFNldHMgbWFueSB2YWx1ZXMKKyAgICBpZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0g
Im9iamVjdCIgKSB7CisgICAgY2hhaW5hYmxlID0gdHJ1ZTsKKyAgICBmb3IgKCBpIGluIGtleSAp
IHsKKyAgICBqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlH
ZXQsIHJhdyApOworICAgIH0KKworICAgIC8vIFNldHMgb25lIHZhbHVlCisgICAgfSBlbHNlIGlm
ICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKyAgICBjaGFpbmFibGUgPSB0cnVlOworCisgICAg
aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmF3ID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICBpZiAoIGJ1bGsgKSB7CisgICAgLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2Fp
bnN0IHRoZSBlbnRpcmUgc2V0CisgICAgaWYgKCByYXcgKSB7CisgICAgZm4uY2FsbCggZWxlbXMs
IHZhbHVlICk7CisgICAgZm4gPSBudWxsOworCisgICAgLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0
aW5nIGZ1bmN0aW9uIHZhbHVlcworICAgIH0gZWxzZSB7CisgICAgYnVsayA9IGZuOworICAgIGZu
ID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7CisgICAgcmV0dXJuIGJ1bGsuY2FsbCgg
alF1ZXJ5KCBlbGVtICksIHZhbHVlICk7CisgICAgfTsKKyAgICB9CisgICAgfQorCisgICAgaWYg
KCBmbiApIHsKKyAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICBmbiggZWxlbXNb
aV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1z
W2ldLCBrZXkgKSApICk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2hhaW5h
YmxlID8KKyAgICBlbGVtcyA6CisKKyAgICAvLyBHZXRzCisgICAgYnVsayA/CisgICAgZm4uY2Fs
bCggZWxlbXMgKSA6CisgICAgbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0
OworICAgIH0sCisKKyAgICBub3c6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAoIG5ldyBEYXRl
KCkgKS5nZXRUaW1lKCk7CisgICAgfQorfSk7CisKK2pRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVu
Y3Rpb24oIG9iaiApIHsKKyAgICBpZiAoICFyZWFkeUxpc3QgKSB7CisKKyAgICByZWFkeUxpc3Qg
PSBqUXVlcnkuRGVmZXJyZWQoKTsKKworICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1l
bnQpLnJlYWR5KCkgaXMgY2FsbGVkIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5
IG9jY3VycmVkLgorICAgIC8vIHdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVy
YWN0aXZlIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmUKKyAgICAvLyBk
aXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8x
MjI4MiNjb21tZW50OjE1CisgICAgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxl
dGUiICkgeworICAgIC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRz
IHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQorICAgIHNldFRpbWVvdXQoIGpRdWVyeS5y
ZWFkeSApOworCisgICAgLy8gU3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29u
dGVudExvYWRlZAorICAgIH0gZWxzZSBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7
CisgICAgLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaworICAgIGRvY3VtZW50LmFkZEV2
ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOworCisg
ICAgLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsK
KyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7
CisKKyAgICAvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisgICAgfSBlbHNlIHsKKyAgICAv
LyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBm
b3IgaWZyYW1lcworICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdl
IiwgY29tcGxldGVkICk7CisKKyAgICAvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRo
YXQgd2lsbCBhbHdheXMgd29yaworICAgIHdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGNv
bXBsZXRlZCApOworCisgICAgLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCisgICAgLy8gY29udGlu
dWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeQorICAgIHZhciB0b3Ag
PSBmYWxzZTsKKworICAgIHRyeSB7CisgICAgdG9wID0gd2luZG93LmZyYW1lRWxlbWVudCA9PSBu
dWxsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB9IGNhdGNoKGUpIHt9CisKKyAg
ICBpZiAoIHRvcCAmJiB0b3AuZG9TY3JvbGwgKSB7CisgICAgKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hl
Y2soKSB7CisgICAgaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CisKKyAgICB0cnkgeworICAgIC8v
IFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCisgICAgLy8gaHR0cDovL2phdmFzY3JpcHQu
bndib3guY29tL0lFQ29udGVudExvYWRlZC8KKyAgICB0b3AuZG9TY3JvbGwoImxlZnQiKTsKKyAg
ICB9IGNhdGNoKGUpIHsKKyAgICByZXR1cm4gc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgNTAg
KTsKKyAgICB9CisKKyAgICAvLyBkZXRhY2ggYWxsIGRvbSByZWFkeSBldmVudHMKKyAgICBkZXRh
Y2goKTsKKworICAgIC8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucworICAgIGpR
dWVyeS5yZWFkeSgpOworICAgIH0KKyAgICB9KSgpOworICAgIH0KKyAgICB9CisgICAgfQorICAg
IHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7Cit9OworCisvLyBQb3B1bGF0ZSB0aGUg
Y2xhc3MydHlwZSBtYXAKK2pRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rp
b24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihp
LCBuYW1lKSB7CisgICAgY2xhc3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5h
bWUudG9Mb3dlckNhc2UoKTsKK30pOworCitmdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkgewor
ICAgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoLAorICAgIHR5cGUgPSBqUXVlcnkudHlwZSggb2Jq
ICk7CisKKyAgICBpZiAoIGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7CisgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIGlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHsK
KyAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8
fCB0eXBlICE9PSAiZnVuY3Rpb24iICYmCisgICAgKCBsZW5ndGggPT09IDAgfHwKKyAgICB0eXBl
b2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGlu
IG9iaiApOworfQorCisvLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8g
dGhlc2UKK3Jvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOworLy8gU3RyaW5nIHRvIE9iamVj
dCBvcHRpb25zIGZvcm1hdCBjYWNoZQordmFyIG9wdGlvbnNDYWNoZSA9IHt9OworCisvLyBDb252
ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lcyBh
bmQgc3RvcmUgaW4gY2FjaGUKK2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cisg
ICAgdmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307CisgICAgalF1ZXJ5
LmVhY2goIG9wdGlvbnMubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBf
LCBmbGFnICkgeworICAgIG9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKKyAgICB9KTsKKyAgICByZXR1
cm4gb2JqZWN0OworfQorCisvKgorICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUg
Zm9sbG93aW5nIHBhcmFtZXRlcnM6CisgKgorICogICAgb3B0aW9uczogYW4gb3B0aW9uYWwgbGlz
dCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdworICogICAg
ICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBv
cHRpb24gb2JqZWN0CisgKgorICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3Qg
bGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJlZCIgbXVsdGlw
bGUgdGltZXMuCisgKgorICogUG9zc2libGUgb3B0aW9uczoKKyAqCisgKiAgICBvbmNlOiAgICAg
ICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9u
Y2UgKGxpa2UgYSBEZWZlcnJlZCkKKyAqCisgKiAgICBtZW1vcnk6ICAgICAgICAgICAgd2lsbCBr
ZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBh
ZGRlZAorICogICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVk
IHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCisgKiAgICAgICAgICAgICAg
ICAgICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICogICAgdW5pcXVlOiAgICAgICAg
ICAgIHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVw
bGljYXRlIGluIHRoZSBsaXN0KQorICoKKyAqICAgIHN0b3BPbkZhbHNlOiAgICBpbnRlcnJ1cHQg
Y2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2UKKyAqCisgKi8KK2pRdWVyeS5D
YWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKKworICAgIC8vIENvbnZlcnQgb3B0aW9u
cyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKKyAg
ICAvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpCisgICAgb3B0aW9ucyA9IHR5cGVvZiBvcHRp
b25zID09PSAic3RyaW5nIiA/CisgICAgKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVh
dGVPcHRpb25zKCBvcHRpb25zICkgKSA6CisgICAgalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMg
KTsKKworICAgIHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5n
CisgICAgZmlyaW5nLAorICAgIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJs
ZSBsaXN0cykKKyAgICBtZW1vcnksCisgICAgLy8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFs
cmVhZHkgZmlyZWQKKyAgICBmaXJlZCwKKyAgICAvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJp
bmcKKyAgICBmaXJpbmdMZW5ndGgsCisgICAgLy8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBj
YWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlmIG5lZWRlZCkKKyAgICBmaXJpbmdJbmRleCwK
KyAgICAvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFu
ZCBmaXJlV2l0aCkKKyAgICBmaXJpbmdTdGFydCwKKyAgICAvLyBBY3R1YWwgY2FsbGJhY2sgbGlz
dAorICAgIGxpc3QgPSBbXSwKKyAgICAvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRh
YmxlIGxpc3RzCisgICAgc3RhY2sgPSAhb3B0aW9ucy5vbmNlICYmIFtdLAorICAgIC8vIEZpcmUg
Y2FsbGJhY2tzCisgICAgZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIG1lbW9yeSA9IG9w
dGlvbnMubWVtb3J5ICYmIGRhdGE7CisgICAgZmlyZWQgPSB0cnVlOworICAgIGZpcmluZ0luZGV4
ID0gZmlyaW5nU3RhcnQgfHwgMDsKKyAgICBmaXJpbmdTdGFydCA9IDA7CisgICAgZmlyaW5nTGVu
Z3RoID0gbGlzdC5sZW5ndGg7CisgICAgZmlyaW5nID0gdHJ1ZTsKKyAgICBmb3IgKCA7IGxpc3Qg
JiYgZmlyaW5nSW5kZXggPCBmaXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7CisgICAgaWYg
KCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBm
YWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkgeworICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBU
byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkCisgICAgYnJlYWs7CisgICAgfQorICAg
IH0KKyAgICBmaXJpbmcgPSBmYWxzZTsKKyAgICBpZiAoIGxpc3QgKSB7CisgICAgaWYgKCBzdGFj
ayApIHsKKyAgICBpZiAoIHN0YWNrLmxlbmd0aCApIHsKKyAgICBmaXJlKCBzdGFjay5zaGlmdCgp
ICk7CisgICAgfQorICAgIH0gZWxzZSBpZiAoIG1lbW9yeSApIHsKKyAgICBsaXN0ID0gW107Cisg
ICAgfSBlbHNlIHsKKyAgICBzZWxmLmRpc2FibGUoKTsKKyAgICB9CisgICAgfQorICAgIH0sCisg
ICAgLy8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3QKKyAgICBzZWxmID0geworICAgIC8vIEFkZCBh
IGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKKyAgICBh
ZGQ6IGZ1bmN0aW9uKCkgeworICAgIGlmICggbGlzdCApIHsKKyAgICAvLyBGaXJzdCwgd2Ugc2F2
ZSB0aGUgY3VycmVudCBsZW5ndGgKKyAgICB2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsKKyAgICAo
ZnVuY3Rpb24gYWRkKCBhcmdzICkgeworICAgIGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbigg
XywgYXJnICkgeworICAgIHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOworICAgIGlmICgg
dHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKKyAgICBpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2Vs
Zi5oYXMoIGFyZyApICkgeworICAgIGxpc3QucHVzaCggYXJnICk7CisgICAgfQorICAgIH0gZWxz
ZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHR5cGUgIT09ICJzdHJpbmciICkgeworICAgIC8v
IEluc3BlY3QgcmVjdXJzaXZlbHkKKyAgICBhZGQoIGFyZyApOworICAgIH0KKyAgICB9KTsKKyAg
ICB9KSggYXJndW1lbnRzICk7CisgICAgLy8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNr
cyB0byB0aGUKKyAgICAvLyBjdXJyZW50IGZpcmluZyBiYXRjaD8KKyAgICBpZiAoIGZpcmluZyAp
IHsKKyAgICBmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDsKKyAgICAvLyBXaXRoIG1lbW9yeSwg
aWYgd2UncmUgbm90IGZpcmluZyB0aGVuCisgICAgLy8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdh
eQorICAgIH0gZWxzZSBpZiAoIG1lbW9yeSApIHsKKyAgICBmaXJpbmdTdGFydCA9IHN0YXJ0Owor
ICAgIGZpcmUoIG1lbW9yeSApOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAg
fSwKKyAgICAvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0CisgICAgcmVtb3ZlOiBm
dW5jdGlvbigpIHsKKyAgICBpZiAoIGxpc3QgKSB7CisgICAgalF1ZXJ5LmVhY2goIGFyZ3VtZW50
cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKKyAgICB2YXIgaW5kZXg7CisgICAgd2hpbGUoICggaW5k
ZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHsKKyAgICBs
aXN0LnNwbGljZSggaW5kZXgsIDEgKTsKKyAgICAvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXMKKyAg
ICBpZiAoIGZpcmluZyApIHsKKyAgICBpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKKyAg
ICBmaXJpbmdMZW5ndGgtLTsKKyAgICB9CisgICAgaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCAp
IHsKKyAgICBmaXJpbmdJbmRleC0tOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0pOworICAg
IH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAgIC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2Fs
bGJhY2sgaXMgaW4gdGhlIGxpc3QuCisgICAgLy8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJl
dHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuCisgICAgaGFz
OiBmdW5jdGlvbiggZm4gKSB7CisgICAgcmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBs
aXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3QubGVuZ3RoICk7CisgICAgfSwKKyAgICAvLyBS
ZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0CisgICAgZW1wdHk6IGZ1bmN0aW9uKCkg
eworICAgIGxpc3QgPSBbXTsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAgIC8vIEhhdmUg
dGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlCisgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7Cisg
ICAgbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOworICAgIHJldHVybiB0aGlzOwor
ICAgIH0sCisgICAgLy8gSXMgaXQgZGlzYWJsZWQ/CisgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiAhbGlzdDsKKyAgICB9LAorICAgIC8vIExvY2sgdGhlIGxpc3QgaW4gaXRz
IGN1cnJlbnQgc3RhdGUKKyAgICBsb2NrOiBmdW5jdGlvbigpIHsKKyAgICBzdGFjayA9IHVuZGVm
aW5lZDsKKyAgICBpZiAoICFtZW1vcnkgKSB7CisgICAgc2VsZi5kaXNhYmxlKCk7CisgICAgfQor
ICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgLy8gSXMgaXQgbG9ja2VkPworICAgIGxvY2tl
ZDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICFzdGFjazsKKyAgICB9LAorICAgIC8vIENhbGwg
YWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHMKKyAgICBm
aXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7CisgICAgYXJncyA9IGFyZ3MgfHwg
W107CisgICAgYXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFy
Z3MgXTsKKyAgICBpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKKyAgICBpZiAo
IGZpcmluZyApIHsKKyAgICBzdGFjay5wdXNoKCBhcmdzICk7CisgICAgfSBlbHNlIHsKKyAgICBm
aXJlKCBhcmdzICk7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAg
IC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCisgICAg
ZmlyZTogZnVuY3Rpb24oKSB7CisgICAgc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKyAgICAvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFj
a3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKKyAgICBmaXJlZDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuICEhZmlyZWQ7CisgICAgfQorICAgIH07CisKKyAgICByZXR1
cm4gc2VsZjsKK307CitqUXVlcnkuZXh0ZW5kKHsKKworICAgIERlZmVycmVkOiBmdW5jdGlvbigg
ZnVuYyApIHsKKyAgICB2YXIgdHVwbGVzID0gWworICAgIC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVy
LCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQorICAgIFsgInJlc29sdmUiLCAiZG9uZSIsIGpR
dWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZXNvbHZlZCIgXSwKKyAgICBbICJyZWpl
Y3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIg
XSwKKyAgICBbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnki
KSBdCisgICAgXSwKKyAgICBzdGF0ZSA9ICJwZW5kaW5nIiwKKyAgICBwcm9taXNlID0geworICAg
IHN0YXRlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gc3RhdGU7CisgICAgfSwKKyAgICBhbHdh
eXM6IGZ1bmN0aW9uKCkgeworICAgIGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFy
Z3VtZW50cyApOworICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgdGhlbjogZnVuY3Rpb24o
IC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgeworICAgIHZhciBmbnMgPSBhcmd1
bWVudHM7CisgICAgcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7
CisgICAgalF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgeworICAgIHZh
ciBhY3Rpb24gPSB0dXBsZVsgMCBdLAorICAgIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sg
aSBdICkgJiYgZm5zWyBpIF07CisgICAgLy8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jl
c3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyCisgICAgZGVmZXJyZWRbIHR1
cGxlWzFdIF0oZnVuY3Rpb24oKSB7CisgICAgdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHko
IHRoaXMsIGFyZ3VtZW50cyApOworICAgIGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rp
b24oIHJldHVybmVkLnByb21pc2UgKSApIHsKKyAgICByZXR1cm5lZC5wcm9taXNlKCkKKyAgICAu
ZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApCisgICAgLmZhaWwoIG5ld0RlZmVyLnJlamVjdCApCisg
ICAgLnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTsKKyAgICB9IGVsc2UgeworICAgIG5ld0Rl
ZmVyWyBhY3Rpb24gKyAiV2l0aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21p
c2UoKSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7CisgICAgfQorICAg
IH0pOworICAgIH0pOworICAgIGZucyA9IG51bGw7CisgICAgfSkucHJvbWlzZSgpOworICAgIH0s
CisgICAgLy8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZAorICAgIC8vIElmIG9iaiBp
cyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKKyAg
ICBwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgeworICAgIHJldHVybiBvYmogIT0gbnVsbCA/IGpR
dWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKKyAgICB9CisgICAgfSwKKyAg
ICBkZWZlcnJlZCA9IHt9OworCisgICAgLy8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdAorICAg
IHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKKworICAgIC8vIEFkZCBsaXN0LXNwZWNpZmlj
IG1ldGhvZHMKKyAgICBqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7
CisgICAgdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAorICAgIHN0YXRlU3RyaW5nID0gdHVwbGVbIDMg
XTsKKworICAgIC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRk
CisgICAgcHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkOworCisgICAgLy8gSGFuZGxlIHN0
YXRlCisgICAgaWYgKCBzdGF0ZVN0cmluZyApIHsKKyAgICBsaXN0LmFkZChmdW5jdGlvbigpIHsK
KyAgICAvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdCisgICAgc3RhdGUgPSBzdGF0
ZVN0cmluZzsKKworICAgIC8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxl
OyBwcm9ncmVzc19saXN0LmxvY2sKKyAgICB9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxl
LCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKKyAgICB9CisKKyAgICAvLyBkZWZlcnJlZFsgcmVz
b2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdCisgICAgZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5j
dGlvbigpIHsKKyAgICBkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gZGVm
ZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7CisgICAgcmV0dXJuIHRoaXM7Cisg
ICAgfTsKKyAgICBkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7
CisgICAgfSk7CisKKyAgICAvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKKyAgICBwcm9t
aXNlLnByb21pc2UoIGRlZmVycmVkICk7CisKKyAgICAvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55
CisgICAgaWYgKCBmdW5jICkgeworICAgIGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7
CisgICAgfQorCisgICAgLy8gQWxsIGRvbmUhCisgICAgcmV0dXJuIGRlZmVycmVkOworICAgIH0s
CisKKyAgICAvLyBEZWZlcnJlZCBoZWxwZXIKKyAgICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5h
dGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgcmVz
b2x2ZVZhbHVlcyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICksCisgICAgbGVuZ3RoID0g
cmVzb2x2ZVZhbHVlcy5sZW5ndGgsCisKKyAgICAvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQg
c3Vib3JkaW5hdGVzCisgICAgcmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5h
dGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3Ro
IDogMCwKKworICAgIC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29u
c2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgorICAgIGRlZmVy
cmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwK
KworICAgIC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2
YWx1ZXMKKyAgICB1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7
CisgICAgcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICBjb250ZXh0c1sgaSBdID0gdGhp
czsKKyAgICB2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gY29yZV9zbGljZS5j
YWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOworICAgIGlmKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFs
dWVzICkgeworICAgIGRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKKyAg
ICB9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkgeworICAgIGRlZmVycmVkLnJlc29sdmVX
aXRoKCBjb250ZXh0cywgdmFsdWVzICk7CisgICAgfQorICAgIH07CisgICAgfSwKKworICAgIHBy
b2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7CisKKyAgICAv
LyBhZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFz
IHJlc29sdmVkCisgICAgaWYgKCBsZW5ndGggPiAxICkgeworICAgIHByb2dyZXNzVmFsdWVzID0g
bmV3IEFycmF5KCBsZW5ndGggKTsKKyAgICBwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBs
ZW5ndGggKTsKKyAgICByZXNvbHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOworICAg
IGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAgIGlmICggcmVzb2x2ZVZhbHVlc1sgaSBd
ICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkgewor
ICAgIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKCkKKyAgICAuZG9uZSggdXBkYXRlRnVuYygg
aSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKQorICAgIC5mYWlsKCBkZWZlcnJl
ZC5yZWplY3QgKQorICAgIC5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0
cywgcHJvZ3Jlc3NWYWx1ZXMgKSApOworICAgIH0gZWxzZSB7CisgICAgLS1yZW1haW5pbmc7Cisg
ICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0
aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCisgICAgaWYgKCAhcmVtYWluaW5nICkgeworICAgIGRl
ZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOworICAgIH0KK30pOworalF1ZXJ5
LnN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CisKKyAgICB2YXIgc3VwcG9ydCwgYWxsLCBhLAorICAg
IGlucHV0LCBzZWxlY3QsIGZyYWdtZW50LAorICAgIG9wdCwgZXZlbnROYW1lLCBpc1N1cHBvcnRl
ZCwgaSwKKyAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgIC8v
IFNldHVwCisgICAgZGl2LnNldEF0dHJpYnV0ZSggImNsYXNzTmFtZSIsICJ0IiApOworICAgIGRp
di5pbm5lckhUTUwgPSAiICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+
PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IjsKKworICAgIC8vIFN1cHBvcnQgdGVzdHMgd29uJ3Qg
cnVuIGluIHNvbWUgbGltaXRlZCBvciBub24tYnJvd3NlciBlbnZpcm9ubWVudHMKKyAgICBhbGwg
PSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICBhID0gZGl2LmdldEVsZW1lbnRz
QnlUYWdOYW1lKCJhIilbIDAgXTsKKyAgICBpZiAoICFhbGwgfHwgIWEgfHwgIWFsbC5sZW5ndGgg
KSB7CisgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIC8vIEZpcnN0IGJhdGNoIG9mIHRlc3Rz
CisgICAgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CisgICAgb3B0
ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSAp
OworICAgIGlucHV0ID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWyAwIF07CisK
KyAgICBhLnN0eWxlLmNzc1RleHQgPSAidG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiOwor
ICAgIHN1cHBvcnQgPSB7CisgICAgLy8gVGVzdCBzZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNs
YXNzLiBJZiBpdCB3b3Jrcywgd2UgbmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0
cmlidXRlIChpZTYvNykKKyAgICBnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09ICJ0
IiwKKworICAgIC8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1M
IGlzIHVzZWQKKyAgICBsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUg
PT09IDMsCisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0
b21hdGljYWxseSBpbnNlcnRlZAorICAgIC8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0
eSB0YWJsZXMKKyAgICB0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5s
ZW5ndGgsCisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxp
emVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKKyAgICAvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBl
ciBlbGVtZW50IGluIElFCisgICAgaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoImxpbmsiKS5sZW5ndGgsCisKKyAgICAvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9u
IGZyb20gZ2V0QXR0cmlidXRlCisgICAgLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKKyAg
ICBzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKKworICAgIC8v
IE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCisgICAgLy8gKElFIG5vcm1h
bGl6ZXMgaXQgYnkgZGVmYXVsdCkKKyAgICBocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUo
ImhyZWYiKSA9PT0gIi9hIiwKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0
eSBleGlzdHMKKyAgICAvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKKyAgICAvLyBVc2UgYSBy
ZWdleCB0byB3b3JrIGFyb3VuZCBhIFdlYktpdCBpc3N1ZS4gU2VlICM1MTQ1CisgICAgb3BhY2l0
eTogL14wLjUvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAorCisgICAgLy8gVmVyaWZ5IHN0eWxl
IGZsb2F0IGV4aXN0ZW5jZQorICAgIC8vIChJRSB1c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBj
c3NGbG9hdCkKKyAgICBjc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisgICAgLy8gQ2hl
Y2sgdGhlIGRlZmF1bHQgY2hlY2tib3gvcmFkaW8gdmFsdWUgKCIiIG9uIFdlYktpdDsgIm9uIiBl
bHNld2hlcmUpCisgICAgY2hlY2tPbjogISFpbnB1dC52YWx1ZSwKKworICAgIC8vIE1ha2Ugc3Vy
ZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3Rl
ZCBwcm9wZXJ0eS4KKyAgICAvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2Yg
dHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKQorICAgIG9wdFNlbGVjdGVkOiBv
cHQuc2VsZWN0ZWQsCisKKyAgICAvLyBUZXN0cyBmb3IgZW5jdHlwZSBzdXBwb3J0IG9uIGEgZm9y
bSAoIzY3NDMpCisgICAgZW5jdHlwZTogISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiku
ZW5jdHlwZSwKKworICAgIC8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRv
ZXMgbm90IGNhdXNlIHByb2JsZW1zCisgICAgLy8gV2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5l
ZCwgdGhpcyBzdGlsbCB3b3JrcworICAgIGh0bWw1Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4i
LAorCisgICAgLy8galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgREVQUkVDQVRFRCBpbiAxLjggc2lu
Y2Ugd2UgZG9uJ3Qgc3VwcG9ydCBRdWlya3MgTW9kZQorICAgIGJveE1vZGVsOiBkb2N1bWVudC5j
b21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIsCisKKyAgICAvLyBXaWxsIGJlIGRlZmluZWQgbGF0
ZXIKKyAgICBkZWxldGVFeHBhbmRvOiB0cnVlLAorICAgIG5vQ2xvbmVFdmVudDogdHJ1ZSwKKyAg
ICBpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxzZSwKKyAgICBzaHJpbmtXcmFwQmxvY2tzOiBm
YWxzZSwKKyAgICByZWxpYWJsZU1hcmdpblJpZ2h0OiB0cnVlLAorICAgIGJveFNpemluZ1JlbGlh
YmxlOiB0cnVlLAorICAgIHBpeGVsUG9zaXRpb246IGZhbHNlCisgICAgfTsKKworICAgIC8vIE1h
a2Ugc3VyZSBjaGVja2VkIHN0YXR1cyBpcyBwcm9wZXJseSBjbG9uZWQKKyAgICBpbnB1dC5jaGVj
a2VkID0gdHJ1ZTsKKyAgICBzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2Rl
KCB0cnVlICkuY2hlY2tlZDsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGlu
c2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKKyAgICAvLyAo
V2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCisgICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1
ZTsKKyAgICBzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworICAgIC8vIFN1
cHBvcnQ6IElFPDkKKyAgICB0cnkgeworICAgIGRlbGV0ZSBkaXYudGVzdDsKKyAgICB9IGNhdGNo
KCBlICkgeworICAgIHN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOworICAgIH0KKworICAg
IC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBnZXRBdHRyaWJ1dGUoInZhbHVlIikKKyAgICBpbnB1
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgaW5wdXQuc2V0QXR0cmli
dXRlKCAidmFsdWUiLCAiIiApOworICAgIHN1cHBvcnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1
dGUoICJ2YWx1ZSIgKSA9PT0gIiI7CisKKyAgICAvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFp
bnMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW8KKyAgICBpbnB1dC52YWx1ZSA9ICJ0
IjsKKyAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOworICAgIHN1cHBv
cnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7CisKKyAgICAvLyAjMTEyMTcgLSBX
ZWJLaXQgbG9zZXMgY2hlY2sgd2hlbiB0aGUgbmFtZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRy
aWJ1dGUKKyAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInQiICk7CisgICAgaW5w
dXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiApOworCisgICAgZnJhZ21lbnQgPSBkb2N1bWVu
dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlu
cHV0ICk7CisKKyAgICAvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJl
dGFpbiBpdHMgY2hlY2tlZAorICAgIC8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8g
dGhlIERPTSAoSUU2LzcpCisgICAgc3VwcG9ydC5hcHBlbmRDaGVja2VkID0gaW5wdXQuY2hlY2tl
ZDsKKworICAgIC8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5
IGluIGZyYWdtZW50cworICAgIHN1cHBvcnQuY2hlY2tDbG9uZSA9IGZyYWdtZW50LmNsb25lTm9k
ZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOworCisgICAgLy8g
U3VwcG9ydDogSUU8OQorICAgIC8vIE9wZXJhIGRvZXMgbm90IGNsb25lIGV2ZW50cyAoYW5kIHR5
cGVvZiBkaXYuYXR0YWNoRXZlbnQgPT09IHVuZGVmaW5lZCkuCisgICAgLy8gSUU5LTEwIGNsb25l
cyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50LCBidXQgdGhleSBkb24ndCB0cmlnZ2VyIHdp
dGggLmNsaWNrKCkKKyAgICBpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKKyAgICBkaXYuYXR0YWNo
RXZlbnQoICJvbmNsaWNrIiwgZnVuY3Rpb24oKSB7CisgICAgc3VwcG9ydC5ub0Nsb25lRXZlbnQg
PSBmYWxzZTsKKyAgICB9KTsKKworICAgIGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbGljaygpOwor
ICAgIH0KKworICAgIC8vIFN1cHBvcnQ6IElFPDkgKGxhY2sgc3VibWl0L2NoYW5nZSBidWJibGUp
LCBGaXJlZm94IDE3KyAobGFjayBmb2N1c2luIGV2ZW50KQorICAgIC8vIEJld2FyZSBvZiBDU1Ag
cmVzdHJpY3Rpb25zIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9D
U1ApLCB0ZXN0L2NzcC5waHAKKyAgICBmb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6
IHRydWUsIGZvY3VzaW46IHRydWUgfSkgeworICAgIGRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFt
ZSA9ICJvbiIgKyBpLCAidCIgKTsKKworICAgIHN1cHBvcnRbIGkgKyAiQnViYmxlcyIgXSA9IGV2
ZW50TmFtZSBpbiB3aW5kb3cgfHwgZGl2LmF0dHJpYnV0ZXNbIGV2ZW50TmFtZSBdLmV4cGFuZG8g
PT09IGZhbHNlOworICAgIH0KKworICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250
ZW50LWJveCI7CisgICAgZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlw
ID0gIiI7CisgICAgc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3Vu
ZENsaXAgPT09ICJjb250ZW50LWJveCI7CisKKyAgICAvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEg
Ym9keSBhdCBkb2MgcmVhZHkKKyAgICBqUXVlcnkoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRh
aW5lciwgbWFyZ2luRGl2LCB0ZHMsCisgICAgZGl2UmVzZXQgPSAicGFkZGluZzowO21hcmdpbjow
O2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1z
aXppbmc6Y29udGVudC1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OyIsCisgICAg
Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CisKKyAgICBp
ZiAoICFib2R5ICkgeworICAgIC8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0
IGhhdmUgYSBib2R5CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRhaW5lciA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0g
ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDot
OTk5OXB4O21hcmdpbi10b3A6MXB4IjsKKworICAgIGJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5l
ciApLmFwcGVuZENoaWxkKCBkaXYgKTsKKworICAgIC8vIFN1cHBvcnQ6IElFOAorICAgIC8vIENo
ZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhl
eSBhcmUgc2V0CisgICAgLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3Ro
ZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCisgICAgLy8gdGFibGUgcm93OyBpZiBzbywgb2Zm
c2V0V2lkdGgvSGVpZ2h0IGFyZSBub3QgcmVsaWFibGUgZm9yIHVzZSB3aGVuCisgICAgLy8gZGV0
ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKKyAg
ICAvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBw
YXJlbnQgZWxlbWVudCBpcworICAgIC8vIGhpZGRlbjsgZG9uIHNhZmV0eSBnb2dnbGVzIGFuZCBz
ZWUgYnVnICM0NTEyIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKyAgICBkaXYuaW5uZXJIVE1MID0g
Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iOworICAgIHRkcyA9
IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKyAgICB0ZHNbIDAgXS5zdHlsZS5jc3NU
ZXh0ID0gInBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiOworICAgIGlz
U3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKKworICAgIHRkc1sg
MCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKKyAgICB0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5v
bmUiOworCisgICAgLy8gU3VwcG9ydDogSUU4CisgICAgLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUg
Y2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQKKyAgICBzdXBwb3J0LnJlbGlhYmxl
SGlkZGVuT2Zmc2V0cyA9IGlzU3VwcG9ydGVkICYmICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09
PSAwICk7CisKKyAgICAvLyBDaGVjayBib3gtc2l6aW5nIGFuZCBtYXJnaW4gYmVoYXZpb3IKKyAg
ICBkaXYuaW5uZXJIVE1MID0gIiI7CisgICAgZGl2LnN0eWxlLmNzc1RleHQgPSAiYm94LXNpemlu
Zzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemlu
Zzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0
cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7IjsKKyAgICBzdXBwb3J0
LmJveFNpemluZyA9ICggZGl2Lm9mZnNldFdpZHRoID09PSA0ICk7CisgICAgc3VwcG9ydC5kb2Vz
Tm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCA9ICggYm9keS5vZmZzZXRUb3AgIT09IDEgKTsK
KworICAgIC8vIFVzZSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSBiZWNhdXNlIGpzZG9tIG9uIG5v
ZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0LgorICAgIGlmICggd2luZG93LmdldENvbXB1dGVk
U3R5bGUgKSB7CisgICAgc3VwcG9ydC5waXhlbFBvc2l0aW9uID0gKCB3aW5kb3cuZ2V0Q29tcHV0
ZWRTdHlsZSggZGl2LCBudWxsICkgfHwge30gKS50b3AgIT09ICIxJSI7CisgICAgc3VwcG9ydC5i
b3hTaXppbmdSZWxpYWJsZSA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCAp
IHx8IHsgd2lkdGg6ICI0cHgiIH0gKS53aWR0aCA9PT0gIjRweCI7CisKKyAgICAvLyBDaGVjayBp
ZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5
CisgICAgLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29u
dGFpbmVyLiAoIzMzMzMpCisgICAgLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBu
aWdodGxpZXMKKyAgICAvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1
cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKKyAgICBtYXJnaW5EaXYgPSBkaXYuYXBw
ZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7CisgICAgbWFyZ2luRGl2
LnN0eWxlLmNzc1RleHQgPSBkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0OworICAgIG1hcmdp
bkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKKyAg
ICBkaXYuc3R5bGUud2lkdGggPSAiMXB4IjsKKworICAgIHN1cHBvcnQucmVsaWFibGVNYXJnaW5S
aWdodCA9CisgICAgIXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdp
bkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmlnaHQgKTsKKyAgICB9CisKKyAgICBpZiAoIHR5
cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7CisgICAgLy8gU3Vw
cG9ydDogSUU8OAorICAgIC8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRz
IGFjdCBsaWtlIGlubGluZS1ibG9jaworICAgIC8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVp
ciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmcKKyAgICAvLyB0aGVtIGxheW91dAorICAg
IGRpdi5pbm5lckhUTUwgPSAiIjsKKyAgICBkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsg
IndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiOworICAgIHN1cHBv
cnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7CisK
KyAgICAvLyBTdXBwb3J0OiBJRTYKKyAgICAvLyBDaGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91
dCBzaHJpbmstd3JhcCB0aGVpciBjaGlsZHJlbgorICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJs
b2NrIjsKKyAgICBkaXYuaW5uZXJIVE1MID0gIjxkaXY+PC9kaXY+IjsKKyAgICBkaXYuZmlyc3RD
aGlsZC5zdHlsZS53aWR0aCA9ICI1cHgiOworICAgIHN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9
ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7CisKKyAgICBpZiAoIHN1cHBvcnQuaW5saW5lQmxv
Y2tOZWVkc0xheW91dCApIHsKKyAgICAvLyBQcmV2ZW50IElFIDYgZnJvbSBhZmZlY3RpbmcgbGF5
b3V0IGZvciBwb3NpdGlvbmVkIGVsZW1lbnRzICMxMTA0OAorICAgIC8vIFByZXZlbnQgSUUgZnJv
bSBzaHJpbmtpbmcgdGhlIGJvZHkgaW4gSUUgNyBtb2RlICMxMjg2OQorICAgIC8vIFN1cHBvcnQ6
IElFPDgKKyAgICBib2R5LnN0eWxlLnpvb20gPSAxOworICAgIH0KKyAgICB9CisKKyAgICBib2R5
LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKKworICAgIC8vIE51bGwgZWxlbWVudHMgdG8gYXZv
aWQgbGVha3MgaW4gSUUKKyAgICBjb250YWluZXIgPSBkaXYgPSB0ZHMgPSBtYXJnaW5EaXYgPSBu
dWxsOworICAgIH0pOworCisgICAgLy8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJ
RQorICAgIGFsbCA9IHNlbGVjdCA9IGZyYWdtZW50ID0gb3B0ID0gYSA9IGlucHV0ID0gbnVsbDsK
KworICAgIHJldHVybiBzdXBwb3J0OworfSkoKTsKKwordmFyIHJicmFjZSA9IC8oPzpce1tcc1xT
XSpcfXxcW1tcc1xTXSpcXSkkLywKKyAgICBybXVsdGlEYXNoID0gLyhbQS1aXSkvZzsKKworZnVu
Y3Rpb24gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNl
IE9ubHkgKi8gKXsKKyAgICBpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworICAg
IHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgdGhpc0NhY2hlLCByZXQsCisgICAgaW50ZXJuYWxL
ZXkgPSBqUXVlcnkuZXhwYW5kbywKKyAgICBnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gInN0
cmluZyIsCisKKyAgICAvLyBXZSBoYXZlIHRvIGhhbmRsZSBET00gbm9kZXMgYW5kIEpTIG9iamVj
dHMgZGlmZmVyZW50bHkgYmVjYXVzZSBJRTYtNworICAgIC8vIGNhbid0IEdDIG9iamVjdCByZWZl
cmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5CisgICAgaXNOb2RlID0g
ZWxlbS5ub2RlVHlwZSwKKworICAgIC8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBq
UXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCisgICAgLy8gYXR0YWNoZWQgZGlyZWN0bHkg
dG8gdGhlIG9iamVjdCBzbyBHQyBjYW4gb2NjdXIgYXV0b21hdGljYWxseQorICAgIGNhY2hlID0g
aXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKKworICAgIC8vIE9ubHkgZGVmaW5pbmcgYW4g
SUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93cworICAg
IC8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3
aXRoIG5vIGNhY2hlCisgICAgaWQgPSBpc05vZGUgPyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxl
bVsgaW50ZXJuYWxLZXkgXSAmJiBpbnRlcm5hbEtleTsKKworICAgIC8vIEF2b2lkIGRvaW5nIGFu
eSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFu
CisgICAgLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCisgICAgaWYgKCAoIWlkIHx8
ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNhY2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYm
IGRhdGEgPT09IHVuZGVmaW5lZCApIHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCAh
aWQgKSB7CisgICAgLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVh
Y2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCisgICAgLy8gZW5kcyB1cCBpbiB0aGUgZ2xvYmFs
IGNhY2hlCisgICAgaWYgKCBpc05vZGUgKSB7CisgICAgZWxlbVsgaW50ZXJuYWxLZXkgXSA9IGlk
ID0gY29yZV9kZWxldGVkSWRzLnBvcCgpIHx8IGpRdWVyeS5ndWlkKys7CisgICAgfSBlbHNlIHsK
KyAgICBpZCA9IGludGVybmFsS2V5OworICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFjYWNoZVsg
aWQgXSApIHsKKyAgICBjYWNoZVsgaWQgXSA9IHt9OworCisgICAgLy8gQXZvaWRzIGV4cG9zaW5n
IGpRdWVyeSBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdAorICAg
IC8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkKKyAgICBpZiAoICFpc05vZGUg
KSB7CisgICAgY2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7CisgICAgfQorICAgIH0K
KworICAgIC8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQg
b2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRzCisgICAgLy8gc2hhbGxvdyBjb3BpZWQgb3Zl
ciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQorICAgIGlmICggdHlwZW9mIG5hbWUgPT09ICJvYmpl
Y3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iICkgeworICAgIGlmICggcHZ0ICkgewor
ICAgIGNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKKyAg
ICB9IGVsc2UgeworICAgIGNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsg
aWQgXS5kYXRhLCBuYW1lICk7CisgICAgfQorICAgIH0KKworICAgIHRoaXNDYWNoZSA9IGNhY2hl
WyBpZCBdOworCisgICAgLy8galF1ZXJ5IGRhdGEoKSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBv
YmplY3QgaW5zaWRlIHRoZSBvYmplY3QncyBpbnRlcm5hbCBkYXRhCisgICAgLy8gY2FjaGUgaW4g
b3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1
c2VyLWRlZmluZWQKKyAgICAvLyBkYXRhLgorICAgIGlmICggIXB2dCApIHsKKyAgICBpZiAoICF0
aGlzQ2FjaGUuZGF0YSApIHsKKyAgICB0aGlzQ2FjaGUuZGF0YSA9IHt9OworICAgIH0KKworICAg
IHRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOworICAgIH0KKworICAgIGlmICggZGF0YSAhPT0g
dW5kZWZpbmVkICkgeworICAgIHRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0g
PSBkYXRhOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1l
bCBhbmQgbm9uLWNvbnZlcnRlZCBkYXRhIHByb3BlcnR5IG5hbWVzCisgICAgLy8gSWYgYSBkYXRh
IHByb3BlcnR5IHdhcyBzcGVjaWZpZWQKKyAgICBpZiAoIGdldEJ5TmFtZSApIHsKKworICAgIC8v
IEZpcnN0IFRyeSB0byBmaW5kIGFzLWlzIHByb3BlcnR5IGRhdGEKKyAgICByZXQgPSB0aGlzQ2Fj
aGVbIG5hbWUgXTsKKworICAgIC8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRh
dGEKKyAgICBpZiAoIHJldCA9PSBudWxsICkgeworCisgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNh
bWVsQ2FzZWQgcHJvcGVydHkKKyAgICByZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2Uo
IG5hbWUgKSBdOworICAgIH0KKyAgICB9IGVsc2UgeworICAgIHJldCA9IHRoaXNDYWNoZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitmdW5jdGlvbiBpbnRlcm5hbFJlbW92ZURhdGEo
IGVsZW0sIG5hbWUsIHB2dCApIHsKKyAgICBpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSAp
ICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaSwgbCwgdGhpc0NhY2hlLAorICAg
IGlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCisKKyAgICAvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1v
cmUgaW5mb3JtYXRpb24KKyAgICBjYWNoZSA9IGlzTm9kZSA/IGpRdWVyeS5jYWNoZSA6IGVsZW0s
CisgICAgaWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFu
ZG87CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IG5vIGNhY2hlIGVudHJ5IGZvciB0aGlz
IG9iamVjdCwgdGhlcmUgaXMgbm8KKyAgICAvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmcKKyAgICBp
ZiAoICFjYWNoZVsgaWQgXSApIHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBuYW1l
ICkgeworCisgICAgdGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5k
YXRhOworCisgICAgaWYgKCB0aGlzQ2FjaGUgKSB7CisKKyAgICAvLyBTdXBwb3J0IGFycmF5IG9y
IHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgbmFtZXMgZm9yIGRhdGEga2V5cworICAgIGlmICggIWpR
dWVyeS5pc0FycmF5KCBuYW1lICkgKSB7CisKKyAgICAvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtl
eSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbgorICAgIGlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7
CisgICAgbmFtZSA9IFsgbmFtZSBdOworICAgIH0gZWxzZSB7CisKKyAgICAvLyBzcGxpdCB0aGUg
Y2FtZWwgY2FzZWQgdmVyc2lvbiBieSBzcGFjZXMgdW5sZXNzIGEga2V5IHdpdGggdGhlIHNwYWNl
cyBleGlzdHMKKyAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOworICAgIGlmICgg
bmFtZSBpbiB0aGlzQ2FjaGUgKSB7CisgICAgbmFtZSA9IFsgbmFtZSBdOworICAgIH0gZWxzZSB7
CisgICAgbmFtZSA9IG5hbWUuc3BsaXQoIiAiKTsKKyAgICB9CisgICAgfQorICAgIH0gZWxzZSB7
CisgICAgLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5IG9mIGtleXMuLi4KKyAgICAvLyBXaGVuIGRh
dGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIsICJ2YWwiKSBzaWduYXR1cmUsCisg
ICAgLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuCisgICAgLy8gU2luY2Ug
dGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKKyAg
ICAvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2CisgICAgLy8gVGhp
cyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguCisgICAgbmFtZSA9
IG5hbWUuY29uY2F0KCBqUXVlcnkubWFwKCBuYW1lLCBqUXVlcnkuY2FtZWxDYXNlICkgKTsKKyAg
ICB9CisKKyAgICBmb3IgKCBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSsrICkgewor
ICAgIGRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWVbaV0gXTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVy
ZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlCisgICAg
Ly8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCisgICAgaWYg
KCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRo
aXNDYWNoZSApICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8v
IFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICAgIGlmICggIXB2dCApIHsK
KyAgICBkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTsKKworICAgIC8vIERvbid0IGRlc3Ryb3kgdGhl
IHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CisgICAgLy8gaGFk
IGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBpdAorICAgIGlmICggIWlzRW1wdHlEYXRhT2Jq
ZWN0KCBjYWNoZVsgaWQgXSApICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQorCisgICAg
Ly8gRGVzdHJveSB0aGUgY2FjaGUKKyAgICBpZiAoIGlzTm9kZSApIHsKKyAgICBqUXVlcnkuY2xl
YW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApOworCisgICAgLy8gVXNlIGRlbGV0ZSB3aGVuIHN1cHBv
cnRlZCBmb3IgZXhwYW5kb3Mgb3IgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgcGVyIGlzV2luZG93
ICgjMTAwODApCisgICAgfSBlbHNlIGlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8
fCBjYWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7CisgICAgZGVsZXRlIGNhY2hlWyBpZCBdOworCisg
ICAgLy8gV2hlbiBhbGwgZWxzZSBmYWlscywgbnVsbAorICAgIH0gZWxzZSB7CisgICAgY2FjaGVb
IGlkIF0gPSBudWxsOworICAgIH0KK30KKworalF1ZXJ5LmV4dGVuZCh7CisgICAgY2FjaGU6IHt9
LAorCisgICAgLy8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCisg
ICAgLy8gTm9uLWRpZ2l0cyByZW1vdmVkIHRvIG1hdGNoIHJpbmxpbmVqUXVlcnkKKyAgICBleHBh
bmRvOiAialF1ZXJ5IiArICggY29yZV92ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2Uo
IC9cRC9nLCAiIiApLAorCisgICAgLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNh
dGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdQorICAgIC8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8g
cHJvcGVydGllcyB0byB0aGVtLgorICAgIG5vRGF0YTogeworICAgICJlbWJlZCI6IHRydWUsCisg
ICAgLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBh
bmRvcykKKyAgICAib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1
MzU0MDAwMCIsCisgICAgImFwcGxldCI6IHRydWUKKyAgICB9LAorCisgICAgaGFzRGF0YTogZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVb
IGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOworICAgIHJl
dHVybiAhIWVsZW0gJiYgIWlzRW1wdHlEYXRhT2JqZWN0KCBlbGVtICk7CisgICAgfSwKKworICAg
IGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworICAgIHJldHVybiBpbnRlcm5h
bERhdGEoIGVsZW0sIG5hbWUsIGRhdGEgKTsKKyAgICB9LAorCisgICAgcmVtb3ZlRGF0YTogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUgKSB7CisgICAgcmV0dXJuIGludGVybmFsUmVtb3ZlRGF0YSggZWxl
bSwgbmFtZSApOworICAgIH0sCisKKyAgICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgICAg
X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworICAgIHJldHVybiBpbnRlcm5h
bERhdGEoIGVsZW0sIG5hbWUsIGRhdGEsIHRydWUgKTsKKyAgICB9LAorCisgICAgX3JlbW92ZURh
dGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworICAgIHJldHVybiBpbnRlcm5hbFJlbW92ZURh
dGEoIGVsZW0sIG5hbWUsIHRydWUgKTsKKyAgICB9LAorCisgICAgLy8gQSBtZXRob2QgZm9yIGRl
dGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhhbmRsZSB0aGUgZGF0YSBleHBhbmRvCisgICAg
YWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gRG8gbm90IHNldCBkYXRhIG9u
IG5vbi1lbGVtZW50IGJlY2F1c2UgaXQgd2lsbCBub3QgYmUgY2xlYXJlZCAoIzgzMzUpLgorICAg
IGlmICggZWxlbS5ub2RlVHlwZSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICYmIGVsZW0ubm9kZVR5
cGUgIT09IDkgKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciBub0RhdGEg
PSBlbGVtLm5vZGVOYW1lICYmIGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNh
c2UoKSBdOworCisgICAgLy8gbm9kZXMgYWNjZXB0IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVj
aWZpZWQ7IHJlamVjdGlvbiBjYW4gYmUgY29uZGl0aW9uYWwKKyAgICByZXR1cm4gIW5vRGF0YSB8
fCBub0RhdGEgIT09IHRydWUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSA9PT0gbm9E
YXRhOworICAgIH0KK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBkYXRhOiBmdW5jdGlv
bigga2V5LCB2YWx1ZSApIHsKKyAgICB2YXIgYXR0cnMsIG5hbWUsCisgICAgZWxlbSA9IHRoaXNb
MF0sCisgICAgaSA9IDAsCisgICAgZGF0YSA9IG51bGw7CisKKyAgICAvLyBHZXRzIGFsbCB2YWx1
ZXMKKyAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgeworICAgIGlmICggdGhpcy5sZW5ndGgg
KSB7CisgICAgZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtICk7CisKKyAgICBpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiApICkgewor
ICAgIGF0dHJzID0gZWxlbS5hdHRyaWJ1dGVzOworICAgIGZvciAoIDsgaSA8IGF0dHJzLmxlbmd0
aDsgaSsrICkgeworICAgIG5hbWUgPSBhdHRyc1tpXS5uYW1lOworCisgICAgaWYgKCAhbmFtZS5p
bmRleE9mKCAiZGF0YS0iICkgKSB7CisgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUu
c2xpY2UoNSkgKTsKKworICAgIGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsK
KyAgICB9CisgICAgfQorICAgIGpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiwgdHJ1
ZSApOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvLyBT
ZXRzIG11bHRpcGxlIHZhbHVlcworICAgIGlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7
CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICBqUXVlcnkuZGF0YSggdGhp
cywga2V5ICk7CisgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRo
aXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKworICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAp
IHsKKyAgICAvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QK
KyAgICByZXR1cm4gZWxlbSA/IGRhdGFBdHRyKCBlbGVtLCBrZXksIGpRdWVyeS5kYXRhKCBlbGVt
LCBrZXkgKSApIDogbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKKyAgICB9KTsKKyAgICB9LCBudWxs
LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTsKKyAgICB9LAorCisg
ICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1
bmN0aW9uKCkgeworICAgIGpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKKyAgICB9KTsK
KyAgICB9Cit9KTsKKworZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKyAg
ICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55Cisg
ICAgLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCisgICAgaWYgKCBkYXRh
ID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKworICAgIHZhciBuYW1l
ID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQxIiApLnRvTG93ZXJDYXNl
KCk7CisKKyAgICBkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKworICAgIGlmICgg
dHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgeworICAgIHRyeSB7CisgICAgZGF0YSA9IGRhdGEg
PT09ICJ0cnVlIiA/IHRydWUgOgorICAgIGRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CisgICAg
ZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6CisgICAgLy8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVy
IGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmcKKyAgICArZGF0YSArICIiID09PSBkYXRh
ID8gK2RhdGEgOgorICAgIHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBk
YXRhICkgOgorICAgIGRhdGE7CisgICAgfSBjYXRjaCggZSApIHt9CisKKyAgICAvLyBNYWtlIHN1
cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKKyAgICBqUXVlcnku
ZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CisKKyAgICB9IGVsc2UgeworICAgIGRhdGEgPSB1bmRl
ZmluZWQ7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvLyBjaGVja3Mg
YSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzcworZnVuY3Rpb24gaXNFbXB0eURhdGFPYmplY3Qo
IG9iaiApIHsKKyAgICB2YXIgbmFtZTsKKyAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKKworICAg
IC8vIGlmIHRoZSBwdWJsaWMgZGF0YSBvYmplY3QgaXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0
aWxsIGVtcHR5CisgICAgaWYgKCBuYW1lID09PSAiZGF0YSIgJiYgalF1ZXJ5LmlzRW1wdHlPYmpl
Y3QoIG9ialtuYW1lXSApICkgeworICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIG5hbWUg
IT09ICJ0b0pTT04iICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIHRydWU7Cit9CitqUXVlcnkuZXh0ZW5kKHsKKyAgICBxdWV1ZTogZnVuY3Rpb24oIGVs
ZW0sIHR5cGUsIGRhdGEgKSB7CisgICAgdmFyIHF1ZXVlOworCisgICAgaWYgKCBlbGVtICkgewor
ICAgIHR5cGUgPSAoIHR5cGUgfHwgImZ4IiApICsgInF1ZXVlIjsKKyAgICBxdWV1ZSA9IGpRdWVy
eS5fZGF0YSggZWxlbSwgdHlwZSApOworCisgICAgLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0
aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAorICAgIGlmICggZGF0YSAp
IHsKKyAgICBpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKKyAgICBxdWV1
ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOwor
ICAgIH0gZWxzZSB7CisgICAgcXVldWUucHVzaCggZGF0YSApOworICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHF1ZXVlIHx8IFtdOworICAgIH0KKyAgICB9LAorCisgICAgZGVxdWV1ZTogZnVuY3Rp
b24oIGVsZW0sIHR5cGUgKSB7CisgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworICAgIHZhciBx
dWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAorICAgIHN0YXJ0TGVuZ3RoID0gcXVl
dWUubGVuZ3RoLAorICAgIGZuID0gcXVldWUuc2hpZnQoKSwKKyAgICBob29rcyA9IGpRdWVyeS5f
cXVldWVIb29rcyggZWxlbSwgdHlwZSApLAorICAgIG5leHQgPSBmdW5jdGlvbigpIHsKKyAgICBq
UXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOworICAgIH07CisKKyAgICAvLyBJZiB0aGUgZngg
cXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCisg
ICAgaWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgeworICAgIGZuID0gcXVldWUuc2hpZnQoKTsK
KyAgICBzdGFydExlbmd0aC0tOworICAgIH0KKworICAgIGhvb2tzLmN1ciA9IGZuOworICAgIGlm
ICggZm4gKSB7CisKKyAgICAvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRo
ZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCisgICAgLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAorICAg
IGlmICggdHlwZSA9PT0gImZ4IiApIHsKKyAgICBxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIg
KTsKKyAgICB9CisKKyAgICAvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9u
CisgICAgZGVsZXRlIGhvb2tzLnN0b3A7CisgICAgZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3Mg
KTsKKyAgICB9CisKKyAgICBpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKKyAgICBob29r
cy5lbXB0eS5maXJlKCk7CisgICAgfQorICAgIH0sCisKKyAgICAvLyBub3QgaW50ZW5kZWQgZm9y
IHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciBy
ZXR1cm5zIHRoZSBjdXJyZW50IG9uZQorICAgIF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwg
dHlwZSApIHsKKyAgICB2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKKyAgICByZXR1cm4g
alF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXkgKSB8fCBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSwgewor
ICAgIGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigp
IHsKKyAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiICk7CisgICAg
alF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBrZXkgKTsKKyAgICB9KQorICAgIH0pOworICAgIH0K
K30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRh
dGEgKSB7CisgICAgdmFyIHNldHRlciA9IDI7CisKKyAgICBpZiAoIHR5cGVvZiB0eXBlICE9PSAi
c3RyaW5nIiApIHsKKyAgICBkYXRhID0gdHlwZTsKKyAgICB0eXBlID0gImZ4IjsKKyAgICBzZXR0
ZXItLTsKKyAgICB9CisKKyAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7Cisg
ICAgcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOworICAgIH0KKworICAgIHJl
dHVybiBkYXRhID09PSB1bmRlZmluZWQgPworICAgIHRoaXMgOgorICAgIHRoaXMuZWFjaChmdW5j
dGlvbigpIHsKKyAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEg
KTsKKworICAgIC8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCisgICAgalF1ZXJ5Ll9x
dWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CisKKyAgICBpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVl
dWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKKyAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlw
ZSApOworICAgIH0KKyAgICB9KTsKKyAgICB9LAorICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBl
ICkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmRlcXVl
dWUoIHRoaXMsIHR5cGUgKTsKKyAgICB9KTsKKyAgICB9LAorICAgIC8vIEJhc2VkIG9mZiBvZiB0
aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4KKyAgICAvLyBodHRw
Oi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCisgICAg
ZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgeworICAgIHRpbWUgPSBqUXVlcnkuZnggPyBq
UXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7CisgICAgdHlwZSA9IHR5cGUg
fHwgImZ4IjsKKworICAgIHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwg
aG9va3MgKSB7CisgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7Cisg
ICAgaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgIGNsZWFyVGltZW91dCggdGltZW91dCAp
OworICAgIH07CisgICAgfSk7CisgICAgfSwKKyAgICBjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlw
ZSApIHsKKyAgICByZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworICAgIH0s
CisgICAgLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4g
dHlwZQorICAgIC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQorICAg
IHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CisgICAgdmFyIHRtcCwKKyAgICBjb3Vu
dCA9IDEsCisgICAgZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICBlbGVtZW50cyA9IHRo
aXMsCisgICAgaSA9IHRoaXMubGVuZ3RoLAorICAgIHJlc29sdmUgPSBmdW5jdGlvbigpIHsKKyAg
ICBpZiAoICEoIC0tY291bnQgKSApIHsKKyAgICBkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMs
IFsgZWxlbWVudHMgXSApOworICAgIH0KKyAgICB9OworCisgICAgaWYgKCB0eXBlb2YgdHlwZSAh
PT0gInN0cmluZyIgKSB7CisgICAgb2JqID0gdHlwZTsKKyAgICB0eXBlID0gdW5kZWZpbmVkOwor
ICAgIH0KKyAgICB0eXBlID0gdHlwZSB8fCAiZngiOworCisgICAgd2hpbGUoIGktLSApIHsKKyAg
ICB0bXAgPSBqUXVlcnkuX2RhdGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIg
KTsKKyAgICBpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CisgICAgY291bnQrKzsKKyAgICB0bXAu
ZW1wdHkuYWRkKCByZXNvbHZlICk7CisgICAgfQorICAgIH0KKyAgICByZXNvbHZlKCk7CisgICAg
cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOworICAgIH0KK30pOwordmFyIG5vZGVIb29rLCBi
b29sSG9vaywKKyAgICByY2xhc3MgPSAvW1x0XHJcbl0vZywKKyAgICBycmV0dXJuID0gL1xyL2cs
CisgICAgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmpl
Y3QpJC9pLAorICAgIHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2ksCisgICAgcmJvb2xlYW4g
PSAvXig/OmNoZWNrZWR8c2VsZWN0ZWR8YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNvbnRyb2xz
fGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWly
ZWR8c2NvcGVkKSQvaSwKKyAgICBydXNlRGVmYXVsdCA9IC9eKD86Y2hlY2tlZHxzZWxlY3RlZCkk
L2ksCisgICAgZ2V0U2V0QXR0cmlidXRlID0galF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRl
LAorICAgIGdldFNldElucHV0ID0galF1ZXJ5LnN1cHBvcnQuaW5wdXQ7CisKK2pRdWVyeS5mbi5l
eHRlbmQoeworICAgIGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKyAgICByZXR1cm4g
alF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMu
bGVuZ3RoID4gMSApOworICAgIH0sCisKKyAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSAp
IHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeS5yZW1vdmVB
dHRyKCB0aGlzLCBuYW1lICk7CisgICAgfSk7CisgICAgfSwKKworICAgIHByb3A6IGZ1bmN0aW9u
KCBuYW1lLCB2YWx1ZSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5
LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworICAgIH0sCisKKyAg
ICByZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICBuYW1lID0galF1ZXJ5LnByb3BG
aXhbIG5hbWUgXSB8fCBuYW1lOworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVt
b3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCisgICAgdHJ5IHsKKyAgICB0aGlzWyBuYW1lIF0g
PSB1bmRlZmluZWQ7CisgICAgZGVsZXRlIHRoaXNbIG5hbWUgXTsKKyAgICB9IGNhdGNoKCBlICkg
e30KKyAgICB9KTsKKyAgICB9LAorCisgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsK
KyAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwKKyAgICBpID0gMCwKKyAgICBs
ZW4gPSB0aGlzLmxlbmd0aCwKKyAgICBwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5n
IiAmJiB2YWx1ZTsKKworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7Cisg
ICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5h
ZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApOworICAgIH0p
OworICAgIH0KKworICAgIGlmICggcHJvY2VlZCApIHsKKyAgICAvLyBUaGUgZGlzanVuY3Rpb24g
aGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIHJlbW92ZUNsYXNzKQorICAg
IGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107
CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBlbGVtID0gdGhpc1sgaSBdOwor
ICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/CisgICAg
KCAiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIiApLnJlcGxhY2UoIHJjbGFzcywgIiAiICkgOgor
ICAgICIgIgorICAgICk7CisKKyAgICBpZiAoIGN1ciApIHsKKyAgICBqID0gMDsKKyAgICB3aGls
ZSAoIChjbGF6eiA9IGNsYXNzZXNbaisrXSkgKSB7CisgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAi
ICsgY2xhenogKyAiICIgKSA8IDAgKSB7CisgICAgY3VyICs9IGNsYXp6ICsgIiAiOworICAgIH0K
KyAgICB9CisgICAgZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY3VyICk7CisKKyAgICB9
CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICByZW1vdmVD
bGFzczogZnVuY3Rpb24oIHZhbHVlICkgeworICAgIHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNs
YXp6LCBqLAorICAgIGkgPSAwLAorICAgIGxlbiA9IHRoaXMubGVuZ3RoLAorICAgIHByb2NlZWQg
PSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYg
dmFsdWU7CisKKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworICAgIHJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CisgICAgalF1ZXJ5KCB0aGlzICkucmVtb3Zl
Q2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKKyAgICB9KTsK
KyAgICB9CisgICAgaWYgKCBwcm9jZWVkICkgeworICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIi
ICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKyAgICBmb3IgKCA7IGkgPCBsZW47
IGkrKyApIHsKKyAgICBlbGVtID0gdGhpc1sgaSBdOworICAgIC8vIFRoaXMgZXhwcmVzc2lvbiBp
cyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCisgICAgY3Vy
ID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID8KKyAgICAoICIgIiAr
IGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CisgICAgIiIK
KyAgICApOworCisgICAgaWYgKCBjdXIgKSB7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoY2xh
enogPSBjbGFzc2VzW2orK10pICkgeworICAgIC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKKyAg
ICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBjbGF6eiArICIgIiApID49IDAgKSB7CisgICAg
Y3VyID0gY3VyLnJlcGxhY2UoICIgIiArIGNsYXp6ICsgIiAiLCAiICIgKTsKKyAgICB9CisgICAg
fQorICAgIGVsZW0uY2xhc3NOYW1lID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiAiIjsK
KyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICB0
b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKyAgICB2YXIgdHlwZSA9
IHR5cGVvZiB2YWx1ZSwKKyAgICBpc0Jvb2wgPSB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFu
IjsKKworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFz
cyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZh
bCApOworICAgIH0pOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7
CisgICAgaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKKyAgICAvLyB0b2dnbGUgaW5kaXZpZHVh
bCBjbGFzcyBuYW1lcworICAgIHZhciBjbGFzc05hbWUsCisgICAgaSA9IDAsCisgICAgc2VsZiA9
IGpRdWVyeSggdGhpcyApLAorICAgIHN0YXRlID0gc3RhdGVWYWwsCisgICAgY2xhc3NOYW1lcyA9
IHZhbHVlLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFtdOworCisgICAgd2hpbGUgKCAoY2xh
c3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgeworICAgIC8vIGNoZWNrIGVhY2ggY2xhc3NO
YW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAorICAgIHN0YXRlID0gaXNCb29sID8gc3Rh
dGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7CisgICAgc2VsZlsgc3RhdGUgPyAiYWRk
Q2xhc3MiIDogInJlbW92ZUNsYXNzIiBdKCBjbGFzc05hbWUgKTsKKyAgICB9CisKKyAgICAvLyBU
b2dnbGUgd2hvbGUgY2xhc3MgbmFtZQorICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09IGNvcmVfc3Ry
dW5kZWZpbmVkIHx8IHR5cGUgPT09ICJib29sZWFuIiApIHsKKyAgICBpZiAoIHRoaXMuY2xhc3NO
YW1lICkgeworICAgIC8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKyAgICBqUXVlcnkuX2RhdGEo
IHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKKyAgICB9CisKKyAgICAv
LyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCAiZmFs
c2UiLAorICAgIC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdh
cyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCisgICAgLy8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sg
d2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSwKKyAgICAvLyBmYWxs
aW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuCisgICAg
dGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6
IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CisgICAgfQorICAg
IH0pOworICAgIH0sCisKKyAgICBoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAg
IHZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwKKyAgICBpID0gMCwKKyAgICBs
ID0gdGhpcy5sZW5ndGg7CisgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIGlmICggdGhp
c1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJl
cGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID49IDAgKSB7CisgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisg
ICAgdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgdmFyIHJldCwgaG9va3MsIGlzRnVuY3Rp
b24sCisgICAgZWxlbSA9IHRoaXNbMF07CisKKyAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkg
eworICAgIGlmICggZWxlbSApIHsKKyAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50
eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsK
KworICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCgg
ZWxlbSwgInZhbHVlIiApKSAhPT0gdW5kZWZpbmVkICkgeworICAgIHJldHVybiByZXQ7CisgICAg
fQorCisgICAgcmV0ID0gZWxlbS52YWx1ZTsKKworICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAi
c3RyaW5nIiA/CisgICAgLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcworICAgIHJl
dC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6CisgICAgLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVl
IGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCisgICAgcmV0ID09IG51bGwgPyAiIiA6IHJldDsKKyAg
ICB9CisKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1
bmN0aW9uKCB2YWx1ZSApOworCisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsK
KyAgICB2YXIgdmFsLAorICAgIHNlbGYgPSBqUXVlcnkodGhpcyk7CisKKyAgICBpZiAoIHRoaXMu
bm9kZVR5cGUgIT09IDEgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggaXNGdW5j
dGlvbiApIHsKKyAgICB2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBzZWxmLnZhbCgpICk7Cisg
ICAgfSBlbHNlIHsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBUcmVhdCBudWxs
L3VuZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZworICAgIGlmICggdmFs
ID09IG51bGwgKSB7CisgICAgdmFsID0gIiI7CisgICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9
PT0gIm51bWJlciIgKSB7CisgICAgdmFsICs9ICIiOworICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5p
c0FycmF5KCB2YWwgKSApIHsKKyAgICB2YWwgPSBqUXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKKyAg
ICB9KTsKKyAgICB9CisKKyAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0g
fHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKKworICAg
IC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5n
CisgICAgaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlz
LCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgeworICAgIHRoaXMudmFsdWUgPSB2YWw7
CisgICAgfQorICAgIH0pOworICAgIH0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICB2YWxI
b29rczogeworICAgIG9wdGlvbjogeworICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
Ly8gYXR0cmlidXRlcy52YWx1ZSBpcyB1bmRlZmluZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0Cisg
ICAgLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgorICAgIHZhciB2YWwgPSBlbGVtLmF0dHJpYnV0
ZXMudmFsdWU7CisgICAgcmV0dXJuICF2YWwgfHwgdmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUg
OiBlbGVtLnRleHQ7CisgICAgfQorICAgIH0sCisgICAgc2VsZWN0OiB7CisgICAgZ2V0OiBmdW5j
dGlvbiggZWxlbSApIHsKKyAgICB2YXIgdmFsdWUsIG9wdGlvbiwKKyAgICBvcHRpb25zID0gZWxl
bS5vcHRpb25zLAorICAgIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorICAgIG9uZSA9IGVs
ZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiIHx8IGluZGV4IDwgMCwKKyAgICB2YWx1ZXMgPSBvbmUg
PyBudWxsIDogW10sCisgICAgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgs
CisgICAgaSA9IGluZGV4IDwgMCA/CisgICAgbWF4IDoKKyAgICBvbmUgPyBpbmRleCA6IDA7CisK
KyAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCisgICAgZm9yICgg
OyBpIDwgbWF4OyBpKysgKSB7CisgICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisgICAgLy8g
b2xkSUUgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCisg
ICAgaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCisgICAgLy8gRG9u
J3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRn
cm91cAorICAgICggalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVk
IDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCApICYmCisgICAgKCAh
b3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBh
cmVudE5vZGUsICJvcHRncm91cCIgKSApICkgeworCisgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyB2
YWx1ZSBmb3IgdGhlIG9wdGlvbgorICAgIHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTsK
KworICAgIC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisgICAgaWYg
KCBvbmUgKSB7CisgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIE11bHRpLVNlbGVj
dHMgcmV0dXJuIGFuIGFycmF5CisgICAgdmFsdWVzLnB1c2goIHZhbHVlICk7CisgICAgfQorICAg
IH0KKworICAgIHJldHVybiB2YWx1ZXM7CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oIGVs
ZW0sIHZhbHVlICkgeworICAgIHZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSAp
OworCisgICAgalF1ZXJ5KGVsZW0pLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgdGhpcy5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkodGhpcykudmFsKCksIHZh
bHVlcyApID49IDA7CisgICAgfSk7CisKKyAgICBpZiAoICF2YWx1ZXMubGVuZ3RoICkgeworICAg
IGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVzOworICAg
IH0KKyAgICB9CisgICAgfSwKKworICAgIGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1
ZSApIHsKKyAgICB2YXIgaG9va3MsIG5vdHhtbCwgcmV0LAorICAgIG5UeXBlID0gZWxlbS5ub2Rl
VHlwZTsKKworICAgIC8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50
IGFuZCBhdHRyaWJ1dGUgbm9kZXMKKyAgICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5U
eXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAorICAg
IGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBjb3JlX3N0cnVuZGVmaW5lZCApIHsK
KyAgICByZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CisgICAgfQorCisg
ICAgbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOworCisg
ICAgLy8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZQorICAgIC8vIEdyYWIgbmVjZXNzYXJ5
IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKKyAgICBpZiAoIG5vdHhtbCApIHsKKyAgICBuYW1lID0g
bmFtZS50b0xvd2VyQ2FzZSgpOworICAgIGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBd
IHx8ICggcmJvb2xlYW4udGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOworICAg
IH0KKworICAgIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKworICAgIGlmICggdmFsdWUg
PT09IG51bGwgKSB7CisgICAgalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKKworICAg
IH0gZWxzZSBpZiAoIGhvb2tzICYmIG5vdHhtbCAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0g
aG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgeworICAgIHJl
dHVybiByZXQ7CisKKyAgICB9IGVsc2UgeworICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2
YWx1ZSArICIiICk7CisgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIH0gZWxzZSBpZiAo
IGhvb2tzICYmIG5vdHhtbCAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBl
bGVtLCBuYW1lICkpICE9PSBudWxsICkgeworICAgIHJldHVybiByZXQ7CisKKyAgICB9IGVsc2Ug
eworCisgICAgLy8gSW4gSUU5KywgRmxhc2ggb2JqZWN0cyBkb24ndCBoYXZlIC5nZXRBdHRyaWJ1
dGUgKCMxMjk0NSkKKyAgICAvLyBTdXBwb3J0OiBJRTkrCisgICAgaWYgKCB0eXBlb2YgZWxlbS5n
ZXRBdHRyaWJ1dGUgIT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIHJldCA9ICBlbGVtLmdl
dEF0dHJpYnV0ZSggbmFtZSApOworICAgIH0KKworICAgIC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1
dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisgICAgcmV0dXJuIHJl
dCA9PSBudWxsID8KKyAgICB1bmRlZmluZWQgOgorICAgIHJldDsKKyAgICB9CisgICAgfSwKKwor
ICAgIHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICB2YXIgbmFtZSwg
cHJvcE5hbWUsCisgICAgaSA9IDAsCisgICAgYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0
Y2goIGNvcmVfcm5vdHdoaXRlICk7CisKKyAgICBpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVU
eXBlID09PSAxICkgeworICAgIHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7Cisg
ICAgcHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKyAgICAvLyBC
b29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisgICAgaWYg
KCByYm9vbGVhbi50ZXN0KCBuYW1lICkgKSB7CisgICAgLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJv
cGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcworICAgIC8vIEFsc28gY2xlYXIg
ZGVmYXVsdENoZWNrZWQvZGVmYXVsdFNlbGVjdGVkIChpZiBhcHByb3ByaWF0ZSkgZm9yIElFPDgK
KyAgICBpZiAoICFnZXRTZXRBdHRyaWJ1dGUgJiYgcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkg
eworICAgIGVsZW1bIGpRdWVyeS5jYW1lbENhc2UoICJkZWZhdWx0LSIgKyBuYW1lICkgXSA9Cisg
ICAgZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgZWxlbVsgcHJv
cE5hbWUgXSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRp
b24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKQorICAgIH0g
ZWxzZSB7CisgICAgalF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsICIiICk7CisgICAgfQorCisgICAg
ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSAp
OworICAgIH0KKyAgICB9CisgICAgfSwKKworICAgIGF0dHJIb29rczogeworICAgIHR5cGU6IHsK
KyAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICBpZiAoICFqUXVlcnkuc3Vw
cG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSAicmFkaW8iICYmIGpRdWVyeS5ub2RlTmFtZShl
bGVtLCAiaW5wdXQiKSApIHsKKyAgICAvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0
dG9uIGFmdGVyIHRoZSB2YWx1ZSByZXNldHMgdGhlIHZhbHVlIGluIElFNi05CisgICAgLy8gUmVz
ZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmlu
ZyBjcmVhdGlvbgorICAgIHZhciB2YWwgPSBlbGVtLnZhbHVlOworICAgIGVsZW0uc2V0QXR0cmli
dXRlKCAidHlwZSIsIHZhbHVlICk7CisgICAgaWYgKCB2YWwgKSB7CisgICAgZWxlbS52YWx1ZSA9
IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICB9CisgICAgfQorICAg
IH0sCisKKyAgICBwcm9wRml4OiB7CisgICAgdGFiaW5kZXg6ICJ0YWJJbmRleCIsCisgICAgcmVh
ZG9ubHk6ICJyZWFkT25seSIsCisgICAgImZvciI6ICJodG1sRm9yIiwKKyAgICAiY2xhc3MiOiAi
Y2xhc3NOYW1lIiwKKyAgICBtYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorICAgIGNlbGxzcGFjaW5n
OiAiY2VsbFNwYWNpbmciLAorICAgIGNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAorICAgIHJv
d3NwYW46ICJyb3dTcGFuIiwKKyAgICBjb2xzcGFuOiAiY29sU3BhbiIsCisgICAgdXNlbWFwOiAi
dXNlTWFwIiwKKyAgICBmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKKyAgICBjb250ZW50ZWRp
dGFibGU6ICJjb250ZW50RWRpdGFibGUiCisgICAgfSwKKworICAgIHByb3A6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lLCB2YWx1ZSApIHsKKyAgICB2YXIgcmV0LCBob29rcywgbm90eG1sLAorICAgIG5U
eXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAgIC8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBv
biB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKKyAgICBpZiAoICFlbGVtIHx8IG5U
eXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBl
bGVtICk7CisKKyAgICBpZiAoIG5vdHhtbCApIHsKKyAgICAvLyBGaXggbmFtZSBhbmQgYXR0YWNo
IGhvb2tzCisgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKyAgICBo
b29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVl
ICE9PSB1bmRlZmluZWQgKSB7CisgICAgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAo
cmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewor
ICAgIHJldHVybiByZXQ7CisKKyAgICB9IGVsc2UgeworICAgIHJldHVybiAoIGVsZW1bIG5hbWUg
XSA9IHZhbHVlICk7CisgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICBpZiAoIGhvb2tzICYmICJn
ZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwg
KSB7CisgICAgcmV0dXJuIHJldDsKKworICAgIH0gZWxzZSB7CisgICAgcmV0dXJuIGVsZW1bIG5h
bWUgXTsKKyAgICB9CisgICAgfQorICAgIH0sCisKKyAgICBwcm9wSG9va3M6IHsKKyAgICB0YWJJ
bmRleDogeworICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gZWxlbS50YWJJbmRl
eCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3Qg
YmVlbiBleHBsaWNpdGx5IHNldAorICAgIC8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cv
MjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13
aXRoLWphdmFzY3JpcHQvCisgICAgdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0
ZU5vZGUoInRhYmluZGV4Iik7CisKKyAgICByZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1
dGVOb2RlLnNwZWNpZmllZCA/CisgICAgcGFyc2VJbnQoIGF0dHJpYnV0ZU5vZGUudmFsdWUsIDEw
ICkgOgorICAgIHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUu
dGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/CisgICAgMCA6CisgICAgdW5kZWZp
bmVkOworICAgIH0KKyAgICB9CisgICAgfQorfSk7CisKKy8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0
cmlidXRlcworYm9vbEhvb2sgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsK
KyAgICB2YXIKKyAgICAvLyBVc2UgLnByb3AgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgYXR0cmlidXRl
IGlzIHVuZGVyc3Rvb2QgYXMgYm9vbGVhbgorICAgIHByb3AgPSBqUXVlcnkucHJvcCggZWxlbSwg
bmFtZSApLAorCisgICAgLy8gRmV0Y2ggaXQgYWNjb3JkaW5nbHkKKyAgICBhdHRyID0gdHlwZW9m
IHByb3AgPT09ICJib29sZWFuIiAmJiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorICAgIGRl
dGFpbCA9IHR5cGVvZiBwcm9wID09PSAiYm9vbGVhbiIgPworCisgICAgZ2V0U2V0SW5wdXQgJiYg
Z2V0U2V0QXR0cmlidXRlID8KKyAgICBhdHRyICE9IG51bGwgOgorICAgIC8vIG9sZElFIGZhYnJp
Y2F0ZXMgYW4gZW1wdHkgc3RyaW5nIGZvciBtaXNzaW5nIGJvb2xlYW4gYXR0cmlidXRlcworICAg
IC8vIGFuZCBjb25mbGF0ZXMgY2hlY2tlZC9zZWxlY3RlZCBpbnRvIGF0dHJvcGVydGllcworICAg
IHJ1c2VEZWZhdWx0LnRlc3QoIG5hbWUgKSA/CisgICAgZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSgg
ImRlZmF1bHQtIiArIG5hbWUgKSBdIDoKKyAgICAhIWF0dHIgOgorCisgICAgLy8gZmV0Y2ggYW4g
YXR0cmlidXRlIG5vZGUgZm9yIHByb3BlcnRpZXMgbm90IHJlY29nbml6ZWQgYXMgYm9vbGVhbgor
ICAgIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOworCisgICAgcmV0dXJuIGRldGFpbCAm
JiBkZXRhaWwudmFsdWUgIT09IGZhbHNlID8KKyAgICBuYW1lLnRvTG93ZXJDYXNlKCkgOgorICAg
IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1l
ICkgeworICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworICAgIC8vIFJlbW92ZSBib29sZWFu
IGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2UKKyAgICBqUXVlcnkucmVtb3ZlQXR0ciggZWxl
bSwgbmFtZSApOworICAgIH0gZWxzZSBpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0
ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgeworICAgIC8vIElFPDggbmVlZHMgdGhl
ICpwcm9wZXJ0eSogbmFtZQorICAgIGVsZW0uc2V0QXR0cmlidXRlKCAhZ2V0U2V0QXR0cmlidXRl
ICYmIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSwgbmFtZSApOworCisgICAgLy8gVXNl
IGRlZmF1bHRDaGVja2VkIGFuZCBkZWZhdWx0U2VsZWN0ZWQgZm9yIG9sZElFCisgICAgfSBlbHNl
IHsKKyAgICBlbGVtWyBqUXVlcnkuY2FtZWxDYXNlKCAiZGVmYXVsdC0iICsgbmFtZSApIF0gPSBl
bGVtWyBuYW1lIF0gPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBuYW1lOworICAgIH0KK307
CisKKy8vIGZpeCBvbGRJRSB2YWx1ZSBhdHRyb3BlcnR5CitpZiAoICFnZXRTZXRJbnB1dCB8fCAh
Z2V0U2V0QXR0cmlidXRlICkgeworICAgIGpRdWVyeS5hdHRySG9va3MudmFsdWUgPSB7CisgICAg
Z2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIgcmV0ID0gZWxlbS5nZXRBdHRy
aWJ1dGVOb2RlKCBuYW1lICk7CisgICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlu
cHV0IiApID8KKworICAgIC8vIElnbm9yZSB0aGUgdmFsdWUgKnByb3BlcnR5KiBieSB1c2luZyBk
ZWZhdWx0VmFsdWUKKyAgICBlbGVtLmRlZmF1bHRWYWx1ZSA6CisKKyAgICByZXQgJiYgcmV0LnNw
ZWNpZmllZCA/IHJldC52YWx1ZSA6IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rp
b24oIGVsZW0sIHZhbHVlLCBuYW1lICkgeworICAgIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVt
LCAiaW5wdXQiICkgKSB7CisgICAgLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmli
dXRlIGlzIGFsc28gdXNlZAorICAgIGVsZW0uZGVmYXVsdFZhbHVlID0gdmFsdWU7CisgICAgfSBl
bHNlIHsKKyAgICAvLyBVc2Ugbm9kZUhvb2sgaWYgZGVmaW5lZCAoIzE5NTQpOyBvdGhlcndpc2Ug
c2V0QXR0cmlidXRlIGlzIGZpbmUKKyAgICByZXR1cm4gbm9kZUhvb2sgJiYgbm9kZUhvb2suc2V0
KCBlbGVtLCB2YWx1ZSwgbmFtZSApOworICAgIH0KKyAgICB9CisgICAgfTsKK30KKworLy8gSUU2
LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdl
dC9zZXRBdHRyaWJ1dGUKK2lmICggIWdldFNldEF0dHJpYnV0ZSApIHsKKworICAgIC8vIFVzZSB0
aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83CisgICAgLy8gVGhpcyBmaXhlcyBhbG1vc3Qg
ZXZlcnkgSUU2LzcgaXNzdWUKKyAgICBub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24g
PSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIgcmV0ID0gZWxl
bS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7CisgICAgcmV0dXJuIHJldCAmJiAoIG5hbWUgPT09
ICJpZCIgfHwgbmFtZSA9PT0gIm5hbWUiIHx8IG5hbWUgPT09ICJjb29yZHMiID8gcmV0LnZhbHVl
ICE9PSAiIiA6IHJldC5zcGVjaWZpZWQgKSA/CisgICAgcmV0LnZhbHVlIDoKKyAgICB1bmRlZmlu
ZWQ7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKKyAg
ICAvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQorICAg
IHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKKyAgICBpZiAoICFyZXQg
KSB7CisgICAgZWxlbS5zZXRBdHRyaWJ1dGVOb2RlKAorICAgIChyZXQgPSBlbGVtLm93bmVyRG9j
dW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICkpCisgICAgKTsKKyAgICB9CisKKyAgICByZXQu
dmFsdWUgPSB2YWx1ZSArPSAiIjsKKworICAgIC8vIEJyZWFrIGFzc29jaWF0aW9uIHdpdGggY2xv
bmVkIGVsZW1lbnRzIGJ5IGFsc28gdXNpbmcgc2V0QXR0cmlidXRlICgjOTY0NikKKyAgICByZXR1
cm4gbmFtZSA9PT0gInZhbHVlIiB8fCB2YWx1ZSA9PT0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUg
KSA/CisgICAgdmFsdWUgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9CisgICAgfTsKKworICAgIC8v
IFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQorICAgIC8v
IFNldHRpbmcgdG8gZW1wdHkgc3RyaW5nIHRocm93cyBhbiBlcnJvciBhcyBhbiBpbnZhbGlkIHZh
bHVlCisgICAgalF1ZXJ5LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGUgPSB7CisgICAgZ2V0OiBu
b2RlSG9vay5nZXQsCisgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7Cisg
ICAgbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSA9PT0gIiIgPyBmYWxzZSA6IHZhbHVlLCBuYW1l
ICk7CisgICAgfQorICAgIH07CisKKyAgICAvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRv
IGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCisgICAgLy8gVGhpcyBp
cyBmb3IgcmVtb3ZhbHMKKyAgICBqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1
bmN0aW9uKCBpLCBuYW1lICkgeworICAgIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVy
eS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgeworICAgIHNldDogZnVuY3Rpb24o
IGVsZW0sIHZhbHVlICkgeworICAgIGlmICggdmFsdWUgPT09ICIiICkgeworICAgIGVsZW0uc2V0
QXR0cmlidXRlKCBuYW1lLCAiYXV0byIgKTsKKyAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAg
IH0KKyAgICB9KTsKKyAgICB9KTsKK30KKworCisvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBh
IHNwZWNpYWwgY2FsbCBvbiBJRQorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9s
aWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHJl
Zk5vcm1hbGl6ZWQgKSB7CisgICAgalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgi
LCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICBqUXVlcnkuYXR0ckhvb2tz
WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKKyAg
ICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0
ZSggbmFtZSwgMiApOworICAgIHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsK
KyAgICB9CisgICAgfSk7CisgICAgfSk7CisKKyAgICAvLyBocmVmL3NyYyBwcm9wZXJ0eSBzaG91
bGQgZ2V0IHRoZSBmdWxsIG5vcm1hbGl6ZWQgVVJMICgjMTAyOTkvIzEyOTE1KQorICAgIGpRdWVy
eS5lYWNoKFsgImhyZWYiLCAic3JjIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICBqUXVl
cnkucHJvcEhvb2tzWyBuYW1lIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDQgKTsKKyAgICB9CisgICAgfTsKKyAg
ICB9KTsKK30KKworaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7CisgICAgalF1ZXJ5LmF0
dHJIb29rcy5zdHlsZSA9IHsKKyAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIC8vIFJl
dHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nCisgICAgLy8gTm90ZTog
SUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFtZXMsIGJ1dCBpZiB3ZSB3ZXJlIHRvIC50b0xv
d2VyQ2FzZSgpCisgICAgLy8gLmNzc1RleHQsIHRoYXQgd291bGQgZGVzdHJveSBjYXNlIHNlbnN0
aXRpdml0eSBpbiBVUkwncywgbGlrZSBpbiAiYmFja2dyb3VuZCIKKyAgICByZXR1cm4gZWxlbS5z
dHlsZS5jc3NUZXh0IHx8IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIGVs
ZW0sIHZhbHVlICkgeworICAgIHJldHVybiAoIGVsZW0uc3R5bGUuY3NzVGV4dCA9IHZhbHVlICsg
IiIgKTsKKyAgICB9CisgICAgfTsKK30KKworLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZh
dWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGFuIG9wdGlvbgorLy8gQWNjZXNzaW5nIHRoZSBwYXJl
bnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CitpZiAoICFqUXVlcnkuc3VwcG9y
dC5vcHRTZWxlY3RlZCApIHsKKyAgICBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0galF1ZXJ5
LmV4dGVuZCggalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCwgeworICAgIGdldDogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKworICAgIGlmICgg
cGFyZW50ICkgeworICAgIHBhcmVudC5zZWxlY3RlZEluZGV4OworCisgICAgLy8gTWFrZSBzdXJl
IHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCisgICAgaWYgKCBw
YXJlbnQucGFyZW50Tm9kZSApIHsKKyAgICBwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4
OworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIH0pOworfQorCisv
LyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmcKK2lmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5
cGUgKSB7CisgICAgalF1ZXJ5LnByb3BGaXguZW5jdHlwZSA9ICJlbmNvZGluZyI7Cit9CisKKy8v
IFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCitpZiAoICFqUXVlcnkuc3VwcG9y
dC5jaGVja09uICkgeworICAgIGpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBm
dW5jdGlvbigpIHsKKyAgICBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKKyAgICBnZXQ6IGZ1
bmN0aW9uKCBlbGVtICkgeworICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQg
IiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVk
CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6
IGVsZW0udmFsdWU7CisgICAgfQorICAgIH07CisgICAgfSk7Cit9CitqUXVlcnkuZWFjaChbICJy
YWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LnZhbEhvb2tzWyB0
aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgeworICAgIHNl
dDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZh
bHVlICkgKSB7CisgICAgcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpR
dWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAwICk7CisgICAgfQorICAgIH0KKyAgICB9KTsK
K30pOwordmFyIHJmb3JtRWxlbXMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCisg
ICAgcmtleUV2ZW50ID0gL15rZXkvLAorICAgIHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250
ZXh0bWVudSl8Y2xpY2svLAorICAgIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9j
dXNvdXRibHVyKSQvLAorICAgIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkk
LzsKKworZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZnVu
Y3Rpb24gcmV0dXJuRmFsc2UoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogSGVs
cGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJs
aWMgaW50ZXJmYWNlLgorICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5
IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisgICAgZ2xv
YmFsOiB7fSwKKworICAgIGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRh
LCBzZWxlY3RvciApIHsKKyAgICB2YXIgdG1wLCBldmVudHMsIHQsIGhhbmRsZU9iakluLAorICAg
IHNwZWNpYWwsIGV2ZW50SGFuZGxlLCBoYW5kbGVPYmosCisgICAgaGFuZGxlcnMsIHR5cGUsIG5h
bWVzcGFjZXMsIG9yaWdUeXBlLAorICAgIGVsZW1EYXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICk7
CisKKyAgICAvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQg
bm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKQorICAgIGlmICggIWVsZW1EYXRhICkgewor
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0
IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXIKKyAgICBpZiAoIGhhbmRsZXIu
aGFuZGxlciApIHsKKyAgICBoYW5kbGVPYmpJbiA9IGhhbmRsZXI7CisgICAgaGFuZGxlciA9IGhh
bmRsZU9iakluLmhhbmRsZXI7CisgICAgc2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsK
KyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUg
SUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKKyAgICBpZiAoICFoYW5kbGVyLmd1aWQg
KSB7CisgICAgaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKKyAgICB9CisKKyAgICAvLyBJ
bml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRo
aXMgaXMgdGhlIGZpcnN0CisgICAgaWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7
CisgICAgZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307CisgICAgfQorICAgIGlmICggIShl
dmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSkgKSB7CisgICAgZXZlbnRIYW5kbGUgPSBlbGVt
RGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHsKKyAgICAvLyBEaXNjYXJkIHRoZSBzZWNvbmQg
ZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAorICAgIC8vIHdoZW4gYW4gZXZl
bnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKKyAgICByZXR1cm4gdHlwZW9m
IGpRdWVyeSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmln
Z2VyZWQgIT09IGUudHlwZSkgPworICAgIGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZXZl
bnRIYW5kbGUuZWxlbSwgYXJndW1lbnRzICkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9OworICAg
IC8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEg
bWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50cworICAgIGV2ZW50SGFuZGxlLmVs
ZW0gPSBlbGVtOworICAgIH0KKworICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJh
dGVkIGJ5IGEgc3BhY2UKKyAgICAvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2Vv
dXQiLCBmbik7CisgICAgdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdo
aXRlICkgfHwgWyIiXTsKKyAgICB0ID0gdHlwZXMubGVuZ3RoOworICAgIHdoaWxlICggdC0tICkg
eworICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CisgICAg
dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdOworICAgIG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAi
IiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7CisKKyAgICAvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0
eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUK
KyAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAg
IC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBl
LCBvdGhlcndpc2UgZ2l2ZW4gdHlwZQorICAgIHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5k
ZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKworICAgIC8vIFVwZGF0
ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKKyAgICBzcGVjaWFsID0galF1ZXJ5
LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAgIC8vIGhhbmRsZU9iaiBpcyBwYXNz
ZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzCisgICAgaGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7
CisgICAgdHlwZTogdHlwZSwKKyAgICBvcmlnVHlwZTogb3JpZ1R5cGUsCisgICAgZGF0YTogZGF0
YSwKKyAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgIGd1aWQ6IGhhbmRsZXIuZ3VpZCwKKyAgICBz
ZWxlY3Rvcjogc2VsZWN0b3IsCisgICAgbmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnku
ZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSwKKyAgICBuYW1lc3BhY2U6
IG5hbWVzcGFjZXMuam9pbigiLiIpCisgICAgfSwgaGFuZGxlT2JqSW4gKTsKKworICAgIC8vIElu
aXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0CisgICAgaWYgKCAh
KGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkgeworICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0
eXBlIF0gPSBbXTsKKyAgICBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsKKworICAgIC8vIE9u
bHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRz
IGhhbmRsZXIgcmV0dXJucyBmYWxzZQorICAgIGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lh
bC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBm
YWxzZSApIHsKKyAgICAvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxl
bWVudAorICAgIGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgeworICAgIGVsZW0uYWRkRXZl
bnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CisKKyAgICB9IGVsc2UgaWYg
KCBlbGVtLmF0dGFjaEV2ZW50ICkgeworICAgIGVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBl
LCBldmVudEhhbmRsZSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgaWYgKCBzcGVjaWFs
LmFkZCApIHsKKyAgICBzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKKworICAg
IGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CisgICAgaGFuZGxlT2JqLmhhbmRsZXIu
Z3VpZCA9IGhhbmRsZXIuZ3VpZDsKKyAgICB9CisgICAgfQorCisgICAgLy8gQWRkIHRvIHRoZSBl
bGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnQKKyAgICBpZiAoIHNlbGVj
dG9yICkgeworICAgIGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAw
LCBoYW5kbGVPYmogKTsKKyAgICB9IGVsc2UgeworICAgIGhhbmRsZXJzLnB1c2goIGhhbmRsZU9i
aiApOworICAgIH0KKworICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZl
ciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KKyAgICBqUXVlcnkuZXZlbnQuZ2xv
YmFsWyB0eXBlIF0gPSB0cnVlOworICAgIH0KKworICAgIC8vIE51bGxpZnkgZWxlbSB0byBwcmV2
ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorICAgIGVsZW0gPSBudWxsOworICAgIH0sCisKKyAgICAv
LyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKKyAgICBy
ZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5
cGVzICkgeworICAgIHZhciBqLCBoYW5kbGVPYmosIHRtcCwKKyAgICBvcmlnQ291bnQsIHQsIGV2
ZW50cywKKyAgICBzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwKKyAgICBuYW1lc3BhY2VzLCBvcmln
VHlwZSwKKyAgICBlbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9k
YXRhKCBlbGVtICk7CisKKyAgICBpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRh
LmV2ZW50cykgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9uY2UgZm9yIGVhY2gg
dHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWQKKyAgICB0eXBlcyA9
ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggY29yZV9ybm90d2hpdGUgKSB8fCBbIiJdOworICAgIHQg
PSB0eXBlcy5sZW5ndGg7CisgICAgd2hpbGUgKCB0LS0gKSB7CisgICAgdG1wID0gcnR5cGVuYW1l
c3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKKyAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBb
MV07CisgICAgbmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQo
KTsKKworICAgIC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJv
dmlkZWQpIGZvciB0aGUgZWxlbWVudAorICAgIGlmICggIXR5cGUgKSB7CisgICAgZm9yICggdHlw
ZSBpbiBldmVudHMgKSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5
cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7CisgICAgfQorICAgIGNvbnRpbnVl
OworICAgIH0KKworICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8
IHt9OworICAgIHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVj
aWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKyAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8
IFtdOworICAgIHRtcCA9IHRtcFsyXSAmJiBuZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3Bh
Y2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiApOworCisgICAgLy8gUmVtb3Zl
IG1hdGNoaW5nIGV2ZW50cworICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7Cisg
ICAgd2hpbGUgKCBqLS0gKSB7CisgICAgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKKworICAg
IGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkg
JiYKKyAgICAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAm
JgorICAgICggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiYKKyAg
ICAoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8IHNlbGVj
dG9yID09PSAiKioiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkgeworICAgIGhhbmRsZXJzLnNw
bGljZSggaiwgMSApOworCisgICAgaWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7CisgICAgaGFu
ZGxlcnMuZGVsZWdhdGVDb3VudC0tOworICAgIH0KKyAgICBpZiAoIHNwZWNpYWwucmVtb3ZlICkg
eworICAgIHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworICAgIH0KKyAg
ICB9CisgICAgfQorCisgICAgLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSBy
ZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAorICAgIC8vIChhdm9p
ZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVj
aWFsIGV2ZW50IGhhbmRsZXJzKQorICAgIGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5n
dGggKSB7CisgICAgaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNh
bGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKKyAg
ICBqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApOworICAg
IH0KKworICAgIGRlbGV0ZSBldmVudHNbIHR5cGUgXTsKKyAgICB9CisgICAgfQorCisgICAgLy8g
UmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKKyAgICBpZiAoIGpRdWVy
eS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKKyAgICBkZWxldGUgZWxlbURhdGEuaGFuZGxl
OworCisgICAgLy8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVh
cnMgdGhlIGV4cGFuZG8gaWYgZW1wdHkKKyAgICAvLyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxl
dGUKKyAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CisgICAgfQorICAg
IH0sCisKKyAgICB0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5k
bGVycyApIHsKKyAgICB2YXIgaGFuZGxlLCBvbnR5cGUsIGN1ciwKKyAgICBidWJibGVUeXBlLCBz
cGVjaWFsLCB0bXAsIGksCisgICAgZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCisg
ICAgdHlwZSA9IGNvcmVfaGFzT3duLmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUg
OiBldmVudCwKKyAgICBuYW1lc3BhY2VzID0gY29yZV9oYXNPd24uY2FsbCggZXZlbnQsICJuYW1l
c3BhY2UiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOworCisgICAgY3VyID0g
dG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7CisKKyAgICAvLyBEb24ndCBkbyBldmVudHMg
b24gdGV4dCBhbmQgY29tbWVudCBub2RlcworICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8
fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBm
b2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcg
dGhlbSByaWdodCBub3cKKyAgICBpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnku
ZXZlbnQudHJpZ2dlcmVkICkgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggdHlw
ZS5pbmRleE9mKCIuIikgPj0gMCApIHsKKyAgICAvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0
ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisgICAgbmFtZXNwYWNl
cyA9IHR5cGUuc3BsaXQoIi4iKTsKKyAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworICAg
IG5hbWVzcGFjZXMuc29ydCgpOworICAgIH0KKyAgICBvbnR5cGUgPSB0eXBlLmluZGV4T2YoIjoi
KSA8IDAgJiYgIm9uIiArIHR5cGU7CisKKyAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVl
cnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKKyAg
ICBldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KKyAgICBldmVudCA6CisgICAgbmV3
IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCAp
OworCisgICAgZXZlbnQuaXNUcmlnZ2VyID0gdHJ1ZTsKKyAgICBldmVudC5uYW1lc3BhY2UgPSBu
YW1lc3BhY2VzLmpvaW4oIi4iKTsKKyAgICBldmVudC5uYW1lc3BhY2VfcmUgPSBldmVudC5uYW1l
c3BhY2UgPworICAgIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwu
KD86LipcXC58KSIpICsgIihcXC58JCkiICkgOgorICAgIG51bGw7CisKKyAgICAvLyBDbGVhbiB1
cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWQKKyAgICBldmVudC5yZXN1bHQg
PSB1bmRlZmluZWQ7CisgICAgaWYgKCAhZXZlbnQudGFyZ2V0ICkgeworICAgIGV2ZW50LnRhcmdl
dCA9IGVsZW07CisgICAgfQorCisgICAgLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHBy
ZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAorICAgIGRhdGEg
PSBkYXRhID09IG51bGwgPworICAgIFsgZXZlbnQgXSA6CisgICAgalF1ZXJ5Lm1ha2VBcnJheSgg
ZGF0YSwgWyBldmVudCBdICk7CisKKyAgICAvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3
IG91dHNpZGUgdGhlIGxpbmVzCisgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0
eXBlIF0gfHwge307CisgICAgaWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAm
JiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRo
IGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKQorICAgIC8vIEJ1YmJsZSB1
cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRv
Y3VtZW50IHZhciAoIzk3MjQpCisgICAgaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5v
QnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworICAgIGJ1YmJsZVR5cGUg
PSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlOworICAgIGlmICggIXJmb2N1c01vcnBoLnRl
c3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7CisgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7Cisg
ICAgfQorICAgIGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKKyAgICBldmVu
dFBhdGgucHVzaCggY3VyICk7CisgICAgdG1wID0gY3VyOworICAgIH0KKworICAgIC8vIE9ubHkg
YWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3Ig
ZGV0YWNoZWQgRE9NKQorICAgIGlmICggdG1wID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRv
Y3VtZW50KSApIHsKKyAgICBldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5w
YXJlbnRXaW5kb3cgfHwgd2luZG93ICk7CisgICAgfQorICAgIH0KKworICAgIC8vIEZpcmUgaGFu
ZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoIChjdXIgPSBl
dmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisKKyAg
ICBldmVudC50eXBlID0gaSA+IDEgPworICAgIGJ1YmJsZVR5cGUgOgorICAgIHNwZWNpYWwuYmlu
ZFR5cGUgfHwgdHlwZTsKKworICAgIC8vIGpRdWVyeSBoYW5kbGVyCisgICAgaGFuZGxlID0gKCBq
UXVlcnkuX2RhdGEoIGN1ciwgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1
ZXJ5Ll9kYXRhKCBjdXIsICJoYW5kbGUiICk7CisgICAgaWYgKCBoYW5kbGUgKSB7CisgICAgaGFu
ZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKyAgICB9CisKKyAgICAvLyBOYXRpdmUgaGFuZGxlcgor
ICAgIGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOworICAgIGlmICggaGFuZGxlICYm
IGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBoYW5kbGUuYXBwbHkgJiYgaGFuZGxlLmFwcGx5
KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsK
KyAgICB9CisgICAgfQorICAgIGV2ZW50LnR5cGUgPSB0eXBlOworCisgICAgLy8gSWYgbm9ib2R5
IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdworICAgIGlmICggIW9ubHlI
YW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisKKyAgICBpZiAoICgh
c3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBlbGVtLm93bmVyRG9j
dW1lbnQsIGRhdGEgKSA9PT0gZmFsc2UpICYmCisgICAgISh0eXBlID09PSAiY2xpY2siICYmIGpR
dWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkg
KSB7CisKKyAgICAvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRo
IHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuCisgICAgLy8gQ2FuJ3QgdXNlIGFuIC5p
c0Z1bmN0aW9uKCkgY2hlY2sgaGVyZSBiZWNhdXNlIElFNi83IGZhaWxzIHRoYXQgdGVzdC4KKyAg
ICAvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xv
YmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApCisgICAgaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBd
ICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworICAgIC8vIERvbid0IHJlLXRyaWdn
ZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKKyAgICB0bXAg
PSBlbGVtWyBvbnR5cGUgXTsKKworICAgIGlmICggdG1wICkgeworICAgIGVsZW1bIG9udHlwZSBd
ID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNh
bWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQorICAgIGpRdWVyeS5l
dmVudC50cmlnZ2VyZWQgPSB0eXBlOworICAgIHRyeSB7CisgICAgZWxlbVsgdHlwZSBdKCk7Cisg
ICAgfSBjYXRjaCAoIGUgKSB7CisgICAgLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlk
ZGVuIGVsZW1lbnQgKCMxNDg2LCMxMjUxOCkKKyAgICAvLyBvbmx5IHJlcHJvZHVjaWJsZSBvbiB3
aW5YUCBJRTggbmF0aXZlLCBub3QgSUU5IGluIElFOCBtb2RlCisgICAgfQorICAgIGpRdWVyeS5l
dmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CisKKyAgICBpZiAoIHRtcCApIHsKKyAgICBlbGVt
WyBvbnR5cGUgXSA9IHRtcDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gZXZlbnQucmVzdWx0OworICAgIH0sCisKKyAgICBkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50
ICkgeworCisgICAgLy8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRp
dmUgZXZlbnQgb2JqZWN0CisgICAgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApOwor
CisgICAgdmFyIGksIHJldCwgaGFuZGxlT2JqLCBtYXRjaGVkLCBqLAorICAgIGhhbmRsZXJRdWV1
ZSA9IFtdLAorICAgIGFyZ3MgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorICAgIGhh
bmRsZXJzID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQu
dHlwZSBdIHx8IFtdLAorICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQu
dHlwZSBdIHx8IHt9OworCisgICAgLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhl
ciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKKyAgICBhcmdzWzBdID0gZXZlbnQ7
CisgICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzOworCisgICAgLy8gQ2FsbCB0aGUgcHJl
RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVz
aXJlZAorICAgIGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNo
LmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgeworICAgIHJldHVybjsKKyAgICB9CisK
KyAgICAvLyBEZXRlcm1pbmUgaGFuZGxlcnMKKyAgICBoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZl
bnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CisKKyAgICAvLyBSdW4g
ZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0
aCB1cworICAgIGkgPSAwOworICAgIHdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkr
KyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKyAgICBldmVudC5jdXJy
ZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOworCisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoaGFu
ZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVBy
b3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCisgICAgLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0
aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgorICAgIC8vIDIpIGhhdmUgbmFtZXNwYWNlKHMp
IGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4g
aGF2ZSBubyBuYW1lc3BhY2UpLgorICAgIGlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVu
dC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgeworCisgICAgZXZl
bnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOworICAgIGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0
YTsKKworICAgIHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5
cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyICkKKyAgICAuYXBwbHkoIG1h
dGNoZWQuZWxlbSwgYXJncyApOworCisgICAgaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKKyAg
ICBpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHsKKyAgICBldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgIH0KKyAgICB9
CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9v
ayBmb3IgdGhlIG1hcHBlZCB0eXBlCisgICAgaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsK
KyAgICBzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApOworICAgIH0KKwor
ICAgIHJldHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKKworICAgIGhhbmRsZXJzOiBmdW5jdGlv
biggZXZlbnQsIGhhbmRsZXJzICkgeworICAgIHZhciBzZWwsIGhhbmRsZU9iaiwgbWF0Y2hlcywg
aSwKKyAgICBoYW5kbGVyUXVldWUgPSBbXSwKKyAgICBkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMu
ZGVsZWdhdGVDb3VudCwKKyAgICBjdXIgPSBldmVudC50YXJnZXQ7CisKKyAgICAvLyBGaW5kIGRl
bGVnYXRlIGhhbmRsZXJzCisgICAgLy8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJl
ZXMgKCMxMzE4MCkKKyAgICAvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJl
Zm94ICgjMzg2MSkKKyAgICBpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmICgh
ZXZlbnQuYnV0dG9uIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkgeworCisgICAgZm9yICgg
OyBjdXIgIT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKKworICAgIC8v
IERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KQorICAgIC8vIERvbid0IHByb2Nlc3Mg
Y2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0
KQorICAgIGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmIChjdXIuZGlzYWJsZWQgIT09IHRydWUg
fHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7CisgICAgbWF0Y2hlcyA9IFtdOworICAgIGZv
ciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgeworICAgIGhhbmRsZU9iaiA9IGhh
bmRsZXJzWyBpIF07CisKKyAgICAvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5
cGUgcHJvcGVydGllcyAoIzEzMjAzKQorICAgIHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArICIg
IjsKKworICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHsKKyAgICBtYXRj
aGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgPworICAgIGpRdWVyeSggc2VsLCB0
aGlzICkuaW5kZXgoIGN1ciApID49IDAgOgorICAgIGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51
bGwsIFsgY3VyIF0gKS5sZW5ndGg7CisgICAgfQorICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gKSB7
CisgICAgbWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTsKKyAgICB9CisgICAgfQorICAgIGlmICgg
bWF0Y2hlcy5sZW5ndGggKSB7CisgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhh
bmRsZXJzOiBtYXRjaGVzIH0pOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8v
IEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKKyAgICBpZiAoIGRl
bGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7CisgICAgaGFuZGxlclF1ZXVlLnB1c2go
eyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9
KTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFuZGxlclF1ZXVlOworICAgIH0sCisKKyAgICBmaXg6
IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICBpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkg
eworICAgIHJldHVybiBldmVudDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBj
b3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKKyAg
ICB2YXIgaSwgcHJvcCwgY29weSwKKyAgICB0eXBlID0gZXZlbnQudHlwZSwKKyAgICBvcmlnaW5h
bEV2ZW50ID0gZXZlbnQsCisgICAgZml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTsKKwor
ICAgIGlmICggIWZpeEhvb2sgKSB7CisgICAgdGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9v
ayA9CisgICAgcm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDoKKyAg
ICBya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5rZXlIb29rcyA6CisgICAge307CisgICAg
fQorICAgIGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2su
cHJvcHMgKSA6IHRoaXMucHJvcHM7CisKKyAgICBldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9y
aWdpbmFsRXZlbnQgKTsKKworICAgIGkgPSBjb3B5Lmxlbmd0aDsKKyAgICB3aGlsZSAoIGktLSAp
IHsKKyAgICBwcm9wID0gY29weVsgaSBdOworICAgIGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2
ZW50WyBwcm9wIF07CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8vIEZpeCB0
YXJnZXQgcHJvcGVydHkgKCMxOTI1KQorICAgIGlmICggIWV2ZW50LnRhcmdldCApIHsKKyAgICBl
dmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CisgICAg
fQorCisgICAgLy8gU3VwcG9ydDogQ2hyb21lIDIzKywgU2FmYXJpPworICAgIC8vIFRhcmdldCBz
aG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpCisgICAgaWYgKCBldmVudC50
YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7CisgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0
LnBhcmVudE5vZGU7CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8vIEZvciBt
b3VzZS9rZXkgZXZlbnRzLCBtZXRhS2V5PT1mYWxzZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgs
ICMxMTMyOCkKKyAgICBldmVudC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5OworCisgICAgcmV0
dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50
ICkgOiBldmVudDsKKyAgICB9LAorCisgICAgLy8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBz
aGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQKKyAgICBwcm9wczogImFsdEtleSBidWJi
bGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSBy
ZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQo
IiAiKSwKKworICAgIGZpeEhvb2tzOiB7fSwKKworICAgIGtleUhvb2tzOiB7CisgICAgcHJvcHM6
ICJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLAorICAgIGZpbHRlcjogZnVu
Y3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKKworICAgIC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2
ZW50cworICAgIGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHsKKyAgICBldmVudC53aGljaCA9
IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFs
LmtleUNvZGU7CisgICAgfQorCisgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKyAgICB9LAorCisg
ICAgbW91c2VIb29rczogeworICAgIHByb3BzOiAiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGll
bnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVl
blkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLAorICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBv
cmlnaW5hbCApIHsKKyAgICB2YXIgYm9keSwgZXZlbnREb2MsIGRvYywKKyAgICBidXR0b24gPSBv
cmlnaW5hbC5idXR0b24sCisgICAgZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDsK
KworICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFp
bGFibGUKKyAgICBpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAh
PSBudWxsICkgeworICAgIGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwg
ZG9jdW1lbnQ7CisgICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OworICAgIGJvZHkg
PSBldmVudERvYy5ib2R5OworCisgICAgZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsg
KCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCAp
IC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwg
MCApOworICAgIGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5z
Y3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRv
Yy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTsKKyAgICB9CisK
KyAgICAvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCAhZXZlbnQu
cmVsYXRlZFRhcmdldCAmJiBmcm9tRWxlbWVudCApIHsKKyAgICBldmVudC5yZWxhdGVkVGFyZ2V0
ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZy
b21FbGVtZW50OworICAgIH0KKworICAgIC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxl
ZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQKKyAgICAvLyBOb3RlOiBidXR0b24gaXMgbm90
IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorICAgIGlmICggIWV2ZW50LndoaWNoICYmIGJ1
dHRvbiAhPT0gdW5kZWZpbmVkICkgeworICAgIGV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8g
MSA6ICggYnV0dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTsKKyAgICB9
CisKKyAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorICAgIH0sCisKKyAgICBzcGVjaWFsOiB7Cisg
ICAgbG9hZDogeworICAgIC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZy
b20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKKyAgICBub0J1YmJsZTogdHJ1ZQorICAgIH0sCisg
ICAgY2xpY2s6IHsKKyAgICAvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNo
ZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAorICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgeworICAg
IGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiaW5wdXQiICkgJiYgdGhpcy50eXBlID09PSAi
Y2hlY2tib3giICYmIHRoaXMuY2xpY2sgKSB7CisgICAgdGhpcy5jbGljaygpOworICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgfQorICAgIH0sCisgICAgZm9jdXM6IHsKKyAgICAvLyBGaXJl
IG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJl
Y3QKKyAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIHRoaXMgIT09IGRvY3VtZW50
LmFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5mb2N1cyApIHsKKyAgICB0cnkgeworICAgIHRoaXMuZm9j
dXMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgLy8gU3Vw
cG9ydDogSUU8OQorICAgIC8vIElmIHdlIGVycm9yIG9uIGZvY3VzIHRvIGhpZGRlbiBlbGVtZW50
ICgjMTQ4NiwgIzEyNTE4KSwKKyAgICAvLyBsZXQgLnRyaWdnZXIoKSBydW4gdGhlIGhhbmRsZXJz
CisgICAgfQorICAgIH0KKyAgICB9LAorICAgIGRlbGVnYXRlVHlwZTogImZvY3VzaW4iCisgICAg
fSwKKyAgICBibHVyOiB7CisgICAgdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisgICAgaWYgKCB0aGlz
ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIHRoaXMuYmx1ciApIHsKKyAgICB0aGlzLmJs
dXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0sCisgICAgZGVsZWdhdGVUeXBl
OiAiZm9jdXNvdXQiCisgICAgfSwKKworICAgIGJlZm9yZXVubG9hZDogeworICAgIHBvc3REaXNw
YXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgeworCisgICAgLy8gRXZlbiB3aGVuIHJldHVyblZhbHVl
IGVxdWFscyB0byB1bmRlZmluZWQgRmlyZWZveCB3aWxsIHN0aWxsIHNob3cgYWxlcnQKKyAgICBp
ZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICkgeworICAgIGV2ZW50Lm9yaWdpbmFsRXZl
bnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7CisgICAgfQorICAgIH0KKyAgICB9CisgICAg
fSwKKworICAgIHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSAp
IHsKKyAgICAvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZl
cmVudCBvbmUuCisgICAgLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3Rv
cFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCisgICAgLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRz
IGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuCisgICAgdmFyIGUgPSBq
UXVlcnkuZXh0ZW5kKAorICAgIG5ldyBqUXVlcnkuRXZlbnQoKSwKKyAgICBldmVudCwKKyAgICB7
IHR5cGU6IHR5cGUsCisgICAgaXNTaW11bGF0ZWQ6IHRydWUsCisgICAgb3JpZ2luYWxFdmVudDog
e30KKyAgICB9CisgICAgKTsKKyAgICBpZiAoIGJ1YmJsZSApIHsKKyAgICBqUXVlcnkuZXZlbnQu
dHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOworICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5LmV2ZW50
LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTsKKyAgICB9CisgICAgaWYgKCBlLmlzRGVmYXVsdFBy
ZXZlbnRlZCgpICkgeworICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgfQorICAgIH0K
K307CisKK2pRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIg
PworICAgIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CisgICAgaWYgKCBlbGVtLnJl
bW92ZUV2ZW50TGlzdGVuZXIgKSB7CisgICAgZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBl
LCBoYW5kbGUsIGZhbHNlICk7CisgICAgfQorICAgIH0gOgorICAgIGZ1bmN0aW9uKCBlbGVtLCB0
eXBlLCBoYW5kbGUgKSB7CisgICAgdmFyIG5hbWUgPSAib24iICsgdHlwZTsKKworICAgIGlmICgg
ZWxlbS5kZXRhY2hFdmVudCApIHsKKworICAgIC8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBt
ZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgKKyAgICAvLyBkZXRhY2hFdmVu
dCBuZWVkZWQgcHJvcGVydHkgb24gZWxlbWVudCwgYnkgbmFtZSBvZiB0aGF0IGV2ZW50LCB0byBw
cm9wZXJseSBleHBvc2UgaXQgdG8gR0MKKyAgICBpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09
IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIGVsZW1bIG5hbWUgXSA9IG51bGw7CisgICAgfQor
CisgICAgZWxlbS5kZXRhY2hFdmVudCggbmFtZSwgaGFuZGxlICk7CisgICAgfQorICAgIH07CisK
K2pRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgeworICAgIC8vIEFsbG93IGlu
c3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAorICAgIGlmICggISh0aGlzIGlu
c3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKKyAgICByZXR1cm4gbmV3IGpRdWVyeS5FdmVudCgg
c3JjLCBwcm9wcyApOworICAgIH0KKworICAgIC8vIEV2ZW50IG9iamVjdAorICAgIGlmICggc3Jj
ICYmIHNyYy50eXBlICkgeworICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKyAgICB0aGlz
LnR5cGUgPSBzcmMudHlwZTsKKworICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1l
bnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCisgICAgLy8gYnkgYSBoYW5kbGVy
IGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgdGhp
cy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoIHNyYy5kZWZhdWx0UHJldmVudGVkIHx8IHNyYy5yZXR1
cm5WYWx1ZSA9PT0gZmFsc2UgfHwKKyAgICBzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdl
dFByZXZlbnREZWZhdWx0KCkgKSA/IHJldHVyblRydWUgOiByZXR1cm5GYWxzZTsKKworICAgIC8v
IEV2ZW50IHR5cGUKKyAgICB9IGVsc2UgeworICAgIHRoaXMudHlwZSA9IHNyYzsKKyAgICB9CisK
KyAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50
IG9iamVjdAorICAgIGlmICggcHJvcHMgKSB7CisgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJv
cHMgKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZl
bnQgZG9lc24ndCBoYXZlIG9uZQorICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1l
U3RhbXAgfHwgalF1ZXJ5Lm5vdygpOworCisgICAgLy8gTWFyayBpdCBhcyBmaXhlZAorICAgIHRo
aXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlzIGJh
c2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFn
ZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2
ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90
b3R5cGUgPSB7CisgICAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKyAgICBpc1By
b3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisgICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlv
blN0b3BwZWQ6IHJldHVybkZhbHNlLAorCisgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkg
eworICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCisgICAgdGhpcy5pc0RlZmF1bHRQ
cmV2ZW50ZWQgPSByZXR1cm5UcnVlOworICAgIGlmICggIWUgKSB7CisgICAgcmV0dXJuOworICAg
IH0KKworICAgIC8vIElmIHByZXZlbnREZWZhdWx0IGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmln
aW5hbCBldmVudAorICAgIGlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKKyAgICBlLnByZXZlbnRE
ZWZhdWx0KCk7CisKKyAgICAvLyBTdXBwb3J0OiBJRQorICAgIC8vIE90aGVyd2lzZSBzZXQgdGhl
IHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZQorICAg
IH0gZWxzZSB7CisgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOworICAgIH0KKyAgICB9LAorICAg
IHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFs
RXZlbnQ7CisKKyAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKyAg
ICBpZiAoICFlICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgc3RvcFByb3BhZ2F0
aW9uIGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAorICAgIGlmICggZS5zdG9w
UHJvcGFnYXRpb24gKSB7CisgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9CisKKyAgICAv
LyBTdXBwb3J0OiBJRQorICAgIC8vIFNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRo
ZSBvcmlnaW5hbCBldmVudCB0byB0cnVlCisgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlOworICAg
IH0sCisgICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKKyAgICB0aGlz
LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKyAgICB0aGlzLnN0
b3BQcm9wYWdhdGlvbigpOworICAgIH0KK307CisKKy8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZl
IGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcworalF1ZXJ5
LmVhY2goeworICAgIG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAorICAgIG1vdXNlbGVhdmU6ICJt
b3VzZW91dCIKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CisgICAgalF1ZXJ5LmV2ZW50LnNw
ZWNpYWxbIG9yaWcgXSA9IHsKKyAgICBkZWxlZ2F0ZVR5cGU6IGZpeCwKKyAgICBiaW5kVHlwZTog
Zml4LAorCisgICAgaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgdmFyIHJldCwKKyAg
ICB0YXJnZXQgPSB0aGlzLAorICAgIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAorICAg
IGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajsKKworICAgIC8vIEZvciBtb3VzZW50ZXIvbGVh
dmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KKyAg
ICAvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBi
cm93c2VyIHdpbmRvdworICAgIGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAm
JiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7CisgICAgZXZlbnQudHlw
ZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKKyAgICByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBs
eSggdGhpcywgYXJndW1lbnRzICk7CisgICAgZXZlbnQudHlwZSA9IGZpeDsKKyAgICB9CisgICAg
cmV0dXJuIHJldDsKKyAgICB9CisgICAgfTsKK30pOworCisvLyBJRSBzdWJtaXQgZGVsZWdhdGlv
bgoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyApIHsKKworICAgIGpRdWVyeS5l
dmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKKyAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgLy8g
T25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKKyAgICBpZiAo
IGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CisgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIC8vIExhenktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRh
bnQgZm9ybSBtYXkgcG90ZW50aWFsbHkgYmUgc3VibWl0dGVkCisgICAgalF1ZXJ5LmV2ZW50LmFk
ZCggdGhpcywgImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBlICkg
eworICAgIC8vIE5vZGUgbmFtZSBjaGVjayBhdm9pZHMgYSBWTUwtcmVsYXRlZCBjcmFzaCBpbiBJ
RSAoIzk4MDcpCisgICAgdmFyIGVsZW0gPSBlLnRhcmdldCwKKyAgICBmb3JtID0galF1ZXJ5Lm5v
ZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9u
IiApID8gZWxlbS5mb3JtIDogdW5kZWZpbmVkOworICAgIGlmICggZm9ybSAmJiAhalF1ZXJ5Ll9k
YXRhKCBmb3JtLCAic3VibWl0QnViYmxlcyIgKSApIHsKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCBm
b3JtLCAic3VibWl0Ll9zdWJtaXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgZXZlbnQuX3N1
Ym1pdF9idWJibGUgPSB0cnVlOworICAgIH0pOworICAgIGpRdWVyeS5fZGF0YSggZm9ybSwgInN1
Ym1pdEJ1YmJsZXMiLCB0cnVlICk7CisgICAgfQorICAgIH0pOworICAgIC8vIHJldHVybiB1bmRl
ZmluZWQgc2luY2Ugd2UgZG9uJ3QgbmVlZCBhbiBldmVudCBsaXN0ZW5lcgorICAgIH0sCisKKyAg
ICBwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICAvLyBJZiBmb3JtIHdhcyBz
dWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWUKKyAgICBp
ZiAoIGV2ZW50Ll9zdWJtaXRfYnViYmxlICkgeworICAgIGRlbGV0ZSBldmVudC5fc3VibWl0X2J1
YmJsZTsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewor
ICAgIGpRdWVyeS5ldmVudC5zaW11bGF0ZSggInN1Ym1pdCIsIHRoaXMucGFyZW50Tm9kZSwgZXZl
bnQsIHRydWUgKTsKKyAgICB9CisgICAgfQorICAgIH0sCisKKyAgICB0ZWFyZG93bjogZnVuY3Rp
b24oKSB7CisgICAgLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBl
dmVudHMKKyAgICBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CisgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlbW92ZSBkZWxlZ2F0ZWQgaGFuZGxlcnM7
IGNsZWFuRGF0YSBldmVudHVhbGx5IHJlYXBzIHN1Ym1pdCBoYW5kbGVycyBhdHRhY2hlZCBhYm92
ZQorICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKKyAgICB9Cisg
ICAgfTsKK30KKworLy8gSUUgY2hhbmdlIGRlbGVnYXRpb24gYW5kIGNoZWNrYm94L3JhZGlvIGZp
eAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHsKKworICAgIGpRdWVyeS5l
dmVudC5zcGVjaWFsLmNoYW5nZSA9IHsKKworICAgIHNldHVwOiBmdW5jdGlvbigpIHsKKworICAg
IGlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7CisgICAgLy8gSUUgZG9l
c24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQg
b24gY2xpY2sKKyAgICAvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hh
bmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS4KKyAgICAvLyBUaGlzIHN0aWxsIGZpcmVzIG9u
Y2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuCisgICAgaWYg
KCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgewor
ICAgIGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIiwgZnVu
Y3Rpb24oIGV2ZW50ICkgeworICAgIGlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5h
bWUgPT09ICJjaGVja2VkIiApIHsKKyAgICB0aGlzLl9qdXN0X2NoYW5nZWQgPSB0cnVlOworICAg
IH0KKyAgICB9KTsKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2NoYW5nZSIs
IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICBpZiAoIHRoaXMuX2p1c3RfY2hhbmdlZCAmJiAhZXZl
bnQuaXNUcmlnZ2VyICkgeworICAgIHRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOworICAgIH0K
KyAgICAvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDAp
CisgICAgalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUg
KTsKKyAgICB9KTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBEZWxl
Z2F0ZWQgZXZlbnQ7IGxhenktYWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBpbnB1
dHMKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIs
IGZ1bmN0aW9uKCBlICkgeworICAgIHZhciBlbGVtID0gZS50YXJnZXQ7CisKKyAgICBpZiAoIHJm
b3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApICYmICFqUXVlcnkuX2RhdGEoIGVsZW0sICJj
aGFuZ2VCdWJibGVzIiApICkgeworICAgIGpRdWVyeS5ldmVudC5hZGQoIGVsZW0sICJjaGFuZ2Uu
X2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAm
JiAhZXZlbnQuaXNTaW11bGF0ZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKKyAgICBqUXVlcnku
ZXZlbnQuc2ltdWxhdGUoICJjaGFuZ2UiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7
CisgICAgfQorICAgIH0pOworICAgIGpRdWVyeS5fZGF0YSggZWxlbSwgImNoYW5nZUJ1YmJsZXMi
LCB0cnVlICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAgICBoYW5kbGU6IGZ1bmN0aW9u
KCBldmVudCApIHsKKyAgICB2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDsKKworICAgIC8vIFN3YWxs
b3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0
cmlnZ2VyZWQgdGhlbSBhYm92ZQorICAgIGlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1Np
bXVsYXRlZCB8fCBldmVudC5pc1RyaWdnZXIgfHwgKGVsZW0udHlwZSAhPT0gInJhZGlvIiAmJiBl
bGVtLnR5cGUgIT09ICJjaGVja2JveCIpICkgeworICAgIHJldHVybiBldmVudC5oYW5kbGVPYmou
aGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisgICAgfQorICAgIH0sCisKKyAgICB0
ZWFyZG93bjogZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5f
Y2hhbmdlIiApOworCisgICAgcmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUg
KTsKKyAgICB9CisgICAgfTsKK30KKworLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJs
dXIgZXZlbnRzCitpZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKKyAgICBq
UXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rp
b24oIG9yaWcsIGZpeCApIHsKKworICAgIC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFu
ZGxlciB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQKKyAgICB2YXIgYXR0YWNo
ZXMgPSAwLAorICAgIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgalF1ZXJ5LmV2
ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQg
KSwgdHJ1ZSApOworICAgIH07CisKKyAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7
CisgICAgc2V0dXA6IGZ1bmN0aW9uKCkgeworICAgIGlmICggYXR0YWNoZXMrKyA9PT0gMCApIHsK
KyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7Cisg
ICAgfQorICAgIH0sCisgICAgdGVhcmRvd246IGZ1bmN0aW9uKCkgeworICAgIGlmICggLS1hdHRh
Y2hlcyA9PT0gMCApIHsKKyAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBo
YW5kbGVyLCB0cnVlICk7CisgICAgfQorICAgIH0KKyAgICB9OworICAgIH0pOworfQorCitqUXVl
cnkuZm4uZXh0ZW5kKHsKKworICAgIG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRh
LCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsKKyAgICB2YXIgdHlwZSwgb3JpZ0ZuOworCisgICAg
Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCisgICAgaWYgKCB0eXBlb2Yg
dHlwZXMgPT09ICJvYmplY3QiICkgeworICAgIC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3Rvciwg
ZGF0YSApCisgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworICAgIC8v
ICggdHlwZXMtT2JqZWN0LCBkYXRhICkKKyAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKKyAg
ICBzZWxlY3RvciA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgZm9yICggdHlwZSBpbiB0eXBlcyAp
IHsKKyAgICB0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25l
ICk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlmICggZGF0YSA9PSBu
dWxsICYmIGZuID09IG51bGwgKSB7CisgICAgLy8gKCB0eXBlcywgZm4gKQorICAgIGZuID0gc2Vs
ZWN0b3I7CisgICAgZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSBpZiAo
IGZuID09IG51bGwgKSB7CisgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkg
eworICAgIC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCisgICAgZm4gPSBkYXRhOworICAgIGRh
dGEgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAvLyAoIHR5cGVzLCBkYXRhLCBmbiAp
CisgICAgZm4gPSBkYXRhOworICAgIGRhdGEgPSBzZWxlY3RvcjsKKyAgICBzZWxlY3RvciA9IHVu
ZGVmaW5lZDsKKyAgICB9CisgICAgfQorICAgIGlmICggZm4gPT09IGZhbHNlICkgeworICAgIGZu
ID0gcmV0dXJuRmFsc2U7CisgICAgfSBlbHNlIGlmICggIWZuICkgeworICAgIHJldHVybiB0aGlz
OworICAgIH0KKworICAgIGlmICggb25lID09PSAxICkgeworICAgIG9yaWdGbiA9IGZuOworICAg
IGZuID0gZnVuY3Rpb24oIGV2ZW50ICkgeworICAgIC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBz
aW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mbworICAgIGpRdWVyeSgpLm9mZiggZXZlbnQgKTsK
KyAgICByZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKyAgICB9OworICAg
IC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisgICAg
Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7
CisgICAgfQorICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeS5l
dmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKKyAgICB9KTsKKyAg
ICB9LAorICAgIG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7Cisg
ICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsKKyAgICB9
LAorICAgIG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7CisgICAgdmFyIGhh
bmRsZU9iaiwgdHlwZTsKKyAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYm
IHR5cGVzLmhhbmRsZU9iaiApIHsKKyAgICAvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5
LkV2ZW50CisgICAgaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOworICAgIGpRdWVyeSggdHlw
ZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCisgICAgaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRs
ZU9iai5vcmlnVHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3Jp
Z1R5cGUsCisgICAgaGFuZGxlT2JqLnNlbGVjdG9yLAorICAgIGhhbmRsZU9iai5oYW5kbGVyCisg
ICAgKTsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09
ICJvYmplY3QiICkgeworICAgIC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCisgICAg
Zm9yICggdHlwZSBpbiB0eXBlcyApIHsKKyAgICB0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5
cGVzWyB0eXBlIF0gKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmICgg
c2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsK
KyAgICAvLyAoIHR5cGVzIFssIGZuXSApCisgICAgZm4gPSBzZWxlY3RvcjsKKyAgICBzZWxlY3Rv
ciA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgZm4g
PSByZXR1cm5GYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsK
KyAgICBqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7Cisg
ICAgfSk7CisgICAgfSwKKworICAgIGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7
CisgICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOworICAgIH0sCisg
ICAgdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgeworICAgIHJldHVybiB0aGlzLm9mZigg
dHlwZXMsIG51bGwsIGZuICk7CisgICAgfSwKKworICAgIGRlbGVnYXRlOiBmdW5jdGlvbiggc2Vs
ZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKKyAgICByZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNl
bGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNl
bGVjdG9yLCB0eXBlcywgZm4gKSB7CisgICAgLy8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9y
LCB0eXBlcyBbLCBmbl0gKQorICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhp
cy5vZmYoIHNlbGVjdG9yLCAiKioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIq
KiIsIGZuICk7CisgICAgfSwKKworICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkg
eworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmV2ZW50LnRy
aWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsKKyAgICB9KTsKKyAgICB9LAorICAgIHRyaWdnZXJI
YW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKyAgICB2YXIgZWxlbSA9IHRoaXNbMF07
CisgICAgaWYgKCBlbGVtICkgeworICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlw
ZSwgZGF0YSwgZWxlbSwgdHJ1ZSApOworICAgIH0KKyAgICB9Cit9KTsKKy8qIQorICogU2l6emxl
IENTUyBTZWxlY3RvciBFbmdpbmUKKyAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9u
IGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5z
ZQorICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqLworKGZ1bmN0aW9uKCB3aW5kb3csIHVuZGVm
aW5lZCApIHsKKwordmFyIGksCisgICAgY2FjaGVkcnVucywKKyAgICBFeHByLAorICAgIGdldFRl
eHQsCisgICAgaXNYTUwsCisgICAgY29tcGlsZSwKKyAgICBoYXNEdXBsaWNhdGUsCisgICAgb3V0
ZXJtb3N0Q29udGV4dCwKKworICAgIC8vIExvY2FsIGRvY3VtZW50IHZhcnMKKyAgICBzZXREb2N1
bWVudCwKKyAgICBkb2N1bWVudCwKKyAgICBkb2NFbGVtLAorICAgIGRvY3VtZW50SXNYTUwsCisg
ICAgcmJ1Z2d5UVNBLAorICAgIHJidWdneU1hdGNoZXMsCisgICAgbWF0Y2hlcywKKyAgICBjb250
YWlucywKKyAgICBzb3J0T3JkZXIsCisKKyAgICAvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCisg
ICAgZXhwYW5kbyA9ICJzaXp6bGUiICsgLShuZXcgRGF0ZSgpKSwKKyAgICBwcmVmZXJyZWREb2Mg
PSB3aW5kb3cuZG9jdW1lbnQsCisgICAgc3VwcG9ydCA9IHt9LAorICAgIGRpcnJ1bnMgPSAwLAor
ICAgIGRvbmUgPSAwLAorICAgIGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHRva2Vu
Q2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgp
LAorCisgICAgLy8gR2VuZXJhbC1wdXJwb3NlIGNvbnN0YW50cworICAgIHN0cnVuZGVmaW5lZCA9
IHR5cGVvZiB1bmRlZmluZWQsCisgICAgTUFYX05FR0FUSVZFID0gMSA8PCAzMSwKKworICAgIC8v
IEFycmF5IG1ldGhvZHMKKyAgICBhcnIgPSBbXSwKKyAgICBwb3AgPSBhcnIucG9wLAorICAgIHB1
c2ggPSBhcnIucHVzaCwKKyAgICBzbGljZSA9IGFyci5zbGljZSwKKyAgICAvLyBVc2UgYSBzdHJp
cHBlZC1kb3duIGluZGV4T2YgaWYgd2UgY2FuJ3QgdXNlIGEgbmF0aXZlIG9uZQorICAgIGluZGV4
T2YgPSBhcnIuaW5kZXhPZiB8fCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgaSA9IDAsCisg
ICAgbGVuID0gdGhpcy5sZW5ndGg7CisgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAg
aWYgKCB0aGlzW2ldID09PSBlbGVtICkgeworICAgIHJldHVybiBpOworICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIC0xOworICAgIH0sCisKKworICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMKKwor
ICAgIC8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNl
bGVjdG9ycy8jd2hpdGVzcGFjZQorICAgIHdoaXRlc3BhY2UgPSAiW1xceDIwXFx0XFxyXFxuXFxm
XSIsCisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2NoYXJhY3RlcnMK
KyAgICBjaGFyYWN0ZXJFbmNvZGluZyA9ICIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0p
KyIsCisKKyAgICAvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVy
cworICAgIC8vIEFuIHVucXVvdGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlmaWVyIGh0
dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisg
ICAgLy8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5o
dG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyCisgICAgaWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29k
aW5nLnJlcGxhY2UoICJ3IiwgIncjIiApLAorCisgICAgLy8gQWNjZXB0YWJsZSBvcGVyYXRvcnMg
aHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisgICAg
b3BlcmF0b3JzID0gIihbKl4kfCF+XT89KSIsCisgICAgYXR0cmlidXRlcyA9ICJcXFsiICsgd2hp
dGVzcGFjZSArICIqKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpIiArIHdoaXRlc3BhY2UgKwor
ICAgICIqKD86IiArIG9wZXJhdG9ycyArIHdoaXRlc3BhY2UgKyAiKig/OihbJ1wiXSkoKD86XFxc
XC58W15cXFxcXSkqPylcXDN8KCIgKyBpZGVudGlmaWVyICsgIil8KXwpIiArIHdoaXRlc3BhY2Ug
KyAiKlxcXSIsCisKKyAgICAvLyBQcmVmZXIgYXJndW1lbnRzIHF1b3RlZCwKKyAgICAvLyAgIHRo
ZW4gbm90IGNvbnRhaW5pbmcgcHNldWRvcy9icmFja2V0cywKKyAgICAvLyAgIHRoZW4gYXR0cmli
dXRlIHNlbGVjdG9ycy9ub24tcGFyZW50aGV0aWNhbCBleHByZXNzaW9ucywKKyAgICAvLyAgIHRo
ZW4gYW55dGhpbmcgZWxzZQorICAgIC8vIFRoZXNlIHByZWZlcmVuY2VzIGFyZSBoZXJlIHRvIHJl
ZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycworICAgIC8vICAgbmVlZGluZyB0b2tlbml6ZSBp
biB0aGUgUFNFVURPIHByZUZpbHRlcgorICAgIHBzZXVkb3MgPSAiOigiICsgY2hhcmFjdGVyRW5j
b2RpbmcgKyAiKSg/OlxcKCgoWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxc
LnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzLnJlcGxhY2UoIDMsIDggKSArICIpKil8Liop
XFwpfCkiLAorCisgICAgLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVz
cGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcg
dGhlIGxhdHRlcgorICAgIHJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIr
fCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAor
CisgICAgcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqLCIgKyB3aGl0
ZXNwYWNlICsgIioiICksCisgICAgcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hp
dGVzcGFjZSArICIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIiArIHdoaXRlc3BhY2UgKyAiKiIg
KSwKKyAgICBycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAorICAgIHJpZGVudGlmaWVy
ID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAorCisgICAgbWF0Y2hFeHBy
ID0geworICAgICJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAi
KSIgKSwKKyAgICAiQ0xBU1MiOiBuZXcgUmVnRXhwKCAiXlxcLigiICsgY2hhcmFjdGVyRW5jb2Rp
bmcgKyAiKSIgKSwKKyAgICAiTkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wiXT8oIiAr
IGNoYXJhY3RlckVuY29kaW5nICsgIilbJ1wiXT9cXF0iICksCisgICAgIlRBRyI6IG5ldyBSZWdF
eHAoICJeKCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3KiIgKSArICIpIiAp
LAorICAgICJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAorICAgICJQU0VV
RE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCisgICAgIkNISUxEIjogbmV3IFJlZ0V4
cCggIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/Olxc
KCIgKyB3aGl0ZXNwYWNlICsKKyAgICAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3
aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKworICAgICIqKFxcZCspfCkp
IiArIHdoaXRlc3BhY2UgKyAiKlxcKXwpIiwgImkiICksCisgICAgLy8gRm9yIHVzZSBpbiBsaWJy
YXJpZXMgaW1wbGVtZW50aW5nIC5pcygpCisgICAgLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRj
aGluZyBpbiBgc2VsZWN0YAorICAgICJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIgKyB3
aGl0ZXNwYWNlICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/
OlxcKCIgKworICAgIHdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNl
ICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQorICAgIH0sCisKKyAgICByc2libGluZyA9IC9b
XHgyMFx0XHJcblxmXSpbK35dLywKKworICAgIHJuYXRpdmUgPSAvXltee10rXHtccypcW25hdGl2
ZSBjb2RlLywKKworICAgIC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFH
IG9yIENMQVNTIHNlbGVjdG9ycworICAgIHJxdWlja0V4cHIgPSAvXig/OiMoW1x3LV0rKXwoXHcr
KXxcLihbXHctXSspKSQvLAorCisgICAgcmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRh
cmVhfGJ1dHRvbikkL2ksCisgICAgcmhlYWRlciA9IC9eaFxkJC9pLAorCisgICAgcmVzY2FwZSA9
IC8nfFxcL2csCisgICAgcmF0dHJpYnV0ZVF1b3RlcyA9IC9cPVtceDIwXHRcclxuXGZdKihbXici
XF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLAorCisgICAgLy8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3
dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVycworICAgIHJ1
bmVzY2FwZSA9IC9cXChbXGRhLWZBLUZdezEsNn1bXHgyMFx0XHJcblxmXT98LikvZywKKyAgICBm
dW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCApIHsKKyAgICB2YXIgaGlnaCA9ICIweCIg
KyBlc2NhcGVkIC0gMHgxMDAwMDsKKyAgICAvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAorICAg
IHJldHVybiBoaWdoICE9PSBoaWdoID8KKyAgICBlc2NhcGVkIDoKKyAgICAvLyBCTVAgY29kZXBv
aW50CisgICAgaGlnaCA8IDAgPworICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEw
MDAwICkgOgorICAgIC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBw
YWlyKQorICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2gg
JiAweDNGRiB8IDB4REMwMCApOworICAgIH07CisKKy8vIFVzZSBhIHN0cmlwcGVkLWRvd24gc2xp
Y2UgaWYgd2UgY2FuJ3QgdXNlIGEgbmF0aXZlIG9uZQordHJ5IHsKKyAgICBzbGljZS5jYWxsKCBw
cmVmZXJyZWREb2MuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsK
K30gY2F0Y2ggKCBlICkgeworICAgIHNsaWNlID0gZnVuY3Rpb24oIGkgKSB7CisgICAgdmFyIGVs
ZW0sCisgICAgcmVzdWx0cyA9IFtdOworICAgIHdoaWxlICggKGVsZW0gPSB0aGlzW2krK10pICkg
eworICAgIHJlc3VsdHMucHVzaCggZWxlbSApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgICB9OworfQorCisvKioKKyAqIEZvciBmZWF0dXJlIGRldGVjdGlvbgorICogQHBhcmFtIHtG
dW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHRlc3QgZm9yIG5hdGl2ZSBzdXBwb3J0CisgKi8K
K2Z1bmN0aW9uIGlzTmF0aXZlKCBmbiApIHsKKyAgICByZXR1cm4gcm5hdGl2ZS50ZXN0KCBmbiAr
ICIiICk7Cit9CisKKy8qKgorICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBz
aXplCisgKiBAcmV0dXJucyB7RnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBP
YmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoCisgKiAgICBwcm9wZXJ0
eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBs
YXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKQorICogICAgZGVsZXRpbmcgdGhlIG9sZGVzdCBl
bnRyeQorICovCitmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKKyAgICB2YXIgY2FjaGUsCisgICAg
a2V5cyA9IFtdOworCisgICAgcmV0dXJuIChjYWNoZSA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkg
eworICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUg
cHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQorICAgIGlmICgga2V5cy5wdXNo
KCBrZXkgKz0gIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgeworICAgIC8vIE9ubHkga2VlcCB0
aGUgbW9zdCByZWNlbnQgZW50cmllcworICAgIGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07
CisgICAgfQorICAgIHJldHVybiAoY2FjaGVbIGtleSBdID0gdmFsdWUpOworICAgIH0pOworfQor
CisvKioKKyAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCisgKiBA
cGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFyaworICovCitmdW5jdGlvbiBt
YXJrRnVuY3Rpb24oIGZuICkgeworICAgIGZuWyBleHBhbmRvIF0gPSB0cnVlOworICAgIHJldHVy
biBmbjsKK30KKworLyoqCisgKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAorICog
QHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBh
IGJvb2xlYW4gcmVzdWx0CisgKi8KK2Z1bmN0aW9uIGFzc2VydCggZm4gKSB7CisgICAgdmFyIGRp
diA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCisgICAgdHJ5IHsKKyAgICByZXR1
cm4gZm4oIGRpdiApOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgICAg
fSBmaW5hbGx5IHsKKyAgICAvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQorICAgIGRpdiA9IG51bGw7
CisgICAgfQorfQorCitmdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRz
LCBzZWVkICkgeworICAgIHZhciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsCisgICAgLy8gUVNB
IHZhcnMKKyAgICBpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsK
KworICAgIGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQg
OiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7CisgICAgc2V0RG9jdW1lbnQoIGNvbnRl
eHQgKTsKKyAgICB9CisKKyAgICBjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKyAgICBy
ZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKKworICAgIGlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBz
ZWxlY3RvciAhPT0gInN0cmluZyIgKSB7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisg
ICAgaWYgKCAobm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBub2RlVHlwZSAh
PT0gOSApIHsKKyAgICByZXR1cm4gW107CisgICAgfQorCisgICAgaWYgKCAhZG9jdW1lbnRJc1hN
TCAmJiAhc2VlZCApIHsKKworICAgIC8vIFNob3J0Y3V0cworICAgIGlmICggKG1hdGNoID0gcnF1
aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsKKyAgICAvLyBTcGVlZC11cDogU2l6emxlKCIj
SUQiKQorICAgIGlmICggKG0gPSBtYXRjaFsxXSkgKSB7CisgICAgaWYgKCBub2RlVHlwZSA9PT0g
OSApIHsKKyAgICBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApOworICAgIC8vIENo
ZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAg
Ly8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgIGlm
ICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CisgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdo
ZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXMKKyAgICAvLyBieSBuYW1lIGlu
c3RlYWQgb2YgSUQKKyAgICBpZiAoIGVsZW0uaWQgPT09IG0gKSB7CisgICAgcmVzdWx0cy5wdXNo
KCBlbGVtICk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgLy8gQ29udGV4dCBpcyBu
b3QgYSBkb2N1bWVudAorICAgIGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0g
Y29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCisgICAgY29udGFp
bnMoIGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgeworICAgIHJlc3VsdHMucHVz
aCggZWxlbSApOworICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKyAgICB9CisKKyAgICAvLyBT
cGVlZC11cDogU2l6emxlKCJUQUciKQorICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgeworICAg
IHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5VGFn
TmFtZSggc2VsZWN0b3IgKSwgMCkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKworICAgIC8vIFNw
ZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCisgICAgfSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkg
JiYgc3VwcG9ydC5nZXRCeUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUgKSB7CisgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVs
ZW1lbnRzQnlDbGFzc05hbWUoIG0gKSwgMCkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9
CisgICAgfQorCisgICAgLy8gUVNBIHBhdGgKKyAgICBpZiAoIHN1cHBvcnQucXNhICYmICFyYnVn
Z3lRU0EudGVzdChzZWxlY3RvcikgKSB7CisgICAgb2xkID0gdHJ1ZTsKKyAgICBuaWQgPSBleHBh
bmRvOworICAgIG5ld0NvbnRleHQgPSBjb250ZXh0OworICAgIG5ld1NlbGVjdG9yID0gbm9kZVR5
cGUgPT09IDkgJiYgc2VsZWN0b3I7CisKKyAgICAvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVs
ZW1lbnQtcm9vdGVkIHF1ZXJpZXMKKyAgICAvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBz
cGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290CisgICAgLy8gYW5kIHdvcmtpbmcgdXAg
ZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCisg
ICAgLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCisgICAgaWYgKCBub2Rl
VHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3Qi
ICkgeworICAgIGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApOworCisgICAgaWYgKCAob2xk
ID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImlkIikpICkgeworICAgIG5pZCA9IG9sZC5yZXBsYWNl
KCByZXNjYXBlLCAiXFwkJiIgKTsKKyAgICB9IGVsc2UgeworICAgIGNvbnRleHQuc2V0QXR0cmli
dXRlKCAiaWQiLCBuaWQgKTsKKyAgICB9CisgICAgbmlkID0gIltpZD0nIiArIG5pZCArICInXSAi
OworCisgICAgaSA9IGdyb3Vwcy5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgZ3Jv
dXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7CisgICAgfQorICAgIG5ld0Nv
bnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8
fCBjb250ZXh0OworICAgIG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIiwiKTsKKyAgICB9CisK
KyAgICBpZiAoIG5ld1NlbGVjdG9yICkgeworICAgIHRyeSB7CisgICAgcHVzaC5hcHBseSggcmVz
dWx0cywgc2xpY2UuY2FsbCggbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKAorICAgIG5ld1Nl
bGVjdG9yCisgICAgKSwgMCApICk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSBjYXRjaChx
c2FFcnJvcikgeworICAgIH0gZmluYWxseSB7CisgICAgaWYgKCAhb2xkICkgeworICAgIGNvbnRl
eHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAg
ICB9CisKKyAgICAvLyBBbGwgb3RoZXJzCisgICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVw
bGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOworfQorCisvKioK
KyAqIERldGVjdCB4bWwKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVu
dCBvciBhIGRvY3VtZW50CisgKi8KK2lzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVy
ZSBpdCBkb2Vzbid0IHlldCBleGlzdAorICAgIC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBp
biBJRSAtICM0ODMzKQorICAgIHZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93
bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OworICAgIHJldHVybiBkb2N1bWVu
dEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiA6IGZhbHNlOwor
fTsKKworLyoqCisgKiBTZXRzIGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQg
b24gdGhlIGN1cnJlbnQgZG9jdW1lbnQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2Nd
IEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50
CisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50CisgKi8K
K3NldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cisg
ICAgdmFyIGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJl
ZERvYzsKKworICAgIC8vIElmIG5vIGRvY3VtZW50IGFuZCBkb2N1bWVudEVsZW1lbnQgaXMgYXZh
aWxhYmxlLCByZXR1cm4KKyAgICBpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBl
ICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkgeworICAgIHJldHVybiBkb2N1bWVudDsK
KyAgICB9CisKKyAgICAvLyBTZXQgb3VyIGRvY3VtZW50CisgICAgZG9jdW1lbnQgPSBkb2M7Cisg
ICAgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICAvLyBTdXBwb3J0IHRlc3Rz
CisgICAgZG9jdW1lbnRJc1hNTCA9IGlzWE1MKCBkb2MgKTsKKworICAgIC8vIENoZWNrIGlmIGdl
dEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzCisgICAgc3VwcG9y
dC50YWdOYW1lTm9Db21tZW50cyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworICAgIGRpdi5h
cHBlbmRDaGlsZCggZG9jLmNyZWF0ZUNvbW1lbnQoIiIpICk7CisgICAgcmV0dXJuICFkaXYuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7CisgICAgfSk7CisKKyAgICAvLyBDaGVjayBp
ZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzCisgICAg
c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisgICAgZGl2Lmlu
bmVySFRNTCA9ICI8c2VsZWN0Pjwvc2VsZWN0PiI7CisgICAgdmFyIHR5cGUgPSB0eXBlb2YgZGl2
Lmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7CisgICAgLy8gSUU4IHJldHVybnMg
YSBzdHJpbmcgZm9yIHNvbWUgYXR0cmlidXRlcyBldmVuIHdoZW4gbm90IHByZXNlbnQKKyAgICBy
ZXR1cm4gdHlwZSAhPT0gImJvb2xlYW4iICYmIHR5cGUgIT09ICJzdHJpbmciOworICAgIH0pOwor
CisgICAgLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSBjYW4gYmUgdHJ1c3RlZAor
ICAgIHN1cHBvcnQuZ2V0QnlDbGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAg
ICAvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQorICAgIGRp
di5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0naGlkZGVuIGUnPjwvZGl2PjxkaXYgY2xhc3M9J2hp
ZGRlbic+PC9kaXY+IjsKKyAgICBpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCAh
ZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggKSB7CisgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIC8vIFNhZmFyaSAzLjIgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMg
YW5kIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcworICAgIGRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0g
ImUiOworICAgIHJldHVybiBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9
PT0gMjsKKyAgICB9KTsKKworICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMg
ZWxlbWVudHMgYnkgbmFtZQorICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZp
bGVnZXMgZm9ybSBjb250cm9scyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElECisgICAgc3VwcG9y
dC5nZXRCeU5hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBJbmplY3QgY29u
dGVudAorICAgIGRpdi5pZCA9IGV4cGFuZG8gKyAwOworICAgIGRpdi5pbm5lckhUTUwgPSAiPGEg
bmFtZT0nIiArIGV4cGFuZG8gKyAiJz48L2E+PGRpdiBuYW1lPSciICsgZXhwYW5kbyArICInPjwv
ZGl2PiI7CisgICAgZG9jRWxlbS5pbnNlcnRCZWZvcmUoIGRpdiwgZG9jRWxlbS5maXJzdENoaWxk
ICk7CisKKyAgICAvLyBUZXN0CisgICAgdmFyIHBhc3MgPSBkb2MuZ2V0RWxlbWVudHNCeU5hbWUg
JiYKKyAgICAvLyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBmZXdlciB0aGFuIHRoZSBjb3Jy
ZWN0IDIKKyAgICBkb2MuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGggPT09IDIg
KworICAgIC8vIGJ1Z2d5IGJyb3dzZXJzIHdpbGwgcmV0dXJuIG1vcmUgdGhhbiB0aGUgY29ycmVj
dCAwCisgICAgZG9jLmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICsgMCApLmxlbmd0aDsKKyAg
ICBzdXBwb3J0LmdldElkTm90TmFtZSA9ICFkb2MuZ2V0RWxlbWVudEJ5SWQoIGV4cGFuZG8gKTsK
KworICAgIC8vIENsZWFudXAKKyAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBkaXYgKTsKKworICAg
IHJldHVybiBwYXNzOworICAgIH0pOworCisgICAgLy8gSUU2LzcgcmV0dXJuIG1vZGlmaWVkIGF0
dHJpYnV0ZXMKKyAgICBFeHByLmF0dHJIYW5kbGUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsK
KyAgICBkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOworICAgIHJldHVybiBkaXYu
Zmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSBzdHJ1
bmRlZmluZWQgJiYKKyAgICBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0g
IiMiOworICAgIH0pID8KKyAgICB7fSA6CisgICAgeworICAgICJocmVmIjogZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAiaHJlZiIsIDIgKTsKKyAgICB9
LAorICAgICJ0eXBlIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0
cmlidXRlKCJ0eXBlIik7CisgICAgfQorICAgIH07CisKKyAgICAvLyBJRCBmaW5kIGFuZCBmaWx0
ZXIKKyAgICBpZiAoIHN1cHBvcnQuZ2V0SWROb3ROYW1lICkgeworICAgIEV4cHIuZmluZFsiSUQi
XSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKKyAgICBpZiAoIHR5cGVvZiBjb250ZXh0Lmdl
dEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIWRvY3VtZW50SXNYTUwgKSB7CisgICAg
dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApOworICAgIC8vIENoZWNrIHBhcmVu
dE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAgLy8gbm9kZXMg
dGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgIHJldHVybiBtICYm
IG0ucGFyZW50Tm9kZSA/IFttXSA6IFtdOworICAgIH0KKyAgICB9OworICAgIEV4cHIuZmlsdGVy
WyJJRCJdID0gZnVuY3Rpb24oIGlkICkgeworICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBy
dW5lc2NhcGUsIGZ1bmVzY2FwZSApOworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKKyAgICB9OworICAg
IH07CisgICAgfSBlbHNlIHsKKyAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNv
bnRleHQgKSB7CisgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3Ry
dW5kZWZpbmVkICYmICFkb2N1bWVudElzWE1MICkgeworICAgIHZhciBtID0gY29udGV4dC5nZXRF
bGVtZW50QnlJZCggaWQgKTsKKworICAgIHJldHVybiBtID8KKyAgICBtLmlkID09PSBpZCB8fCB0
eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgbS5nZXRBdHRyaWJ1
dGVOb2RlKCJpZCIpLnZhbHVlID09PSBpZCA/CisgICAgW21dIDoKKyAgICB1bmRlZmluZWQgOgor
ICAgIFtdOworICAgIH0KKyAgICB9OworICAgIEV4cHIuZmlsdGVyWyJJRCJdID0gIGZ1bmN0aW9u
KCBpZCApIHsKKyAgICB2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2Nh
cGUgKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIG5vZGUgPSB0eXBl
b2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRy
aWJ1dGVOb2RlKCJpZCIpOworICAgIHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJ
ZDsKKyAgICB9OworICAgIH07CisgICAgfQorCisgICAgLy8gVGFnCisgICAgRXhwci5maW5kWyJU
QUciXSA9IHN1cHBvcnQudGFnTmFtZU5vQ29tbWVudHMgPworICAgIGZ1bmN0aW9uKCB0YWcsIGNv
bnRleHQgKSB7CisgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAh
PT0gc3RydW5kZWZpbmVkICkgeworICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdO
YW1lKCB0YWcgKTsKKyAgICB9CisgICAgfSA6CisgICAgZnVuY3Rpb24oIHRhZywgY29udGV4dCAp
IHsKKyAgICB2YXIgZWxlbSwKKyAgICB0bXAgPSBbXSwKKyAgICBpID0gMCwKKyAgICByZXN1bHRz
ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7CisKKyAgICAvLyBGaWx0ZXIg
b3V0IHBvc3NpYmxlIGNvbW1lbnRzCisgICAgaWYgKCB0YWcgPT09ICIqIiApIHsKKyAgICB3aGls
ZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgKSB7CisgICAgdG1wLnB1c2goIGVsZW0gKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IHRtcDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfTsKKworICAgIC8vIE5hbWUK
KyAgICBFeHByLmZpbmRbIk5BTUUiXSA9IHN1cHBvcnQuZ2V0QnlOYW1lICYmIGZ1bmN0aW9uKCB0
YWcsIGNvbnRleHQgKSB7CisgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFt
ZSAhPT0gc3RydW5kZWZpbmVkICkgeworICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlO
YW1lKCBuYW1lICk7CisgICAgfQorICAgIH07CisKKyAgICAvLyBDbGFzcworICAgIEV4cHIuZmlu
ZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0QnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFt
ZSwgY29udGV4dCApIHsKKyAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFz
c05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiAhZG9jdW1lbnRJc1hNTCApIHsKKyAgICByZXR1cm4g
Y29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsKKyAgICB9CisgICAg
fTsKKworICAgIC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKKworICAgIC8vIG1h
dGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJh
IDExLjUpCisgICAgcmJ1Z2d5TWF0Y2hlcyA9IFtdOworCisgICAgLy8gcVNhKDpmb2N1cykgcmVw
b3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSksCisgICAgLy8gbm8gbmVlZCB0byBhbHNv
IGFkZCB0byBidWdneU1hdGNoZXMgc2luY2UgbWF0Y2hlcyBjaGVja3MgYnVnZ3lRU0EKKyAgICAv
LyBBIHN1cHBvcnQgdGVzdCB3b3VsZCByZXF1aXJlIHRvbyBtdWNoIGNvZGUgKHdvdWxkIGluY2x1
ZGUgZG9jdW1lbnQgcmVhZHkpCisgICAgcmJ1Z2d5UVNBID0gWyAiOmZvY3VzIiBdOworCisgICAg
aWYgKCAoc3VwcG9ydC5xc2EgPSBpc05hdGl2ZShkb2MucXVlcnlTZWxlY3RvckFsbCkpICkgewor
ICAgIC8vIEJ1aWxkIFFTQSByZWdleAorICAgIC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJv
bSBEaWVnbyBQZXJpbmkKKyAgICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBTZWxl
Y3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlCisgICAgLy8gVGhpcyBpcyB0byB0
ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0bHkKKyAgICAvLyBzZXR0aW5nIGEgYm9v
bGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKKyAgICAvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxk
IGJlIGVub3VnaAorICAgIC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5Cisg
ICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+
PC9zZWxlY3Q+IjsKKworICAgIC8vIElFOCAtIFNvbWUgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBu
b3QgdHJlYXRlZCBjb3JyZWN0bHkKKyAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3Nl
bGVjdGVkXSIpLmxlbmd0aCApIHsKKyAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNw
YWNlICsgIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVj
dGVkfHZhbHVlKSIgKTsKKyAgICB9CisKKyAgICAvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBz
aG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50cworICAgIC8vIGh0dHA6Ly93d3cu
dzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCisgICAg
Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKKyAg
ICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CisgICAg
cmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7CisgICAgfQorICAgIH0pOworCisgICAgYXNzZXJ0
KGZ1bmN0aW9uKCBkaXYgKSB7CisKKyAgICAvLyBPcGVyYSAxMC0xMi9JRTggLSBePSAkPSAqPSBh
bmQgZW1wdHkgdmFsdWVzCisgICAgLy8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmcKKyAgICBk
aXYuaW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIGk9JycvPiI7CisgICAgaWYgKCBk
aXYucXVlcnlTZWxlY3RvckFsbCgiW2lePScnXSIpLmxlbmd0aCApIHsKKyAgICByYnVnZ3lRU0Eu
cHVzaCggIlsqXiRdPSIgKyB3aGl0ZXNwYWNlICsgIiooPzpcIlwifCcnKSIgKTsKKyAgICB9CisK
KyAgICAvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAo
aGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQorICAgIC8vIElFOCB0aHJvd3MgZXJy
b3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgaWYgKCAhZGl2LnF1ZXJ5
U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoICkgeworICAgIHJidWdneVFTQS5wdXNoKCAi
OmVuYWJsZWQiLCAiOmRpc2FibGVkIiApOworICAgIH0KKworICAgIC8vIE9wZXJhIDEwLTExIGRv
ZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCisgICAgZGl2LnF1ZXJ5
U2VsZWN0b3JBbGwoIiosOngiKTsKKyAgICByYnVnZ3lRU0EucHVzaCgiLC4qOiIpOworICAgIH0p
OworICAgIH0KKworICAgIGlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gaXNOYXRpdmUo
IChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzU2VsZWN0b3IgfHwKKyAgICBkb2NFbGVtLm1vek1h
dGNoZXNTZWxlY3RvciB8fAorICAgIGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8Cisg
ICAgZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CisgICAgZG9jRWxlbS5tc01hdGNoZXNTZWxl
Y3RvcikgKSkgKSB7CisKKyAgICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBDaGVj
ayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3IKKyAgICAvLyBv
biBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQorICAgIHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0
Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsKKworICAgIC8vIFRoaXMgc2hvdWxkIGZh
aWwgd2l0aCBhbiBleGNlcHRpb24KKyAgICAvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJu
cyBmYWxzZSBpbnN0ZWFkCisgICAgbWF0Y2hlcy5jYWxsKCBkaXYsICJbcyE9JyddOngiICk7Cisg
ICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CisgICAgfSk7CisgICAgfQor
CisgICAgcmJ1Z2d5UVNBID0gbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oInwiKSApOworICAg
IHJidWdneU1hdGNoZXMgPSBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOwor
CisgICAgLy8gRWxlbWVudCBjb250YWlucyBhbm90aGVyCisgICAgLy8gUHVycG9zZWZ1bGx5IGRv
ZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudAorICAgIC8vIEFzIGluLCBhbiBl
bGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmCisgICAgY29udGFpbnMgPSBpc05hdGl2ZShk
b2NFbGVtLmNvbnRhaW5zKSB8fCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8KKyAg
ICBmdW5jdGlvbiggYSwgYiApIHsKKyAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8g
YS5kb2N1bWVudEVsZW1lbnQgOiBhLAorICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOworICAg
IHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKAor
ICAgIGFkb3duLmNvbnRhaW5zID8KKyAgICBhZG93bi5jb250YWlucyggYnVwICkgOgorICAgIGEu
Y29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVw
ICkgJiAxNgorICAgICkpOworICAgIH0gOgorICAgIGZ1bmN0aW9uKCBhLCBiICkgeworICAgIGlm
ICggYiApIHsKKyAgICB3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKKyAgICBpZiAoIGIg
PT09IGEgKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworICAgIH07CisKKyAgICAvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisgICAg
c29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/CisgICAgZnVuY3Rp
b24oIGEsIGIgKSB7CisgICAgdmFyIGNvbXBhcmU7CisKKyAgICBpZiAoIGEgPT09IGIgKSB7Cisg
ICAgaGFzRHVwbGljYXRlID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAo
IChjb21wYXJlID0gYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVu
dFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSkgKSB7CisgICAgaWYg
KCBjb21wYXJlICYgMSB8fCBhLnBhcmVudE5vZGUgJiYgYS5wYXJlbnROb2RlLm5vZGVUeXBlID09
PSAxMSApIHsKKyAgICBpZiAoIGEgPT09IGRvYyB8fCBjb250YWlucyggcHJlZmVycmVkRG9jLCBh
ICkgKSB7CisgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIGIgPT09IGRvYyB8fCBjb250
YWlucyggcHJlZmVycmVkRG9jLCBiICkgKSB7CisgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJl
dHVybiAwOworICAgIH0KKyAgICByZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7CisgICAgfQor
CisgICAgcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyAtMSA6IDE7CisgICAgfSA6
CisgICAgZnVuY3Rpb24oIGEsIGIgKSB7CisgICAgdmFyIGN1ciwKKyAgICBpID0gMCwKKyAgICBh
dXAgPSBhLnBhcmVudE5vZGUsCisgICAgYnVwID0gYi5wYXJlbnROb2RlLAorICAgIGFwID0gWyBh
IF0sCisgICAgYnAgPSBbIGIgXTsKKworICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFy
ZSBpZGVudGljYWwKKyAgICBpZiAoIGEgPT09IGIgKSB7CisgICAgaGFzRHVwbGljYXRlID0gdHJ1
ZTsKKyAgICByZXR1cm4gMDsKKworICAgIC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBk
b2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisgICAgfSBlbHNlIGlmICggIWF1cCB8fCAhYnVwICkg
eworICAgIHJldHVybiBhID09PSBkb2MgPyAtMSA6CisgICAgYiA9PT0gZG9jID8gMSA6CisgICAg
YXVwID8gLTEgOgorICAgIGJ1cCA/IDEgOgorICAgIDA7CisKKyAgICAvLyBJZiB0aGUgbm9kZXMg
YXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVjaworICAgIH0gZWxzZSBpZiAoIGF1
cCA9PT0gYnVwICkgeworICAgIHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKKyAgICB9CisK
KyAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBm
b3IgY29tcGFyaXNvbgorICAgIGN1ciA9IGE7CisgICAgd2hpbGUgKCAoY3VyID0gY3VyLnBhcmVu
dE5vZGUpICkgeworICAgIGFwLnVuc2hpZnQoIGN1ciApOworICAgIH0KKyAgICBjdXIgPSBiOwor
ICAgIHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKKyAgICBicC51bnNoaWZ0KCBj
dXIgKTsKKyAgICB9CisKKyAgICAvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBk
aXNjcmVwYW5jeQorICAgIHdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgeworICAgIGkrKzsKKyAg
ICB9CisKKyAgICByZXR1cm4gaSA/CisgICAgLy8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBu
b2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yCisgICAgc2libGluZ0NoZWNrKCBhcFtpXSwgYnBb
aV0gKSA6CisKKyAgICAvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmly
c3QKKyAgICBhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgorICAgIGJwW2ldID09PSBwcmVm
ZXJyZWREb2MgPyAxIDoKKyAgICAwOworICAgIH07CisKKyAgICAvLyBBbHdheXMgYXNzdW1lIHRo
ZSBwcmVzZW5jZSBvZiBkdXBsaWNhdGVzIGlmIHNvcnQgZG9lc24ndAorICAgIC8vIHBhc3MgdGhl
bSB0byBvdXIgY29tcGFyaXNvbiBmdW5jdGlvbiAoYXMgaW4gR29vZ2xlIENocm9tZSkuCisgICAg
aGFzRHVwbGljYXRlID0gZmFsc2U7CisgICAgWzAsIDBdLnNvcnQoIHNvcnRPcmRlciApOworICAg
IHN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9IGhhc0R1cGxpY2F0ZTsKKworICAgIHJldHVybiBk
b2N1bWVudDsKK307CisKK1NpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRz
ICkgeworICAgIHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7Cit9
OworCitTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7Cisg
ICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisgICAgaWYgKCAoIGVsZW0ub3duZXJE
b2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgeworICAgIHNldERvY3VtZW50KCBlbGVt
ICk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBh
cmUgcXVvdGVkCisgICAgZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0n
JDEnXSIgKTsKKworICAgIC8vIHJidWdneVFTQSBhbHdheXMgY29udGFpbnMgOmZvY3VzLCBzbyBu
byBuZWVkIGZvciBhbiBleGlzdGVuY2UgY2hlY2sKKyAgICBpZiAoIHN1cHBvcnQubWF0Y2hlc1Nl
bGVjdG9yICYmICFkb2N1bWVudElzWE1MICYmICghcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0
Y2hlcy50ZXN0KGV4cHIpKSAmJiAhcmJ1Z2d5UVNBLnRlc3QoZXhwcikgKSB7CisgICAgdHJ5IHsK
KyAgICB2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7CisKKyAgICAvLyBJRSA5
J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzCisg
ICAgaWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fAorICAgIC8vIEFzIHdl
bGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50CisgICAg
Ly8gZnJhZ21lbnQgaW4gSUUgOQorICAgIGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5u
b2RlVHlwZSAhPT0gMTEgKSB7CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgfSBjYXRjaChl
KSB7fQorICAgIH0KKworICAgIHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBb
ZWxlbV0gKS5sZW5ndGggPiAwOworfTsKKworU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNv
bnRleHQsIGVsZW0gKSB7CisgICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisgICAg
aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkg
eworICAgIHNldERvY3VtZW50KCBjb250ZXh0ICk7CisgICAgfQorICAgIHJldHVybiBjb250YWlu
cyggY29udGV4dCwgZWxlbSApOworfTsKKworU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwg
bmFtZSApIHsKKyAgICB2YXIgdmFsOworCisgICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVl
ZGVkCisgICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50
ICkgeworICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQorCisgICAgaWYgKCAhZG9jdW1l
bnRJc1hNTCApIHsKKyAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0KKyAgICBp
ZiAoICh2YWwgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSkgKSB7CisgICAgcmV0dXJuIHZhbCgg
ZWxlbSApOworICAgIH0KKyAgICBpZiAoIGRvY3VtZW50SXNYTUwgfHwgc3VwcG9ydC5hdHRyaWJ1
dGVzICkgeworICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOworICAgIH0KKyAg
ICByZXR1cm4gKCAodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpIHx8IGVsZW0u
Z2V0QXR0cmlidXRlKCBuYW1lICkgKSAmJiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPworICAgIG5h
bWUgOgorICAgIHZhbCAmJiB2YWwuc3BlY2lmaWVkID8gdmFsLnZhbHVlIDogbnVsbDsKK307CisK
K1NpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCAi
U3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyApOworfTsKKwor
Ly8gRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlcworU2l6emxlLnVuaXF1
ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKKyAgICB2YXIgZWxlbSwKKyAgICBkdXBsaWNh
dGVzID0gW10sCisgICAgaSA9IDEsCisgICAgaiA9IDA7CisKKyAgICAvLyBVbmxlc3Mgd2UgKmtu
b3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlCisgICAg
aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlczsKKyAgICByZXN1bHRzLnNv
cnQoIHNvcnRPcmRlciApOworCisgICAgaWYgKCBoYXNEdXBsaWNhdGUgKSB7CisgICAgZm9yICgg
OyAoZWxlbSA9IHJlc3VsdHNbaV0pOyBpKysgKSB7CisgICAgaWYgKCBlbGVtID09PSByZXN1bHRz
WyBpIC0gMSBdICkgeworICAgIGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTsKKyAgICB9CisgICAg
fQorICAgIHdoaWxlICggai0tICkgeworICAgIHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBq
IF0sIDEgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdHM7Cit9OworCitmdW5j
dGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7CisgICAgdmFyIGN1ciA9IGIgJiYgYSwKKyAgICBk
aWZmID0gY3VyICYmICggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLSAoIH5hLnNv
dXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApOworCisgICAgLy8gVXNlIElFIHNvdXJjZUluZGV4
IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCisgICAgaWYgKCBkaWZmICkgeworICAgIHJldHVy
biBkaWZmOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGIgZm9sbG93cyBhCisgICAgaWYgKCBj
dXIgKSB7CisgICAgd2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHsKKyAgICBpZiAo
IGN1ciA9PT0gYiApIHsKKyAgICByZXR1cm4gLTE7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gYSA/IDEgOiAtMTsKK30KKworLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBp
biBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcworZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5
cGUgKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBuYW1lID0gZWxl
bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBuYW1lID09PSAiaW5wdXQiICYm
IGVsZW0udHlwZSA9PT0gdHlwZTsKKyAgICB9OworfQorCisvLyBSZXR1cm5zIGEgZnVuY3Rpb24g
dG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKK2Z1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVk
byggdHlwZSApIHsKKyAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIG5hbWUg
PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIChuYW1lID09PSAiaW5w
dXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisgICAgfTsK
K30KKworLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlv
bmFscworZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7CisgICAgcmV0dXJu
IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7CisgICAgYXJndW1lbnQgPSArYXJn
dW1lbnQ7CisgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyAp
IHsKKyAgICB2YXIgaiwKKyAgICBtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBh
cmd1bWVudCApLAorICAgIGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOworCisgICAgLy8gTWF0Y2gg
ZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCisgICAgd2hpbGUgKCBpLS0g
KSB7CisgICAgaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKKyAgICBzZWVk
W2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAg
ICB9KTsKK30KKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0
ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2RlcworICogQHBhcmFtIHtBcnJheXxFbGVt
ZW50fSBlbGVtCisgKi8KK2dldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVt
ICkgeworICAgIHZhciBub2RlLAorICAgIHJldCA9ICIiLAorICAgIGkgPSAwLAorICAgIG5vZGVU
eXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAgIGlmICggIW5vZGVUeXBlICkgeworICAgIC8vIElm
IG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5CisgICAgZm9yICgg
OyAobm9kZSA9IGVsZW1baV0pOyBpKysgKSB7CisgICAgLy8gRG8gbm90IHRyYXZlcnNlIGNvbW1l
bnQgbm9kZXMKKyAgICByZXQgKz0gZ2V0VGV4dCggbm9kZSApOworICAgIH0KKyAgICB9IGVsc2Ug
aWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEg
KSB7CisgICAgLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cworICAgIC8vIGlubmVyVGV4
dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKHNlZSAjMTExNTMp
CisgICAgaWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gInN0cmluZyIgKSB7CisgICAg
cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAvLyBUcmF2ZXJzZSBp
dHMgY2hpbGRyZW4KKyAgICBmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVt
ID0gZWxlbS5uZXh0U2libGluZyApIHsKKyAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSApOworICAg
IH0KKyAgICB9CisgICAgfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09
IDQgKSB7CisgICAgcmV0dXJuIGVsZW0ubm9kZVZhbHVlOworICAgIH0KKyAgICAvLyBEbyBub3Qg
aW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXMKKworICAgIHJl
dHVybiByZXQ7Cit9OworCitFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKworICAgIC8vIENh
biBiZSBhZGp1c3RlZCBieSB0aGUgdXNlcgorICAgIGNhY2hlTGVuZ3RoOiA1MCwKKworICAgIGNy
ZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLAorCisgICAgbWF0Y2g6IG1hdGNoRXhwciwKKworICAg
IGZpbmQ6IHt9LAorCisgICAgcmVsYXRpdmU6IHsKKyAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9k
ZSIsIGZpcnN0OiB0cnVlIH0sCisgICAgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sCisgICAg
IisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCisgICAgIn4iOiB7
IGRpcjogInByZXZpb3VzU2libGluZyIgfQorICAgIH0sCisKKyAgICBwcmVGaWx0ZXI6IHsKKyAg
ICAiQVRUUiI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKyAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJl
cGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisKKyAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2
YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAorICAgIG1hdGNoWzNd
ID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVu
ZXNjYXBlICk7CisKKyAgICBpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworICAgIG1hdGNoWzNd
ID0gIiAiICsgbWF0Y2hbM10gKyAiICI7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoLnNsaWNl
KCAwLCA0ICk7CisgICAgfSwKKworICAgICJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKyAg
ICAvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCisgICAgMSB0eXBlIChvbmx5fG50
aHwuLi4pCisgICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQorICAgIDMgYXJndW1lbnQgKGV2ZW58
b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCisgICAgNCB4bi1jb21wb25lbnQgb2YgeG4reSBh
cmd1bWVudCAoWystXT9cZCpufCkKKyAgICA1IHNpZ24gb2YgeG4tY29tcG9uZW50CisgICAgNiB4
IG9mIHhuLWNvbXBvbmVudAorICAgIDcgc2lnbiBvZiB5LWNvbXBvbmVudAorICAgIDggeSBvZiB5
LWNvbXBvbmVudAorICAgICovCisgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgp
OworCisgICAgaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKKyAgICAv
LyBudGgtKiByZXF1aXJlcyBhcmd1bWVudAorICAgIGlmICggIW1hdGNoWzNdICkgeworICAgIFNp
enpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKyAgICB9CisKKyAgICAvLyBudW1lcmljIHggYW5kIHkg
cGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTEQKKyAgICAvLyByZW1lbWJlciB0aGF0IGZh
bHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCisgICAgbWF0Y2hbNF0gPSArKCBtYXRj
aFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09ICJl
dmVuIiB8fCBtYXRjaFszXSA9PT0gIm9kZCIgKSApOworICAgIG1hdGNoWzVdID0gKyggKCBtYXRj
aFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09ICJvZGQiICk7CisKKyAgICAvLyBvdGhl
ciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMKKyAgICB9IGVsc2UgaWYgKCBtYXRjaFszXSApIHsK
KyAgICBTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNo
OworICAgIH0sCisKKyAgICAiUFNFVURPIjogZnVuY3Rpb24oIG1hdGNoICkgeworICAgIHZhciBl
eGNlc3MsCisgICAgdW5xdW90ZWQgPSAhbWF0Y2hbNV0gJiYgbWF0Y2hbMl07CisKKyAgICBpZiAo
IG1hdGNoRXhwclsiQ0hJTEQiXS50ZXN0KCBtYXRjaFswXSApICkgeworICAgIHJldHVybiBudWxs
OworICAgIH0KKworICAgIC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzCisgICAgaWYg
KCBtYXRjaFs0XSApIHsKKyAgICBtYXRjaFsyXSA9IG1hdGNoWzRdOworCisgICAgLy8gU3RyaXAg
ZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHMKKyAgICB9IGVsc2UgaWYg
KCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiYKKyAgICAvLyBHZXQgZXhj
ZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQorICAgIChleGNlc3MgPSB0b2tlbml6ZSgg
dW5xdW90ZWQsIHRydWUgKSkgJiYKKyAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3Npbmcg
cGFyZW50aGVzaXMKKyAgICAoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1b3Rl
ZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7CisKKyAgICAvLyBleGNl
c3MgaXMgYSBuZWdhdGl2ZSBpbmRleAorICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAs
IGV4Y2VzcyApOworICAgIG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwor
ICAgIH0KKworICAgIC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRv
IGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KQorICAgIHJldHVybiBtYXRjaC5zbGlj
ZSggMCwgMyApOworICAgIH0KKyAgICB9LAorCisgICAgZmlsdGVyOiB7CisKKyAgICAiVEFHIjog
ZnVuY3Rpb24oIG5vZGVOYW1lICkgeworICAgIGlmICggbm9kZU5hbWUgPT09ICIqIiApIHsKKyAg
ICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OworICAgIH0KKworICAgIG5vZGVO
YW1lID0gbm9kZU5hbWUucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2Fz
ZSgpOworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbS5ub2Rl
TmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lOworICAgIH07
CisgICAgfSwKKworICAgICJDTEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7CisgICAgdmFy
IHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKKworICAgIHJldHVybiBw
YXR0ZXJuIHx8CisgICAgKHBhdHRlcm4gPSBuZXcgUmVnRXhwKCAiKF58IiArIHdoaXRlc3BhY2Ug
KyAiKSIgKyBjbGFzc05hbWUgKyAiKCIgKyB3aGl0ZXNwYWNlICsgInwkKSIgKSkgJiYKKyAgICBj
bGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBwYXR0
ZXJuLnRlc3QoIGVsZW0uY2xhc3NOYW1lIHx8ICh0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09
IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgfHwgIiIgKTsKKyAg
ICB9KTsKKyAgICB9LAorCisgICAgIkFUVFIiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNo
ZWNrICkgeworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgcmVzdWx0ID0g
U2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTsKKworICAgIGlmICggcmVzdWx0ID09IG51bGwgKSB7
CisgICAgcmV0dXJuIG9wZXJhdG9yID09PSAiIT0iOworICAgIH0KKyAgICBpZiAoICFvcGVyYXRv
ciApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN1bHQgKz0gIiI7CisKKyAg
ICByZXR1cm4gb3BlcmF0b3IgPT09ICI9IiA/IHJlc3VsdCA9PT0gY2hlY2sgOgorICAgIG9wZXJh
dG9yID09PSAiIT0iID8gcmVzdWx0ICE9PSBjaGVjayA6CisgICAgb3BlcmF0b3IgPT09ICJePSIg
PyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6CisgICAgb3BlcmF0b3Ig
PT09ICIqPSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKyAgICBv
cGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCAp
ID09PSBjaGVjayA6CisgICAgb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiArIHJlc3VsdCArICIg
IiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CisgICAgb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1
bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBj
aGVjayArICItIiA6CisgICAgZmFsc2U7CisgICAgfTsKKyAgICB9LAorCisgICAgIkNISUxEIjog
ZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHsKKyAgICB2YXIg
c2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKKyAgICBmb3J3YXJkID0gdHlw
ZS5zbGljZSggLTQgKSAhPT0gImxhc3QiLAorICAgIG9mVHlwZSA9IHdoYXQgPT09ICJvZi10eXBl
IjsKKworICAgIHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID8KKworICAgIC8vIFNo
b3J0Y3V0IGZvciA6bnRoLSoobikKKyAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4g
ISFlbGVtLnBhcmVudE5vZGU7CisgICAgfSA6CisKKyAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4
dCwgeG1sICkgeworICAgIHZhciBjYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgZGlmZiwgbm9kZUlu
ZGV4LCBzdGFydCwKKyAgICBkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmci
IDogInByZXZpb3VzU2libGluZyIsCisgICAgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLAorICAg
IG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAorICAgIHVzZUNh
Y2hlID0gIXhtbCAmJiAhb2ZUeXBlOworCisgICAgaWYgKCBwYXJlbnQgKSB7CisKKyAgICAvLyA6
KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpCisgICAgaWYgKCBzaW1wbGUgKSB7Cisg
ICAgd2hpbGUgKCBkaXIgKSB7CisgICAgbm9kZSA9IGVsZW07CisgICAgd2hpbGUgKCAobm9kZSA9
IG5vZGVbIGRpciBdKSApIHsKKyAgICBpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dl
ckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CisgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKyAgICB9CisgICAgLy8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSog
KGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pCisgICAgc3RhcnQgPSBkaXIgPSB0eXBlID09PSAi
b25seSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisgICAgfQorICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBw
YXJlbnQubGFzdENoaWxkIF07CisKKyAgICAvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9y
ZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YAorICAgIGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSAp
IHsKKyAgICAvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXgKKyAg
ICBvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0g
e30pOworICAgIGNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdOworICAgIG5vZGVJbmRl
eCA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzFdOworICAgIGRpZmYgPSBjYWNoZVsw
XSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTsKKyAgICBub2RlID0gbm9kZUluZGV4ICYmIHBhcmVu
dC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTsKKworICAgIHdoaWxlICggKG5vZGUgPSArK25vZGVJ
bmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisKKyAgICAvLyBGYWxsYmFjayB0byBzZWVr
aW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorICAgIChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwg
c3RhcnQucG9wKCkpICkgeworCisgICAgLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBg
cGFyZW50YCBhbmQgYnJlYWsKKyAgICBpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZm
ICYmIG5vZGUgPT09IGVsZW0gKSB7CisgICAgb3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5z
LCBub2RlSW5kZXgsIGRpZmYgXTsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgLy8g
VXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCisgICAgfSBl
bHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsg
ZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKKyAg
ICBkaWZmID0gY2FjaGVbMV07CisKKyAgICAvLyB4bWwgOm50aC1jaGlsZCguLi4pIG9yIDpudGgt
bGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLikKKyAgICB9IGVsc2Ug
eworICAgIC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20g
dGhlIHN0YXJ0CisgICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9k
ZVsgZGlyIF0gfHwKKyAgICAoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSAp
IHsKKworICAgIGlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09
IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkgeworICAgIC8vIENhY2hl
IHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnQKKyAgICBpZiAoIHVzZUNhY2hl
ICkgeworICAgIChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5
cGUgXSA9IFsgZGlycnVucywgZGlmZiBdOworICAgIH0KKworICAgIGlmICggbm9kZSA9PT0gZWxl
bSApIHsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBJ
bmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQorICAg
IGRpZmYgLT0gbGFzdDsKKyAgICByZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmly
c3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsKKyAgICB9CisgICAgfTsKKyAgICB9LAor
CisgICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgeworICAgIC8vIHBz
ZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQorICAgIC8vIGh0dHA6Ly93d3cu
dzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXMKKyAgICAvLyBQcmlvcml0aXplIGJ5
IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1
cHBlcmNhc2UgbGV0dGVycworICAgIC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0
cyBmcm9tIHBzZXVkb3MKKyAgICB2YXIgYXJncywKKyAgICBmbiA9IEV4cHIucHNldWRvc1sgcHNl
dWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8CisgICAg
U2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CisKKyAgICAv
LyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CisgICAgLy8g
YXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KKyAgICAv
LyBqdXN0IGFzIFNpenpsZSBkb2VzCisgICAgaWYgKCBmblsgZXhwYW5kbyBdICkgeworICAgIHJl
dHVybiBmbiggYXJndW1lbnQgKTsKKyAgICB9CisKKyAgICAvLyBCdXQgbWFpbnRhaW4gc3VwcG9y
dCBmb3Igb2xkIHNpZ25hdHVyZXMKKyAgICBpZiAoIGZuLmxlbmd0aCA+IDEgKSB7CisgICAgYXJn
cyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOworICAgIHJldHVybiBFeHByLnNl
dEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPworICAgIG1h
cmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKKyAgICB2YXIgaWR4LAorICAg
IG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKKyAgICBpID0gbWF0Y2hlZC5sZW5ndGg7
CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRj
aGVkW2ldICk7CisgICAgc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRb
aV0gKTsKKyAgICB9CisgICAgfSkgOgorICAgIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVy
biBmbiggZWxlbSwgMCwgYXJncyApOworICAgIH07CisgICAgfQorCisgICAgcmV0dXJuIGZuOwor
ICAgIH0KKyAgICB9LAorCisgICAgcHNldWRvczogeworICAgIC8vIFBvdGVudGlhbGx5IGNvbXBs
ZXggcHNldWRvcworICAgICJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkg
eworICAgIC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCisgICAgLy8gdG8g
YXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICAvLyBzcGFjZXMgYXMgY29t
YmluYXRvcnMKKyAgICB2YXIgaW5wdXQgPSBbXSwKKyAgICByZXN1bHRzID0gW10sCisgICAgbWF0
Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICkgKTsKKworICAg
IHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gPworICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbigg
c2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgeworICAgIHZhciBlbGVtLAorICAgIHVubWF0
Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSwKKyAgICBpID0gc2VlZC5sZW5n
dGg7CisKKyAgICAvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgCisgICAg
d2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CisgICAg
c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pOworICAgIH0KKyAgICB9CisgICAgfSkgOgor
ICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgaW5wdXRbMF0gPSBlbGVt
OworICAgIG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKKyAgICByZXR1cm4g
IXJlc3VsdHMucG9wKCk7CisgICAgfTsKKyAgICB9KSwKKworICAgICJoYXMiOiBtYXJrRnVuY3Rp
b24oZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICByZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7CisgICAgfTsK
KyAgICB9KSwKKworICAgICJjb250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCAp
IHsKKyAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuICggZWxlbS50ZXh0
Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0
ZXh0ICkgPiAtMTsKKyAgICB9OworICAgIH0pLAorCisgICAgLy8gIldoZXRoZXIgYW4gZWxlbWVu
dCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3IKKyAgICAvLyBpcyBiYXNlZCBz
b2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIGJlaW5nIGVxdWFs
IHRvIHRoZSBpZGVudGlmaWVyIEMsCisgICAgLy8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50
aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAiLSIuCisgICAgLy8gVGhlIG1hdGNoaW5n
IG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBj
YXNlLWluc2Vuc2l0aXZlbHkuCisgICAgLy8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZl
IHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS4iCisgICAgLy8gaHR0cDovL3d3dy53My5vcmcv
VFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkbworICAgICJsYW5nIjogbWFya0Z1bmN0aW9uKCBmdW5j
dGlvbiggbGFuZyApIHsKKyAgICAvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlm
aWRlcgorICAgIGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCAiIikgKSB7CisgICAgU2l6
emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKKyAgICB9CisgICAgbGFu
ZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwor
ICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgZWxlbUxhbmc7CisgICAgZG8g
eworICAgIGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc1hNTCA/CisgICAgZWxlbS5nZXRBdHRy
aWJ1dGUoInhtbDpsYW5nIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSA6CisgICAgZWxl
bS5sYW5nKSApIHsKKworICAgIGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTsKKyAg
ICByZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICIt
IiApID09PSAwOworICAgIH0KKyAgICB9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUp
ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAg
ICB9KSwKKworICAgIC8vIE1pc2NlbGxhbmVvdXMKKyAgICAidGFyZ2V0IjogZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9u
Lmhhc2g7CisgICAgcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwor
ICAgIH0sCisKKyAgICAicm9vdCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBlbGVt
ID09PSBkb2NFbGVtOworICAgIH0sCisKKyAgICAiZm9jdXMiOiBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICByZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50
Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVt
LmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOworICAgIH0sCisKKyAgICAvLyBCb29sZWFuIHByb3Bl
cnRpZXMKKyAgICAiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBlbGVt
LmRpc2FibGVkID09PSBmYWxzZTsKKyAgICB9LAorCisgICAgImRpc2FibGVkIjogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CisgICAgfSwKKwor
ICAgICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gSW4gQ1NTMywgOmNoZWNr
ZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCisgICAg
Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5Mjkv
I2NoZWNrZWQKKyAgICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7
CisgICAgcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwg
KG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOworICAgIH0sCisKKyAg
ICAic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAvLyBBY2Nlc3NpbmcgdGhpcyBw
cm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CisgICAgLy8gb3B0aW9ucyBpbiBTYWZh
cmkgd29yayBwcm9wZXJseQorICAgIGlmICggZWxlbS5wYXJlbnROb2RlICkgeworICAgIGVsZW0u
cGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworICAgIH0KKworICAgIHJldHVybiBlbGVtLnNlbGVj
dGVkID09PSB0cnVlOworICAgIH0sCisKKyAgICAvLyBDb250ZW50cworICAgICJlbXB0eSI6IGZ1
bmN0aW9uKCBlbGVtICkgeworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8j
ZW1wdHktcHNldWRvCisgICAgLy8gOmVtcHR5IGlzIG9ubHkgYWZmZWN0ZWQgYnkgZWxlbWVudCBu
b2RlcyBhbmQgY29udGVudCBub2RlcyhpbmNsdWRpbmcgdGV4dCgzKSwgY2RhdGEoNCkpLAorICAg
IC8vICAgbm90IGNvbW1lbnQsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBvciBvdGhlcnMKKyAg
ICAvLyBUaGFua3MgdG8gRGllZ28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXQKKyAg
ICAvLyAgIEdyZWF0ZXIgdGhhbiAiQCIgbWVhbnMgYWxwaGEgY2hhcmFjdGVycyAoc3BlY2lmaWNh
bGx5IG5vdCBzdGFydGluZyB3aXRoICIjIiBvciAiPyIpCisgICAgZm9yICggZWxlbSA9IGVsZW0u
Zmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7CisgICAgaWYgKCBl
bGVtLm5vZGVOYW1lID4gIkAiIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlw
ZSA9PT0gNCApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9LAorCisgICAgInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJl
dHVybiAhRXhwci5wc2V1ZG9zWyJlbXB0eSJdKCBlbGVtICk7CisgICAgfSwKKworICAgIC8vIEVs
ZW1lbnQvaW5wdXQgdHlwZXMKKyAgICAiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOworICAgIH0sCisKKyAgICAiaW5w
dXQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5v
ZGVOYW1lICk7CisgICAgfSwKKworICAgICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gbmFt
ZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0
b24iOworICAgIH0sCisKKyAgICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBh
dHRyOworICAgIC8vIElFNiBhbmQgNyB3aWxsIG1hcCBlbGVtLnR5cGUgdG8gJ3RleHQnIGZvciBu
ZXcgSFRNTDUgdHlwZXMgKHNlYXJjaCwgZXRjKQorICAgIC8vIHVzZSBnZXRBdHRyaWJ1dGUgaW5z
dGVhZCB0byB0ZXN0IHRoaXMgY2FzZQorICAgIHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJD
YXNlKCkgPT09ICJpbnB1dCIgJiYKKyAgICBlbGVtLnR5cGUgPT09ICJ0ZXh0IiAmJgorICAgICgg
KGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dl
ckNhc2UoKSA9PT0gZWxlbS50eXBlICk7CisgICAgfSwKKworICAgIC8vIFBvc2l0aW9uLWluLWNv
bGxlY3Rpb24KKyAgICAiZmlyc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiBbIDAgXTsKKyAgICB9KSwKKworICAgICJsYXN0IjogY3JlYXRlUG9zaXRp
b25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgcmV0dXJu
IFsgbGVuZ3RoIC0gMSBdOworICAgIH0pLAorCisgICAgImVxIjogY3JlYXRlUG9zaXRpb25hbFBz
ZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworICAgIHJl
dHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKKyAg
ICB9KSwKKworICAgICJldmVuIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0
Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgdmFyIGkgPSAwOworICAgIGZvciAoIDsgaSA8IGxl
bmd0aDsgaSArPSAyICkgeworICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgfQorICAg
IHJldHVybiBtYXRjaEluZGV4ZXM7CisgICAgfSksCisKKyAgICAib2RkIjogY3JlYXRlUG9zaXRp
b25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgdmFyIGkg
PSAxOworICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgeworICAgIG1hdGNoSW5kZXhl
cy5wdXNoKCBpICk7CisgICAgfQorICAgIHJldHVybiBtYXRjaEluZGV4ZXM7CisgICAgfSksCisK
KyAgICAibHQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMs
IGxlbmd0aCwgYXJndW1lbnQgKSB7CisgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVu
dCArIGxlbmd0aCA6IGFyZ3VtZW50OworICAgIGZvciAoIDsgLS1pID49IDA7ICkgeworICAgIG1h
dGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgfQorICAgIHJldHVybiBtYXRjaEluZGV4ZXM7Cisg
ICAgfSksCisKKyAgICAiZ3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRj
aEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7CisgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAg
PyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OworICAgIGZvciAoIDsgKytpIDwgbGVuZ3Ro
OyApIHsKKyAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOworICAgIH0KKyAgICByZXR1cm4gbWF0
Y2hJbmRleGVzOworICAgIH0pCisgICAgfQorfTsKKworLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBl
IHBzZXVkb3MKK2ZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6
IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgeworICAgIEV4cHIucHNldWRv
c1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTsKK30KK2ZvciAoIGkgaW4geyBzdWJtaXQ6
IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CisgICAgRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVC
dXR0b25Qc2V1ZG8oIGkgKTsKK30KKworZnVuY3Rpb24gdG9rZW5pemUoIHNlbGVjdG9yLCBwYXJz
ZU9ubHkgKSB7CisgICAgdmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsCisgICAgc29G
YXIsIGdyb3VwcywgcHJlRmlsdGVycywKKyAgICBjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3Rv
ciArICIgIiBdOworCisgICAgaWYgKCBjYWNoZWQgKSB7CisgICAgcmV0dXJuIHBhcnNlT25seSA/
IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTsKKyAgICB9CisKKyAgICBzb0ZhciA9IHNlbGVjdG9yOwor
ICAgIGdyb3VwcyA9IFtdOworICAgIHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKKworICAg
IHdoaWxlICggc29GYXIgKSB7CisKKyAgICAvLyBDb21tYSBhbmQgZmlyc3QgcnVuCisgICAgaWYg
KCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CisgICAgaWYg
KCBtYXRjaCApIHsKKyAgICAvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxp
ZAorICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOwor
ICAgIH0KKyAgICBncm91cHMucHVzaCggdG9rZW5zID0gW10gKTsKKyAgICB9CisKKyAgICBtYXRj
aGVkID0gZmFsc2U7CisKKyAgICAvLyBDb21iaW5hdG9ycworICAgIGlmICggKG1hdGNoID0gcmNv
bWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkgeworICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgp
OworICAgIHRva2Vucy5wdXNoKCB7CisgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgLy8gQ2FzdCBk
ZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCisgICAgdHlwZTogbWF0Y2hbMF0ucmVwbGFj
ZSggcnRyaW0sICIgIiApCisgICAgfSApOworICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNo
ZWQubGVuZ3RoICk7CisgICAgfQorCisgICAgLy8gRmlsdGVycworICAgIGZvciAoIHR5cGUgaW4g
RXhwci5maWx0ZXIgKSB7CisgICAgaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVj
KCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAorICAgIChtYXRjaCA9IHByZUZp
bHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgeworICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgp
OworICAgIHRva2Vucy5wdXNoKCB7CisgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgdHlwZTogdHlw
ZSwKKyAgICBtYXRjaGVzOiBtYXRjaAorICAgIH0gKTsKKyAgICBzb0ZhciA9IHNvRmFyLnNsaWNl
KCBtYXRjaGVkLmxlbmd0aCApOworICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFtYXRjaGVkICkg
eworICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBv
ZiB0aGUgaW52YWxpZCBleGNlc3MKKyAgICAvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmcKKyAgICAv
LyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnMKKyAgICByZXR1cm4g
cGFyc2VPbmx5ID8KKyAgICBzb0Zhci5sZW5ndGggOgorICAgIHNvRmFyID8KKyAgICBTaXp6bGUu
ZXJyb3IoIHNlbGVjdG9yICkgOgorICAgIC8vIENhY2hlIHRoZSB0b2tlbnMKKyAgICB0b2tlbkNh
Y2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKK30KKworZnVuY3Rpb24gdG9TZWxl
Y3RvciggdG9rZW5zICkgeworICAgIHZhciBpID0gMCwKKyAgICBsZW4gPSB0b2tlbnMubGVuZ3Ro
LAorICAgIHNlbGVjdG9yID0gIiI7CisgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAg
c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gc2VsZWN0b3I7
Cit9CisKK2Z1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2Ug
KSB7CisgICAgdmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLAorICAgIGNoZWNrTm9uRWxlbWVudHMg
PSBiYXNlICYmIGRpciA9PT0gInBhcmVudE5vZGUiLAorICAgIGRvbmVOYW1lID0gZG9uZSsrOwor
CisgICAgcmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgPworICAgIC8vIENoZWNrIGFnYWluc3QgY2xv
c2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudAorICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250
ZXh0LCB4bWwgKSB7CisgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBp
ZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICByZXR1
cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7CisgICAgfQorICAgIH0KKyAgICB9IDoK
KworICAgIC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwor
ICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGRhdGEsIGNhY2hl
LCBvdXRlckNhY2hlLAorICAgIGRpcmtleSA9IGRpcnJ1bnMgKyAiICIgKyBkb25lTmFtZTsKKwor
ICAgIC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkg
ZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nCisgICAgaWYgKCB4bWwgKSB7CisgICAgd2hp
bGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICBpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRl
eHQsIHhtbCApICkgeworICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAg
IH0gZWxzZSB7CisgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBpZiAo
IGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICBvdXRlckNh
Y2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSk7CisgICAgaWYg
KCAoY2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiYgY2FjaGVbMF0gPT09IGRpcmtleSApIHsK
KyAgICBpZiAoIChkYXRhID0gY2FjaGVbMV0pID09PSB0cnVlIHx8IGRhdGEgPT09IGNhY2hlZHJ1
bnMgKSB7CisgICAgcmV0dXJuIGRhdGEgPT09IHRydWU7CisgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgY2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSA9IFsgZGlya2V5IF07CisgICAgY2FjaGVbMV0g
PSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB8fCBjYWNoZWRydW5zOworICAgIGlmICgg
Y2FjaGVbMV0gPT09IHRydWUgKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAg
ICB9CisgICAgfQorICAgIH0KKyAgICB9OworfQorCitmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcigg
bWF0Y2hlcnMgKSB7CisgICAgcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPworICAgIGZ1bmN0
aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7
CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRl
eHQsIHhtbCApICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfQorICAgIHJldHVy
biB0cnVlOworICAgIH0gOgorICAgIG1hdGNoZXJzWzBdOworfQorCitmdW5jdGlvbiBjb25kZW5z
ZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkgeworICAgIHZhciBlbGVt
LAorICAgIG5ld1VubWF0Y2hlZCA9IFtdLAorICAgIGkgPSAwLAorICAgIGxlbiA9IHVubWF0Y2hl
ZC5sZW5ndGgsCisgICAgbWFwcGVkID0gbWFwICE9IG51bGw7CisKKyAgICBmb3IgKCA7IGkgPCBs
ZW47IGkrKyApIHsKKyAgICBpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKKyAgICBpZiAo
ICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICBuZXdVbm1h
dGNoZWQucHVzaCggZWxlbSApOworICAgIGlmICggbWFwcGVkICkgeworICAgIG1hcC5wdXNoKCBp
ICk7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld1VubWF0Y2hl
ZDsKK30KKworZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hl
ciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgeworICAgIGlmICggcG9z
dEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkgeworICAgIHBvc3RGaWx0ZXIgPSBz
ZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7CisgICAgfQorICAgIGlmICggcG9zdEZpbmRlciAmJiAh
cG9zdEZpbmRlclsgZXhwYW5kbyBdICkgeworICAgIHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBw
b3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKKyAgICB9CisgICAgcmV0dXJuIG1hcmtGdW5jdGlv
bihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgeworICAgIHZhciB0ZW1w
LCBpLCBlbGVtLAorICAgIHByZU1hcCA9IFtdLAorICAgIHBvc3RNYXAgPSBbXSwKKyAgICBwcmVl
eGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLAorCisgICAgLy8gR2V0IGluaXRpYWwgZWxlbWVudHMg
ZnJvbSBzZWVkIG9yIGNvbnRleHQKKyAgICBlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0
cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250
ZXh0LCBbXSApLAorCisgICAgLy8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVz
ZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uCisgICAgbWF0Y2hl
ckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisgICAgY29uZGVuc2Uo
IGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorICAgIGVsZW1zLAor
CisgICAgbWF0Y2hlck91dCA9IG1hdGNoZXIgPworICAgIC8vIElmIHdlIGhhdmUgYSBwb3N0Rmlu
ZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0
aW5nIHJlc3VsdHMsCisgICAgcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVl
eGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPworCisgICAgLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nl
c3NpbmcgaXMgbmVjZXNzYXJ5CisgICAgW10gOgorCisgICAgLy8gLi4ub3RoZXJ3aXNlIHVzZSBy
ZXN1bHRzIGRpcmVjdGx5CisgICAgcmVzdWx0cyA6CisgICAgbWF0Y2hlckluOworCisgICAgLy8g
RmluZCBwcmltYXJ5IG1hdGNoZXMKKyAgICBpZiAoIG1hdGNoZXIgKSB7CisgICAgbWF0Y2hlcigg
bWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTsKKyAgICB9CisKKyAgICAvLyBB
cHBseSBwb3N0RmlsdGVyCisgICAgaWYgKCBwb3N0RmlsdGVyICkgeworICAgIHRlbXAgPSBjb25k
ZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApOworICAgIHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBj
b250ZXh0LCB4bWwgKTsKKworICAgIC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92
aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KKyAgICBpID0gdGVtcC5sZW5ndGg7CisgICAgd2hp
bGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgeworICAgIG1hdGNoZXJP
dXRbIHBvc3RNYXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKyAg
ICB9CisgICAgfQorICAgIH0KKworICAgIGlmICggc2VlZCApIHsKKyAgICBpZiAoIHBvc3RGaW5k
ZXIgfHwgcHJlRmlsdGVyICkgeworICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAgICAvLyBHZXQg
dGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRv
IHBvc3RGaW5kZXIgY29udGV4dHMKKyAgICB0ZW1wID0gW107CisgICAgaSA9IG1hdGNoZXJPdXQu
bGVuZ3RoOworICAgIHdoaWxlICggaS0tICkgeworICAgIGlmICggKGVsZW0gPSBtYXRjaGVyT3V0
W2ldKSApIHsKKyAgICAvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQg
YSBmaW5hbCBtYXRjaAorICAgIHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7Cisg
ICAgfQorICAgIH0KKyAgICBwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVt
cCwgeG1sICk7CisgICAgfQorCisgICAgLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2Vl
ZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKKyAgICBpID0gbWF0Y2hlck91
dC5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IG1hdGNoZXJP
dXRbaV0pICYmCisgICAgKHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZi5jYWxsKCBzZWVkLCBl
bGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CisKKyAgICBzZWVkW3RlbXBdID0gIShyZXN1bHRz
W3RlbXBdID0gZWxlbSk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgZWxlbWVu
dHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWQKKyAgICB9IGVsc2Ug
eworICAgIG1hdGNoZXJPdXQgPSBjb25kZW5zZSgKKyAgICBtYXRjaGVyT3V0ID09PSByZXN1bHRz
ID8KKyAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3Ro
ICkgOgorICAgIG1hdGNoZXJPdXQKKyAgICApOworICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAg
ICBwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKKyAgICB9IGVs
c2UgeworICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKKyAgICB9CisgICAg
fQorICAgIH0pOworfQorCitmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewor
ICAgIHZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosCisgICAgbGVuID0gdG9rZW5zLmxlbmd0
aCwKKyAgICBsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBd
LAorICAgIGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2
ZVsiICJdLAorICAgIGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCwKKworICAgIC8vIFRoZSBm
b3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBm
cm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCisgICAgbWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRv
ciggZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsK
KyAgICB9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCisgICAgbWF0Y2hBbnlDb250ZXh0ID0g
YWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGluZGV4T2YuY2Fs
bCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTsKKyAgICB9LCBpbXBsaWNpdFJlbGF0aXZlLCB0
cnVlICksCisgICAgbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7
CisgICAgcmV0dXJuICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBv
dXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoCisgICAgKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5v
ZGVUeXBlID8KKyAgICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoKKyAgICBt
YXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7CisgICAgfSBdOworCisgICAg
Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRp
dmVbIHRva2Vuc1tpXS50eXBlIF0pICkgeworICAgIG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9y
KGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdOworICAgIH0gZWxzZSB7Cisg
ICAgbWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0
b2tlbnNbaV0ubWF0Y2hlcyApOworCisgICAgLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcg
YSBwb3NpdGlvbmFsIG1hdGNoZXIKKyAgICBpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKKyAg
ICAvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIg
aGFuZGxpbmcKKyAgICBqID0gKytpOworICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgeworICAg
IGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKyAgICBicmVhazsKKyAg
ICB9CisgICAgfQorICAgIHJldHVybiBzZXRNYXRjaGVyKAorICAgIGkgPiAxICYmIGVsZW1lbnRN
YXRjaGVyKCBtYXRjaGVycyApLAorICAgIGkgPiAxICYmIHRvU2VsZWN0b3IoIHRva2Vucy5zbGlj
ZSggMCwgaSAtIDEgKSApLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCisgICAgbWF0Y2hlciwKKyAg
ICBpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKKyAg
ICBqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBq
ICkpICksCisgICAgaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQorICAgICk7CisgICAg
fQorICAgIG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRjaGVyRnJv
bUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7CisgICAgLy8g
QSBjb3VudGVyIHRvIHNwZWNpZnkgd2hpY2ggZWxlbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgbWF0
Y2hlZAorICAgIHZhciBtYXRjaGVyQ2FjaGVkUnVucyA9IDAsCisgICAgYnlTZXQgPSBzZXRNYXRj
aGVycy5sZW5ndGggPiAwLAorICAgIGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGgg
PiAwLAorICAgIHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJl
c3VsdHMsIGV4cGFuZENvbnRleHQgKSB7CisgICAgdmFyIGVsZW0sIGosIG1hdGNoZXIsCisgICAg
c2V0TWF0Y2hlZCA9IFtdLAorICAgIG1hdGNoZWRDb3VudCA9IDAsCisgICAgaSA9ICIwIiwKKyAg
ICB1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAorICAgIG91dGVybW9zdCA9IGV4cGFuZENvbnRleHQg
IT0gbnVsbCwKKyAgICBjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKyAgICAvLyBX
ZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIGNvbnRleHQKKyAgICBl
bGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgZXhwYW5k
Q29udGV4dCAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCApLAorICAgIC8vIFVzZSBp
bnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisgICAgZGly
cnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRo
LnJhbmRvbSgpIHx8IDAuMSk7CisKKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBvdXRlcm1v
c3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKKyAgICBjYWNoZWRy
dW5zID0gbWF0Y2hlckNhY2hlZFJ1bnM7CisgICAgfQorCisgICAgLy8gQWRkIGVsZW1lbnRzIHBh
c3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKKyAgICAvLyBLZWVwIGBp
YCBhIHN0cmluZyBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgc28gYG1hdGNoZWRDb3VudGAgd2ls
bCBiZSAiMDAiIGJlbG93CisgICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBp
KysgKSB7CisgICAgaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKKyAgICBqID0gMDsKKyAgICB3
aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkgeworICAgIGlmICggbWF0
Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CisgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7
CisgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBk
aXJydW5zID0gZGlycnVuc1VuaXF1ZTsKKyAgICBjYWNoZWRydW5zID0gKyttYXRjaGVyQ2FjaGVk
UnVuczsKKyAgICB9CisgICAgfQorCisgICAgLy8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZv
ciBzZXQgZmlsdGVycworICAgIGlmICggYnlTZXQgKSB7CisgICAgLy8gVGhleSB3aWxsIGhhdmUg
Z29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycworICAgIGlmICggKGVsZW0gPSAhbWF0
Y2hlciAmJiBlbGVtKSApIHsKKyAgICBtYXRjaGVkQ291bnQtLTsKKyAgICB9CisKKyAgICAvLyBM
ZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CisgICAg
aWYgKCBzZWVkICkgeworICAgIHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7CisgICAgfQorICAgIH0K
KyAgICB9CisKKyAgICAvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHMK
KyAgICBtYXRjaGVkQ291bnQgKz0gaTsKKyAgICBpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRD
b3VudCApIHsKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNb
aisrXSkgKSB7CisgICAgbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4
bWwgKTsKKyAgICB9CisKKyAgICBpZiAoIHNlZWQgKSB7CisgICAgLy8gUmVpbnRlZ3JhdGUgZWxl
bWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZworICAgIGlmICgg
bWF0Y2hlZENvdW50ID4gMCApIHsKKyAgICB3aGlsZSAoIGktLSApIHsKKyAgICBpZiAoICEodW5t
YXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgeworICAgIHNldE1hdGNoZWRbaV0gPSBwb3Au
Y2FsbCggcmVzdWx0cyApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gRGlzY2FyZCBp
bmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXMKKyAgICBz
ZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsKKyAgICB9CisKKyAgICAvLyBBZGQg
bWF0Y2hlcyB0byByZXN1bHRzCisgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCAp
OworCisgICAgLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNj
ZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nCisgICAgaWYgKCBvdXRlcm1vc3QgJiYg
IXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmCisgICAgKCBtYXRjaGVkQ291bnQgKyBz
ZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7CisKKyAgICBTaXp6bGUudW5pcXVlU29ydCggcmVz
dWx0cyApOworICAgIH0KKyAgICB9CisKKyAgICAvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2Yg
Z2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBk
aXJydW5zID0gZGlycnVuc1VuaXF1ZTsKKyAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJh
Y2t1cDsKKyAgICB9CisKKyAgICByZXR1cm4gdW5tYXRjaGVkOworICAgIH07CisKKyAgICByZXR1
cm4gYnlTZXQgPworICAgIG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOgorICAgIHN1cGVy
TWF0Y2hlcjsKK30KKworY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVj
dG9yLCBncm91cCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKKyAgICB2YXIgaSwKKyAgICBz
ZXRNYXRjaGVycyA9IFtdLAorICAgIGVsZW1lbnRNYXRjaGVycyA9IFtdLAorICAgIGNhY2hlZCA9
IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CisKKyAgICBpZiAoICFjYWNoZWQgKSB7
CisgICAgLy8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQg
Y2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50CisgICAgaWYgKCAhZ3JvdXAgKSB7Cisg
ICAgZ3JvdXAgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKKyAgICB9CisgICAgaSA9IGdyb3VwLmxl
bmd0aDsKKyAgICB3aGlsZSAoIGktLSApIHsKKyAgICBjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2Vu
cyggZ3JvdXBbaV0gKTsKKyAgICBpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgeworICAgIHNldE1h
dGNoZXJzLnB1c2goIGNhY2hlZCApOworICAgIH0gZWxzZSB7CisgICAgZWxlbWVudE1hdGNoZXJz
LnB1c2goIGNhY2hlZCApOworICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWNoZSB0aGUgY29tcGls
ZWQgZnVuY3Rpb24KKyAgICBjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hl
ckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKKyAg
ICB9CisgICAgcmV0dXJuIGNhY2hlZDsKK307CisKK2Z1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMo
IHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgbGVu
ID0gY29udGV4dHMubGVuZ3RoOworICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworICAgIFNp
enpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7CisgICAgfQorICAgIHJldHVy
biByZXN1bHRzOworfQorCitmdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1
bHRzLCBzZWVkICkgeworICAgIHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLAorICAg
IG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CisKKyAgICBpZiAoICFzZWVkICkgeworICAg
IC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3Vw
CisgICAgaWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7CisKKyAgICAvLyBUYWtlIGEgc2hvcnRj
dXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRAorICAg
IHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKKyAgICBpZiAoIHRva2Vu
cy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgorICAg
IGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWRvY3VtZW50SXNYTUwgJiYKKyAgICBFeHByLnJl
bGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgeworCisgICAgY29udGV4dCA9IEV4cHIuZmluZFsi
SUQiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLCBj
b250ZXh0IClbMF07CisgICAgaWYgKCAhY29udGV4dCApIHsKKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgICB9CisKKyAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52
YWx1ZS5sZW5ndGggKTsKKyAgICB9CisKKyAgICAvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdo
dC10by1sZWZ0IG1hdGNoaW5nCisgICAgaSA9IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVz
dCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoOworICAgIHdoaWxlICggaS0tICkgewor
ICAgIHRva2VuID0gdG9rZW5zW2ldOworCisgICAgLy8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmlu
YXRvcgorICAgIGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewor
ICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkg
eworICAgIC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBj
b21iaW5hdG9ycworICAgIGlmICggKHNlZWQgPSBmaW5kKAorICAgIHRva2VuLm1hdGNoZXNbMF0u
cmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSwKKyAgICByc2libGluZy50ZXN0KCB0b2tl
bnNbMF0udHlwZSApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0CisgICAgKSkgKSB7
CisKKyAgICAvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiBy
ZXR1cm4gZWFybHkKKyAgICB0b2tlbnMuc3BsaWNlKCBpLCAxICk7CisgICAgc2VsZWN0b3IgPSBz
ZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKKyAgICBpZiAoICFzZWxlY3RvciAp
IHsKKyAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKCBzZWVkLCAwICkgKTsKKyAg
ICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAg
IH0KKyAgICB9CisgICAgfQorCisgICAgLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmlu
ZyBmdW5jdGlvbgorICAgIC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlv
biBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKyAgICBjb21waWxlKCBzZWxlY3Rv
ciwgbWF0Y2ggKSgKKyAgICBzZWVkLAorICAgIGNvbnRleHQsCisgICAgZG9jdW1lbnRJc1hNTCwK
KyAgICByZXN1bHRzLAorICAgIHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkKKyAgICApOworICAg
IHJldHVybiByZXN1bHRzOworfQorCisvLyBEZXByZWNhdGVkCitFeHByLnBzZXVkb3NbIm50aCJd
ID0gRXhwci5wc2V1ZG9zWyJlcSJdOworCisvLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNl
dEZpbHRlcnMKK2Z1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQorRXhwci5maWx0ZXJzID0gc2V0Rmls
dGVycy5wcm90b3R5cGUgPSBFeHByLnBzZXVkb3M7CitFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0
RmlsdGVycygpOworCisvLyBJbml0aWFsaXplIHdpdGggdGhlIGRlZmF1bHQgZG9jdW1lbnQKK3Nl
dERvY3VtZW50KCk7CisKKy8vIE92ZXJyaWRlIHNpenpsZSBhdHRyaWJ1dGUgcmV0cmlldmFsCitT
aXp6bGUuYXR0ciA9IGpRdWVyeS5hdHRyOworalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnku
ZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIu
cHNldWRvczsKK2pRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0
ID0gU2l6emxlLmdldFRleHQ7CitqUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVl
cnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7CisKKworfSkoIHdpbmRvdyApOwordmFyIHJ1
bnRpbCA9IC9VbnRpbCQvLAorICAgIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86
VW50aWx8QWxsKSkvLAorICAgIGlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKKyAgICBybmVl
ZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LAorICAgIC8vIG1ldGhv
ZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20g
YSB1bmlxdWUgc2V0CisgICAgZ3VhcmFudGVlZFVuaXF1ZSA9IHsKKyAgICBjaGlsZHJlbjogdHJ1
ZSwKKyAgICBjb250ZW50czogdHJ1ZSwKKyAgICBuZXh0OiB0cnVlLAorICAgIHByZXY6IHRydWUK
KyAgICB9OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBmaW5kOiBmdW5jdGlvbiggc2VsZWN0
b3IgKSB7CisgICAgdmFyIGksIHJldCwgc2VsZiwKKyAgICBsZW4gPSB0aGlzLmxlbmd0aDsKKwor
ICAgIGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKyAgICBzZWxmID0gdGhp
czsKKyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIo
ZnVuY3Rpb24oKSB7CisgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBpZiAo
IGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CisgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIH0KKyAgICB9KSApOworICAgIH0KKworICAgIHJldCA9IFtdOworICAgIGZv
ciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0
aGlzWyBpIF0sIHJldCApOworICAgIH0KKworICAgIC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVj
dG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKQorICAg
IHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiBy
ZXQgKTsKKyAgICByZXQuc2VsZWN0b3IgPSAoIHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9y
ICsgIiAiIDogIiIgKSArIHNlbGVjdG9yOworICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAg
IGhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKKyAgICB2YXIgaSwKKyAgICB0YXJnZXRzID0galF1
ZXJ5KCB0YXJnZXQsIHRoaXMgKSwKKyAgICBsZW4gPSB0YXJnZXRzLmxlbmd0aDsKKworICAgIHJl
dHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsg
aSsrICkgeworICAgIGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7
CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAgICB9LAorCisgICAg
bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3
aW5ub3codGhpcywgc2VsZWN0b3IsIGZhbHNlKSApOworICAgIH0sCisKKyAgICBmaWx0ZXI6IGZ1
bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0
aGlzLCBzZWxlY3RvciwgdHJ1ZSkgKTsKKyAgICB9LAorCisgICAgaXM6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKKyAgICByZXR1cm4gISFzZWxlY3RvciAmJiAoCisgICAgdHlwZW9mIHNlbGVjdG9y
ID09PSAic3RyaW5nIiA/CisgICAgLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUg
c2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldAorICAgIC8vIHNv
ICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdp
dGggdHdvICJwIi4KKyAgICBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPworICAgIGpR
dWVyeSggc2VsZWN0b3IsIHRoaXMuY29udGV4dCApLmluZGV4KCB0aGlzWzBdICkgPj0gMCA6Cisg
ICAgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKKyAgICB0aGlz
LmZpbHRlciggc2VsZWN0b3IgKS5sZW5ndGggPiAwICk7CisgICAgfSwKKworICAgIGNsb3Nlc3Q6
IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CisgICAgdmFyIGN1ciwKKyAgICBpID0g
MCwKKyAgICBsID0gdGhpcy5sZW5ndGgsCisgICAgcmV0ID0gW10sCisgICAgcG9zID0gcm5lZWRz
Q29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5n
IiA/CisgICAgalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgor
ICAgIDA7CisKKyAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisgICAgY3VyID0gdGhpc1tpXTsK
KworICAgIHdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4
dCAmJiBjdXIubm9kZVR5cGUgIT09IDExICkgeworICAgIGlmICggcG9zID8gcG9zLmluZGV4KGN1
cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykgKSB7
CisgICAgcmV0LnB1c2goIGN1ciApOworICAgIGJyZWFrOworICAgIH0KKyAgICBjdXIgPSBjdXIu
cGFyZW50Tm9kZTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBy
ZXQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7CisgICAgfSwKKwor
ICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KKyAgICAv
LyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKKyAgICBpbmRleDogZnVuY3Rpb24oIGVsZW0g
KSB7CisKKyAgICAvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudAorICAgIGlm
ICggIWVsZW0gKSB7CisgICAgcmV0dXJuICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUg
KSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CisgICAgfQorCisgICAgLy8g
aW5kZXggaW4gc2VsZWN0b3IKKyAgICBpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsK
KyAgICByZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7Cisg
ICAgfQorCisgICAgLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50
CisgICAgcmV0dXJuIGpRdWVyeS5pbkFycmF5KAorICAgIC8vIElmIGl0IHJlY2VpdmVzIGEgalF1
ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorICAgIGVsZW0uanF1ZXJ5ID8g
ZWxlbVswXSA6IGVsZW0sIHRoaXMgKTsKKyAgICB9LAorCisgICAgYWRkOiBmdW5jdGlvbiggc2Vs
ZWN0b3IsIGNvbnRleHQgKSB7CisgICAgdmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gInN0
cmluZyIgPworICAgIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CisgICAgalF1ZXJ5Lm1h
a2VBcnJheSggc2VsZWN0b3IgJiYgc2VsZWN0b3Iubm9kZVR5cGUgPyBbIHNlbGVjdG9yIF0gOiBz
ZWxlY3RvciApLAorICAgIGFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CisK
KyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoYWxsKSApOworICAgIH0s
CisKKyAgICBhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgcmV0dXJuIHRoaXMu
YWRkKCBzZWxlY3RvciA9PSBudWxsID8KKyAgICB0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZP
YmplY3QuZmlsdGVyKHNlbGVjdG9yKQorICAgICk7CisgICAgfQorfSk7CisKK2pRdWVyeS5mbi5h
bmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7CisKK2Z1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGly
ICkgeworICAgIGRvIHsKKyAgICBjdXIgPSBjdXJbIGRpciBdOworICAgIH0gd2hpbGUgKCBjdXIg
JiYgY3VyLm5vZGVUeXBlICE9PSAxICk7CisKKyAgICByZXR1cm4gY3VyOworfQorCitqUXVlcnku
ZWFjaCh7CisgICAgcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgcGFyZW50ID0g
ZWxlbS5wYXJlbnROb2RlOworICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9
PSAxMSA/IHBhcmVudCA6IG51bGw7CisgICAgfSwKKyAgICBwYXJlbnRzOiBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiICk7CisgICAg
fSwKKyAgICBwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICBy
ZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOworICAgIH0sCisg
ICAgbmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJu
ZXh0U2libGluZyIgKTsKKyAgICB9LAorICAgIHByZXY6IGZ1bmN0aW9uKCBlbGVtICkgeworICAg
IHJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAgIH0sCisgICAg
bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0s
ICJuZXh0U2libGluZyIgKTsKKyAgICB9LAorICAgIHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAg
IH0sCisgICAgbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisgICAgcmV0
dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAg
ICBwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICByZXR1cm4galF1
ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAgICBz
aWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAo
IGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTsKKyAgICB9LAorICAg
IGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4galF1ZXJ5LnNpYmxpbmco
IGVsZW0uZmlyc3RDaGlsZCApOworICAgIH0sCisgICAgY29udGVudHM6IGZ1bmN0aW9uKCBlbGVt
ICkgeworICAgIHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgPworICAg
IGVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6Cisg
ICAgalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7CisgICAgfQorfSwgZnVuY3Rp
b24oIG5hbWUsIGZuICkgeworICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGls
LCBzZWxlY3RvciApIHsKKyAgICB2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGls
ICk7CisKKyAgICBpZiAoICFydW50aWwudGVzdCggbmFtZSApICkgeworICAgIHNlbGVjdG9yID0g
dW50aWw7CisgICAgfQorCisgICAgaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09
ICJzdHJpbmciICkgeworICAgIHJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsK
KyAgICB9CisKKyAgICByZXQgPSB0aGlzLmxlbmd0aCA+IDEgJiYgIWd1YXJhbnRlZWRVbmlxdWVb
IG5hbWUgXSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0OworCisgICAgaWYgKCB0aGlzLmxl
bmd0aCA+IDEgJiYgcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKKyAgICByZXQgPSByZXQu
cmV2ZXJzZSgpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7Cisg
ICAgfTsKK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBleHBy
LCBlbGVtcywgbm90ICkgeworICAgIGlmICggbm90ICkgeworICAgIGV4cHIgPSAiOm5vdCgiICsg
ZXhwciArICIpIjsKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KKyAg
ICBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoZWxlbXNbMF0sIGV4cHIpID8gWyBlbGVtc1sw
XSBdIDogW10gOgorICAgIGpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOworICAgIH0s
CisKKyAgICBkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgeworICAgIHZhciBtYXRj
aGVkID0gW10sCisgICAgY3VyID0gZWxlbVsgZGlyIF07CisKKyAgICB3aGlsZSAoIGN1ciAmJiBj
dXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBl
ICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKKyAgICBpZiAoIGN1ci5u
b2RlVHlwZSA9PT0gMSApIHsKKyAgICBtYXRjaGVkLnB1c2goIGN1ciApOworICAgIH0KKyAgICBj
dXIgPSBjdXJbZGlyXTsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoZWQ7CisgICAgfSwKKworICAg
IHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgeworICAgIHZhciByID0gW107CisKKyAgICBm
b3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgeworICAgIGlmICggbi5ub2RlVHlwZSA9PT0g
MSAmJiBuICE9PSBlbGVtICkgeworICAgIHIucHVzaCggbiApOworICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gcjsKKyAgICB9Cit9KTsKKworLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVu
Y3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QKK2Z1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMs
IHF1YWxpZmllciwga2VlcCApIHsKKworICAgIC8vIENhbid0IHBhc3MgbnVsbCBvciB1bmRlZmlu
ZWQgdG8gaW5kZXhPZiBpbiBGaXJlZm94IDQKKyAgICAvLyBTZXQgdG8gMCB0byBza2lwIHN0cmlu
ZyBjaGVjaworICAgIHF1YWxpZmllciA9IHF1YWxpZmllciB8fCAwOworCisgICAgaWYgKCBqUXVl
cnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5ncmVwKGVs
ZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKyAgICB2YXIgcmV0VmFsID0gISFxdWFsaWZp
ZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApOworICAgIHJldHVybiByZXRWYWwgPT09IGtlZXA7Cisg
ICAgfSk7CisKKyAgICB9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CisgICAgcmV0
dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4g
KCBlbGVtID09PSBxdWFsaWZpZXIgKSA9PT0ga2VlcDsKKyAgICB9KTsKKworICAgIH0gZWxzZSBp
ZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgeworICAgIHZhciBmaWx0ZXJlZCA9
IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxl
bS5ub2RlVHlwZSA9PT0gMTsKKyAgICB9KTsKKworICAgIGlmICggaXNTaW1wbGUudGVzdCggcXVh
bGlmaWVyICkgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5maWx0ZXIocXVhbGlmaWVyLCBmaWx0ZXJl
ZCwgIWtlZXApOworICAgIH0gZWxzZSB7CisgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlcigg
cXVhbGlmaWVyLCBmaWx0ZXJlZCApOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4galF1ZXJ5
LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiAoIGpRdWVyeS5p
bkFycmF5KCBlbGVtLCBxdWFsaWZpZXIgKSA+PSAwICkgPT09IGtlZXA7CisgICAgfSk7Cit9Citm
dW5jdGlvbiBjcmVhdGVTYWZlRnJhZ21lbnQoIGRvY3VtZW50ICkgeworICAgIHZhciBsaXN0ID0g
bm9kZU5hbWVzLnNwbGl0KCAifCIgKSwKKyAgICBzYWZlRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURv
Y3VtZW50RnJhZ21lbnQoKTsKKworICAgIGlmICggc2FmZUZyYWcuY3JlYXRlRWxlbWVudCApIHsK
KyAgICB3aGlsZSAoIGxpc3QubGVuZ3RoICkgeworICAgIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQo
CisgICAgbGlzdC5wb3AoKQorICAgICk7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FmZUZy
YWc7Cit9CisKK3ZhciBub2RlTmFtZXMgPSAiYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxj
YW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnwiICsK
KyAgICAiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlv
bnxzdW1tYXJ5fHRpbWV8dmlkZW8iLAorICAgIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0i
KD86bnVsbHxcZCspIi9nLAorICAgIHJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoIjwoPzoiICsg
bm9kZU5hbWVzICsgIilbXFxzLz5dIiwgImkiKSwKKyAgICBybGVhZGluZ1doaXRlc3BhY2UgPSAv
XlxzKy8sCisgICAgcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5w
dXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKKyAgICBydGFnTmFtZSA9
IC88KFtcdzpdKykvLAorICAgIHJ0Ym9keSA9IC88dGJvZHkvaSwKKyAgICByaHRtbCA9IC88fCYj
P1x3KzsvLAorICAgIHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksCisg
ICAgbWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlID0gL14oPzpjaGVja2JveHxyYWRpbykkL2ks
CisgICAgLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAorICAgIHJjaGVja2VkID0gL2No
ZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisgICAgcnNjcmlwdFR5cGUgPSAvXiR8
XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksCisgICAgcnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVc
LyguKikvLAorICAgIHJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/Olxd
XF18LS0pPlxzKiQvZywKKworICAgIC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBz
dXBwb3J0IFhIVE1MICgjMTMyMDApCisgICAgd3JhcE1hcCA9IHsKKyAgICBvcHRpb246IFsgMSwg
IjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAorICAgIGxlZ2Vu
ZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKKyAgICBhcmVhOiBbIDEsICI8
bWFwPiIsICI8L21hcD4iIF0sCisgICAgcGFyYW06IFsgMSwgIjxvYmplY3Q+IiwgIjwvb2JqZWN0
PiIgXSwKKyAgICB0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKyAgICB0cjog
WyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKyAgICBjb2w6IFsg
MiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJs
ZT4iIF0sCisgICAgdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+
PC90YWJsZT4iIF0sCisKKyAgICAvLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0
LCBzdHlsZSwgb3IgYW55IGh0bWw1IChOb1Njb3BlKSB0YWdzLAorICAgIC8vIHVubGVzcyB3cmFw
cGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQu
CisgICAgX2RlZmF1bHQ6IGpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbIDAsICIiLCAi
IiBdIDogWyAxLCAiWDxkaXY+IiwgIjwvZGl2PiIgIF0KKyAgICB9LAorICAgIHNhZmVGcmFnbWVu
dCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSwKKyAgICBmcmFnbWVudERpdiA9IHNh
ZmVGcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsK
Kword3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOword3JhcE1hcC50Ym9keSA9IHdy
YXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1h
cC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCitqUXVlcnkuZm4uZXh0ZW5kKHsK
KyAgICB0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3Mo
IHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5l
ZCA/CisgICAgalF1ZXJ5LnRleHQoIHRoaXMgKSA6CisgICAgdGhpcy5lbXB0eSgpLmFwcGVuZCgg
KCB0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRl
eHROb2RlKCB2YWx1ZSApICk7CisgICAgfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGgg
KTsKKyAgICB9LAorCisgICAgd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisgICAgaWYgKCBq
UXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oaSkgeworICAgIGpRdWVyeSh0aGlzKS53cmFwQWxsKCBodG1sLmNhbGwodGhpcywgaSkgKTsK
KyAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoIHRoaXNbMF0gKSB7CisgICAgLy8gVGhlIGVsZW1l
bnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKKyAgICB2YXIgd3JhcCA9IGpRdWVyeSggaHRt
bCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CisKKyAgICBpZiAo
IHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKKyAgICB3cmFwLmluc2VydEJlZm9yZSggdGhpc1swXSAp
OworICAgIH0KKworICAgIHdyYXAubWFwKGZ1bmN0aW9uKCkgeworICAgIHZhciBlbGVtID0gdGhp
czsKKworICAgIHdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2Rl
VHlwZSA9PT0gMSApIHsKKyAgICBlbGVtID0gZWxlbS5maXJzdENoaWxkOworICAgIH0KKworICAg
IHJldHVybiBlbGVtOworICAgIH0pLmFwcGVuZCggdGhpcyApOworICAgIH0KKworICAgIHJldHVy
biB0aGlzOworICAgIH0sCisKKyAgICB3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAg
IGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNo
KGZ1bmN0aW9uKGkpIHsKKyAgICBqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhp
cywgaSkgKTsKKyAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9u
KCkgeworICAgIHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCisgICAgY29udGVudHMgPSBzZWxm
LmNvbnRlbnRzKCk7CisKKyAgICBpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKKyAgICBjb250ZW50
cy53cmFwQWxsKCBodG1sICk7CisKKyAgICB9IGVsc2UgeworICAgIHNlbGYuYXBwZW5kKCBodG1s
ICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAgICB3cmFwOiBmdW5jdGlvbiggaHRtbCAp
IHsKKyAgICB2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CisKKyAg
ICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKyAgICBqUXVlcnkoIHRoaXMgKS53cmFw
QWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOworICAgIH0pOwor
ICAgIH0sCisKKyAgICB1bndyYXA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnBhcmVu
dCgpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAi
Ym9keSIgKSApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5v
ZGVzICk7CisgICAgfQorICAgIH0pLmVuZCgpOworICAgIH0sCisKKyAgICBhcHBlbmQ6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5
cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisgICAgdGhpcy5hcHBlbmRDaGls
ZCggZWxlbSApOworICAgIH0KKyAgICB9KTsKKyAgICB9LAorCisgICAgcHJlcGVuZDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlv
biggZWxlbSApIHsKKyAgICBpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlw
ZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKyAgICB0aGlzLmluc2VydEJlZm9y
ZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAg
ICBiZWZvcmU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVu
dHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAp
IHsKKyAgICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisgICAg
fQorICAgIH0pOworICAgIH0sCisKKyAgICBhZnRlcjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgeworICAg
IGlmICggdGhpcy5wYXJlbnROb2RlICkgeworICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZv
cmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKyAgICB9CisgICAgfSk7CisgICAgfSwKKwor
ICAgIC8vIGtlZXBEYXRhIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS0tZG8gbm90IGRvY3VtZW50
CisgICAgcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgeworICAgIHZhciBl
bGVtLAorICAgIGkgPSAwOworCisgICAgZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7
IGkrKyApIHsKKyAgICBpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3Rvciwg
WyBlbGVtIF0gKS5sZW5ndGggPiAwICkgeworICAgIGlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9k
ZVR5cGUgPT09IDEgKSB7CisgICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTsK
KyAgICB9CisKKyAgICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICBpZiAoIGtlZXBEYXRh
ICYmIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7CisgICAg
c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7CisgICAgfQorICAgIGVs
ZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworICAgIH0KKyAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgZWxlbSwKKyAgICBpID0gMDsKKworICAgIGZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAh
PSBudWxsOyBpKysgKSB7CisgICAgLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQg
bWVtb3J5IGxlYWtzCisgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgIGpRdWVy
eS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOworICAgIH0KKworICAgIC8vIFJl
bW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCisgICAgd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7
CisgICAgZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJzdENoaWxkICk7CisgICAgfQorCisgICAg
Ly8gSWYgdGhpcyBpcyBhIHNlbGVjdCwgZW5zdXJlIHRoYXQgaXQgZGlzcGxheXMgZW1wdHkgKCMx
MjMzNikKKyAgICAvLyBTdXBwb3J0OiBJRTw5CisgICAgaWYgKCBlbGVtLm9wdGlvbnMgJiYgalF1
ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgeworICAgIGVsZW0ub3B0aW9ucy5sZW5n
dGggPSAwOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAg
Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKyAg
ICBkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5k
RXZlbnRzOworICAgIGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVs
bCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKKworICAgIHJldHVybiB0aGlz
Lm1hcCggZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFB
bmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CisgICAgfSk7CisgICAgfSwKKworICAgIGh0
bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywg
ZnVuY3Rpb24oIHZhbHVlICkgeworICAgIHZhciBlbGVtID0gdGhpc1swXSB8fCB7fSwKKyAgICBp
ID0gMCwKKyAgICBsID0gdGhpcy5sZW5ndGg7CisKKyAgICBpZiAoIHZhbHVlID09PSB1bmRlZmlu
ZWQgKSB7CisgICAgcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgPworICAgIGVsZW0uaW5uZXJI
VE1MLnJlcGxhY2UoIHJpbmxpbmVqUXVlcnksICIiICkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9
CisKKyAgICAvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5u
ZXJIVE1MCisgICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0
bWwudGVzdCggdmFsdWUgKSAmJgorICAgICggalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8
fCAhcm5vc2hpbWNhY2hlLnRlc3QoIHZhbHVlICkgICkgJiYKKyAgICAoIGpRdWVyeS5zdXBwb3J0
LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSAp
ICYmCisgICAgIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIiIsICIiXSAp
WzFdLnRvTG93ZXJDYXNlKCkgXSApIHsKKworICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSggcnho
dG1sVGFnLCAiPCQxPjwvJDI+IiApOworCisgICAgdHJ5IHsKKyAgICBmb3IgKDsgaSA8IGw7IGkr
KyApIHsKKyAgICAvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVh
a3MKKyAgICBlbGVtID0gdGhpc1tpXSB8fCB7fTsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgKSB7CisgICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7Cisg
ICAgZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTsKKyAgICB9CisgICAgfQorCisgICAgZWxlbSA9IDA7
CisKKyAgICAvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRo
ZSBmYWxsYmFjayBtZXRob2QKKyAgICB9IGNhdGNoKGUpIHt9CisgICAgfQorCisgICAgaWYgKCBl
bGVtICkgeworICAgIHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CisgICAgfQorICAgIH0s
IG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7CisgICAgfSwKKworICAgIHJlcGxhY2VX
aXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgdmFyIGlzRnVuYyA9IGpRdWVyeS5pc0Z1bmN0
aW9uKCB2YWx1ZSApOworCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSBy
ZW1vdmVkIGZyb20gdGhlIERPTSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKKyAgICAvLyB0aGlz
IGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cworICAg
IGlmICggIWlzRnVuYyAmJiB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgeworICAgIHZhbHVl
ID0galF1ZXJ5KCB2YWx1ZSApLm5vdCggdGhpcyApLmRldGFjaCgpOworICAgIH0KKworICAgIHJl
dHVybiB0aGlzLmRvbU1hbmlwKCBbIHZhbHVlIF0sIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewor
ICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0U2libGluZywKKyAgICBwYXJlbnQgPSB0aGlzLnBhcmVu
dE5vZGU7CisKKyAgICBpZiAoIHBhcmVudCApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5yZW1vdmUo
KTsKKyAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKCBlbGVtLCBuZXh0ICk7CisgICAgfQorICAgIH0p
OworICAgIH0sCisKKyAgICBkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICByZXR1
cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7CisgICAgfSwKKworICAgIGRvbU1hbmlw
OiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgeworCisgICAgLy8gRmxhdHRlbiBh
bnkgbmVzdGVkIGFycmF5cworICAgIGFyZ3MgPSBjb3JlX2NvbmNhdC5hcHBseSggW10sIGFyZ3Mg
KTsKKworICAgIHZhciBmaXJzdCwgbm9kZSwgaGFzU2NyaXB0cywKKyAgICBzY3JpcHRzLCBkb2Ms
IGZyYWdtZW50LAorICAgIGkgPSAwLAorICAgIGwgPSB0aGlzLmxlbmd0aCwKKyAgICBzZXQgPSB0
aGlzLAorICAgIGlOb0Nsb25lID0gbCAtIDEsCisgICAgdmFsdWUgPSBhcmdzWzBdLAorICAgIGlz
RnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKKworICAgIC8vIFdlIGNhbid0
IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAorICAg
IGlmICggaXNGdW5jdGlvbiB8fCAhKCBsIDw9IDEgfHwgdHlwZW9mIHZhbHVlICE9PSAic3RyaW5n
IiB8fCBqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCB2YWx1ZSAp
ICkgKSB7CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7CisgICAgdmFy
IHNlbGYgPSBzZXQuZXEoIGluZGV4ICk7CisgICAgaWYgKCBpc0Z1bmN0aW9uICkgeworICAgIGFy
Z3NbMF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVu
ZGVmaW5lZCApOworICAgIH0KKyAgICBzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJh
Y2sgKTsKKyAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoIGwgKSB7CisgICAgZnJhZ21lbnQgPSBq
UXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNl
LCB0aGlzICk7CisgICAgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOworCisgICAgaWYgKCBm
cmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKKyAgICBmcmFnbWVudCA9IGZpcnN0
OworICAgIH0KKworICAgIGlmICggZmlyc3QgKSB7CisgICAgdGFibGUgPSB0YWJsZSAmJiBqUXVl
cnkubm9kZU5hbWUoIGZpcnN0LCAidHIiICk7CisgICAgc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdl
dEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKKyAgICBoYXNTY3Jp
cHRzID0gc2NyaXB0cy5sZW5ndGg7CisKKyAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50
IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVu
ZCB1cAorICAgIC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRp
b25zICgjODA3MCkuCisgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIG5vZGUgPSBmcmFn
bWVudDsKKworICAgIGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CisgICAgbm9kZSA9IGpRdWVyeS5j
bG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisgICAgLy8gS2VlcCByZWZlcmVuY2VzIHRvIGNs
b25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvbgorICAgIGlmICggaGFzU2NyaXB0cyAp
IHsKKyAgICBqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgInNjcmlwdCIgKSAp
OworICAgIH0KKyAgICB9CisKKyAgICBjYWxsYmFjay5jYWxsKAorICAgIHRhYmxlICYmIGpRdWVy
eS5ub2RlTmFtZSggdGhpc1tpXSwgInRhYmxlIiApID8KKyAgICBmaW5kT3JBcHBlbmQoIHRoaXNb
aV0sICJ0Ym9keSIgKSA6CisgICAgdGhpc1tpXSwKKyAgICBub2RlLAorICAgIGkKKyAgICApOwor
ICAgIH0KKworICAgIGlmICggaGFzU2NyaXB0cyApIHsKKyAgICBkb2MgPSBzY3JpcHRzWyBzY3Jp
cHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50OworCisgICAgLy8gUmVlbmFibGUgc2NyaXB0
cworICAgIGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTsKKworICAgIC8vIEV2
YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KKyAg
ICBmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHsKKyAgICBub2RlID0gc2NyaXB0
c1sgaSBdOworICAgIGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkgJiYK
KyAgICAhalF1ZXJ5Ll9kYXRhKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJiBqUXVlcnkuY29udGFp
bnMoIGRvYywgbm9kZSApICkgeworCisgICAgaWYgKCBub2RlLnNyYyApIHsKKyAgICAvLyBIb3Bl
IGFqYXggaXMgYXZhaWxhYmxlLi4uCisgICAgalF1ZXJ5LmFqYXgoeworICAgIHVybDogbm9kZS5z
cmMsCisgICAgdHlwZTogIkdFVCIsCisgICAgZGF0YVR5cGU6ICJzY3JpcHQiLAorICAgIGFzeW5j
OiBmYWxzZSwKKyAgICBnbG9iYWw6IGZhbHNlLAorICAgICJ0aHJvd3MiOiB0cnVlCisgICAgfSk7
CisgICAgfSBlbHNlIHsKKyAgICBqUXVlcnkuZ2xvYmFsRXZhbCggKCBub2RlLnRleHQgfHwgbm9k
ZS50ZXh0Q29udGVudCB8fCBub2RlLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNj
cmlwdCwgIiIgKSApOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZpeCAj
MTE4MDk6IEF2b2lkIGxlYWtpbmcgbWVtb3J5CisgICAgZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7
CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0KK30pOworCitmdW5jdGlv
biBmaW5kT3JBcHBlbmQoIGVsZW0sIHRhZyApIHsKKyAgICByZXR1cm4gZWxlbS5nZXRFbGVtZW50
c0J5VGFnTmFtZSggdGFnIClbMF0gfHwgZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoIHRhZyApICk7Cit9CisKKy8vIFJlcGxhY2UvcmVzdG9yZSB0aGUg
dHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRp
b24KK2Z1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7CisgICAgdmFyIGF0dHIgPSBlbGVt
LmdldEF0dHJpYnV0ZU5vZGUoInR5cGUiKTsKKyAgICBlbGVtLnR5cGUgPSAoIGF0dHIgJiYgYXR0
ci5zcGVjaWZpZWQgKSArICIvIiArIGVsZW0udHlwZTsKKyAgICByZXR1cm4gZWxlbTsKK30KK2Z1
bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CisgICAgdmFyIG1hdGNoID0gcnNjcmlwdFR5
cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7CisgICAgaWYgKCBtYXRjaCApIHsKKyAgICBlbGVt
LnR5cGUgPSBtYXRjaFsxXTsKKyAgICB9IGVsc2UgeworICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRl
KCJ0eXBlIik7CisgICAgfQorICAgIHJldHVybiBlbGVtOworfQorCisvLyBNYXJrIHNjcmlwdHMg
YXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQKK2Z1bmN0aW9uIHNldEdsb2JhbEV2YWwo
IGVsZW1zLCByZWZFbGVtZW50cyApIHsKKyAgICB2YXIgZWxlbSwKKyAgICBpID0gMDsKKyAgICBm
b3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICBqUXVlcnkuX2Rh
dGEoIGVsZW0sICJnbG9iYWxFdmFsIiwgIXJlZkVsZW1lbnRzIHx8IGpRdWVyeS5fZGF0YSggcmVm
RWxlbWVudHNbaV0sICJnbG9iYWxFdmFsIiApICk7CisgICAgfQorfQorCitmdW5jdGlvbiBjbG9u
ZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgeworCisgICAgaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAx
IHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAg
IHZhciB0eXBlLCBpLCBsLAorICAgIG9sZERhdGEgPSBqUXVlcnkuX2RhdGEoIHNyYyApLAorICAg
IGN1ckRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QsIG9sZERhdGEgKSwKKyAgICBldmVudHMgPSBv
bGREYXRhLmV2ZW50czsKKworICAgIGlmICggZXZlbnRzICkgeworICAgIGRlbGV0ZSBjdXJEYXRh
LmhhbmRsZTsKKyAgICBjdXJEYXRhLmV2ZW50cyA9IHt9OworCisgICAgZm9yICggdHlwZSBpbiBl
dmVudHMgKSB7CisgICAgZm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkg
PCBsOyBpKysgKSB7CisgICAgalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0
eXBlIF1bIGkgXSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gbWFrZSB0aGUgY2xv
bmVkIHB1YmxpYyBkYXRhIG9iamVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKKyAgICBpZiAo
IGN1ckRhdGEuZGF0YSApIHsKKyAgICBjdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwg
Y3VyRGF0YS5kYXRhICk7CisgICAgfQorfQorCitmdW5jdGlvbiBmaXhDbG9uZU5vZGVJc3N1ZXMo
IHNyYywgZGVzdCApIHsKKyAgICB2YXIgbm9kZU5hbWUsIGUsIGRhdGE7CisKKyAgICAvLyBXZSBk
byBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3Igbm9uLUVsZW1lbnRzCisgICAgaWYgKCBkZXN0
Lm5vZGVUeXBlICE9PSAxICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlTmFtZSA9
IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKworICAgIC8vIElFNi04IGNvcGllcyBldmVu
dHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4gdXNpbmcgY2xvbmVOb2RlLgorICAgIGlmICgg
IWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCAmJiBkZXN0WyBqUXVlcnkuZXhwYW5kbyBdICkg
eworICAgIGRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QgKTsKKworICAgIGZvciAoIGUgaW4gZGF0
YS5ldmVudHMgKSB7CisgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBkZXN0LCBlLCBkYXRhLmhhbmRs
ZSApOworICAgIH0KKworICAgIC8vIEV2ZW50IGRhdGEgZ2V0cyByZWZlcmVuY2VkIGluc3RlYWQg
b2YgY29waWVkIGlmIHRoZSBleHBhbmRvIGdldHMgY29waWVkIHRvbworICAgIGRlc3QucmVtb3Zl
QXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApOworICAgIH0KKworICAgIC8vIElFIGJsYW5rcyBj
b250ZW50cyB3aGVuIGNsb25pbmcgc2NyaXB0cywgYW5kIHRyaWVzIHRvIGV2YWx1YXRlIG5ld2x5
LXNldCB0ZXh0CisgICAgaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9
PSBzcmMudGV4dCApIHsKKyAgICBkaXNhYmxlU2NyaXB0KCBkZXN0ICkudGV4dCA9IHNyYy50ZXh0
OworICAgIHJlc3RvcmVTY3JpcHQoIGRlc3QgKTsKKworICAgIC8vIElFNi0xMCBpbXByb3Blcmx5
IGNsb25lcyBjaGlsZHJlbiBvZiBvYmplY3QgZWxlbWVudHMgdXNpbmcgY2xhc3NpZC4KKyAgICAv
LyBJRTEwIHRocm93cyBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvciBpZiBwYXJlbnQgaXMgbnVs
bCwgIzEyMTMyLgorICAgIH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKKyAg
ICBpZiAoIGRlc3QucGFyZW50Tm9kZSApIHsKKyAgICBkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRl
ckhUTUw7CisgICAgfQorCisgICAgLy8gVGhpcyBwYXRoIGFwcGVhcnMgdW5hdm9pZGFibGUgZm9y
IElFOS4gV2hlbiBjbG9uaW5nIGFuIG9iamVjdAorICAgIC8vIGVsZW1lbnQgaW4gSUU5LCB0aGUg
b3V0ZXJIVE1MIHN0cmF0ZWd5IGFib3ZlIGlzIG5vdCBzdWZmaWNpZW50LgorICAgIC8vIElmIHRo
ZSBzcmMgaGFzIGlubmVySFRNTCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAorICAgIC8v
IGNvcHkgdGhlIHNyYy5pbm5lckhUTUwgaW50byB0aGUgZGVzdC5pbm5lckhUTUwuICMxMDMyNAor
ICAgIGlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSAmJiAoIHNyYy5pbm5lckhUTUwgJiYg
IWpRdWVyeS50cmltKGRlc3QuaW5uZXJIVE1MKSApICkgeworICAgIGRlc3QuaW5uZXJIVE1MID0g
c3JjLmlubmVySFRNTDsKKyAgICB9CisKKyAgICB9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlu
cHV0IiAmJiBtYW5pcHVsYXRpb25fcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsK
KyAgICAvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xv
bmVkIGNoZWNrYm94CisgICAgLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0
byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAorICAgIC8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlm
IHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAorCisgICAgZGVzdC5kZWZh
dWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkOworCisgICAgLy8gSUU2LTcg
Z2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWQKKyAg
ICAvLyBjaGVja2JveC9yYWRpbyBidXR0b24gdG8gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2Yg
Im9uIgorICAgIGlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVlICkgeworICAgIGRlc3QudmFs
dWUgPSBzcmMudmFsdWU7CisgICAgfQorCisgICAgLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRo
ZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKKyAgICAvLyBzdGF0ZSB3
aGVuIGNsb25pbmcgb3B0aW9ucworICAgIH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib3B0aW9u
IiApIHsKKyAgICBkZXN0LmRlZmF1bHRTZWxlY3RlZCA9IGRlc3Quc2VsZWN0ZWQgPSBzcmMuZGVm
YXVsdFNlbGVjdGVkOworCisgICAgLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFs
dWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgorICAgIC8vIGNsb25pbmcgb3RoZXIgdHlwZXMg
b2YgaW5wdXQgZmllbGRzCisgICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwg
bm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CisgICAgZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMu
ZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworalF1ZXJ5LmVhY2goeworICAgIGFwcGVuZFRvOiAi
YXBwZW5kIiwKKyAgICBwcmVwZW5kVG86ICJwcmVwZW5kIiwKKyAgICBpbnNlcnRCZWZvcmU6ICJi
ZWZvcmUiLAorICAgIGluc2VydEFmdGVyOiAiYWZ0ZXIiLAorICAgIHJlcGxhY2VBbGw6ICJyZXBs
YWNlV2l0aCIKK30sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKKyAgICBqUXVlcnkuZm5b
IG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICB2YXIgZWxlbXMsCisgICAgaSA9
IDAsCisgICAgcmV0ID0gW10sCisgICAgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAorICAg
IGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMTsKKworICAgIGZvciAoIDsgaSA8PSBsYXN0OyBpKysg
KSB7CisgICAgZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUodHJ1ZSk7Cisg
ICAgalF1ZXJ5KCBpbnNlcnRbaV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTsKKworICAgIC8vIE1v
ZGVybiBicm93c2VycyBjYW4gYXBwbHkgalF1ZXJ5IGNvbGxlY3Rpb25zIGFzIGFycmF5cywgYnV0
IG9sZElFIG5lZWRzIGEgLmdldCgpCisgICAgY29yZV9wdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdl
dCgpICk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKKyAgICB9
OworfSk7CisKK2Z1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgeworICAgIHZhciBlbGVt
cywgZWxlbSwKKyAgICBpID0gMCwKKyAgICBmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lICE9PSBjb3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoIHRhZyB8fCAiKiIgKSA6CisgICAgdHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3Rv
ckFsbCAhPT0gY29yZV9zdHJ1bmRlZmluZWQgPyBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRh
ZyB8fCAiKiIgKSA6CisgICAgdW5kZWZpbmVkOworCisgICAgaWYgKCAhZm91bmQgKSB7CisgICAg
Zm9yICggZm91bmQgPSBbXSwgZWxlbXMgPSBjb250ZXh0LmNoaWxkTm9kZXMgfHwgY29udGV4dDsg
KGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgeworICAgIGlmICggIXRhZyB8fCBqUXVl
cnkubm9kZU5hbWUoIGVsZW0sIHRhZyApICkgeworICAgIGZvdW5kLnB1c2goIGVsZW0gKTsKKyAg
ICB9IGVsc2UgeworICAgIGpRdWVyeS5tZXJnZSggZm91bmQsIGdldEFsbCggZWxlbSwgdGFnICkg
KTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8
fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/CisgICAgalF1ZXJ5Lm1l
cmdlKCBbIGNvbnRleHQgXSwgZm91bmQgKSA6CisgICAgZm91bmQ7Cit9CisKKy8vIFVzZWQgaW4g
YnVpbGRGcmFnbWVudCwgZml4ZXMgdGhlIGRlZmF1bHRDaGVja2VkIHByb3BlcnR5CitmdW5jdGlv
biBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKKyAgICBpZiAoIG1hbmlwdWxhdGlvbl9yY2hl
Y2thYmxlVHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHsKKyAgICBlbGVtLmRlZmF1bHRDaGVja2Vk
ID0gZWxlbS5jaGVja2VkOworICAgIH0KK30KKworalF1ZXJ5LmV4dGVuZCh7CisgICAgY2xvbmU6
IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKyAg
ICB2YXIgZGVzdEVsZW1lbnRzLCBub2RlLCBjbG9uZSwgaSwgc3JjRWxlbWVudHMsCisgICAgaW5Q
YWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAg
IGlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxlbSkg
fHwgIXJub3NoaW1jYWNoZS50ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsgIj4iICkgKSB7Cisg
ICAgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApOworCisgICAgLy8gSUU8PTggZG9lcyBu
b3QgcHJvcGVybHkgY2xvbmUgZGV0YWNoZWQsIHVua25vd24gZWxlbWVudCBub2RlcworICAgIH0g
ZWxzZSB7CisgICAgZnJhZ21lbnREaXYuaW5uZXJIVE1MID0gZWxlbS5vdXRlckhUTUw7CisgICAg
ZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCAp
OworICAgIH0KKworICAgIGlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpR
dWVyeS5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSAmJgorICAgIChlbGVtLm5vZGVUeXBlID09PSAx
IHx8IGVsZW0ubm9kZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgewor
CisgICAgLy8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBo
dHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKKyAgICBkZXN0RWxlbWVudHMgPSBn
ZXRBbGwoIGNsb25lICk7CisgICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKKworICAg
IC8vIEZpeCBhbGwgSUUgY2xvbmluZyBpc3N1ZXMKKyAgICBmb3IgKCBpID0gMDsgKG5vZGUgPSBz
cmNFbGVtZW50c1tpXSkgIT0gbnVsbDsgKytpICkgeworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBk
ZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NworICAgIGlmICggZGVzdEVs
ZW1lbnRzW2ldICkgeworICAgIGZpeENsb25lTm9kZUlzc3Vlcyggbm9kZSwgZGVzdEVsZW1lbnRz
W2ldICk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJv
bSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCisgICAgaWYgKCBkYXRhQW5kRXZlbnRzICkgewor
ICAgIGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CisgICAgc3JjRWxlbWVudHMgPSBzcmNFbGVt
ZW50cyB8fCBnZXRBbGwoIGVsZW0gKTsKKyAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMg
fHwgZ2V0QWxsKCBjbG9uZSApOworCisgICAgZm9yICggaSA9IDA7IChub2RlID0gc3JjRWxlbWVu
dHNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICBjbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVs
ZW1lbnRzW2ldICk7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgY2xvbmVDb3B5RXZlbnQoIGVs
ZW0sIGNsb25lICk7CisgICAgfQorICAgIH0KKworICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFs
dWF0aW9uIGhpc3RvcnkKKyAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0
IiApOworICAgIGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CisgICAgc2V0R2xvYmFs
RXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSAp
OworICAgIH0KKworICAgIGRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7
CisKKyAgICAvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKKyAgICByZXR1cm4gY2xvbmU7CisgICAg
fSwKKworICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgc2NyaXB0
cywgc2VsZWN0aW9uICkgeworICAgIHZhciBqLCBlbGVtLCBjb250YWlucywKKyAgICB0bXAsIHRh
ZywgdGJvZHksIHdyYXAsCisgICAgbCA9IGVsZW1zLmxlbmd0aCwKKworICAgIC8vIEVuc3VyZSBh
IHNhZmUgZnJhZ21lbnQKKyAgICBzYWZlID0gY3JlYXRlU2FmZUZyYWdtZW50KCBjb250ZXh0ICks
CisKKyAgICBub2RlcyA9IFtdLAorICAgIGkgPSAwOworCisgICAgZm9yICggOyBpIDwgbDsgaSsr
ICkgeworICAgIGVsZW0gPSBlbGVtc1sgaSBdOworCisgICAgaWYgKCBlbGVtIHx8IGVsZW0gPT09
IDAgKSB7CisKKyAgICAvLyBBZGQgbm9kZXMgZGlyZWN0bHkKKyAgICBpZiAoIGpRdWVyeS50eXBl
KCBlbGVtICkgPT09ICJvYmplY3QiICkgeworICAgIGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0u
bm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKKworICAgIC8vIENvbnZlcnQgbm9uLWh0bWwg
aW50byBhIHRleHQgbm9kZQorICAgIH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7
CisgICAgbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CisKKyAg
ICAvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKKyAgICB9IGVsc2UgeworICAgIHRtcCA9
IHRtcCB8fCBzYWZlLmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7
CisKKyAgICAvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCisgICAgdGFn
ID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyIiLCAiIl0gKVsxXS50b0xvd2VyQ2FzZSgp
OworICAgIHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OworCisgICAg
dG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48
LyQyPiIgKSArIHdyYXBbMl07CisKKyAgICAvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8g
dGhlIHJpZ2h0IGNvbnRlbnQKKyAgICBqID0gd3JhcFswXTsKKyAgICB3aGlsZSAoIGotLSApIHsK
KyAgICB0bXAgPSB0bXAubGFzdENoaWxkOworICAgIH0KKworICAgIC8vIE1hbnVhbGx5IGFkZCBs
ZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZCBieSBJRQorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0
LmxlYWRpbmdXaGl0ZXNwYWNlICYmIHJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCBlbGVtICkgKSB7
CisgICAgbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggcmxlYWRpbmdXaGl0ZXNw
YWNlLmV4ZWMoIGVsZW0gKVswXSApICk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIElFJ3MgYXV0
b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKKyAgICBpZiAoICFqUXVlcnku
c3VwcG9ydC50Ym9keSApIHsKKworICAgIC8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBo
YXZlIHNwdXJpb3VzIDx0Ym9keT4KKyAgICBlbGVtID0gdGFnID09PSAidGFibGUiICYmICFydGJv
ZHkudGVzdCggZWxlbSApID8KKyAgICB0bXAuZmlyc3RDaGlsZCA6CisKKyAgICAvLyBTdHJpbmcg
d2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KKyAgICB3cmFwWzFdID09PSAiPHRhYmxlPiIg
JiYgIXJ0Ym9keS50ZXN0KCBlbGVtICkgPworICAgIHRtcCA6CisgICAgMDsKKworICAgIGogPSBl
bGVtICYmIGVsZW0uY2hpbGROb2Rlcy5sZW5ndGg7CisgICAgd2hpbGUgKCBqLS0gKSB7CisgICAg
aWYgKCBqUXVlcnkubm9kZU5hbWUoICh0Ym9keSA9IGVsZW0uY2hpbGROb2Rlc1tqXSksICJ0Ym9k
eSIgKSAmJiAhdGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggKSB7CisgICAgZWxlbS5yZW1vdmVDaGls
ZCggdGJvZHkgKTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIGpRdWVyeS5tZXJnZSggbm9k
ZXMsIHRtcC5jaGlsZE5vZGVzICk7CisKKyAgICAvLyBGaXggIzEyMzkyIGZvciBXZWJLaXQgYW5k
IElFID4gOQorICAgIHRtcC50ZXh0Q29udGVudCA9ICIiOworCisgICAgLy8gRml4ICMxMjM5MiBm
b3Igb2xkSUUKKyAgICB3aGlsZSAoIHRtcC5maXJzdENoaWxkICkgeworICAgIHRtcC5yZW1vdmVD
aGlsZCggdG1wLmZpcnN0Q2hpbGQgKTsKKyAgICB9CisKKyAgICAvLyBSZW1lbWJlciB0aGUgdG9w
LWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVyIGNsZWFudXAKKyAgICB0bXAgPSBzYWZlLmxhc3RD
aGlsZDsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZpeCAjMTEzNTY6IENsZWFyIGVs
ZW1lbnRzIGZyb20gZnJhZ21lbnQKKyAgICBpZiAoIHRtcCApIHsKKyAgICBzYWZlLnJlbW92ZUNo
aWxkKCB0bXAgKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBkZWZhdWx0Q2hlY2tlZCBmb3IgYW55
IHJhZGlvcyBhbmQgY2hlY2tib3hlcworICAgIC8vIGFib3V0IHRvIGJlIGFwcGVuZGVkIHRvIHRo
ZSBET00gaW4gSUUgNi83ICgjODA2MCkKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRD
aGVja2VkICkgeworICAgIGpRdWVyeS5ncmVwKCBnZXRBbGwoIG5vZGVzLCAiaW5wdXQiICksIGZp
eERlZmF1bHRDaGVja2VkICk7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCAoZWxl
bSA9IG5vZGVzWyBpKysgXSkgKSB7CisKKyAgICAvLyAjNDA4NyAtIElmIG9yaWdpbiBhbmQgZGVz
dGluYXRpb24gZWxlbWVudHMgYXJlIHRoZSBzYW1lLCBhbmQgdGhpcyBpcworICAgIC8vIHRoYXQg
ZWxlbWVudCwgZG8gbm90IGRvIGFueXRoaW5nCisgICAgaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5
LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHsKKyAgICBjb250aW51ZTsKKyAg
ICB9CisKKyAgICBjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50
LCBlbGVtICk7CisKKyAgICAvLyBBcHBlbmQgdG8gZnJhZ21lbnQKKyAgICB0bXAgPSBnZXRBbGwo
IHNhZmUuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgInNjcmlwdCIgKTsKKworICAgIC8vIFByZXNlcnZl
IHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKKyAgICBpZiAoIGNvbnRhaW5zICkgeworICAgIHNl
dEdsb2JhbEV2YWwoIHRtcCApOworICAgIH0KKworICAgIC8vIENhcHR1cmUgZXhlY3V0YWJsZXMK
KyAgICBpZiAoIHNjcmlwdHMgKSB7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoZWxlbSA9IHRt
cFsgaisrIF0pICkgeworICAgIGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIi
ICkgKSB7CisgICAgc2NyaXB0cy5wdXNoKCBlbGVtICk7CisgICAgfQorICAgIH0KKyAgICB9Cisg
ICAgfQorCisgICAgdG1wID0gbnVsbDsKKworICAgIHJldHVybiBzYWZlOworICAgIH0sCisKKyAg
ICBjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSAp
IHsKKyAgICB2YXIgZWxlbSwgdHlwZSwgaWQsIGRhdGEsCisgICAgaSA9IDAsCisgICAgaW50ZXJu
YWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKKyAgICBjYWNoZSA9IGpRdWVyeS5jYWNoZSwKKyAgICBk
ZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbywKKyAgICBzcGVjaWFs
ID0galF1ZXJ5LmV2ZW50LnNwZWNpYWw7CisKKyAgICBmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0p
ICE9IG51bGw7IGkrKyApIHsKKworICAgIGlmICggYWNjZXB0RGF0YSB8fCBqUXVlcnkuYWNjZXB0
RGF0YSggZWxlbSApICkgeworCisgICAgaWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdOworICAgIGRh
dGEgPSBpZCAmJiBjYWNoZVsgaWQgXTsKKworICAgIGlmICggZGF0YSApIHsKKyAgICBpZiAoIGRh
dGEuZXZlbnRzICkgeworICAgIGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CisgICAgaWYg
KCBzcGVjaWFsWyB0eXBlIF0gKSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlw
ZSApOworCisgICAgLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5y
ZW1vdmUncyBvdmVyaGVhZAorICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBl
bGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8g
UmVtb3ZlIGNhY2hlIG9ubHkgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHJlbW92ZWQgYnkgalF1ZXJ5
LmV2ZW50LnJlbW92ZQorICAgIGlmICggY2FjaGVbIGlkIF0gKSB7CisKKyAgICBkZWxldGUgY2Fj
aGVbIGlkIF07CisKKyAgICAvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5k
byBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsCisgICAgLy8gbm9yIGRvZXMgaXQgaGF2ZSBhIHJlbW92
ZUF0dHJpYnV0ZSBmdW5jdGlvbiBvbiBEb2N1bWVudCBub2RlczsKKyAgICAvLyB3ZSBtdXN0IGhh
bmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKKyAgICBpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7CisgICAg
ZGVsZXRlIGVsZW1bIGludGVybmFsS2V5IF07CisKKyAgICB9IGVsc2UgaWYgKCB0eXBlb2YgZWxl
bS5yZW1vdmVBdHRyaWJ1dGUgIT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIGVsZW0ucmVt
b3ZlQXR0cmlidXRlKCBpbnRlcm5hbEtleSApOworCisgICAgfSBlbHNlIHsKKyAgICBlbGVtWyBp
bnRlcm5hbEtleSBdID0gbnVsbDsKKyAgICB9CisKKyAgICBjb3JlX2RlbGV0ZWRJZHMucHVzaCgg
aWQgKTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorfSk7Cit2YXIgaWZyYW1l
LCBnZXRTdHlsZXMsIGN1ckNTUywKKyAgICByYWxwaGEgPSAvYWxwaGFcKFteKV0qXCkvaSwKKyAg
ICByb3BhY2l0eSA9IC9vcGFjaXR5XHMqPVxzKihbXildKikvLAorICAgIHJwb3NpdGlvbiA9IC9e
KHRvcHxyaWdodHxib3R0b218bGVmdCkkLywKKyAgICAvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBp
cyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIs
IG9yICJ0YWJsZS1jYXB0aW9uIgorICAgIC8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczog
aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQorICAg
IHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLywKKyAgICBybWFyZ2lu
ID0gL15tYXJnaW4vLAorICAgIHJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3JlX3Bu
dW0gKyAiKSguKikkIiwgImkiICksCisgICAgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiAr
IGNvcmVfcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKSwKKyAgICBycmVsTnVtID0gbmV3
IFJlZ0V4cCggIl4oWystXSk9KCIgKyBjb3JlX3BudW0gKyAiKSIsICJpIiApLAorICAgIGVsZW1k
aXNwbGF5ID0geyBCT0RZOiAiYmxvY2siIH0sCisKKyAgICBjc3NTaG93ID0geyBwb3NpdGlvbjog
ImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKKyAg
ICBjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CisgICAgbGV0dGVyU3BhY2luZzogMCwKKyAgICBmb250
V2VpZ2h0OiA0MDAKKyAgICB9LAorCisgICAgY3NzRXhwYW5kID0gWyAiVG9wIiwgIlJpZ2h0Iiwg
IkJvdHRvbSIsICJMZWZ0IiBdLAorICAgIGNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk8iLCAi
TW96IiwgIm1zIiBdOworCisvLyByZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90
ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5CitmdW5jdGlvbiB2ZW5kb3JQcm9wTmFt
ZSggc3R5bGUsIG5hbWUgKSB7CisKKyAgICAvLyBzaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUg
bm90IHZlbmRvciBwcmVmaXhlZAorICAgIGlmICggbmFtZSBpbiBzdHlsZSApIHsKKyAgICByZXR1
cm4gbmFtZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVz
CisgICAgdmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5z
bGljZSgxKSwKKyAgICBvcmlnTmFtZSA9IG5hbWUsCisgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0
aDsKKworICAgIHdoaWxlICggaS0tICkgeworICAgIG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsg
Y2FwTmFtZTsKKyAgICBpZiAoIG5hbWUgaW4gc3R5bGUgKSB7CisgICAgcmV0dXJuIG5hbWU7Cisg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBvcmlnTmFtZTsKK30KKworZnVuY3Rpb24gaXNIaWRk
ZW4oIGVsZW0sIGVsICkgeworICAgIC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpR
dWVyeSNmaWx0ZXIgZnVuY3Rpb247CisgICAgLy8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwg
YmUgc2Vjb25kIGFyZ3VtZW50CisgICAgZWxlbSA9IGVsIHx8IGVsZW07CisgICAgcmV0dXJuIGpR
dWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSIgfHwgIWpRdWVyeS5jb250YWlu
cyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7Cit9CisKK2Z1bmN0aW9uIHNob3dIaWRlKCBl
bGVtZW50cywgc2hvdyApIHsKKyAgICB2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLAorICAgIHZh
bHVlcyA9IFtdLAorICAgIGluZGV4ID0gMCwKKyAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7
CisKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworICAgIGVsZW0gPSBl
bGVtZW50c1sgaW5kZXggXTsKKyAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgIGNvbnRpbnVl
OworICAgIH0KKworICAgIHZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgIm9s
ZGRpc3BsYXkiICk7CisgICAgZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKyAgICBpZiAo
IHNob3cgKSB7CisgICAgLy8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVu
dCB0byBsZWFybiBpZiBpdCBpcworICAgIC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxl
cyBvciBub3QKKyAgICBpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUi
ICkgeworICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOworICAgIH0KKworICAgIC8vIFNldCBl
bGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKKyAg
ICAvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHls
ZSBpcworICAgIC8vIGZvciBzdWNoIGFuIGVsZW1lbnQKKyAgICBpZiAoIGVsZW0uc3R5bGUuZGlz
cGxheSA9PT0gIiIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHsKKyAgICB2YWx1ZXNbIGluZGV4IF0g
PSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgY3NzX2RlZmF1bHREaXNwbGF5KGVs
ZW0ubm9kZU5hbWUpICk7CisgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICBpZiAoICF2YWx1ZXNb
IGluZGV4IF0gKSB7CisgICAgaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKKworICAgIGlmICgg
ZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKKyAgICBqUXVlcnku
X2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3Mo
IGVsZW0sICJkaXNwbGF5IiApICk7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAg
Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxv
b3AKKyAgICAvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisgICAgZm9yICggaW5kZXgg
PSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBlbGVtID0gZWxlbWVudHNbIGlu
ZGV4IF07CisgICAgaWYgKCAhZWxlbS5zdHlsZSApIHsKKyAgICBjb250aW51ZTsKKyAgICB9Cisg
ICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0
eWxlLmRpc3BsYXkgPT09ICIiICkgeworICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2
YWx1ZXNbIGluZGV4IF0gfHwgIiIgOiAibm9uZSI7CisgICAgfQorICAgIH0KKworICAgIHJldHVy
biBlbGVtZW50czsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgY3NzOiBmdW5jdGlvbigg
bmFtZSwgdmFsdWUgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9u
KCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKyAgICB2YXIgbGVuLCBzdHlsZXMsCisgICAgbWFwID0g
e30sCisgICAgaSA9IDA7CisKKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7Cisg
ICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7CisgICAgbGVuID0gbmFtZS5sZW5ndGg7CisK
KyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBtYXBbIG5hbWVbIGkgXSBdID0galF1
ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7CisgICAgfQorCisgICAg
cmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/Cisg
ICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoKKyAgICBqUXVlcnkuY3NzKCBl
bGVtLCBuYW1lICk7CisgICAgfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7
CisgICAgfSwKKyAgICBzaG93OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gc2hvd0hpZGUoIHRo
aXMsIHRydWUgKTsKKyAgICB9LAorICAgIGhpZGU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBz
aG93SGlkZSggdGhpcyApOworICAgIH0sCisgICAgdG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7
CisgICAgdmFyIGJvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIjsKKworICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgaWYgKCBib29sID8gc3RhdGUgOiBpc0hpZGRl
biggdGhpcyApICkgeworICAgIGpRdWVyeSggdGhpcyApLnNob3coKTsKKyAgICB9IGVsc2Ugewor
ICAgIGpRdWVyeSggdGhpcyApLmhpZGUoKTsKKyAgICB9CisgICAgfSk7CisgICAgfQorfSk7CisK
K2pRdWVyeS5leHRlbmQoeworICAgIC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Ig
b3ZlcnJpZGluZyB0aGUgZGVmYXVsdAorICAgIC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNl
dHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQorICAgIGNzc0hvb2tzOiB7CisgICAgb3BhY2l0eTogewor
ICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgIGlmICggY29tcHV0ZWQg
KSB7CisgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNp
dHkKKyAgICB2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKKyAgICByZXR1cm4g
cmV0ID09PSAiIiA/ICIxIiA6IHJldDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9LAorCisg
ICAgLy8gRXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAorICAg
IGNzc051bWJlcjogeworICAgICJjb2x1bW5Db3VudCI6IHRydWUsCisgICAgImZpbGxPcGFjaXR5
IjogdHJ1ZSwKKyAgICAiZm9udFdlaWdodCI6IHRydWUsCisgICAgImxpbmVIZWlnaHQiOiB0cnVl
LAorICAgICJvcGFjaXR5IjogdHJ1ZSwKKyAgICAib3JwaGFucyI6IHRydWUsCisgICAgIndpZG93
cyI6IHRydWUsCisgICAgInpJbmRleCI6IHRydWUsCisgICAgInpvb20iOiB0cnVlCisgICAgfSwK
KworICAgIC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBi
ZWZvcmUKKyAgICAvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlCisgICAgY3NzUHJvcHM6
IHsKKyAgICAvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CisgICAgImZsb2F0IjogalF1
ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCisgICAgfSwK
KworICAgIC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCisg
ICAgc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7CisgICAgLy8g
RG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisgICAgaWYgKCAhZWxl
bSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0u
c3R5bGUgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdl
J3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorICAgIHZhciByZXQsIHR5cGUsIGhvb2tz
LAorICAgIG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorICAgIHN0eWxlID0g
ZWxlbS5zdHlsZTsKKworICAgIG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwg
KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9y
aWdOYW1lICkgKTsKKworICAgIC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24K
KyAgICAvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCisgICAgaG9va3MgPSBq
UXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisK
KyAgICAvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWUKKyAgICBpZiAoIHZhbHVlICE9
PSB1bmRlZmluZWQgKSB7CisgICAgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKworICAgIC8vIGNvbnZl
cnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJz
LiAjNzM0NQorICAgIGlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhl
YyggdmFsdWUgKSkgKSB7CisgICAgdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBh
cnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOworICAgIC8vIEZpeGVzIGJ1ZyAj
OTIzNworICAgIHR5cGUgPSAibnVtYmVyIjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhh
dCBOYU4gYW5kIG51bGwgdmFsdWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKKyAgICBpZiAoIHZh
bHVlID09IG51bGwgfHwgdHlwZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7Cisg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFk
ZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQorICAgIGlm
ICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7
CisgICAgdmFsdWUgKz0gInB4IjsKKyAgICB9CisKKyAgICAvLyBGaXhlcyAjODkwOCwgaXQgY2Fu
IGJlIGRvbmUgbW9yZSBjb3JyZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMgaW4gY3NzSG9va3Ms
CisgICAgLy8gYnV0IGl0IHdvdWxkIG1lYW4gdG8gZGVmaW5lIGVpZ2h0IChmb3IgZXZlcnkgcHJv
YmxlbWF0aWMgcHJvcGVydHkpIGlkZW50aWNhbCBmdW5jdGlvbnMKKyAgICBpZiAoICFqUXVlcnku
c3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZigi
YmFja2dyb3VuZCIpID09PSAwICkgeworICAgIHN0eWxlWyBuYW1lIF0gPSAiaW5oZXJpdCI7Cisg
ICAgfQorCisgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90
aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgaWYgKCAhaG9va3MgfHwg
ISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0
cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKworICAgIC8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBm
cm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkCisg
ICAgLy8gRml4ZXMgYnVnICM1NTA5CisgICAgdHJ5IHsKKyAgICBzdHlsZVsgbmFtZSBdID0gdmFs
dWU7CisgICAgfSBjYXRjaChlKSB7fQorICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgLy8gSWYg
YSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJl
CisgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBl
bGVtLCBmYWxzZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKyAgICByZXR1cm4gcmV0Owor
ICAgIH0KKworICAgIC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5
bGUgb2JqZWN0CisgICAgcmV0dXJuIHN0eWxlWyBuYW1lIF07CisgICAgfQorICAgIH0sCisKKyAg
ICBjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkgeworICAgIHZhciBu
dW0sIHZhbCwgaG9va3MsCisgICAgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7
CisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5h
bWUKKyAgICBuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNz
c1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1l
ICkgKTsKKworICAgIC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24KKyAgICAv
LyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCisgICAgaG9va3MgPSBqUXVlcnku
Y3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKyAgICAv
LyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVy
ZQorICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgKSB7CisgICAgdmFsID0gaG9va3Mu
Z2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgaWYg
YSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CisgICAgaWYg
KCB2YWwgPT09IHVuZGVmaW5lZCApIHsKKyAgICB2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0
eWxlcyApOworICAgIH0KKworICAgIC8vY29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1
ZQorICAgIGlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9y
bSApIHsKKyAgICB2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsKKyAgICB9CisKKyAg
ICAvLyBSZXR1cm4sIGNvbnZlcnRpbmcgdG8gbnVtYmVyIGlmIGZvcmNlZCBvciBhIHF1YWxpZmll
ciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljCisgICAgaWYgKCBleHRyYSA9PT0g
IiIgfHwgZXh0cmEgKSB7CisgICAgbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CisgICAgcmV0dXJu
IGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2
YWw7CisgICAgfQorICAgIHJldHVybiB2YWw7CisgICAgfSwKKworICAgIC8vIEEgbWV0aG9kIGZv
ciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBj
YWxjdWxhdGlvbnMKKyAgICBzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ss
IGFyZ3MgKSB7CisgICAgdmFyIHJldCwgbmFtZSwKKyAgICBvbGQgPSB7fTsKKworICAgIC8vIFJl
bWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcworICAgIGZvciAo
IG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICBvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUg
XTsKKyAgICBlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CisgICAgfQorCisg
ICAgcmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTsKKworICAgIC8vIFJl
dmVydCB0aGUgb2xkIHZhbHVlcworICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICBl
bGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0
OworICAgIH0KK30pOworCisvLyBOT1RFOiB3ZSd2ZSBpbmNsdWRlZCB0aGUgIndpbmRvdyIgaW4g
d2luZG93LmdldENvbXB1dGVkU3R5bGUKKy8vIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxs
IGJyZWFrIHdpdGhvdXQgaXQuCitpZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkgeworICAg
IGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiB3aW5kb3cuZ2V0Q29t
cHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOworICAgIH07CisKKyAgICBjdXJDU1MgPSBmdW5jdGlv
biggZWxlbSwgbmFtZSwgX2NvbXB1dGVkICkgeworICAgIHZhciB3aWR0aCwgbWluV2lkdGgsIG1h
eFdpZHRoLAorICAgIGNvbXB1dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAor
CisgICAgLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVy
JykgaW4gSUU5LCBzZWUgIzEyNTM3CisgICAgcmV0ID0gY29tcHV0ZWQgPyBjb21wdXRlZC5nZXRQ
cm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKKyAg
ICBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKyAgICBpZiAoIGNvbXB1dGVkICkgeworCisgICAgaWYg
KCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxl
bSApICkgeworICAgIHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOworICAgIH0KKwor
ICAgIC8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCisg
ICAgLy8gQ2hyb21lIDwgMTcgYW5kIFNhZmFyaSA1LjAgdXNlcyAiY29tcHV0ZWQgdmFsdWUiIGlu
c3RlYWQgb2YgInVzZWQgdmFsdWUiIGZvciBtYXJnaW4tcmlnaHQKKyAgICAvLyBTYWZhcmkgNS4x
LjcgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1
ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMKKyAgICAvLyB0aGlzIGlz
IGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nz
c29tLyNyZXNvbHZlZC12YWx1ZXMKKyAgICBpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBy
bWFyZ2luLnRlc3QoIG5hbWUgKSApIHsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2
YWx1ZXMKKyAgICB3aWR0aCA9IHN0eWxlLndpZHRoOworICAgIG1pbldpZHRoID0gc3R5bGUubWlu
V2lkdGg7CisgICAgbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsKKworICAgIC8vIFB1dCBpbiB0
aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKyAgICBzdHlsZS5taW5X
aWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7CisgICAgcmV0ID0gY29t
cHV0ZWQud2lkdGg7CisKKyAgICAvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCisgICAgc3R5
bGUud2lkdGggPSB3aWR0aDsKKyAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOworICAgIHN0
eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7
CisgICAgfTsKK30gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5
bGUgKSB7CisgICAgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVs
ZW0uY3VycmVudFN0eWxlOworICAgIH07CisKKyAgICBjdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwg
bmFtZSwgX2NvbXB1dGVkICkgeworICAgIHZhciBsZWZ0LCBycywgcnNMZWZ0LAorICAgIGNvbXB1
dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAorICAgIHJldCA9IGNvbXB1dGVk
ID8gY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKKyAgICBzdHlsZSA9IGVsZW0uc3R5bGU7
CisKKyAgICAvLyBBdm9pZCBzZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZQorICAgIC8v
IHNvIHdlIGRvbid0IGRlZmF1bHQgdG8gYXV0bworICAgIGlmICggcmV0ID09IG51bGwgJiYgc3R5
bGUgJiYgc3R5bGVbIG5hbWUgXSApIHsKKyAgICByZXQgPSBzdHlsZVsgbmFtZSBdOworICAgIH0K
KworICAgIC8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKKyAgICAvLyBo
dHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQt
MTAyMjkxCisKKyAgICAvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhl
bCBudW1iZXIKKyAgICAvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdl
IG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKKyAgICAvLyBidXQgbm90IHBvc2l0aW9uIGNz
cyBhdHRyaWJ1dGVzLCBhcyB0aG9zZSBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwYXJlbnQgZWxl
bWVudCBpbnN0ZWFkCisgICAgLy8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0
ZWFkIGJlY2F1c2UgaXQgbWlnaHQgdHJpZ2dlciBhICJzdGFja2luZyBkb2xscyIgcHJvYmxlbQor
ICAgIGlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmICFycG9zaXRpb24udGVzdCggbmFtZSAp
ICkgeworCisgICAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgIGxlZnQgPSBz
dHlsZS5sZWZ0OworICAgIHJzID0gZWxlbS5ydW50aW1lU3R5bGU7CisgICAgcnNMZWZ0ID0gcnMg
JiYgcnMubGVmdDsKKworICAgIC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21w
dXRlZCB2YWx1ZSBvdXQKKyAgICBpZiAoIHJzTGVmdCApIHsKKyAgICBycy5sZWZ0ID0gZWxlbS5j
dXJyZW50U3R5bGUubGVmdDsKKyAgICB9CisgICAgc3R5bGUubGVmdCA9IG5hbWUgPT09ICJmb250
U2l6ZSIgPyAiMWVtIiA6IHJldDsKKyAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwor
CisgICAgLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworICAgIHN0eWxlLmxlZnQgPSBsZWZ0
OworICAgIGlmICggcnNMZWZ0ICkgeworICAgIHJzLmxlZnQgPSByc0xlZnQ7CisgICAgfQorICAg
IH0KKworICAgIHJldHVybiByZXQgPT09ICIiID8gImF1dG8iIDogcmV0OworICAgIH07Cit9CisK
K2Z1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7Cisg
ICAgdmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTsKKyAgICByZXR1cm4gbWF0
Y2hlcyA/CisgICAgLy8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgInN1YnRyYWN0IiwgZS5nLiwg
d2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzCisgICAgTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAt
ICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgorICAgIHZh
bHVlOworfQorCitmdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0
cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7CisgICAgdmFyIGkgPSBleHRyYSA9PT0gKCBpc0Jv
cmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICkgPworICAgIC8vIElmIHdlIGFscmVhZHkg
aGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbgorICAgIDQgOgor
ICAgIC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHBy
b3BlcnRpZXMKKyAgICBuYW1lID09PSAid2lkdGgiID8gMSA6IDAsCisKKyAgICB2YWwgPSAwOwor
CisgICAgZm9yICggOyBpIDwgNDsgaSArPSAyICkgeworICAgIC8vIGJvdGggYm94IG1vZGVscyBl
eGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKKyAgICBpZiAoIGV4dHJhID09
PSAibWFyZ2luIiApIHsKKyAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NF
eHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CisgICAgfQorCisgICAgaWYgKCBpc0JvcmRlckJv
eCApIHsKKyAgICAvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBp
ZiB3ZSB3YW50IGNvbnRlbnQKKyAgICBpZiAoIGV4dHJhID09PSAiY29udGVudCIgKSB7CisgICAg
dmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVl
LCBzdHlsZXMgKTsKKyAgICB9CisKKyAgICAvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBi
b3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgorICAgIGlmICggZXh0cmEgIT09ICJt
YXJnaW4iICkgeworICAgIHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4
cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CisgICAgfQorICAgIH0gZWxzZSB7
CisgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRp
bmcKKyAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBp
IF0sIHRydWUsIHN0eWxlcyApOworCisgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3Qg
Y29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlcgorICAgIGlmICggZXh0cmEgIT09ICJw
YWRkaW5nIiApIHsKKyAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NF
eHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOworICAgIH0KKyAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIHZhbDsKK30KKworZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxl
bSwgbmFtZSwgZXh0cmEgKSB7CisKKyAgICAvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwg
d2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQorICAgIHZhciB2YWx1
ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKKyAgICB2YWwgPSBuYW1lID09PSAid2lkdGgiID8gZWxlbS5v
ZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0LAorICAgIHN0eWxlcyA9IGdldFN0eWxlcygg
ZWxlbSApLAorICAgIGlzQm9yZGVyQm94ID0galF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nICYmIGpR
dWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXIt
Ym94IjsKKworICAgIC8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBm
b3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZAorICAgIC8vIHN2ZyAt
IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NQorICAg
IC8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lk
PTQ5MTY2OAorICAgIGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7CisgICAgLy8gRmFs
bCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5CisgICAg
dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsKKyAgICBpZiAoIHZhbCA8IDAgfHwg
dmFsID09IG51bGwgKSB7CisgICAgdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOworICAgIH0KKwor
ICAgIC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4u
CisgICAgaWYgKCBybnVtbm9ucHgudGVzdCh2YWwpICkgeworICAgIHJldHVybiB2YWw7CisgICAg
fQorCisgICAgLy8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2Vy
IHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKKyAgICAvLyBmb3IgZ2V0Q29tcHV0ZWRT
dHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlCisgICAg
dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmICggalF1ZXJ5LnN1cHBvcnQuYm94U2l6
aW5nUmVsaWFibGUgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKKworICAgIC8vIE5v
cm1hbGl6ZSAiIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhCisgICAgdmFsID0gcGFyc2VG
bG9hdCggdmFsICkgfHwgMDsKKyAgICB9CisKKyAgICAvLyB1c2UgdGhlIGFjdGl2ZSBib3gtc2l6
aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlcworICAgIHJldHVybiAo
IHZhbCArCisgICAgYXVnbWVudFdpZHRoT3JIZWlnaHQoCisgICAgZWxlbSwKKyAgICBuYW1lLAor
ICAgIGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApLAorICAg
IHZhbHVlSXNCb3JkZXJCb3gsCisgICAgc3R5bGVzCisgICAgKQorICAgICkgKyAicHgiOworfQor
CisvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxl
bWVudAorZnVuY3Rpb24gY3NzX2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHsKKyAgICB2YXIg
ZG9jID0gZG9jdW1lbnQsCisgICAgZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdOwor
CisgICAgaWYgKCAhZGlzcGxheSApIHsKKyAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9k
ZU5hbWUsIGRvYyApOworCisgICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJv
bSBpbnNpZGUgYW4gaWZyYW1lCisgICAgaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgIWRpc3Bs
YXkgKSB7CisgICAgLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxl
CisgICAgaWZyYW1lID0gKCBpZnJhbWUgfHwKKyAgICBqUXVlcnkoIjxpZnJhbWUgZnJhbWVib3Jk
ZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKQorICAgIC5jc3MoICJjc3NUZXh0IiwgImRp
c3BsYXk6YmxvY2sgIWltcG9ydGFudCIgKQorICAgICkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVs
ZW1lbnQgKTsKKworICAgIC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdl
YmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQorICAgIGRvYyA9ICggaWZyYW1l
WzBdLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lWzBdLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50
OworICAgIGRvYy53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+Iik7CisgICAgZG9j
LmNsb3NlKCk7CisKKyAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyAp
OworICAgIGlmcmFtZS5kZXRhY2goKTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgY29ycmVj
dCBkZWZhdWx0IGRpc3BsYXkKKyAgICBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7
CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BsYXk7Cit9CisKKy8vIENhbGxlZCBPTkxZIGZyb20g
d2l0aGluIGNzc19kZWZhdWx0RGlzcGxheQorZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwg
ZG9jICkgeworICAgIHZhciBlbGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSAp
ICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksCisgICAgZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1b
MF0sICJkaXNwbGF5IiApOworICAgIGVsZW0ucmVtb3ZlKCk7CisgICAgcmV0dXJuIGRpc3BsYXk7
Cit9CisKK2pRdWVyeS5lYWNoKFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5h
bWUgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlv
biggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkgeworICAgIGlmICggY29tcHV0ZWQgKSB7CisgICAg
Ly8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2li
bHkgc2hvdyB0aGVtCisgICAgLy8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNw
bGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXMKKyAgICByZXR1cm4gZWxlbS5v
ZmZzZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwg
ImRpc3BsYXkiICkgKSA/CisgICAgalF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOwor
ICAgIH0pIDoKKyAgICBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAg
IH0KKyAgICB9LAorCisgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgewor
ICAgIHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTsKKyAgICByZXR1cm4g
c2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBleHRyYSA/CisgICAgYXVnbWVudFdpZHRo
T3JIZWlnaHQoCisgICAgZWxlbSwKKyAgICBuYW1lLAorICAgIGV4dHJhLAorICAgIGpRdWVyeS5z
dXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2Us
IHN0eWxlcyApID09PSAiYm9yZGVyLWJveCIsCisgICAgc3R5bGVzCisgICAgKSA6IDAKKyAgICAp
OworICAgIH0KKyAgICB9OworfSk7CisKK2lmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7
CisgICAgalF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxl
bSwgY29tcHV0ZWQgKSB7CisgICAgLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CisgICAg
cmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVs
ZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KKyAg
ICAoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgIiIgOgorICAgIGNvbXB1dGVk
ID8gIjEiIDogIiI7CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkg
eworICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCisgICAgY3VycmVudFN0eWxlID0gZWxlbS5j
dXJyZW50U3R5bGUsCisgICAgb3BhY2l0eSA9IGpRdWVyeS5pc051bWVyaWMoIHZhbHVlICkgPyAi
YWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIgOiAiIiwKKyAgICBmaWx0ZXIgPSBj
dXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmZpbHRlciB8fCBzdHlsZS5maWx0ZXIgfHwgIiI7
CisKKyAgICAvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2
ZSBsYXlvdXQKKyAgICAvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCisgICAg
c3R5bGUuem9vbSA9IDE7CisKKyAgICAvLyBpZiBzZXR0aW5nIG9wYWNpdHkgdG8gMSwgYW5kIG5v
IG90aGVyIGZpbHRlcnMgZXhpc3QgLSBhdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgYXR0cmlidXRl
ICM2NjUyCisgICAgLy8gaWYgdmFsdWUgPT09ICIiLCB0aGVuIHJlbW92ZSBpbmxpbmUgb3BhY2l0
eSAjMTI2ODUKKyAgICBpZiAoICggdmFsdWUgPj0gMSB8fCB2YWx1ZSA9PT0gIiIgKSAmJgorICAg
IGpRdWVyeS50cmltKCBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCAiIiApICkgPT09ICIiICYmCisg
ICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlICkgeworCisgICAgLy8gU2V0dGluZyBzdHlsZS5maWx0
ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0
CisgICAgLy8gaWYgImZpbHRlcjoiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUgaXMgZGlz
YWJsZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpcworICAgIC8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0
ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4uLgorICAg
IHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKKworICAgIC8vIGlmIHRoZXJlIGlz
IG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUgb3IgdW5zZXQgaW5saW5lIG9w
YWNpdHksIHdlIGFyZSBkb25lCisgICAgaWYgKCB2YWx1ZSA9PT0gIiIgfHwgY3VycmVudFN0eWxl
ICYmICFjdXJyZW50U3R5bGUuZmlsdGVyICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQor
CisgICAgLy8gb3RoZXJ3aXNlLCBzZXQgbmV3IGZpbHRlciB2YWx1ZXMKKyAgICBzdHlsZS5maWx0
ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPworICAgIGZpbHRlci5yZXBsYWNlKCByYWxwaGEs
IG9wYWNpdHkgKSA6CisgICAgZmlsdGVyICsgIiAiICsgb3BhY2l0eTsKKyAgICB9CisgICAgfTsK
K30KKworLy8gVGhlc2UgaG9va3MgY2Fubm90IGJlIGFkZGVkIHVudGlsIERPTSByZWFkeSBiZWNh
dXNlIHRoZSBzdXBwb3J0IHRlc3QKKy8vIGZvciBpdCBpcyBub3QgcnVuIHVudGlsIGFmdGVyIERP
TSByZWFkeQoralF1ZXJ5KGZ1bmN0aW9uKCkgeworICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LnJl
bGlhYmxlTWFyZ2luUmlnaHQgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0g
eworICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgIGlmICggY29tcHV0
ZWQgKSB7CisgICAgLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJu
cyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CisgICAgLy8gV29yayBhcm91bmQgYnkgdGVt
cG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCisgICAgcmV0
dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7ICJkaXNwbGF5IjogImlubGluZS1ibG9jayIgfSwKKyAg
ICBjdXJDU1MsIFsgZWxlbSwgIm1hcmdpblJpZ2h0IiBdICk7CisgICAgfQorICAgIH0KKyAgICB9
OworICAgIH0KKworICAgIC8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0yOTA4NAorICAgIC8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJj
ZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQKKyAgICAvLyByYXRo
ZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwg
d2UganVzdCBjaGVjayBmb3IgaXQgaGVyZQorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LnBpeGVs
UG9zaXRpb24gJiYgalF1ZXJ5LmZuLnBvc2l0aW9uICkgeworICAgIGpRdWVyeS5lYWNoKCBbICJ0
b3AiLCAibGVmdCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tz
WyBwcm9wIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAg
aWYgKCBjb21wdXRlZCApIHsKKyAgICBjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApOwor
ICAgIC8vIGlmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldAor
ICAgIHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CisgICAgalF1ZXJ5KCBlbGVt
ICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CisgICAgY29tcHV0ZWQ7CisgICAgfQorICAg
IH0KKyAgICB9OworICAgIH0pOworICAgIH0KKworfSk7CisKK2lmICggalF1ZXJ5LmV4cHIgJiYg
alF1ZXJ5LmV4cHIuZmlsdGVycyApIHsKKyAgICBqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9
IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyCisgICAg
Ly8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFu
IHplcm8gb24gc29tZSBlbGVtZW50cworICAgIHJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAg
JiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMCB8fAorICAgICghalF1ZXJ5LnN1cHBvcnQucmVsaWFi
bGVIaWRkZW5PZmZzZXRzICYmICgoZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkpIHx8
IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApKSA9PT0gIm5vbmUiKTsKKyAgICB9OworCisg
ICAgalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOworICAgIH07Cit9CisK
Ky8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXMK
K2pRdWVyeS5lYWNoKHsKKyAgICBtYXJnaW46ICIiLAorICAgIHBhZGRpbmc6ICIiLAorICAgIGJv
cmRlcjogIldpZHRoIgorfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgeworICAgIGpRdWVy
eS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7CisgICAgZXhwYW5kOiBmdW5jdGlvbigg
dmFsdWUgKSB7CisgICAgdmFyIGkgPSAwLAorICAgIGV4cGFuZGVkID0ge30sCisKKyAgICAvLyBh
c3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKKyAgICBwYXJ0cyA9IHR5cGVv
ZiB2YWx1ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBdOworCisg
ICAgZm9yICggOyBpIDwgNDsgaSsrICkgeworICAgIGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBh
bmRbIGkgXSArIHN1ZmZpeCBdID0KKyAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8
IHBhcnRzWyAwIF07CisgICAgfQorCisgICAgcmV0dXJuIGV4cGFuZGVkOworICAgIH0KKyAgICB9
OworCisgICAgaWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHsKKyAgICBqUXVlcnkuY3Nz
SG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOworICAgIH0K
K30pOwordmFyIHIyMCA9IC8lMjAvZywKKyAgICByYnJhY2tldCA9IC9cW1xdJC8sCisgICAgckNS
TEYgPSAvXHI/XG4vZywKKyAgICByc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258
aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksCisgICAgcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxl
Y3R8dGV4dGFyZWF8a2V5Z2VuKS9pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBzZXJpYWxp
emU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXpl
QXJyYXkoKSApOworICAgIH0sCisgICAgc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgeworICAg
IHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworICAgIC8vIENhbiBhZGQgcHJvcEhvb2sgZm9y
ICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCisgICAgdmFyIGVsZW1l
bnRzID0galF1ZXJ5LnByb3AoIHRoaXMsICJlbGVtZW50cyIgKTsKKyAgICByZXR1cm4gZWxlbWVu
dHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpczsKKyAgICB9KQorICAgIC5m
aWx0ZXIoZnVuY3Rpb24oKXsKKyAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKKyAgICAvLyBVc2Ug
LmlzKCI6ZGlzYWJsZWQiKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcworICAgIHJl
dHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCAiOmRpc2FibGVkIiApICYmCisg
ICAgcnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVz
LnRlc3QoIHR5cGUgKSAmJgorICAgICggdGhpcy5jaGVja2VkIHx8ICFtYW5pcHVsYXRpb25fcmNo
ZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7CisgICAgfSkKKyAgICAubWFwKGZ1bmN0aW9uKCBp
LCBlbGVtICl7CisgICAgdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOworCisgICAgcmV0
dXJuIHZhbCA9PSBudWxsID8KKyAgICBudWxsIDoKKyAgICBqUXVlcnkuaXNBcnJheSggdmFsICkg
PworICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApeworICAgIHJldHVybiB7IG5h
bWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKKyAg
ICB9KSA6CisgICAgeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYs
ICJcclxuIiApIH07CisgICAgfSkuZ2V0KCk7CisgICAgfQorfSk7CisKKy8vU2VyaWFsaXplIGFu
IGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKKy8va2V5L3ZhbHVlcyBpbnRvIGEg
cXVlcnkgc3RyaW5nCitqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7
CisgICAgdmFyIHByZWZpeCwKKyAgICBzID0gW10sCisgICAgYWRkID0gZnVuY3Rpb24oIGtleSwg
dmFsdWUgKSB7CisgICAgLy8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCBy
ZXR1cm4gaXRzIHZhbHVlCisgICAgdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/
IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7CisgICAgc1sgcy5sZW5n
dGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25l
bnQoIHZhbHVlICk7CisgICAgfTsKKworICAgIC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZv
ciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCisgICAgaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5k
ZWZpbmVkICkgeworICAgIHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVl
cnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOworICAgIH0KKworICAgIC8vIElmIGFuIGFycmF5
IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVu
dHMuCisgICAgaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVy
eS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxl
bWVudHMKKyAgICBqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisgICAgYWRkKCB0aGlzLm5h
bWUsIHRoaXMudmFsdWUgKTsKKyAgICB9KTsKKworICAgIH0gZWxzZSB7CisgICAgLy8gSWYgdHJh
ZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCisg
ICAgLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCisgICAg
Zm9yICggcHJlZml4IGluIGEgKSB7CisgICAgYnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4
IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRo
ZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgorICAgIHJldHVybiBzLmpvaW4oICImIiApLnJlcGxh
Y2UoIHIyMCwgIisiICk7Cit9OworCitmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmos
IHRyYWRpdGlvbmFsLCBhZGQgKSB7CisgICAgdmFyIG5hbWU7CisKKyAgICBpZiAoIGpRdWVyeS5p
c0FycmF5KCBvYmogKSApIHsKKyAgICAvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS4KKyAgICBqUXVl
cnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHsKKyAgICBpZiAoIHRyYWRpdGlvbmFsIHx8
IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgeworICAgIC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRl
bSBhcyBhIHNjYWxhci4KKyAgICBhZGQoIHByZWZpeCwgdiApOworCisgICAgfSBlbHNlIHsKKyAg
ICAvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVt
ZXJpYyBpbmRleC4KKyAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9
PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOworICAg
IH0KKyAgICB9KTsKKworICAgIH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlw
ZSggb2JqICkgPT09ICJvYmplY3QiICkgeworICAgIC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4K
KyAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKKyAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsi
ICsgbmFtZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICB9CisK
KyAgICB9IGVsc2UgeworICAgIC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KKyAgICBhZGQoIHBy
ZWZpeCwgb2JqICk7CisgICAgfQorfQoralF1ZXJ5LmVhY2goICgiYmx1ciBmb2N1cyBmb2N1c2lu
IGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgIiArCisg
ICAgIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vl
bnRlciBtb3VzZWxlYXZlICIgKworICAgICJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtl
eXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Iikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGks
IG5hbWUgKSB7CisKKyAgICAvLyBIYW5kbGUgZXZlbnQgYmluZGluZworICAgIGpRdWVyeS5mblsg
bmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgeworICAgIHJldHVybiBhcmd1bWVudHMubGVu
Z3RoID4gMCA/CisgICAgdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CisgICAgdGhp
cy50cmlnZ2VyKCBuYW1lICk7CisgICAgfTsKK30pOworCitqUXVlcnkuZm4uaG92ZXIgPSBmdW5j
dGlvbiggZm5PdmVyLCBmbk91dCApIHsKKyAgICByZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92
ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKK307Cit2YXIKKyAgICAvLyBEb2N1
bWVudCBsb2NhdGlvbgorICAgIGFqYXhMb2NQYXJ0cywKKyAgICBhamF4TG9jYXRpb24sCisgICAg
YWpheF9ub25jZSA9IGpRdWVyeS5ub3coKSwKKworICAgIGFqYXhfcnF1ZXJ5ID0gL1w/LywKKyAg
ICByaGFzaCA9IC8jLiokLywKKyAgICBydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCisgICAgcmhlYWRl
cnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLCAvLyBJRSBsZWF2ZXMgYW4gXHIg
Y2hhcmFjdGVyIGF0IEVPTAorICAgIC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3Rv
Y29sIGRldGVjdGlvbgorICAgIHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0
b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCisgICAgcm5vQ29udGVudCA9
IC9eKD86R0VUfEhFQUQpJC8sCisgICAgcnByb3RvY29sID0gL15cL1wvLywKKyAgICBydXJsID0g
L14oW1x3ListXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLAorCisgICAgLy8g
S2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAorICAgIF9sb2FkID0galF1ZXJ5LmZu
LmxvYWQsCisKKyAgICAvKiBQcmVmaWx0ZXJzCisgICAgICogMSkgVGhleSBhcmUgdXNlZnVsIHRv
IGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhh
bXBsZSkKKyAgICAgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOgorICAgICAqICAgIC0gQkVGT1JFIGFz
a2luZyBmb3IgYSB0cmFuc3BvcnQKKyAgICAgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRp
b24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCisgICAgICog
Mykga2V5IGlzIHRoZSBkYXRhVHlwZQorICAgICAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioi
IGNhbiBiZSB1c2VkCisgICAgICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3Bv
cnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCisgICAg
ICovCisgICAgcHJlZmlsdGVycyA9IHt9LAorCisgICAgLyogVHJhbnNwb3J0cyBiaW5kaW5ncwor
ICAgICAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKKyAgICAgKiAyKSB0aGUgY2F0Y2hhbGwgc3lt
Ym9sICIqIiBjYW4gYmUgdXNlZAorICAgICAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGgg
dHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKKyAgICAgKi8K
KyAgICB0cmFuc3BvcnRzID0ge30sCisKKyAgICAvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFy
IHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Np
b24KKyAgICBhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCIqIik7CisKKy8vICM4MTM4LCBJRSBtYXkg
dGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nCisvLyBhIGZpZWxkIGZyb20gd2luZG93
LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKK3RyeSB7CisgICAgYWph
eExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjsKK30gY2F0Y2goIGUgKSB7CisgICAgLy8gVXNlIHRo
ZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQKKyAgICAvLyBzaW5jZSBJRSB3aWxsIG1v
ZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbgorICAgIGFqYXhMb2NhdGlvbiA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOworICAgIGFqYXhMb2NhdGlvbi5ocmVmID0gIiI7Cisg
ICAgYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Cit9CisKKy8vIFNlZ21lbnQgbG9j
YXRpb24gaW50byBwYXJ0cworYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24u
dG9Mb3dlckNhc2UoKSApIHx8IFtdOworCisvLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVy
eS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAorZnVuY3Rpb24gYWRkVG9Q
cmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CisKKyAgICAvLyBkYXRhVHlwZUV4
cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgorICAgIHJldHVybiBmdW5j
dGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgeworCisgICAgaWYgKCB0eXBlb2YgZGF0
YVR5cGVFeHByZXNzaW9uICE9PSAic3RyaW5nIiApIHsKKyAgICBmdW5jID0gZGF0YVR5cGVFeHBy
ZXNzaW9uOworICAgIGRhdGFUeXBlRXhwcmVzc2lvbiA9ICIqIjsKKyAgICB9CisKKyAgICB2YXIg
ZGF0YVR5cGUsCisgICAgaSA9IDAsCisgICAgZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9u
LnRvTG93ZXJDYXNlKCkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKyAgICBpZiAo
IGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CisgICAgLy8gRm9yIGVhY2ggZGF0YVR5cGUg
aW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgorICAgIHdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5
cGVzW2krK10pICkgeworICAgIC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCisgICAgaWYgKCBkYXRh
VHlwZVswXSA9PT0gIisiICkgeworICAgIGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8
fCAiKiI7CisgICAgKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUg
XSB8fCBbXSkudW5zaGlmdCggZnVuYyApOworCisgICAgLy8gT3RoZXJ3aXNlIGFwcGVuZAorICAg
IH0gZWxzZSB7CisgICAgKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5
cGUgXSB8fCBbXSkucHVzaCggZnVuYyApOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH07Cit9
CisKKy8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNw
b3J0cworZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwg
b3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKKworICAgIHZhciBpbnNwZWN0ZWQg
PSB7fSwKKyAgICBzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMg
KTsKKworICAgIGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkgeworICAgIHZhciBzZWxlY3Rl
ZDsKKyAgICBpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOworICAgIGpRdWVyeS5lYWNoKCBz
dHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3Rv
cnkgKSB7CisgICAgdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3Rvcnko
IG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKKyAgICBpZiggdHlwZW9mIGRhdGFU
eXBlT3JUcmFuc3BvcnQgPT09ICJzdHJpbmciICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNw
ZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKKyAgICBvcHRpb25zLmRhdGFUeXBlcy51
bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CisgICAgaW5zcGVjdCggZGF0YVR5cGVPclRy
YW5zcG9ydCApOworICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCBzZWVraW5nVHJh
bnNwb3J0ICkgeworICAgIHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQg
KTsKKyAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHJl
dHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioi
IF0gJiYgaW5zcGVjdCggIioiICk7Cit9CisKKy8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXgg
b3B0aW9ucworLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0
ZW5kZWQpCisvLyBGaXhlcyAjOTg4NworZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMg
KSB7CisgICAgdmFyIGRlZXAsIGtleSwKKyAgICBmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0
dGluZ3MuZmxhdE9wdGlvbnMgfHwge307CisKKyAgICBmb3IgKCBrZXkgaW4gc3JjICkgeworICAg
IGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgeworICAgICggZmxhdE9wdGlvbnNbIGtl
eSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8IChkZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNbIGtl
eSBdOworICAgIH0KKyAgICB9CisgICAgaWYgKCBkZWVwICkgeworICAgIGpRdWVyeS5leHRlbmQo
IHRydWUsIHRhcmdldCwgZGVlcCApOworICAgIH0KKworICAgIHJldHVybiB0YXJnZXQ7Cit9CisK
K2pRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKyAg
ICBpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgeworICAgIHJldHVybiBf
bG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisgICAgfQorCisgICAgdmFyIHNlbGVjdG9y
LCByZXNwb25zZSwgdHlwZSwKKyAgICBzZWxmID0gdGhpcywKKyAgICBvZmYgPSB1cmwuaW5kZXhP
ZigiICIpOworCisgICAgaWYgKCBvZmYgPj0gMCApIHsKKyAgICBzZWxlY3RvciA9IHVybC5zbGlj
ZSggb2ZmLCB1cmwubGVuZ3RoICk7CisgICAgdXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTsKKyAg
ICB9CisKKyAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24KKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0
aW9uKCBwYXJhbXMgKSApIHsKKworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxi
YWNrCisgICAgY2FsbGJhY2sgPSBwYXJhbXM7CisgICAgcGFyYW1zID0gdW5kZWZpbmVkOworCisg
ICAgLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworICAgIH0gZWxzZSBpZiAoIHBh
cmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKKyAgICB0eXBlID0gIlBPU1Qi
OworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRo
ZSByZXF1ZXN0CisgICAgaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CisgICAgalF1ZXJ5LmFqYXgo
eworICAgIHVybDogdXJsLAorCisgICAgLy8gaWYgInR5cGUiIHZhcmlhYmxlIGlzIHVuZGVmaW5l
ZCwgdGhlbiAiR0VUIiBtZXRob2Qgd2lsbCBiZSB1c2VkCisgICAgdHlwZTogdHlwZSwKKyAgICBk
YXRhVHlwZTogImh0bWwiLAorICAgIGRhdGE6IHBhcmFtcworICAgIH0pLmRvbmUoZnVuY3Rpb24o
IHJlc3BvbnNlVGV4dCApIHsKKworICAgIC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21w
bGV0ZSBjYWxsYmFjaworICAgIHJlc3BvbnNlID0gYXJndW1lbnRzOworCisgICAgc2VsZi5odG1s
KCBzZWxlY3RvciA/CisKKyAgICAvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0
ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKKyAgICAvLyBFeGNsdWRlIHNjcmlw
dHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKKyAgICBqUXVlcnkoIjxk
aXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNl
bGVjdG9yICkgOgorCisgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHQKKyAgICBy
ZXNwb25zZVRleHQgKTsKKworICAgIH0pLmNvbXBsZXRlKCBjYWxsYmFjayAmJiBmdW5jdGlvbigg
anFYSFIsIHN0YXR1cyApIHsKKyAgICBzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBb
IGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CisgICAgfSk7CisgICAgfQor
CisgICAgcmV0dXJuIHRoaXM7Cit9OworCisvLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMg
Zm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cworalF1ZXJ5LmVhY2goIFsgImFqYXhTdGFy
dCIsICJhamF4U3RvcCIsICJhamF4Q29tcGxldGUiLCAiYWpheEVycm9yIiwgImFqYXhTdWNjZXNz
IiwgImFqYXhTZW5kIiBdLCBmdW5jdGlvbiggaSwgdHlwZSApeworICAgIGpRdWVyeS5mblsgdHlw
ZSBdID0gZnVuY3Rpb24oIGZuICl7CisgICAgcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cisg
ICAgfTsKK30pOworCitqUXVlcnkuZWFjaCggWyAiZ2V0IiwgInBvc3QiIF0sIGZ1bmN0aW9uKCBp
LCBtZXRob2QgKSB7CisgICAgalF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEs
IGNhbGxiYWNrLCB0eXBlICkgeworICAgIC8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3Vt
ZW50IHdhcyBvbWl0dGVkCisgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewor
ICAgIHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOworICAgIGNhbGxiYWNrID0gZGF0YTsKKyAgICBk
YXRhID0gdW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiBqUXVlcnkuYWpheCh7CisgICAg
dXJsOiB1cmwsCisgICAgdHlwZTogbWV0aG9kLAorICAgIGRhdGFUeXBlOiB0eXBlLAorICAgIGRh
dGE6IGRhdGEsCisgICAgc3VjY2VzczogY2FsbGJhY2sKKyAgICB9KTsKKyAgICB9OworfSk7CisK
K2pRdWVyeS5leHRlbmQoeworCisgICAgLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVy
IG9mIGFjdGl2ZSBxdWVyaWVzCisgICAgYWN0aXZlOiAwLAorCisgICAgLy8gTGFzdC1Nb2RpZmll
ZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAorICAgIGxhc3RNb2RpZmllZDoge30sCisg
ICAgZXRhZzoge30sCisKKyAgICBhamF4U2V0dGluZ3M6IHsKKyAgICB1cmw6IGFqYXhMb2NhdGlv
biwKKyAgICB0eXBlOiAiR0VUIiwKKyAgICBpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBh
amF4TG9jUGFydHNbIDEgXSApLAorICAgIGdsb2JhbDogdHJ1ZSwKKyAgICBwcm9jZXNzRGF0YTog
dHJ1ZSwKKyAgICBhc3luYzogdHJ1ZSwKKyAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gt
d3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisgICAgLyoKKyAgICB0aW1lb3V0
OiAwLAorICAgIGRhdGE6IG51bGwsCisgICAgZGF0YVR5cGU6IG51bGwsCisgICAgdXNlcm5hbWU6
IG51bGwsCisgICAgcGFzc3dvcmQ6IG51bGwsCisgICAgY2FjaGU6IG51bGwsCisgICAgdGhyb3dz
OiBmYWxzZSwKKyAgICB0cmFkaXRpb25hbDogZmFsc2UsCisgICAgaGVhZGVyczoge30sCisgICAg
Ki8KKworICAgIGFjY2VwdHM6IHsKKyAgICAiKiI6IGFsbFR5cGVzLAorICAgIHRleHQ6ICJ0ZXh0
L3BsYWluIiwKKyAgICBodG1sOiAidGV4dC9odG1sIiwKKyAgICB4bWw6ICJhcHBsaWNhdGlvbi94
bWwsIHRleHQveG1sIiwKKyAgICBqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2Ny
aXB0IgorICAgIH0sCisKKyAgICBjb250ZW50czogeworICAgIHhtbDogL3htbC8sCisgICAgaHRt
bDogL2h0bWwvLAorICAgIGpzb246IC9qc29uLworICAgIH0sCisKKyAgICByZXNwb25zZUZpZWxk
czogeworICAgIHhtbDogInJlc3BvbnNlWE1MIiwKKyAgICB0ZXh0OiAicmVzcG9uc2VUZXh0Igor
ICAgIH0sCisKKyAgICAvLyBEYXRhIGNvbnZlcnRlcnMKKyAgICAvLyBLZXlzIHNlcGFyYXRlIHNv
dXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmds
ZSBzcGFjZQorICAgIGNvbnZlcnRlcnM6IHsKKworICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8g
dGV4dAorICAgICIqIHRleHQiOiB3aW5kb3cuU3RyaW5nLAorCisgICAgLy8gVGV4dCB0byBodG1s
ICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCisgICAgInRleHQgaHRtbCI6IHRydWUsCisKKyAg
ICAvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCisgICAgInRleHQganNvbiI6
IGpRdWVyeS5wYXJzZUpTT04sCisKKyAgICAvLyBQYXJzZSB0ZXh0IGFzIHhtbAorICAgICJ0ZXh0
IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAorICAgIH0sCisKKyAgICAvLyBGb3Igb3B0aW9ucyB0aGF0
IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOgorICAgIC8vIHlvdSBjYW4gYWRkIHlvdXIgb3du
IGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKKyAgICAvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0
aGF0IHNob3VsZG4ndCBiZQorICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQor
ICAgIGZsYXRPcHRpb25zOiB7CisgICAgdXJsOiB0cnVlLAorICAgIGNvbnRleHQ6IHRydWUKKyAg
ICB9CisgICAgfSwKKworICAgIC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2Jq
ZWN0IGludG8gdGFyZ2V0CisgICAgLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGlu
Z3MgZmllbGRzLgorICAgIC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4
U2V0dGluZ3MuCisgICAgYWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsK
KyAgICByZXR1cm4gc2V0dGluZ3MgPworCisgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmpl
Y3QKKyAgICBhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGlu
Z3MgKSwgc2V0dGluZ3MgKSA6CisKKyAgICAvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisgICAg
YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7CisgICAgfSwKKworICAg
IGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyAp
LAorICAgIGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNw
b3J0cyApLAorCisgICAgLy8gTWFpbiBtZXRob2QKKyAgICBhamF4OiBmdW5jdGlvbiggdXJsLCBv
cHRpb25zICkgeworCisgICAgLy8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEu
NSBzaWduYXR1cmUKKyAgICBpZiAoIHR5cGVvZiB1cmwgPT09ICJvYmplY3QiICkgeworICAgIG9w
dGlvbnMgPSB1cmw7CisgICAgdXJsID0gdW5kZWZpbmVkOworICAgIH0KKworICAgIC8vIEZvcmNl
IG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisK
KyAgICB2YXIgLy8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzCisgICAgcGFydHMsCisgICAg
Ly8gTG9vcCB2YXJpYWJsZQorICAgIGksCisgICAgLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBw
YXJhbQorICAgIGNhY2hlVVJMLAorICAgIC8vIFJlc3BvbnNlIGhlYWRlcnMgYXMgc3RyaW5nCisg
ICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nLAorICAgIC8vIHRpbWVvdXQgaGFuZGxlCisgICAgdGlt
ZW91dFRpbWVyLAorCisgICAgLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBk
aXNwYXRjaGVkCisgICAgZmlyZUdsb2JhbHMsCisKKyAgICB0cmFuc3BvcnQsCisgICAgLy8gUmVz
cG9uc2UgaGVhZGVycworICAgIHJlc3BvbnNlSGVhZGVycywKKyAgICAvLyBDcmVhdGUgdGhlIGZp
bmFsIG9wdGlvbnMgb2JqZWN0CisgICAgcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25z
ICksCisgICAgLy8gQ2FsbGJhY2tzIGNvbnRleHQKKyAgICBjYWxsYmFja0NvbnRleHQgPSBzLmNv
bnRleHQgfHwgcywKKyAgICAvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNr
Q29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uCisgICAgZ2xv
YmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBl
IHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CisgICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRl
eHQgKSA6CisgICAgalF1ZXJ5LmV2ZW50LAorICAgIC8vIERlZmVycmVkcworICAgIGRlZmVycmVk
ID0galF1ZXJ5LkRlZmVycmVkKCksCisgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxs
YmFja3MoIm9uY2UgbWVtb3J5IiksCisgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MK
KyAgICBzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAorICAgIC8vIEhlYWRlcnMgKHRo
ZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCisgICAgcmVxdWVzdEhlYWRlcnMgPSB7fSwKKyAgICBy
ZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCisgICAgLy8gVGhlIGpxWEhSIHN0YXRlCisgICAgc3Rh
dGUgPSAwLAorICAgIC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQorICAgIHN0ckFib3J0ID0gImNh
bmNlbGVkIiwKKyAgICAvLyBGYWtlIHhocgorICAgIGpxWEhSID0geworICAgIHJlYWR5U3RhdGU6
IDAsCisKKyAgICAvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCisgICAgZ2V0
UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CisgICAgdmFyIG1hdGNoOworICAgIGlm
ICggc3RhdGUgPT09IDIgKSB7CisgICAgaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgeworICAgIHJl
c3BvbnNlSGVhZGVycyA9IHt9OworICAgIHdoaWxlICggKG1hdGNoID0gcmhlYWRlcnMuZXhlYygg
cmVzcG9uc2VIZWFkZXJzU3RyaW5nICkpICkgeworICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hb
MV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKKyAgICB9CisgICAgfQorICAgIG1hdGNo
ID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOworICAgIH0KKyAgICByZXR1
cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDsKKyAgICB9LAorCisgICAgLy8gUmF3IHN0
cmluZworICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKKyAgICB9LAorCisg
ICAgLy8gQ2FjaGVzIHRoZSBoZWFkZXIKKyAgICBzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbigg
bmFtZSwgdmFsdWUgKSB7CisgICAgdmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAg
IGlmICggIXN0YXRlICkgeworICAgIG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBd
ID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lOworICAgIHJlcXVlc3RIZWFk
ZXJzWyBuYW1lIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKwor
ICAgIC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCisgICAgb3ZlcnJp
ZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgaWYgKCAhc3RhdGUgKSB7CisgICAg
cy5taW1lVHlwZSA9IHR5cGU7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAg
ICAvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworICAgIHN0YXR1c0NvZGU6IGZ1bmN0aW9u
KCBtYXAgKSB7CisgICAgdmFyIGNvZGU7CisgICAgaWYgKCBtYXAgKSB7CisgICAgaWYgKCBzdGF0
ZSA8IDIgKSB7CisgICAgZm9yICggY29kZSBpbiBtYXAgKSB7CisgICAgLy8gTGF6eS1hZGQgdGhl
IG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lcworICAgIHN0YXR1
c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdOworICAg
IH0KKyAgICB9IGVsc2UgeworICAgIC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNr
cworICAgIGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOworICAgIH0KKyAgICB9
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8vIENhbmNlbCB0aGUgcmVxdWVzdAor
ICAgIGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKKyAgICB2YXIgZmluYWxUZXh0ID0g
c3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKKyAgICBpZiAoIHRyYW5zcG9ydCApIHsKKyAgICB0cmFu
c3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApOworICAgIH0KKyAgICBkb25lKCAwLCBmaW5hbFRleHQg
KTsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgfTsKKworICAgIC8vIEF0dGFjaCBkZWZl
cnJlZHMKKyAgICBkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVE
ZWZlcnJlZC5hZGQ7CisgICAganFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7CisgICAganFYSFIu
ZXJyb3IgPSBqcVhIUi5mYWlsOworCisgICAgLy8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUz
MTogYW5kIHN0cmluZyBwcm9tb3Rpb24pCisgICAgLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92
aWRlZCAoIzU4NjY6IElFNyBpc3N1ZSB3aXRoIHByb3RvY29sLWxlc3MgdXJscykKKyAgICAvLyBI
YW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVu
Y3kgd2l0aCBvbGQgc2lnbmF0dXJlKQorICAgIC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1l
dGVyIGlmIGF2YWlsYWJsZQorICAgIHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9j
YXRpb24gKSArICIiICkucmVwbGFjZSggcmhhc2gsICIiICkucmVwbGFjZSggcnByb3RvY29sLCBh
amF4TG9jUGFydHNbIDEgXSArICIvLyIgKTsKKworICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRpb24g
dG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNAorICAgIHMudHlwZSA9IG9wdGlvbnMubWV0aG9k
IHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7CisKKyAgICAvLyBFeHRyYWN0
IGRhdGFUeXBlcyBsaXN0CisgICAgcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlw
ZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFsiIl07
CisKKyAgICAvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2
ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaAorICAgIGlmICggcy5jcm9zc0RvbWFpbiA9
PSBudWxsICkgeworICAgIHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7
CisgICAgcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJgorICAgICggcGFydHNbIDEgXSAhPT0g
YWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwK
KyAgICAoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0NDMg
KSApICE9CisgICAgKCBhamF4TG9jUGFydHNbIDMgXSB8fCAoIGFqYXhMb2NQYXJ0c1sgMSBdID09
PSAiaHR0cDoiID8gODAgOiA0NDMgKSApICkKKyAgICApOworICAgIH0KKworICAgIC8vIENvbnZl
cnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZworICAgIGlmICggcy5kYXRhICYmIHMucHJv
Y2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CisgICAgcy5kYXRhID0g
alF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKKyAgICB9CisKKyAgICAvLyBB
cHBseSBwcmVmaWx0ZXJzCisgICAgaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZp
bHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7CisKKyAgICAvLyBJZiByZXF1ZXN0IHdhcyBhYm9y
dGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQorICAgIGlmICggc3RhdGUgPT09IDIg
KSB7CisgICAgcmV0dXJuIGpxWEhSOworICAgIH0KKworICAgIC8vIFdlIGNhbiBmaXJlIGdsb2Jh
bCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCisgICAgZmlyZUdsb2JhbHMgPSBzLmdsb2Jh
bDsKKworICAgIC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKKyAgICBpZiAoIGZp
cmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKKyAgICBqUXVlcnkuZXZlbnQu
dHJpZ2dlcigiYWpheFN0YXJ0Iik7CisgICAgfQorCisgICAgLy8gVXBwZXJjYXNlIHRoZSB0eXBl
CisgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CisKKyAgICAvLyBEZXRlcm1pbmUg
aWYgcmVxdWVzdCBoYXMgY29udGVudAorICAgIHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRl
c3QoIHMudHlwZSApOworCisgICAgLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5n
IHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCisgICAgLy8gYW5kL29yIElmLU5vbmUtTWF0Y2gg
aGVhZGVyIGxhdGVyIG9uCisgICAgY2FjaGVVUkwgPSBzLnVybDsKKworICAgIC8vIE1vcmUgb3B0
aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisgICAgaWYgKCAhcy5o
YXNDb250ZW50ICkgeworCisgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRh
IHRvIHVybAorICAgIGlmICggcy5kYXRhICkgeworICAgIGNhY2hlVVJMID0gKCBzLnVybCArPSAo
IGFqYXhfcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOwor
ICAgIC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZl
bnR1YWwgcmV0cnkKKyAgICBkZWxldGUgcy5kYXRhOworICAgIH0KKworICAgIC8vIEFkZCBhbnRp
LWNhY2hlIGluIHVybCBpZiBuZWVkZWQKKyAgICBpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkgewor
ICAgIHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPworCisgICAgLy8gSWYgdGhlcmUgaXMg
YWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWUKKyAgICBjYWNoZVVSTC5yZXBs
YWNlKCBydHMsICIkMV89IiArIGFqYXhfbm9uY2UrKyApIDoKKworICAgIC8vIE90aGVyd2lzZSBh
ZGQgb25lIHRvIHRoZSBlbmQKKyAgICBjYWNoZVVSTCArICggYWpheF9ycXVlcnkudGVzdCggY2Fj
aGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIGFqYXhfbm9uY2UrKzsKKyAgICB9CisgICAg
fQorCisgICAgLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRj
aCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKyAgICBpZiAoIHMuaWZNb2RpZmllZCAp
IHsKKyAgICBpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7CisgICAganFY
SFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU1vZGlmaWVkLVNpbmNlIiwgalF1ZXJ5Lmxhc3RNb2Rp
ZmllZFsgY2FjaGVVUkwgXSApOworICAgIH0KKyAgICBpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVS
TCBdICkgeworICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1
ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBj
b3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CisgICAgaWYgKCBzLmRhdGEgJiYg
cy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVu
dFR5cGUgKSB7CisgICAganFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMu
Y29udGVudFR5cGUgKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZv
ciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisgICAganFYSFIuc2V0UmVx
dWVzdEhlYWRlcigKKyAgICAiQWNjZXB0IiwKKyAgICBzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNj
ZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSA/CisgICAgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBd
ICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAu
MDEiIDogIiIgKSA6CisgICAgcy5hY2NlcHRzWyAiKiIgXQorICAgICk7CisKKyAgICAvLyBDaGVj
ayBmb3IgaGVhZGVycyBvcHRpb24KKyAgICBmb3IgKCBpIGluIHMuaGVhZGVycyApIHsKKyAgICBq
cVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOworICAgIH0KKworICAg
IC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKyAgICBp
ZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQs
IGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7CisgICAgLy8gQWJvcnQg
aWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCisgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7
CisgICAgfQorCisgICAgLy8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uCisg
ICAgc3RyQWJvcnQgPSAiYWJvcnQiOworCisgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVm
ZXJyZWRzCisgICAgZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTog
MSB9ICkgeworICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOworICAgIH0KKworICAgIC8vIEdldCB0
cmFuc3BvcnQKKyAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cygg
dHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworICAgIC8vIElmIG5vIHRyYW5zcG9y
dCwgd2UgYXV0by1hYm9ydAorICAgIGlmICggIXRyYW5zcG9ydCApIHsKKyAgICBkb25lKCAtMSwg
Ik5vIFRyYW5zcG9ydCIgKTsKKyAgICB9IGVsc2UgeworICAgIGpxWEhSLnJlYWR5U3RhdGUgPSAx
OworCisgICAgLy8gU2VuZCBnbG9iYWwgZXZlbnQKKyAgICBpZiAoIGZpcmVHbG9iYWxzICkgewor
ICAgIGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0g
KTsKKyAgICB9CisgICAgLy8gVGltZW91dAorICAgIGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQg
PiAwICkgeworICAgIHRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAg
anFYSFIuYWJvcnQoInRpbWVvdXQiKTsKKyAgICB9LCBzLnRpbWVvdXQgKTsKKyAgICB9CisKKyAg
ICB0cnkgeworICAgIHN0YXRlID0gMTsKKyAgICB0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRl
cnMsIGRvbmUgKTsKKyAgICB9IGNhdGNoICggZSApIHsKKyAgICAvLyBQcm9wYWdhdGUgZXhjZXB0
aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCisgICAgaWYgKCBzdGF0ZSA8IDIgKSB7CisgICAgZG9u
ZSggLTEsIGUgKTsKKyAgICAvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2UKKyAgICB9IGVsc2Ug
eworICAgIHRocm93IGU7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxsYmFjayBm
b3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKKyAgICBmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5h
dGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHsKKyAgICB2YXIgaXNTdWNjZXNz
LCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAorICAgIHN0YXR1c1RleHQgPSBu
YXRpdmVTdGF0dXNUZXh0OworCisgICAgLy8gQ2FsbGVkIG9uY2UKKyAgICBpZiAoIHN0YXRlID09
PSAyICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTdGF0ZSBpcyAiZG9uZSIgbm93
CisgICAgc3RhdGUgPSAyOworCisgICAgLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKKyAg
ICBpZiAoIHRpbWVvdXRUaW1lciApIHsKKyAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciAp
OworICAgIH0KKworICAgIC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFn
ZSBjb2xsZWN0aW9uCisgICAgLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0
IHdpbGwgYmUgdXNlZCkKKyAgICB0cmFuc3BvcnQgPSB1bmRlZmluZWQ7CisKKyAgICAvLyBDYWNo
ZSByZXNwb25zZSBoZWFkZXJzCisgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8
fCAiIjsKKworICAgIC8vIFNldCByZWFkeVN0YXRlCisgICAganFYSFIucmVhZHlTdGF0ZSA9IHN0
YXR1cyA+IDAgPyA0IDogMDsKKworICAgIC8vIEdldCByZXNwb25zZSBkYXRhCisgICAgaWYgKCBy
ZXNwb25zZXMgKSB7CisgICAgcmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhI
UiwgcmVzcG9uc2VzICk7CisgICAgfQorCisgICAgLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5
cGUgY2hhaW5pbmcKKyAgICBpZiAoIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0
YXR1cyA9PT0gMzA0ICkgeworCisgICAgLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQv
b3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKyAgICBpZiAo
IHMuaWZNb2RpZmllZCApIHsKKyAgICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVy
KCJMYXN0LU1vZGlmaWVkIik7CisgICAgaWYgKCBtb2RpZmllZCApIHsKKyAgICBqUXVlcnkubGFz
dE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7CisgICAgfQorICAgIG1vZGlmaWVkID0g
anFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKTsKKyAgICBpZiAoIG1vZGlmaWVkICkgewor
ICAgIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7CisgICAgfQorICAgIH0KKwor
ICAgIC8vIGlmIG5vIGNvbnRlbnQKKyAgICBpZiAoIHN0YXR1cyA9PT0gMjA0ICkgeworICAgIGlz
U3VjY2VzcyA9IHRydWU7CisgICAgc3RhdHVzVGV4dCA9ICJub2NvbnRlbnQiOworCisgICAgLy8g
aWYgbm90IG1vZGlmaWVkCisgICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7CisgICAg
aXNTdWNjZXNzID0gdHJ1ZTsKKyAgICBzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKKworICAg
IC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAorICAgIH0gZWxzZSB7CisgICAg
aXNTdWNjZXNzID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICk7CisgICAgc3RhdHVzVGV4dCA9
IGlzU3VjY2Vzcy5zdGF0ZTsKKyAgICBzdWNjZXNzID0gaXNTdWNjZXNzLmRhdGE7CisgICAgZXJy
b3IgPSBpc1N1Y2Nlc3MuZXJyb3I7CisgICAgaXNTdWNjZXNzID0gIWVycm9yOworICAgIH0KKyAg
ICB9IGVsc2UgeworICAgIC8vIFdlIGV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0CisgICAg
Ly8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVzIGZvciBub24tYWJvcnRzCisg
ICAgZXJyb3IgPSBzdGF0dXNUZXh0OworICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkg
eworICAgIHN0YXR1c1RleHQgPSAiZXJyb3IiOworICAgIGlmICggc3RhdHVzIDwgMCApIHsKKyAg
ICBzdGF0dXMgPSAwOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGRhdGEgZm9y
IHRoZSBmYWtlIHhociBvYmplY3QKKyAgICBqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CisgICAganFY
SFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsK
KworICAgIC8vIFN1Y2Nlc3MvRXJyb3IKKyAgICBpZiAoIGlzU3VjY2VzcyApIHsKKyAgICBkZWZl
cnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQs
IGpxWEhSIF0gKTsKKyAgICB9IGVsc2UgeworICAgIGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxi
YWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOworICAgIH0KKworICAg
IC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisgICAganFYSFIuc3RhdHVzQ29kZSggc3Rh
dHVzQ29kZSApOworICAgIHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CisKKyAgICBpZiAoIGZpcmVH
bG9iYWxzICkgeworICAgIGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAi
YWpheFN1Y2Nlc3MiIDogImFqYXhFcnJvciIsCisgICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8g
c3VjY2VzcyA6IGVycm9yIF0gKTsKKyAgICB9CisKKyAgICAvLyBDb21wbGV0ZQorICAgIGNvbXBs
ZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4
dCBdICk7CisKKyAgICBpZiAoIGZpcmVHbG9iYWxzICkgeworICAgIGdsb2JhbEV2ZW50Q29udGV4
dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CisgICAgLy8gSGFuZGxl
IHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisgICAgaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSAp
IHsKKyAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTsKKyAgICB9CisgICAgfQor
ICAgIH0KKworICAgIHJldHVybiBqcVhIUjsKKyAgICB9LAorCisgICAgZ2V0U2NyaXB0OiBmdW5j
dGlvbiggdXJsLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRl
ZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOworICAgIH0sCisKKyAgICBnZXRKU09OOiBmdW5j
dGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdldCggdXJs
LCBkYXRhLCBjYWxsYmFjaywgImpzb24iICk7CisgICAgfQorfSk7CisKKy8qIEhhbmRsZXMgcmVz
cG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDoKKyAqIC0gc2V0cyBhbGwgcmVzcG9uc2VYWFggZmll
bGRzIGFjY29yZGluZ2x5CisgKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMg
YmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQorICogLSByZXR1cm5z
IHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgKi8KK2Z1bmN0aW9uIGFqYXhIYW5kbGVSZXNw
b25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CisgICAgdmFyIGZpcnN0RGF0YVR5cGUsIGN0
LCBmaW5hbERhdGFUeXBlLCB0eXBlLAorICAgIGNvbnRlbnRzID0gcy5jb250ZW50cywKKyAgICBk
YXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKKyAgICByZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VG
aWVsZHM7CisKKyAgICAvLyBGaWxsIHJlc3BvbnNlWFhYIGZpZWxkcworICAgIGZvciAoIHR5cGUg
aW4gcmVzcG9uc2VGaWVsZHMgKSB7CisgICAgaWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKKyAg
ICBqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOworICAg
IH0KKyAgICB9CisKKyAgICAvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQt
dHlwZSBpbiB0aGUgcHJvY2VzcworICAgIHdoaWxlKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkg
eworICAgIGRhdGFUeXBlcy5zaGlmdCgpOworICAgIGlmICggY3QgPT09IHVuZGVmaW5lZCApIHsK
KyAgICBjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQt
VHlwZSIpOworICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdp
dGggYSBrbm93biBjb250ZW50LXR5cGUKKyAgICBpZiAoIGN0ICkgeworICAgIGZvciAoIHR5cGUg
aW4gY29udGVudHMgKSB7CisgICAgaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0
eXBlIF0udGVzdCggY3QgKSApIHsKKyAgICBkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworICAg
IGJyZWFrOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdl
IGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisgICAgaWYgKCBkYXRh
VHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CisgICAgZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBl
c1sgMCBdOworICAgIH0gZWxzZSB7CisgICAgLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwor
ICAgIGZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgeworICAgIGlmICggIWRhdGFUeXBlc1sgMCBd
IHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgeworICAgIGZp
bmFsRGF0YVR5cGUgPSB0eXBlOworICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoICFmaXJzdERh
dGFUeXBlICkgeworICAgIGZpcnN0RGF0YVR5cGUgPSB0eXBlOworICAgIH0KKyAgICB9CisgICAg
Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lCisgICAgZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5
cGUgfHwgZmlyc3REYXRhVHlwZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIGRhdGFU
eXBlCisgICAgLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKKyAg
ICAvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgICAgaWYgKCBmaW5h
bERhdGFUeXBlICkgeworICAgIGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0g
KSB7CisgICAgZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKKyAgICB9CisgICAg
cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdOworICAgIH0KK30KKworLy8gQ2hhaW4g
Y29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQor
ZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICkgeworICAgIHZhciBjb252MiwgY3Vy
cmVudCwgY29udiwgdG1wLAorICAgIGNvbnZlcnRlcnMgPSB7fSwKKyAgICBpID0gMCwKKyAgICAv
LyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5
IGl0IGZvciBjb252ZXJzaW9uCisgICAgZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKSwK
KyAgICBwcmV2ID0gZGF0YVR5cGVzWyAwIF07CisKKyAgICAvLyBBcHBseSB0aGUgZGF0YUZpbHRl
ciBpZiBwcm92aWRlZAorICAgIGlmICggcy5kYXRhRmlsdGVyICkgeworICAgIHJlc3BvbnNlID0g
cy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOworICAgIH0KKworICAgIC8vIENy
ZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cworICAgIGlmICggZGF0YVR5
cGVzWyAxIF0gKSB7CisgICAgZm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CisgICAgY29u
dmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKKyAg
ICB9CisgICAgfQorCisgICAgLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUs
IHRvbGVyYXRpbmcgbGlzdCBtb2RpZmljYXRpb24KKyAgICBmb3IgKCA7IChjdXJyZW50ID0gZGF0
YVR5cGVzWysraV0pOyApIHsKKworICAgIC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1
cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG8KKyAgICBpZiAoIGN1cnJlbnQgIT09ICIqIiApIHsK
KworICAgIC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBh
bmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKKyAgICBpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9
PSBjdXJyZW50ICkgeworCisgICAgLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKKyAgICBjb252
ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAi
ICsgY3VycmVudCBdOworCisgICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKKyAgICBp
ZiAoICFjb252ICkgeworICAgIGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CisKKyAgICAv
LyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnQKKyAgICB0bXAgPSBjb252Mi5zcGxpdCgiICIpOwor
ICAgIGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CisKKyAgICAvLyBJZiBwcmV2IGNhbiBi
ZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQKKyAgICBjb252ID0gY29udmVydGVyc1sgcHJl
diArICIgIiArIHRtcFsgMCBdIF0gfHwKKyAgICBjb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0g
XTsKKyAgICBpZiAoIGNvbnYgKSB7CisgICAgLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVy
dGVycworICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsKKyAgICBjb252ID0gY29udmVydGVyc1sg
Y29udjIgXTsKKworICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0
YVR5cGUKKyAgICB9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewor
ICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKKyAgICBkYXRhVHlwZXMuc3BsaWNlKCBpLS0sIDAsIGN1
cnJlbnQgKTsKKyAgICB9CisKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9
CisKKyAgICAvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKKyAgICBp
ZiAoIGNvbnYgIT09IHRydWUgKSB7CisKKyAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2Vk
IHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtCisgICAgaWYgKCBjb252ICYmIHNbInRo
cm93cyJdICkgeworICAgIHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKKyAgICB9IGVsc2Ug
eworICAgIHRyeSB7CisgICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOworICAgIH0gY2F0
Y2ggKCBlICkgeworICAgIHJldHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3IiLCBlcnJvcjogY29u
diA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudCB9
OworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSBwcmV2IGZvciBu
ZXh0IGl0ZXJhdGlvbgorICAgIHByZXYgPSBjdXJyZW50OworICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9OworfQorLy8gSW5zdGFs
bCBzY3JpcHQgZGF0YVR5cGUKK2pRdWVyeS5hamF4U2V0dXAoeworICAgIGFjY2VwdHM6IHsKKyAg
ICBzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxp
Y2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKKyAgICB9LAorICAg
IGNvbnRlbnRzOiB7CisgICAgc2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC8KKyAgICB9LAor
ICAgIGNvbnZlcnRlcnM6IHsKKyAgICAidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsK
KyAgICBqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApOworICAgIHJldHVybiB0ZXh0OworICAgIH0K
KyAgICB9Cit9KTsKKworLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBnbG9iYWwK
K2pRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CisgICAgaWYg
KCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CisgICAgcy5jYWNoZSA9IGZhbHNlOworICAgIH0K
KyAgICBpZiAoIHMuY3Jvc3NEb21haW4gKSB7CisgICAgcy50eXBlID0gIkdFVCI7CisgICAgcy5n
bG9iYWwgPSBmYWxzZTsKKyAgICB9Cit9KTsKKworLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJh
bnNwb3J0CitqUXVlcnkuYWpheFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKHMpIHsKKwor
ICAgIC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVz
dHMKKyAgICBpZiAoIHMuY3Jvc3NEb21haW4gKSB7CisKKyAgICB2YXIgc2NyaXB0LAorICAgIGhl
YWQgPSBkb2N1bWVudC5oZWFkIHx8IGpRdWVyeSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3Vt
ZW50RWxlbWVudDsKKworICAgIHJldHVybiB7CisKKyAgICBzZW5kOiBmdW5jdGlvbiggXywgY2Fs
bGJhY2sgKSB7CisKKyAgICBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQi
KTsKKworICAgIHNjcmlwdC5hc3luYyA9IHRydWU7CisKKyAgICBpZiAoIHMuc2NyaXB0Q2hhcnNl
dCApIHsKKyAgICBzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKyAgICB9CisKKyAg
ICBzY3JpcHQuc3JjID0gcy51cmw7CisKKyAgICAvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBi
cm93c2VycworICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0g
ZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CisKKyAgICBpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5y
ZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkg
KSB7CisKKyAgICAvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKKyAgICBzY3JpcHQub25sb2Fk
ID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisKKyAgICAvLyBSZW1vdmUgdGhl
IHNjcmlwdAorICAgIGlmICggc2NyaXB0LnBhcmVudE5vZGUgKSB7CisgICAgc2NyaXB0LnBhcmVu
dE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworICAgIH0KKworICAgIC8vIERlcmVmZXJlbmNl
IHRoZSBzY3JpcHQKKyAgICBzY3JpcHQgPSBudWxsOworCisgICAgLy8gQ2FsbGJhY2sgaWYgbm90
IGFib3J0CisgICAgaWYgKCAhaXNBYm9ydCApIHsKKyAgICBjYWxsYmFjayggMjAwLCAic3VjY2Vz
cyIgKTsKKyAgICB9CisgICAgfQorICAgIH07CisKKyAgICAvLyBDaXJjdW12ZW50IElFNiBidWdz
IHdpdGggYmFzZSBlbGVtZW50cyAoIzI3MDkgYW5kICM0Mzc4KSBieSBwcmVwZW5kaW5nCisgICAg
Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFY
IHRyaWNrZXJ5CisgICAgaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxk
ICk7CisgICAgfSwKKworICAgIGFib3J0OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIHNjcmlwdCAp
IHsKKyAgICBzY3JpcHQub25sb2FkKCB1bmRlZmluZWQsIHRydWUgKTsKKyAgICB9CisgICAgfQor
ICAgIH07CisgICAgfQorfSk7Cit2YXIgb2xkQ2FsbGJhY2tzID0gW10sCisgICAgcmpzb25wID0g
Lyg9KVw/KD89JnwkKXxcP1w/LzsKKworLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncworalF1ZXJ5
LmFqYXhTZXR1cCh7CisgICAganNvbnA6ICJjYWxsYmFjayIsCisgICAganNvbnBDYWxsYmFjazog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICgg
alF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIGFqYXhfbm9uY2UrKyApICk7CisgICAgdGhpc1sgY2Fs
bGJhY2sgXSA9IHRydWU7CisgICAgcmV0dXJuIGNhbGxiYWNrOworICAgIH0KK30pOworCisvLyBE
ZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAg
cmVxdWVzdHMKK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBz
LCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKKworICAgIHZhciBjYWxsYmFja05hbWUsIG92
ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwKKyAgICBqc29uUHJvcCA9IHMuanNvbnAgIT09
IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgPworICAgICJ1cmwiIDoKKyAgICB0eXBl
b2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkuaW5kZXhP
ZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikgJiYgcmpzb25wLnRlc3QoIHMu
ZGF0YSApICYmICJkYXRhIgorICAgICk7CisKKyAgICAvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3Rl
ZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldAorICAg
IGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKKworICAg
IC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3Nv
Y2lhdGVkIHdpdGggaXQKKyAgICBjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVl
cnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgPworICAgIHMuanNvbnBDYWxsYmFjaygp
IDoKKyAgICBzLmpzb25wQ2FsbGJhY2s7CisKKyAgICAvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1
cmwgb3IgZm9ybSBkYXRhCisgICAgaWYgKCBqc29uUHJvcCApIHsKKyAgICBzWyBqc29uUHJvcCBd
ID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsK
KyAgICB9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKKyAgICBzLnVybCArPSAoIGFq
YXhfcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyAiJiIgOiAiPyIgKSArIHMuanNvbnAgKyAiPSIgKyBj
YWxsYmFja05hbWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJp
ZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgorICAgIHMuY29udmVydGVyc1sic2NyaXB0
IGpzb24iXSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewor
ICAgIGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKKyAg
ICB9CisgICAgcmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07CisgICAgfTsKKworICAgIC8v
IGZvcmNlIGpzb24gZGF0YVR5cGUKKyAgICBzLmRhdGFUeXBlc1sgMCBdID0gImpzb24iOworCisg
ICAgLy8gSW5zdGFsbCBjYWxsYmFjaworICAgIG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFj
a05hbWUgXTsKKyAgICB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CisgICAg
cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7CisgICAgfTsKKworICAgIC8vIENsZWFuLXVw
IGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQorICAgIGpxWEhSLmFsd2F5cyhmdW5j
dGlvbigpIHsKKyAgICAvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCisgICAgd2luZG93WyBj
YWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuOworCisgICAgLy8gU2F2ZSBiYWNrIGFzIGZyZWUK
KyAgICBpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgeworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJl
LXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAorICAgIHMuanNv
bnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKKworICAgIC8vIHNh
dmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKKyAgICBvbGRDYWxsYmFja3MucHVz
aCggY2FsbGJhY2tOYW1lICk7CisgICAgfQorCisgICAgLy8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5j
dGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlCisgICAgaWYgKCByZXNwb25zZUNvbnRhaW5lciAm
JiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKKyAgICBvdmVyd3JpdHRlbigg
cmVzcG9uc2VDb250YWluZXJbIDAgXSApOworICAgIH0KKworICAgIHJlc3BvbnNlQ29udGFpbmVy
ID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7CisgICAgfSk7CisKKyAgICAvLyBEZWxlZ2F0ZSB0
byBzY3JpcHQKKyAgICByZXR1cm4gInNjcmlwdCI7CisgICAgfQorfSk7Cit2YXIgeGhyQ2FsbGJh
Y2tzLCB4aHJTdXBwb3J0ZWQsCisgICAgeGhySWQgPSAwLAorICAgIC8vICM1MjgwOiBJbnRlcm5l
dCBFeHBsb3JlciB3aWxsIGtlZXAgY29ubmVjdGlvbnMgYWxpdmUgaWYgd2UgZG9uJ3QgYWJvcnQg
b24gdW5sb2FkCisgICAgeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ICYm
IGZ1bmN0aW9uKCkgeworICAgIC8vIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzCisgICAgdmFy
IGtleTsKKyAgICBmb3IgKCBrZXkgaW4geGhyQ2FsbGJhY2tzICkgeworICAgIHhockNhbGxiYWNr
c1sga2V5IF0oIHVuZGVmaW5lZCwgdHJ1ZSApOworICAgIH0KKyAgICB9OworCisvLyBGdW5jdGlv
bnMgdG8gY3JlYXRlIHhocnMKK2Z1bmN0aW9uIGNyZWF0ZVN0YW5kYXJkWEhSKCkgeworICAgIHRy
eSB7CisgICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKKyAgICB9IGNhdGNo
KCBlICkge30KK30KKworZnVuY3Rpb24gY3JlYXRlQWN0aXZlWEhSKCkgeworICAgIHRyeSB7Cisg
ICAgcmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsK
KyAgICB9IGNhdGNoKCBlICkge30KK30KKworLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAor
Ly8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBj
b21wYXRpYmlsaXR5KQoralF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9i
amVjdCA/CisgICAgLyogTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQorICAgICAqIGltcGxl
bWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVz
KSwKKyAgICAgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFi
bGUKKyAgICAgKiBBZGRpdGlvbmFsbHkgWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIGlu
IElFNy9JRTggc28KKyAgICAgKiB3ZSBuZWVkIGEgZmFsbGJhY2suCisgICAgICovCisgICAgZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuICF0aGlzLmlzTG9jYWwgJiYgY3JlYXRlU3RhbmRhcmRYSFIo
KSB8fCBjcmVhdGVBY3RpdmVYSFIoKTsKKyAgICB9IDoKKyAgICAvLyBGb3IgYWxsIG90aGVyIGJy
b3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorICAgIGNyZWF0
ZVN0YW5kYXJkWEhSOworCisvLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCit4aHJTdXBw
b3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpOworalF1ZXJ5LnN1cHBvcnQuY29ycyA9
ICEheGhyU3VwcG9ydGVkICYmICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyU3VwcG9ydGVkICk7
Cit4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuc3VwcG9ydC5hamF4ID0gISF4aHJTdXBwb3J0ZWQ7CisK
Ky8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCitp
ZiAoIHhoclN1cHBvcnRlZCApIHsKKworICAgIGpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9u
KCBzICkgeworICAgIC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRo
cm91Z2ggWE1MSHR0cFJlcXVlc3QKKyAgICBpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5z
dXBwb3J0LmNvcnMgKSB7CisKKyAgICB2YXIgY2FsbGJhY2s7CisKKyAgICByZXR1cm4geworICAg
IHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKKworICAgIC8vIEdldCBhIG5l
dyB4aHIKKyAgICB2YXIgaGFuZGxlLCBpLAorICAgIHhociA9IHMueGhyKCk7CisKKyAgICAvLyBP
cGVuIHRoZSBzb2NrZXQKKyAgICAvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBh
IGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKKyAgICBpZiAoIHMudXNlcm5hbWUgKSB7Cisg
ICAgeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dv
cmQgKTsKKyAgICB9IGVsc2UgeworICAgIHhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5j
ICk7CisgICAgfQorCisgICAgLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAorICAg
IGlmICggcy54aHJGaWVsZHMgKSB7CisgICAgZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsKKyAg
ICB4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CisgICAgfQorICAgIH0KKworICAgIC8vIE92
ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKKyAgICBpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92
ZXJyaWRlTWltZVR5cGUgKSB7CisgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUg
KTsKKyAgICB9CisKKyAgICAvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgorICAgIC8vIEZvciBj
cm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdo
dCBhcmUKKyAgICAvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNl
dCBpdCB0byBiZSBzdXJlLgorICAgIC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1y
ZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQorICAgIC8vIEZvciBzYW1lLWRv
bWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgor
ICAgIGlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSAp
IHsKKyAgICBoZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gPSAiWE1MSHR0cFJlcXVlc3QiOwor
ICAgIH0KKworICAgIC8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4g
cmVxdWVzdHMgaW4gRmlyZWZveCAzCisgICAgdHJ5IHsKKyAgICBmb3IgKCBpIGluIGhlYWRlcnMg
KSB7CisgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApOworICAgIH0K
KyAgICB9IGNhdGNoKCBlcnIgKSB7fQorCisgICAgLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAorICAg
IC8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQorICAgIC8v
IGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQorICAgIHhoci5z
ZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CisKKyAgICAvLyBMaXN0
ZW5lcgorICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CisgICAgdmFyIHN0
YXR1cywgcmVzcG9uc2VIZWFkZXJzLCBzdGF0dXNUZXh0LCByZXNwb25zZXM7CisKKyAgICAvLyBG
aXJlZm94IHRocm93cyBleGNlcHRpb25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMKKyAgICAv
LyBvZiBhbiB4aHIgd2hlbiBhIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQKKyAgICAvLyBodHRwOi8v
aGVscGZ1bC5rbm9icy1kaWFscy5jb20vaW5kZXgucGhwL0NvbXBvbmVudF9yZXR1cm5lZF9mYWls
dXJlX2NvZGU6XzB4ODAwNDAxMTFfKE5TX0VSUk9SX05PVF9BVkFJTEFCTEUpCisgICAgdHJ5IHsK
KworICAgIC8vIFdhcyBuZXZlciBjYWxsZWQgYW5kIGlzIGFib3J0ZWQgb3IgY29tcGxldGUKKyAg
ICBpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkg
eworCisgICAgLy8gT25seSBjYWxsZWQgb25jZQorICAgIGNhbGxiYWNrID0gdW5kZWZpbmVkOwor
CisgICAgLy8gRG8gbm90IGtlZXAgYXMgYWN0aXZlIGFueW1vcmUKKyAgICBpZiAoIGhhbmRsZSAp
IHsKKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisgICAgaWYgKCB4
aHJPblVubG9hZEFib3J0ICkgeworICAgIGRlbGV0ZSB4aHJDYWxsYmFja3NbIGhhbmRsZSBdOwor
ICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBpdCdzIGFuIGFib3J0CisgICAgaWYgKCBpc0Fib3J0
ICkgeworICAgIC8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAorICAgIGlmICggeGhyLnJl
YWR5U3RhdGUgIT09IDQgKSB7CisgICAgeGhyLmFib3J0KCk7CisgICAgfQorICAgIH0gZWxzZSB7
CisgICAgcmVzcG9uc2VzID0ge307CisgICAgc3RhdHVzID0geGhyLnN0YXR1czsKKyAgICByZXNw
b25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisKKyAgICAvLyBXaGVu
IHJlcXVlc3RpbmcgYmluYXJ5IGRhdGEsIElFNi05IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCisg
ICAgLy8gb24gYW55IGF0dGVtcHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAoIzExNDI2KQorICAg
IGlmICggdHlwZW9mIHhoci5yZXNwb25zZVRleHQgPT09ICJzdHJpbmciICkgeworICAgIHJlc3Bv
bnNlcy50ZXh0ID0geGhyLnJlc3BvbnNlVGV4dDsKKyAgICB9CisKKyAgICAvLyBGaXJlZm94IHRo
cm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKKyAgICAvLyBzdGF0dXNUZXh0IGZvciBm
YXVsdHkgY3Jvc3MtZG9tYWluIHJlcXVlc3RzCisgICAgdHJ5IHsKKyAgICBzdGF0dXNUZXh0ID0g
eGhyLnN0YXR1c1RleHQ7CisgICAgfSBjYXRjaCggZSApIHsKKyAgICAvLyBXZSBub3JtYWxpemUg
d2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHQKKyAgICBzdGF0dXNUZXh0ID0g
IiI7CisgICAgfQorCisgICAgLy8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2
aW9ycworCisgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTog
YXNzdW1lIGEgc3VjY2VzcworICAgIC8vIChzdWNjZXNzIHdpdGggbm8gZGF0YSB3b24ndCBnZXQg
bm90aWZpZWQsIHRoYXQncyB0aGUgYmVzdCB3ZQorICAgIC8vIGNhbiBkbyBnaXZlbiBjdXJyZW50
IGltcGxlbWVudGF0aW9ucykKKyAgICBpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNy
b3NzRG9tYWluICkgeworICAgIHN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0Owor
ICAgIC8vIElFIC0gIzE0NTA6IHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQg
YmUgMjA0CisgICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAxMjIzICkgeworICAgIHN0YXR1cyA9
IDIwNDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9IGNhdGNoKCBmaXJlZm94QWNjZXNzRXhj
ZXB0aW9uICkgeworICAgIGlmICggIWlzQWJvcnQgKSB7CisgICAgY29tcGxldGUoIC0xLCBmaXJl
Zm94QWNjZXNzRXhjZXB0aW9uICk7CisgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgY29tcGxl
dGUgaWYgbmVlZGVkCisgICAgaWYgKCByZXNwb25zZXMgKSB7CisgICAgY29tcGxldGUoIHN0YXR1
cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCByZXNwb25zZUhlYWRlcnMgKTsKKyAgICB9CisgICAg
fTsKKworICAgIGlmICggIXMuYXN5bmMgKSB7CisgICAgLy8gaWYgd2UncmUgaW4gc3luYyBtb2Rl
IHdlIGZpcmUgdGhlIGNhbGxiYWNrCisgICAgY2FsbGJhY2soKTsKKyAgICB9IGVsc2UgaWYgKCB4
aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKKyAgICAvLyAoSUU2ICYgSUU3KSBpZiBpdCdzIGluIGNh
Y2hlIGFuZCBoYXMgYmVlbgorICAgIC8vIHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZp
cmUgdGhlIGNhbGxiYWNrCisgICAgc2V0VGltZW91dCggY2FsbGJhY2sgKTsKKyAgICB9IGVsc2Ug
eworICAgIGhhbmRsZSA9ICsreGhySWQ7CisgICAgaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewor
ICAgIC8vIENyZWF0ZSB0aGUgYWN0aXZlIHhocnMgY2FsbGJhY2tzIGxpc3QgaWYgbmVlZGVkCisg
ICAgLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKKyAgICBpZiAoICF4aHJDYWxsYmFj
a3MgKSB7CisgICAgeGhyQ2FsbGJhY2tzID0ge307CisgICAgalF1ZXJ5KCB3aW5kb3cgKS51bmxv
YWQoIHhock9uVW5sb2FkQWJvcnQgKTsKKyAgICB9CisgICAgLy8gQWRkIHRvIGxpc3Qgb2YgYWN0
aXZlIHhocnMgY2FsbGJhY2tzCisgICAgeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXSA9IGNhbGxiYWNr
OworICAgIH0KKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gY2FsbGJhY2s7CisgICAgfQor
ICAgIH0sCisKKyAgICBhYm9ydDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCBjYWxsYmFjayApIHsK
KyAgICBjYWxsYmFjayggdW5kZWZpbmVkLCB0cnVlICk7CisgICAgfQorICAgIH0KKyAgICB9Owor
ICAgIH0KKyAgICB9KTsKK30KK3ZhciBmeE5vdywgdGltZXJJZCwKKyAgICByZnh0eXBlcyA9IC9e
KD86dG9nZ2xlfHNob3d8aGlkZSkkLywKKyAgICByZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/Oihb
Ky1dKT18KSgiICsgY29yZV9wbnVtICsgIikoW2EteiVdKikkIiwgImkiICksCisgICAgcnJ1biA9
IC9xdWV1ZUhvb2tzJC8sCisgICAgYW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZp
bHRlciBdLAorICAgIHR3ZWVuZXJzID0geworICAgICIqIjogW2Z1bmN0aW9uKCBwcm9wLCB2YWx1
ZSApIHsKKyAgICB2YXIgZW5kLCB1bml0LAorICAgIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2Vlbigg
cHJvcCwgdmFsdWUgKSwKKyAgICBwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLAorICAgIHRh
cmdldCA9IHR3ZWVuLmN1cigpLAorICAgIHN0YXJ0ID0gK3RhcmdldCB8fCAwLAorICAgIHNjYWxl
ID0gMSwKKyAgICBtYXhJdGVyYXRpb25zID0gMjA7CisKKyAgICBpZiAoIHBhcnRzICkgeworICAg
IGVuZCA9ICtwYXJ0c1syXTsKKyAgICB1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVt
YmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKKworICAgIC8vIFdlIG5lZWQgdG8gY29tcHV0ZSBz
dGFydGluZyB2YWx1ZQorICAgIGlmICggdW5pdCAhPT0gInB4IiAmJiBzdGFydCApIHsKKyAgICAv
LyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAor
ICAgIC8vIFByZWZlciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0aGlzIHByb2Nlc3Mg
d2lsbCBiZSB0cml2aWFsIGlmIGl0IHVzZXMgdGhlIHNhbWUgdW5pdHMKKyAgICAvLyBGYWxsYmFj
ayB0byBlbmQgb3IgYSBzaW1wbGUgY29uc3RhbnQKKyAgICBzdGFydCA9IGpRdWVyeS5jc3MoIHR3
ZWVuLmVsZW0sIHByb3AsIHRydWUgKSB8fCBlbmQgfHwgMTsKKworICAgIGRvIHsKKyAgICAvLyBJ
ZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29t
ZXRoaW5nKgorICAgIC8vIFVzZSBhIHN0cmluZyBmb3IgZG91YmxpbmcgZmFjdG9yIHNvIHdlIGRv
bid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93CisgICAgc2NhbGUg
PSBzY2FsZSB8fCAiLjUiOworCisgICAgLy8gQWRqdXN0IGFuZCBhcHBseQorICAgIHN0YXJ0ID0g
c3RhcnQgLyBzY2FsZTsKKyAgICBqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0
ICsgdW5pdCApOworCisgICAgLy8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFO
IGZyb20gdHdlZW4uY3VyKCkKKyAgICAvLyBBbmQgYnJlYWtpbmcgdGhlIGxvb3AgaWYgc2NhbGUg
aXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3ZlIGp1c3QgaGFkIGVub3VnaAorICAg
IH0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNj
YWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApOworICAgIH0KKworICAgIHR3ZWVuLnVuaXQg
PSB1bml0OworICAgIHR3ZWVuLnN0YXJ0ID0gc3RhcnQ7CisgICAgLy8gSWYgYSArPS8tPSB0b2tl
biB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisgICAgdHdl
ZW4uZW5kID0gcGFydHNbMV0gPyBzdGFydCArICggcGFydHNbMV0gKyAxICkgKiBlbmQgOiBlbmQ7
CisgICAgfQorICAgIHJldHVybiB0d2VlbjsKKyAgICB9XQorICAgIH07CisKKy8vIEFuaW1hdGlv
bnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKK2Z1bmN0aW9u
IGNyZWF0ZUZ4Tm93KCkgeworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgZnhOb3cg
PSB1bmRlZmluZWQ7CisgICAgfSk7CisgICAgcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkg
KTsKK30KKworZnVuY3Rpb24gY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICkgeworICAg
IGpRdWVyeS5lYWNoKCBwcm9wcywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgeworICAgIHZhciBj
b2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sg
IioiIF0gKSwKKyAgICBpbmRleCA9IDAsCisgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7
CisgICAgZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBpZiAoIGNvbGxl
Y3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgeworCisgICAg
Ly8gd2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHkKKyAgICByZXR1cm47CisgICAgfQorICAg
IH0KKyAgICB9KTsKK30KKworZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBv
cHRpb25zICkgeworICAgIHZhciByZXN1bHQsCisgICAgc3RvcHBlZCwKKyAgICBpbmRleCA9IDAs
CisgICAgbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCisgICAgZGVmZXJyZWQg
PSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgeworICAgIC8vIGRvbid0IG1h
dGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgorICAgIGRlbGV0ZSB0aWNrLmVsZW07
CisgICAgfSksCisgICAgdGljayA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggc3RvcHBlZCApIHsK
KyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8
IGNyZWF0ZUZ4Tm93KCksCisgICAgcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5z
dGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAorICAgIC8vIGFy
Y2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSAxIC0gKCAwLjUgfHwgMCApICgj
MTI0OTcpCisgICAgdGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLAor
ICAgIHBlcmNlbnQgPSAxIC0gdGVtcCwKKyAgICBpbmRleCA9IDAsCisgICAgbGVuZ3RoID0gYW5p
bWF0aW9uLnR3ZWVucy5sZW5ndGg7CisKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5k
ZXgrKyApIHsKKyAgICBhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApOwor
ICAgIH0KKworICAgIGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJj
ZW50LCByZW1haW5pbmcgXSk7CisKKyAgICBpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsK
KyAgICByZXR1cm4gcmVtYWluaW5nOworICAgIH0gZWxzZSB7CisgICAgZGVmZXJyZWQucmVzb2x2
ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIH0sCisgICAgYW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7CisgICAgZWxlbTogZWxl
bSwKKyAgICBwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSwKKyAgICBvcHRz
OiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSwK
KyAgICBvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCisgICAgb3JpZ2luYWxPcHRpb25z
OiBvcHRpb25zLAorICAgIHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKKyAgICBk
dXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwKKyAgICB0d2VlbnM6IFtdLAorICAgIGNyZWF0ZVR3
ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgeworICAgIHZhciB0d2VlbiA9IGpRdWVyeS5Ud2Vl
biggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKKyAgICBhbmltYXRpb24ub3B0cy5z
cGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CisgICAgYW5p
bWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApOworICAgIHJldHVybiB0d2VlbjsKKyAgICB9LAor
ICAgIHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgeworICAgIHZhciBpbmRleCA9IDAsCisgICAg
Ly8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdl
ZW5zCisgICAgLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CisgICAgbGVuZ3RoID0gZ290
b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKKyAgICBpZiAoIHN0b3BwZWQgKSB7
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0b3BwZWQgPSB0cnVlOworICAgIGZvciAo
IDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgIGFuaW1hdGlvbi50d2VlbnNbIGlu
ZGV4IF0ucnVuKCAxICk7CisgICAgfQorCisgICAgLy8gcmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0
aGUgbGFzdCBmcmFtZQorICAgIC8vIG90aGVyd2lzZSwgcmVqZWN0CisgICAgaWYgKCBnb3RvRW5k
ICkgeworICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0Vu
ZCBdICk7CisgICAgfSBlbHNlIHsKKyAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFu
aW1hdGlvbiwgZ290b0VuZCBdICk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0KKyAg
ICB9KSwKKyAgICBwcm9wcyA9IGFuaW1hdGlvbi5wcm9wczsKKworICAgIHByb3BGaWx0ZXIoIHBy
b3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CisKKyAgICBmb3IgKCA7IGluZGV4
IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKKyAgICByZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJz
WyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7
CisgICAgaWYgKCByZXN1bHQgKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgfQor
CisgICAgY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICk7CisKKyAgICBpZiAoIGpRdWVy
eS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgeworICAgIGFuaW1hdGlvbi5v
cHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOworICAgIH0KKworICAgIGpRdWVyeS5m
eC50aW1lcigKKyAgICBqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7CisgICAgZWxlbTogZWxlbSwKKyAg
ICBhbmltOiBhbmltYXRpb24sCisgICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCisgICAg
fSkKKyAgICApOworCisgICAgLy8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKKyAgICBy
ZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCisgICAg
LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKKyAg
ICAuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApCisgICAgLmFsd2F5cyggYW5pbWF0aW9uLm9w
dHMuYWx3YXlzICk7Cit9CisKK2Z1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFz
aW5nICkgeworICAgIHZhciB2YWx1ZSwgbmFtZSwgaW5kZXgsIGVhc2luZywgaG9va3M7CisKKyAg
ICAvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKKyAg
ICBmb3IgKCBpbmRleCBpbiBwcm9wcyApIHsKKyAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSgg
aW5kZXggKTsKKyAgICBlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07CisgICAgdmFsdWUg
PSBwcm9wc1sgaW5kZXggXTsKKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewor
ICAgIGVhc2luZyA9IHZhbHVlWyAxIF07CisgICAgdmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZh
bHVlWyAwIF07CisgICAgfQorCisgICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKyAgICBwcm9w
c1sgbmFtZSBdID0gdmFsdWU7CisgICAgZGVsZXRlIHByb3BzWyBpbmRleCBdOworICAgIH0KKwor
ICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CisgICAgaWYgKCBob29rcyAmJiAi
ZXhwYW5kIiBpbiBob29rcyApIHsKKyAgICB2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsK
KyAgICBkZWxldGUgcHJvcHNbIG5hbWUgXTsKKworICAgIC8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwg
dGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KKyAgICAvLyBhbHNvIC0g
cmV1c2luZyAnaW5kZXgnIGZyb20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJu
YW1lIgorICAgIGZvciAoIGluZGV4IGluIHZhbHVlICkgeworICAgIGlmICggISggaW5kZXggaW4g
cHJvcHMgKSApIHsKKyAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdOworICAgIHNw
ZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7CisgICAgfQorICAgIH0KKyAgICB9IGVsc2Ug
eworICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKKyAgICB9CisgICAgfQorfQor
CitqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CisKKyAgICB0
d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgeworICAgIGlmICggalF1ZXJ5Lmlz
RnVuY3Rpb24oIHByb3BzICkgKSB7CisgICAgY2FsbGJhY2sgPSBwcm9wczsKKyAgICBwcm9wcyA9
IFsgIioiIF07CisgICAgfSBlbHNlIHsKKyAgICBwcm9wcyA9IHByb3BzLnNwbGl0KCIgIik7Cisg
ICAgfQorCisgICAgdmFyIHByb3AsCisgICAgaW5kZXggPSAwLAorICAgIGxlbmd0aCA9IHByb3Bz
Lmxlbmd0aDsKKworICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAg
IHByb3AgPSBwcm9wc1sgaW5kZXggXTsKKyAgICB0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNb
IHByb3AgXSB8fCBbXTsKKyAgICB0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7
CisgICAgfQorICAgIH0sCisKKyAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJl
cGVuZCApIHsKKyAgICBpZiAoIHByZXBlbmQgKSB7CisgICAgYW5pbWF0aW9uUHJlZmlsdGVycy51
bnNoaWZ0KCBjYWxsYmFjayApOworICAgIH0gZWxzZSB7CisgICAgYW5pbWF0aW9uUHJlZmlsdGVy
cy5wdXNoKCBjYWxsYmFjayApOworICAgIH0KKyAgICB9Cit9KTsKKworZnVuY3Rpb24gZGVmYXVs
dFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7CisgICAgLypqc2hpbnQgdmFsaWR0aGlz
OnRydWUgKi8KKyAgICB2YXIgcHJvcCwgaW5kZXgsIGxlbmd0aCwKKyAgICB2YWx1ZSwgZGF0YVNo
b3csIHRvZ2dsZSwKKyAgICB0d2VlbiwgaG9va3MsIG9sZGZpcmUsCisgICAgYW5pbSA9IHRoaXMs
CisgICAgc3R5bGUgPSBlbGVtLnN0eWxlLAorICAgIG9yaWcgPSB7fSwKKyAgICBoYW5kbGVkID0g
W10sCisgICAgaGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApOworCisg
ICAgLy8gaGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlcworICAgIGlmICggIW9wdHMucXVldWUg
KSB7CisgICAgaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sICJmeCIgKTsKKyAgICBp
ZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7CisgICAgaG9va3MudW5xdWV1ZWQgPSAwOwor
ICAgIG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOworICAgIGhvb2tzLmVtcHR5LmZpcmUgPSBm
dW5jdGlvbigpIHsKKyAgICBpZiAoICFob29rcy51bnF1ZXVlZCApIHsKKyAgICBvbGRmaXJlKCk7
CisgICAgfQorICAgIH07CisgICAgfQorICAgIGhvb2tzLnVucXVldWVkKys7CisKKyAgICBhbmlt
LmFsd2F5cyhmdW5jdGlvbigpIHsKKyAgICAvLyBkb2luZyB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0
aGUgY29tcGxldGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorICAgIC8vIGJlZm9yZSB0aGlzIGNv
bXBsZXRlcworICAgIGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgeworICAgIGhvb2tzLnVucXVldWVk
LS07CisgICAgaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkgeworICAg
IGhvb2tzLmVtcHR5LmZpcmUoKTsKKyAgICB9CisgICAgfSk7CisgICAgfSk7CisgICAgfQorCisg
ICAgLy8gaGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3MKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUg
PT09IDEgJiYgKCAiaGVpZ2h0IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7Cisg
ICAgLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisgICAgLy8gUmVjb3JkIGFs
bCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAorICAgIC8vIGNoYW5n
ZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAorICAgIC8vIG92ZXJm
bG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlCisgICAgb3B0cy5vdmVyZmxvdyA9IFsgc3R5
bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CisKKyAgICAv
LyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAor
ICAgIC8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0
aC9oZWlnaHQgYW5pbWF0ZWQKKyAgICBpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiAp
ID09PSAiaW5saW5lIiAmJgorICAgIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5v
bmUiICkgeworCisgICAgLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxv
Y2s7CisgICAgLy8gYmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBs
YXlvdXQKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0IHx8
IGNzc19kZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApID09PSAiaW5saW5lIiApIHsKKyAg
ICBzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CisKKyAgICB9IGVsc2UgeworICAgIHN0
eWxlLnpvb20gPSAxOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgaWYgKCBvcHRzLm92ZXJm
bG93ICkgeworICAgIHN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisgICAgaWYgKCAhalF1ZXJ5
LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsKKyAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigp
IHsKKyAgICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKKyAgICBzdHlsZS5v
dmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07CisgICAgc3R5bGUub3ZlcmZsb3dZID0gb3B0
cy5vdmVyZmxvd1sgMiBdOworICAgIH0pOworICAgIH0KKyAgICB9CisKKworICAgIC8vIHNob3cv
aGlkZSBwYXNzCisgICAgZm9yICggaW5kZXggaW4gcHJvcHMgKSB7CisgICAgdmFsdWUgPSBwcm9w
c1sgaW5kZXggXTsKKyAgICBpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7CisgICAgZGVs
ZXRlIHByb3BzWyBpbmRleCBdOworICAgIHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRv
Z2dsZSI7CisgICAgaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSAp
IHsKKyAgICBjb250aW51ZTsKKyAgICB9CisgICAgaGFuZGxlZC5wdXNoKCBpbmRleCApOworICAg
IH0KKyAgICB9CisKKyAgICBsZW5ndGggPSBoYW5kbGVkLmxlbmd0aDsKKyAgICBpZiAoIGxlbmd0
aCApIHsKKyAgICBkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIgKSB8fCBq
UXVlcnkuX2RhdGEoIGVsZW0sICJmeHNob3ciLCB7fSApOworICAgIGlmICggImhpZGRlbiIgaW4g
ZGF0YVNob3cgKSB7CisgICAgaGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOworICAgIH0KKworICAg
IC8vIHN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkg
dG8gInJldmVyc2UiCisgICAgaWYgKCB0b2dnbGUgKSB7CisgICAgZGF0YVNob3cuaGlkZGVuID0g
IWhpZGRlbjsKKyAgICB9CisgICAgaWYgKCBoaWRkZW4gKSB7CisgICAgalF1ZXJ5KCBlbGVtICku
c2hvdygpOworICAgIH0gZWxzZSB7CisgICAgYW5pbS5kb25lKGZ1bmN0aW9uKCkgeworICAgIGpR
dWVyeSggZWxlbSApLmhpZGUoKTsKKyAgICB9KTsKKyAgICB9CisgICAgYW5pbS5kb25lKGZ1bmN0
aW9uKCkgeworICAgIHZhciBwcm9wOworICAgIGpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwgImZ4
c2hvdyIgKTsKKyAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAgalF1ZXJ5LnN0eWxlKCBl
bGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKKyAgICB9CisgICAgfSk7CisgICAgZm9yICggaW5k
ZXggPSAwIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgIHByb3AgPSBoYW5kbGVk
WyBpbmRleCBdOworICAgIHR3ZWVuID0gYW5pbS5jcmVhdGVUd2VlbiggcHJvcCwgaGlkZGVuID8g
ZGF0YVNob3dbIHByb3AgXSA6IDAgKTsKKyAgICBvcmlnWyBwcm9wIF0gPSBkYXRhU2hvd1sgcHJv
cCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApOworCisgICAgaWYgKCAhKCBwcm9wIGlu
IGRhdGFTaG93ICkgKSB7CisgICAgZGF0YVNob3dbIHByb3AgXSA9IHR3ZWVuLnN0YXJ0OworICAg
IGlmICggaGlkZGVuICkgeworICAgIHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0OworICAgIHR3ZWVu
LnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0IiA/IDEgOiAwOwor
ICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KK30KKworZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9w
dGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkgeworICAgIHJldHVybiBuZXcgVHdlZW4ucHJvdG90
eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7Cit9CitqUXVlcnku
VHdlZW4gPSBUd2VlbjsKKworVHdlZW4ucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBU
d2VlbiwKKyAgICBpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNp
bmcsIHVuaXQgKSB7CisgICAgdGhpcy5lbGVtID0gZWxlbTsKKyAgICB0aGlzLnByb3AgPSBwcm9w
OworICAgIHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8ICJzd2luZyI7CisgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKKyAgICB0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOworICAg
IHRoaXMuZW5kID0gZW5kOworICAgIHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVt
YmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKKyAgICB9LAorICAgIGN1cjogZnVuY3Rpb24oKSB7
CisgICAgdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKKworICAgIHJl
dHVybiBob29rcyAmJiBob29rcy5nZXQgPworICAgIGhvb2tzLmdldCggdGhpcyApIDoKKyAgICBU
d2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7CisgICAgfSwKKyAgICBydW46IGZ1
bmN0aW9uKCBwZXJjZW50ICkgeworICAgIHZhciBlYXNlZCwKKyAgICBob29rcyA9IFR3ZWVuLnBy
b3BIb29rc1sgdGhpcy5wcm9wIF07CisKKyAgICBpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAp
IHsKKyAgICB0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgK
KyAgICBwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlz
Lm9wdGlvbnMuZHVyYXRpb24KKyAgICApOworICAgIH0gZWxzZSB7CisgICAgdGhpcy5wb3MgPSBl
YXNlZCA9IHBlcmNlbnQ7CisgICAgfQorICAgIHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMu
c3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKKworICAgIGlmICggdGhpcy5vcHRpb25zLnN0
ZXAgKSB7CisgICAgdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywg
dGhpcyApOworICAgIH0KKworICAgIGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkgeworICAgIGhv
b2tzLnNldCggdGhpcyApOworICAgIH0gZWxzZSB7CisgICAgVHdlZW4ucHJvcEhvb2tzLl9kZWZh
dWx0LnNldCggdGhpcyApOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9OworCitU
d2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CisKK1R3ZWVu
LnByb3BIb29rcyA9IHsKKyAgICBfZGVmYXVsdDogeworICAgIGdldDogZnVuY3Rpb24oIHR3ZWVu
ICkgeworICAgIHZhciByZXN1bHQ7CisKKyAgICBpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3Ag
XSAhPSBudWxsICYmCisgICAgKCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVb
IHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKKyAgICByZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4u
cHJvcCBdOworICAgIH0KKworICAgIC8vIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3Jk
IHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQorICAgIC8vIGF0dGVtcHQgYSBw
YXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMKKyAg
ICAvLyBzbywgc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0
LgorICAgIC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVy
bmVkIGFzIGlzLgorICAgIHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnBy
b3AsICIiICk7CisgICAgLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0
byIgYXJlIGNvbnZlcnRlZCB0byAwLgorICAgIHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0g
ImF1dG8iID8gMCA6IHJlc3VsdDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkg
eworICAgIC8vIHVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0IC0gdXNlIGNzc0hvb2sgaWYg
aXRzIHRoZXJlIC0gdXNlIC5zdHlsZSBpZiBpdHMKKyAgICAvLyBhdmFpbGFibGUgYW5kIHVzZSBw
bGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZQorICAgIGlmICggalF1ZXJ5LmZ4LnN0ZXBb
IHR3ZWVuLnByb3AgXSApIHsKKyAgICBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2Vl
biApOworICAgIH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0uc3R5bGUgJiYgKCB0d2Vlbi5lbGVtLnN0
eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3AgXSBdICE9IG51bGwgfHwgalF1ZXJ5LmNz
c0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKKyAgICBqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0s
IHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTsKKyAgICB9IGVsc2UgeworICAg
IHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKKyAgICB9CisgICAgfQorICAg
IH0KK307CisKKy8vIFJlbW92ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJh
c2VkIGFwcHJvYWNoCisvLyB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMK
KworVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0
ID0geworICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgeworICAgIGlmICggdHdlZW4uZWxlbS5u
b2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CisgICAgdHdlZW4uZWxlbVsgdHdl
ZW4ucHJvcCBdID0gdHdlZW4ubm93OworICAgIH0KKyAgICB9Cit9OworCitqUXVlcnkuZWFjaChb
ICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICB2
YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1
bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4gc3BlZWQgPT0g
bnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiA/CisgICAgY3NzRm4uYXBwbHkoIHRo
aXMsIGFyZ3VtZW50cyApIDoKKyAgICB0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICks
IHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisgICAgfTsKK30pOworCitqUXVlcnkuZm4uZXh0
ZW5kKHsKKyAgICBmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sg
KSB7CisKKyAgICAvLyBzaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFj
aXR5IHRvIDAKKyAgICByZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0
eSIsIDAgKS5zaG93KCkKKworICAgIC8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAor
ICAgIC5lbmQoKS5hbmltYXRlKHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2sgKTsKKyAgICB9LAorICAgIGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5n
LCBjYWxsYmFjayApIHsKKyAgICB2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJv
cCApLAorICAgIG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sg
KSwKKyAgICBkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgIC8vIE9wZXJhdGUgb24gYSBj
b3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CisgICAgdmFy
IGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFs
bCApOworICAgIGRvQW5pbWF0aW9uLmZpbmlzaCA9IGZ1bmN0aW9uKCkgeworICAgIGFuaW0uc3Rv
cCggdHJ1ZSApOworICAgIH07CisgICAgLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5n
IHJlc29sdmVzIGltbWVkaWF0ZWx5CisgICAgaWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRo
aXMsICJmaW5pc2giICkgKSB7CisgICAgYW5pbS5zdG9wKCB0cnVlICk7CisgICAgfQorICAgIH07
CisgICAgZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CisKKyAgICByZXR1cm4gZW1w
dHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/CisgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlv
biApIDoKKyAgICB0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7CisgICAg
fSwKKyAgICBzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKKyAg
ICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgeworICAgIHZhciBzdG9wID0gaG9v
a3Muc3RvcDsKKyAgICBkZWxldGUgaG9va3Muc3RvcDsKKyAgICBzdG9wKCBnb3RvRW5kICk7Cisg
ICAgfTsKKworICAgIGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgeworICAgIGdvdG9F
bmQgPSBjbGVhclF1ZXVlOworICAgIGNsZWFyUXVldWUgPSB0eXBlOworICAgIHR5cGUgPSB1bmRl
ZmluZWQ7CisgICAgfQorICAgIGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHsK
KyAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7CisgICAgfQorCisgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICB2YXIgZGVxdWV1ZSA9IHRydWUsCisgICAgaW5k
ZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArICJxdWV1ZUhvb2tzIiwKKyAgICB0aW1lcnMgPSBq
UXVlcnkudGltZXJzLAorICAgIGRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKTsKKworICAgIGlm
ICggaW5kZXggKSB7CisgICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3Rv
cCApIHsKKyAgICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKyAgICB9CisgICAgfSBlbHNl
IHsKKyAgICBmb3IgKCBpbmRleCBpbiBkYXRhICkgeworICAgIGlmICggZGF0YVsgaW5kZXggXSAm
JiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkgeworICAgIHN0b3BR
dWV1ZSggZGF0YVsgaW5kZXggXSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZm9yICgg
aW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKyAgICBpZiAoIHRpbWVyc1sgaW5k
ZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1
ZXVlID09PSB0eXBlKSApIHsKKyAgICB0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5k
ICk7CisgICAgZGVxdWV1ZSA9IGZhbHNlOworICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7
CisgICAgfQorICAgIH0KKworICAgIC8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0
aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKyAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwg
Y2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQorICAgIC8v
IGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kCisgICAgaWYgKCBkZXF1ZXVlIHx8ICFnb3Rv
RW5kICkgeworICAgIGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisgICAgfQorICAgIH0p
OworICAgIH0sCisgICAgZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHsKKyAgICBpZiAoIHR5cGUg
IT09IGZhbHNlICkgeworICAgIHR5cGUgPSB0eXBlIHx8ICJmeCI7CisgICAgfQorICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgdmFyIGluZGV4LAorICAgIGRhdGEgPSBqUXVl
cnkuX2RhdGEoIHRoaXMgKSwKKyAgICBxdWV1ZSA9IGRhdGFbIHR5cGUgKyAicXVldWUiIF0sCisg
ICAgaG9va3MgPSBkYXRhWyB0eXBlICsgInF1ZXVlSG9va3MiIF0sCisgICAgdGltZXJzID0galF1
ZXJ5LnRpbWVycywKKyAgICBsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7CisKKyAg
ICAvLyBlbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhCisgICAgZGF0YS5maW5p
c2ggPSB0cnVlOworCisgICAgLy8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0CisgICAgalF1ZXJ5LnF1
ZXVlKCB0aGlzLCB0eXBlLCBbXSApOworCisgICAgaWYgKCBob29rcyAmJiBob29rcy5jdXIgJiYg
aG9va3MuY3VyLmZpbmlzaCApIHsKKyAgICBob29rcy5jdXIuZmluaXNoLmNhbGwoIHRoaXMgKTsK
KyAgICB9CisKKyAgICAvLyBsb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5p
c2ggdGhlbQorICAgIGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7Cisg
ICAgaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0u
cXVldWUgPT09IHR5cGUgKSB7CisgICAgdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSAp
OworICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisgICAgfQorICAgIH0KKworICAgIC8v
IGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVt
CisgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBp
ZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKKyAgICBxdWV1
ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOworICAgIH0KKyAgICB9CisKKyAgICAvLyB0
dXJuIG9mZiBmaW5pc2hpbmcgZmxhZworICAgIGRlbGV0ZSBkYXRhLmZpbmlzaDsKKyAgICB9KTsK
KyAgICB9Cit9KTsKKworLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFy
ZCBhbmltYXRpb24KK2Z1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7CisgICAg
dmFyIHdoaWNoLAorICAgIGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSwKKyAgICBpID0gMDsKKwor
ICAgIC8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3Nz
RXhwYW5kIHZhbHVlcywKKyAgICAvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVwIHZh
bHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0CisgICAgaW5jbHVkZVdpZHRoID0g
aW5jbHVkZVdpZHRoPyAxIDogMDsKKyAgICBmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRl
V2lkdGggKSB7CisgICAgd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKKyAgICBhdHRyc1sgIm1hcmdp
biIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOworICAgIH0K
KworICAgIGlmICggaW5jbHVkZVdpZHRoICkgeworICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53
aWR0aCA9IHR5cGU7CisgICAgfQorCisgICAgcmV0dXJuIGF0dHJzOworfQorCisvLyBHZW5lcmF0
ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCh7CisgICAgc2xp
ZGVEb3duOiBnZW5GeCgic2hvdyIpLAorICAgIHNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCisgICAg
c2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiKSwKKyAgICBmYWRlSW46IHsgb3BhY2l0eTogInNo
b3ciIH0sCisgICAgZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKKyAgICBmYWRlVG9nZ2xl
OiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKKyAg
ICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayAp
IHsKKyAgICByZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2sgKTsKKyAgICB9OworfSk7CisKK2pRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFz
aW5nLCBmbiApIHsKKyAgICB2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2Jq
ZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogeworICAgIGNvbXBsZXRlOiBmbiB8
fCAhZm4gJiYgZWFzaW5nIHx8CisgICAgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3Bl
ZWQsCisgICAgZHVyYXRpb246IHNwZWVkLAorICAgIGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVh
c2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZworICAgIH07CisK
KyAgICBvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRp
b24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKKyAgICBvcHQuZHVyYXRpb24gaW4galF1
ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5
LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVl
L3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKKyAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9w
dC5xdWV1ZSA9PT0gdHJ1ZSApIHsKKyAgICBvcHQucXVldWUgPSAiZngiOworICAgIH0KKworICAg
IC8vIFF1ZXVlaW5nCisgICAgb3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTsKKworICAgIG9wdC5jb21w
bGV0ZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQg
KSApIHsKKyAgICBvcHQub2xkLmNhbGwoIHRoaXMgKTsKKyAgICB9CisKKyAgICBpZiAoIG9wdC5x
dWV1ZSApIHsKKyAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CisgICAgfQor
ICAgIH07CisKKyAgICByZXR1cm4gb3B0OworfTsKKworalF1ZXJ5LmVhc2luZyA9IHsKKyAgICBs
aW5lYXI6IGZ1bmN0aW9uKCBwICkgeworICAgIHJldHVybiBwOworICAgIH0sCisgICAgc3dpbmc6
IGZ1bmN0aW9uKCBwICkgeworICAgIHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkg
LyAyOworICAgIH0KK307CisKK2pRdWVyeS50aW1lcnMgPSBbXTsKK2pRdWVyeS5meCA9IFR3ZWVu
LnByb3RvdHlwZS5pbml0OworalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIg
dGltZXIsCisgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKKyAgICBpID0gMDsKKworICAgIGZ4
Tm93ID0galF1ZXJ5Lm5vdygpOworCisgICAgZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsr
ICkgeworICAgIHRpbWVyID0gdGltZXJzWyBpIF07CisgICAgLy8gQ2hlY2tzIHRoZSB0aW1lciBo
YXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkCisgICAgaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNb
IGkgXSA9PT0gdGltZXIgKSB7CisgICAgdGltZXJzLnNwbGljZSggaS0tLCAxICk7CisgICAgfQor
ICAgIH0KKworICAgIGlmICggIXRpbWVycy5sZW5ndGggKSB7CisgICAgalF1ZXJ5LmZ4LnN0b3Ao
KTsKKyAgICB9CisgICAgZnhOb3cgPSB1bmRlZmluZWQ7Cit9OworCitqUXVlcnkuZngudGltZXIg
PSBmdW5jdGlvbiggdGltZXIgKSB7CisgICAgaWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMu
cHVzaCggdGltZXIgKSApIHsKKyAgICBqUXVlcnkuZnguc3RhcnQoKTsKKyAgICB9Cit9OworCitq
UXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKKworalF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7
CisgICAgaWYgKCAhdGltZXJJZCApIHsKKyAgICB0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVy
eS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKKyAgICB9Cit9OworCitqUXVlcnkuZngu
c3RvcCA9IGZ1bmN0aW9uKCkgeworICAgIGNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKyAgICB0
aW1lcklkID0gbnVsbDsKK307CisKK2pRdWVyeS5meC5zcGVlZHMgPSB7CisgICAgc2xvdzogNjAw
LAorICAgIGZhc3Q6IDIwMCwKKyAgICAvLyBEZWZhdWx0IHNwZWVkCisgICAgX2RlZmF1bHQ6IDQw
MAorfTsKKworLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnQKK2pRdWVyeS5meC5z
dGVwID0ge307CisKK2lmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsK
KyAgICBqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgcmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKyAg
ICByZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKKyAgICB9KS5sZW5ndGg7CisgICAgfTsKK30KK2pR
dWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKKyAgICBpZiAoIGFyZ3VtZW50
cy5sZW5ndGggKSB7CisgICAgcmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CisgICAgdGhp
cyA6CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgeworICAgIGpRdWVyeS5vZmZzZXQuc2V0
T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7CisgICAgfSk7CisgICAgfQorCisgICAgdmFyIGRv
Y0VsZW0sIHdpbiwKKyAgICBib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAgIGVsZW0gPSB0
aGlzWyAwIF0sCisgICAgZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKyAgICBp
ZiAoICFkb2MgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvY0VsZW0gPSBkb2MuZG9j
dW1lbnRFbGVtZW50OworCisgICAgLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVk
IERPTSBub2RlCisgICAgaWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7
CisgICAgcmV0dXJuIGJveDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGdCQ1Is
IGp1c3QgdXNlIDAsMCByYXRoZXIgdGhhbiBlcnJvcgorICAgIC8vIEJsYWNrQmVycnkgNSwgaU9T
IDMgKG9yaWdpbmFsIGlQaG9uZSkKKyAgICBpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xp
ZW50UmVjdCAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7CisgICAgYm94ID0gZWxlbS5nZXRCb3Vu
ZGluZ0NsaWVudFJlY3QoKTsKKyAgICB9CisgICAgd2luID0gZ2V0V2luZG93KCBkb2MgKTsKKyAg
ICByZXR1cm4geworICAgIHRvcDogYm94LnRvcCAgKyAoIHdpbi5wYWdlWU9mZnNldCB8fCBkb2NF
bGVtLnNjcm9sbFRvcCApICAtICggZG9jRWxlbS5jbGllbnRUb3AgIHx8IDAgKSwKKyAgICBsZWZ0
OiBib3gubGVmdCArICggd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCApIC0g
KCBkb2NFbGVtLmNsaWVudExlZnQgfHwgMCApCisgICAgfTsKK307CisKK2pRdWVyeS5vZmZzZXQg
PSB7CisKKyAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgeworICAg
IHZhciBwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKTsKKworICAgIC8v
IHNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3Rh
dGljIGVsZW0KKyAgICBpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKKyAgICBlbGVtLnN0
eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKyAgICB9CisKKyAgICB2YXIgY3VyRWxlbSA9IGpR
dWVyeSggZWxlbSApLAorICAgIGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksCisgICAgY3Vy
Q1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKKyAgICBjdXJDU1NMZWZ0ID0galF1
ZXJ5LmNzcyggZWxlbSwgImxlZnQiICksCisgICAgY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0
aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYgalF1ZXJ5Lmlu
QXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKKyAgICBwcm9wcyA9
IHt9LCBjdXJQb3NpdGlvbiA9IHt9LCBjdXJUb3AsIGN1ckxlZnQ7CisKKyAgICAvLyBuZWVkIHRv
IGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBh
dXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKKyAgICBpZiAoIGNh
bGN1bGF0ZVBvc2l0aW9uICkgeworICAgIGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigp
OworICAgIGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDsKKyAgICBjdXJMZWZ0ID0gY3VyUG9zaXRp
b24ubGVmdDsKKyAgICB9IGVsc2UgeworICAgIGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1Rv
cCApIHx8IDA7CisgICAgY3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwOwor
ICAgIH0KKworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKKyAgICBv
cHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBjdXJPZmZzZXQgKTsKKyAgICB9CisKKyAg
ICBpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7CisgICAgcHJvcHMudG9wID0gKCBvcHRpb25z
LnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKKyAgICB9CisgICAgaWYgKCBvcHRpb25z
LmxlZnQgIT0gbnVsbCApIHsKKyAgICBwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJP
ZmZzZXQubGVmdCApICsgY3VyTGVmdDsKKyAgICB9CisKKyAgICBpZiAoICJ1c2luZyIgaW4gb3B0
aW9ucyApIHsKKyAgICBvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7CisgICAgfSBl
bHNlIHsKKyAgICBjdXJFbGVtLmNzcyggcHJvcHMgKTsKKyAgICB9CisgICAgfQorfTsKKworCitq
UXVlcnkuZm4uZXh0ZW5kKHsKKworICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICBpZiAo
ICF0aGlzWyAwIF0gKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBvZmZzZXRQYXJl
bnQsIG9mZnNldCwKKyAgICBwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAg
IGVsZW0gPSB0aGlzWyAwIF07CisKKyAgICAvLyBmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZy
b20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlz
IGl0J3Mgb25seSBvZmZzZXQgcGFyZW50CisgICAgaWYgKCBqUXVlcnkuY3NzKCBlbGVtLCAicG9z
aXRpb24iICkgPT09ICJmaXhlZCIgKSB7CisgICAgLy8gd2UgYXNzdW1lIHRoYXQgZ2V0Qm91bmRp
bmdDbGllbnRSZWN0IGlzIGF2YWlsYWJsZSB3aGVuIGNvbXB1dGVkIHBvc2l0aW9uIGlzIGZpeGVk
CisgICAgb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICB9IGVsc2Ug
eworICAgIC8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisgICAgb2Zmc2V0UGFyZW50ID0gdGhp
cy5vZmZzZXRQYXJlbnQoKTsKKworICAgIC8vIEdldCBjb3JyZWN0IG9mZnNldHMKKyAgICBvZmZz
ZXQgPSB0aGlzLm9mZnNldCgpOworICAgIGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFy
ZW50WyAwIF0sICJodG1sIiApICkgeworICAgIHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5v
ZmZzZXQoKTsKKyAgICB9CisKKyAgICAvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKyAgICBw
YXJlbnRPZmZzZXQudG9wICArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJvcmRl
clRvcFdpZHRoIiwgdHJ1ZSApOworICAgIHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3Mo
IG9mZnNldFBhcmVudFsgMCBdLCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOworICAgIH0KKwor
ICAgIC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnMKKyAgICAv
LyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBh
bmQgbWFyZ2luTGVmdAorICAgIC8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZz
ZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCisgICAgcmV0dXJuIHsKKyAgICB0b3A6ICBvZmZz
ZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9w
IiwgdHJ1ZSApLAorICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBq
UXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUpCisgICAgfTsKKyAgICB9LAorCisg
ICAgb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rp
b24oKSB7CisgICAgdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVl
cnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgImh0bWwiICkgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0
UGFyZW50LCAicG9zaXRpb24iKSA9PT0gInN0YXRpYyIgKSApIHsKKyAgICBvZmZzZXRQYXJlbnQg
PSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0UGFy
ZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB9KTsKKyAgICB9Cit9KTsKKwor
CisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNo
KCB7c2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQifSwg
ZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHsKKyAgICB2YXIgdG9wID0gL1kvLnRlc3QoIHByb3Ag
KTsKKworICAgIGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkgeworICAgIHJl
dHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7
CisgICAgdmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOworCisgICAgaWYgKCB2YWwgPT09IHVu
ZGVmaW5lZCApIHsKKyAgICByZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBd
IDoKKyAgICB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSA6CisgICAgZWxl
bVsgbWV0aG9kIF07CisgICAgfQorCisgICAgaWYgKCB3aW4gKSB7CisgICAgd2luLnNjcm9sbFRv
KAorICAgICF0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbExlZnQoKSwKKyAgICB0b3Ag
PyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbFRvcCgpCisgICAgKTsKKworICAgIH0gZWxzZSB7
CisgICAgZWxlbVsgbWV0aG9kIF0gPSB2YWw7CisgICAgfQorICAgIH0sIG1ldGhvZCwgdmFsLCBh
cmd1bWVudHMubGVuZ3RoLCBudWxsICk7CisgICAgfTsKK30pOworCitmdW5jdGlvbiBnZXRXaW5k
b3coIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8KKyAgICBl
bGVtIDoKKyAgICBlbGVtLm5vZGVUeXBlID09PSA5ID8KKyAgICBlbGVtLmRlZmF1bHRWaWV3IHx8
IGVsZW0ucGFyZW50V2luZG93IDoKKyAgICBmYWxzZTsKK30KKy8vIENyZWF0ZSBpbm5lckhlaWdo
dCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGgg
bWV0aG9kcworalF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVpZ2h0IiwgV2lkdGg6ICJ3aWR0aCIg
fSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7CisgICAgalF1ZXJ5LmVhY2goIHsgcGFkZGluZzog
ImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LCBmdW5j
dGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHsKKyAgICAvLyBtYXJnaW4gaXMgb25seSBm
b3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKKyAgICBqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBm
dW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKKyAgICB2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRz
Lmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSAiYm9vbGVhbiIg
KSwKKyAgICBleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1
ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKKworICAgIHJldHVybiBqUXVlcnku
YWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CisgICAgdmFyIGRv
YzsKKworICAgIGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisgICAgLy8gQXMgb2Yg
NS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2Fm
YXJpLCBidXQgdGhlcmUKKyAgICAvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBw
dWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246CisgICAgLy8gaHR0cHM6Ly9n
aXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjQKKyAgICByZXR1cm4gZWxlbS5kb2N1bWVu
dC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOworICAgIH0KKworICAgIC8vIEdl
dCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkg
KSB7CisgICAgZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICAvLyBFaXRoZXIgc2Ny
b2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRo
L0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVzdAorICAgIC8vIHVuZm9ydHVuYXRlbHksIHRo
aXMgY2F1c2VzIGJ1ZyAjMzgzOCBpbiBJRTYvOCBvbmx5LCBidXQgdGhlcmUgaXMgY3VycmVudGx5
IG5vIGdvb2QsIHNtYWxsIHdheSB0byBmaXggaXQuCisgICAgcmV0dXJuIE1hdGgubWF4KAorICAg
IGVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisg
ICAgZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwK
KyAgICBkb2NbICJjbGllbnQiICsgbmFtZSBdCisgICAgKTsKKyAgICB9CisKKyAgICByZXR1cm4g
dmFsdWUgPT09IHVuZGVmaW5lZCA/CisgICAgLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUg
ZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAorICAgIGpRdWVy
eS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOgorCisgICAgLy8gU2V0IHdpZHRoIG9yIGhlaWdo
dCBvbiB0aGUgZWxlbWVudAorICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4
dHJhICk7CisgICAgfSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFp
bmFibGUsIG51bGwgKTsKKyAgICB9OworICAgIH0pOworfSk7CisvLyBMaW1pdCBzY29wZSBwb2xs
dXRpb24gZnJvbSBhbnkgZGVwcmVjYXRlZCBBUEkKKy8vIChmdW5jdGlvbigpIHsKKworLy8gfSko
KTsKKy8vIEV4cG9zZSBqUXVlcnkgdG8gdGhlIGdsb2JhbCBvYmplY3QKK3dpbmRvdy5qUXVlcnkg
PSB3aW5kb3cuJCA9IGpRdWVyeTsKKworLy8gRXhwb3NlIGpRdWVyeSBhcyBhbiBBTUQgbW9kdWxl
LCBidXQgb25seSBmb3IgQU1EIGxvYWRlcnMgdGhhdAorLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVz
IHdpdGggbG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnkKKy8vIGluIGEgcGFnZSB0
aGF0IGFsbCBtaWdodCBjYWxsIGRlZmluZSgpLiBUaGUgbG9hZGVyIHdpbGwgaW5kaWNhdGUKKy8v
IHRoZXkgaGF2ZSBzcGVjaWFsIGFsbG93YW5jZXMgZm9yIG11bHRpcGxlIGpRdWVyeSB2ZXJzaW9u
cyBieQorLy8gc3BlY2lmeWluZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFz
IGEgbmFtZWQgbW9kdWxlLAorLy8gc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0
aCBvdGhlciBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLAorLy8gYnV0IG5vdCB1c2UgYSBwcm9w
ZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdCB1bmRlcnN0YW5kcyBhbm9ueW1vdXMKKy8vIEFN
RCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byBy
ZWdpc3Rlci4KKy8vIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUg
bmFtZXMgYXJlIGRlcml2ZWQgZnJvbQorLy8gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3Jt
YWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2UgZmlsZSBuYW1lLgorLy8gRG8gdGhpcyBhZnRl
ciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBj
YWxsCisvLyBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2ls
bCB3b3JrLgoraWYgKCB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQg
JiYgZGVmaW5lLmFtZC5qUXVlcnkgKSB7CisgICAgZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0
aW9uICgpIHsgcmV0dXJuIGpRdWVyeTsgfSApOworfQorCit9KSggd2luZG93ICk7ClwgTm8gbmV3
bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
UGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1j
b21tb24vYmFzZS5jc3MJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBs
ZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDU1NSBAQAoraHRtbCwKK2JvZHkgeworICAgIG1hcmdpbjogMDsKKyAg
ICBwYWRkaW5nOiAwOworfQorCitidXR0b24geworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5n
OiAwOworICAgIGJvcmRlcjogMDsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworICAgIGZvbnQtc2l6
ZTogMTAwJTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgZm9udC1mYW1pbHk6
IGluaGVyaXQ7CisgICAgY29sb3I6IGluaGVyaXQ7CisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBu
b25lOworICAgIC8qLW1vei1hcHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFwcGVhcmFuY2U6
IG5vbmU7CisgICAgLW8tYXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOwor
fQorCitib2R5IHsKKyAgICBmb250OiAxNHB4ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwg
QXJpYWwsIHNhbnMtc2VyaWY7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJhY2tncm91
bmQ6ICNlYWVhZWEgdXJsKCdiZy5wbmcnKTsKKyAgICBjb2xvcjogIzRkNGQ0ZDsKKyAgICB3aWR0
aDogNTUwcHg7CisgICAgbWFyZ2luOiAwIGF1dG87CisgICAgLXdlYmtpdC1mb250LXNtb290aGlu
ZzogYW50aWFsaWFzZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Cisg
ICAgLW1zLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGlu
ZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisj
dG9kb2FwcCB7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1
NSwgMjU1LCAyNTUsIDAuOSk7CisgICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBib3Jk
ZXI6IDFweCBzb2xpZCAjY2NjOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBib3JkZXIt
dG9wLWxlZnQtcmFkaXVzOiAycHg7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsK
KyAgICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAgMCAy
NXB4IDUwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUpOworfQorCisjdG9kb2FwcDpiZWZvcmUgewor
ICAgIGNvbnRlbnQ6ICcnOworICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y1ZDZkNjsKKyAg
ICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjVkNmQ2OworICAgIHdpZHRoOiAycHg7CisgICAg
cG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICBsZWZ0OiA0MHB4OworICAgIGhl
aWdodDogMTAwJTsKK30KKworI3RvZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xk
ZXIgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworI3RvZG9hcHAgaW5wdXQ6Oi1tb3ot
cGxhY2Vob2xkZXIgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBjb2xvcjogI2E5YTlh
OTsKK30KKworI3RvZG9hcHAgaDEgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6
IC0xMjBweDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDcwcHg7CisgICAgZm9u
dC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGNvbG9yOiAjYjNi
M2IzOworICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CisgICAgdGV4dC1zaGFk
b3c6IC0xcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC10ZXh0LXJlbmRl
cmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGlt
aXplTGVnaWJpbGl0eTsKKyAgICAtbXMtdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0
eTsKKyAgICAtby10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQt
cmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7Cit9CisKKyNoZWFkZXIgeworICAgIHBhZGRp
bmctdG9wOiAxNXB4OworICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7Cit9CisKKyNoZWFkZXI6
YmVmb3JlIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAg
dG9wOiAwOworICAgIHJpZ2h0OiAwOworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiAxNXB4Owor
ICAgIHotaW5kZXg6IDI7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2YzYxNWM7Cisg
ICAgYmFja2dyb3VuZDogIzhkN2Q3NzsKKyAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50
KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKHJnYmEoMTMyLCAxMTAsIDEwMCwg
MC44KSksdG8ocmdiYSgxMDEsIDg0LCA3NiwgMC44KSkpOworICAgIGJhY2tncm91bmQ6IC13ZWJr
aXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEw
MSwgODQsIDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0
b3AsIHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSwgcmdiYSgxMDEsIDg0LCA3NiwgMC44KSk7Cisg
ICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAw
LCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiAtbXMtbGlu
ZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQs
IDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDEz
MiwgMTEwLCAxMDAsIDAuOCksIHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpOworICAgIGZpbHRlcjog
cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0w
LFN0YXJ0Q29sb3JTdHI9JyM5ZDhiODMnLCBFbmRDb2xvclN0cj0nIzg0NzY3MCcpOworICAgIGJv
cmRlci10b3AtbGVmdC1yYWRpdXM6IDFweDsKKyAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czog
MXB4OworfQorCisjbmV3LXRvZG8sCisuZWRpdCB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOwor
ICAgIG1hcmdpbjogMDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDI0cHg7Cisg
ICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJv
cmRlcjogMDsKKyAgICBvdXRsaW5lOiBub25lOworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHBh
ZGRpbmc6IDZweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAgIGJveC1zaGFkb3c6
IGluc2V0IDAgLTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC1ib3gt
c2l6aW5nOiBib3JkZXItYm94OworICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAg
ICAtbXMtYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAtby1ib3gtc2l6aW5nOiBib3JkZXIt
Ym94OworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgLXdlYmtpdC1mb250LXNtb290
aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7
CisgICAgLW1zLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290
aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQor
CisjbmV3LXRvZG8geworICAgIHBhZGRpbmc6IDE2cHggMTZweCAxNnB4IDYwcHg7CisgICAgYm9y
ZGVyOiBub25lOworICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMik7CisgICAgei1p
bmRleDogMjsKKyAgICBib3gtc2hhZG93OiBub25lOworfQorCisjbWFpbiB7CisgICAgcG9zaXRp
b246IHJlbGF0aXZlOworICAgIHotaW5kZXg6IDI7CisgICAgYm9yZGVyLXRvcDogMXB4IGRvdHRl
ZCAjYWRhZGFkOworfQorCitsYWJlbFtmb3I9J3RvZ2dsZS1hbGwnXSB7CisgICAgZGlzcGxheTog
bm9uZTsKK30KKworI3RvZ2dsZS1hbGwgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0
b3A6IC00MnB4OworICAgIGxlZnQ6IC00cHg7CisgICAgd2lkdGg6IDQwcHg7CisgICAgdGV4dC1h
bGlnbjogY2VudGVyOworICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQor
CisjdG9nZ2xlLWFsbDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICfCuyc7CisgICAgZm9udC1zaXpl
OiAyOHB4OworICAgIGNvbG9yOiAjZDlkOWQ5OworICAgIHBhZGRpbmc6IDAgMjVweCA3cHg7Cit9
CisKKyN0b2dnbGUtYWxsOmNoZWNrZWQ6YmVmb3JlIHsKKyAgICBjb2xvcjogIzczNzM3MzsKK30K
KworI3RvZG8tbGlzdCB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlz
dC1zdHlsZTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaSB7CisgICAgcG9zaXRpb246IHJlbGF0
aXZlOworICAgIGZvbnQtc2l6ZTogMjRweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVk
ICNjY2M7Cit9CisKKyN0b2RvLWxpc3QgbGk6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRv
bTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9t
OiBub25lOworICAgIHBhZGRpbmc6IDA7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRp
dCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6
IDEzcHggMTdweCAxMnB4IDE3cHg7CisgICAgbWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9k
by1saXN0IGxpLmVkaXRpbmcgLnZpZXcgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2Rv
LWxpc3QgbGkgLnRvZ2dsZSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0
MHB4OworICAgIC8qIGF1dG8sIHNpbmNlIG5vbi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBw
b3J0IGlucHV0IHN0eWxpbmcgKi8KKyAgICBoZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFi
c29sdXRlOworICAgIHRvcDogMDsKKyAgICBib3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7
CisgICAgYm9yZGVyOiBub25lOyAvKiBNb2JpbGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBl
YXJhbmNlOiBub25lOworICAgIC8qLW1vei1hcHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFw
cGVhcmFuY2U6IG5vbmU7CisgICAgLW8tYXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNl
OiBub25lOworfQorCisjdG9kby1saXN0IGxpIC50b2dnbGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6
ICfinJQnOworICAgIGxpbmUtaGVpZ2h0OiA0M3B4OyAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVs
cyB2aXN1YWwgYWRqdXN0bWVudCAqLworICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICBjb2xvcjog
I2Q5ZDlkOTsKKyAgICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgI2JmYmZiZjsKK30KKworI3RvZG8t
bGlzdCBsaSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgeworICAgIGNvbG9yOiAjODVhZGE3OworICAg
IHRleHQtc2hhZG93OiAwIDFweCAwICM2Njk5OTE7CisgICAgYm90dG9tOiAxcHg7CisgICAgcG9z
aXRpb246IHJlbGF0aXZlOworfQorCisjdG9kby1saXN0IGxpIGxhYmVsIHsKKyAgICB3b3JkLWJy
ZWFrOiBicmVhay13b3JkOworICAgIHBhZGRpbmc6IDE1cHg7CisgICAgbWFyZ2luLWxlZnQ6IDQ1
cHg7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICAtd2Vi
a2l0LXRyYW5zaXRpb246IGNvbG9yIDAuNHM7CisgICAgLW1vei10cmFuc2l0aW9uOiBjb2xvciAw
LjRzOworICAgIC1tcy10cmFuc2l0aW9uOiBjb2xvciAwLjRzOworICAgIC1vLXRyYW5zaXRpb246
IGNvbG9yIDAuNHM7CisgICAgdHJhbnNpdGlvbjogY29sb3IgMC40czsKK30KKworI3RvZG8tbGlz
dCBsaS5jb21wbGV0ZWQgbGFiZWwgeworICAgIGNvbG9yOiAjYTlhOWE5OworICAgIHRleHQtZGVj
b3JhdGlvbjogbGluZS10aHJvdWdoOworfQorCisjdG9kby1saXN0IGxpIC5kZXN0cm95IHsKKyAg
ICBkaXNwbGF5OiBub25lOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7Cisg
ICAgcmlnaHQ6IDEwcHg7CisgICAgYm90dG9tOiAwOworICAgIHdpZHRoOiA0MHB4OworICAgIGhl
aWdodDogNDBweDsKKyAgICBtYXJnaW46IGF1dG8gMDsKKyAgICBmb250LXNpemU6IDIycHg7Cisg
ICAgY29sb3I6ICNhODhhOGE7CisgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAg
ICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjJzOworICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4y
czsKKyAgICAtby10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICB0cmFuc2l0aW9uOiBhbGwgMC4y
czsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3ZlciB7CisgICAgdGV4dC1zaGFkb3c6
IDAgMCAxcHggIzAwMCwKKyAgICAgMCAwIDEwcHggcmdiYSgxOTksIDEwNywgMTA3LCAwLjgpOwor
ICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjMpOworICAgIC1tb3otdHJhbnNmb3JtOiBz
Y2FsZSgxLjMpOworICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMyk7CisgICAgLW8tdHJhbnNm
b3JtOiBzY2FsZSgxLjMpOworICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zKTsKK30KKworI3RvZG8t
bGlzdCBsaSAuZGVzdHJveTphZnRlciB7CisgICAgY29udGVudDogJ+Kclic7Cit9CisKKyN0b2Rv
LWxpc3QgbGk6aG92ZXIgLmRlc3Ryb3kgeworICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisjdG9k
by1saXN0IGxpIC5lZGl0IHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9kby1saXN0IGxp
LmVkaXRpbmc6bGFzdC1jaGlsZCB7CisgICAgbWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworI2Zv
b3RlciB7CisgICAgY29sb3I6ICM3Nzc7CisgICAgcGFkZGluZzogMCAxNXB4OworICAgIHBvc2l0
aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDogMDsKKyAgICBib3R0b206IC0zMXB4OworICAgIGxl
ZnQ6IDA7CisgICAgaGVpZ2h0OiAyMHB4OworICAgIHotaW5kZXg6IDE7CisgICAgdGV4dC1hbGln
bjogY2VudGVyOworfQorCisjZm9vdGVyOmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAg
cG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAwOworICAgIGJvdHRvbTogMzFweDsKKyAg
ICBsZWZ0OiAwOworICAgIGhlaWdodDogNTBweDsKKyAgICB6LWluZGV4OiAtMTsKKyAgICBib3gt
c2hhZG93OiAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjMpLAorICAgIDAgNnB4IDAgLTNweCBy
Z2JhKDI1NSwgMjU1LCAyNTUsIDAuOCksCisgICAgMCA3cHggMXB4IC0zcHggcmdiYSgwLCAwLCAw
LCAwLjMpLAorICAgIDAgNDNweCAwIC02cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpLAorICAg
IDAgNDRweCAycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsK
KyAgICBmbG9hdDogbGVmdDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisjZmlsdGVycyB7
CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsK
KyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgcmlnaHQ6IDA7CisgICAgbGVmdDogMDsKK30K
KworI2ZpbHRlcnMgbGkgeworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2ZpbHRlcnMgbGkg
YSB7CisgICAgY29sb3I6ICM4Mzc1NmY7CisgICAgbWFyZ2luOiAycHg7CisgICAgdGV4dC1kZWNv
cmF0aW9uOiBub25lOworfQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkIHsKKyAgICBmb250LXdl
aWdodDogYm9sZDsKK30KKworI2NsZWFyLWNvbXBsZXRlZCB7CisgICAgZmxvYXQ6IHJpZ2h0Owor
ICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBsaW5lLWhlaWdodDogMjBweDsKKyAgICB0ZXh0
LWRlY29yYXRpb246IG5vbmU7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjEpOwor
ICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBwYWRkaW5nOiAwIDEwcHg7CisgICAgYm9yZGVyLXJh
ZGl1czogM3B4OworICAgIGJveC1zaGFkb3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjIp
OworfQorCisjY2xlYXItY29tcGxldGVkOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAs
IDAsIDAsIDAuMTUpOworICAgIGJveC1zaGFkb3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAw
LjMpOworfQorCisjaW5mbyB7CisgICAgbWFyZ2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjog
I2E2YTZhNjsKKyAgICBmb250LXNpemU6IDEycHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAg
cmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKwor
I2luZm8gYSB7CisgICAgY29sb3I6IGluaGVyaXQ7Cit9CisKKy8qCisgICAgSGFjayB0byByZW1v
dmUgYmFja2dyb3VuZCBmcm9tIE1vYmlsZSBTYWZhcmkuCisgICAgQ2FuJ3QgdXNlIGl0IGdsb2Jh
bGx5IHNpbmNlIGl0IGRlc3Ryb3lzIGNoZWNrYm94ZXMgaW4gRmlyZWZveCBhbmQgT3BlcmEKKyov
CitAbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsK
KyAgICAjdG9nZ2xlLWFsbCwKKyAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgeworICAgIGJhY2tn
cm91bmQ6IG5vbmU7CisgICAgfQorCisgICAgI3RvZG8tbGlzdCBsaSAudG9nZ2xlIHsKKyAgICBo
ZWlnaHQ6IDQwcHg7CisgICAgfQorCisgICAgI3RvZ2dsZS1hbGwgeworICAgIHRvcDogLTU2cHg7
CisgICAgbGVmdDogLTE1cHg7CisgICAgd2lkdGg6IDY1cHg7CisgICAgaGVpZ2h0OiA0MXB4Owor
ICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOworICAgIHRyYW5zZm9ybTogcm90
YXRlKDkwZGVnKTsKKyAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgICAgYXBwZWFyYW5j
ZTogbm9uZTsKKyAgICB9Cit9CisKKy5oaWRkZW57CisgICAgZGlzcGxheTpub25lOworfQorCito
ciB7CisgICAgbWFyZ2luOiAyMHB4IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci10b3A6
IDFweCBkYXNoZWQgI0M1QzVDNTsKKyAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNGN0Y3
Rjc7Cit9CisKKy5sZWFybiBhIHsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQt
ZGVjb3JhdGlvbjogbm9uZTsKKyAgICBjb2xvcjogI2I4M2Y0NTsKK30KKworLmxlYXJuIGE6aG92
ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIGNvbG9yOiAjNzg3ZTdl
OworfQorCisubGVhcm4gaDMsCisubGVhcm4gaDQsCisubGVhcm4gaDUgeworICAgIG1hcmdpbjog
MTBweCAwOworICAgIGZvbnQtd2VpZ2h0OiA1MDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAg
ICBjb2xvcjogIzAwMDsKK30KKworLmxlYXJuIGgzIHsKKyAgICBmb250LXNpemU6IDI0cHg7Cit9
CisKKy5sZWFybiBoNCB7CisgICAgZm9udC1zaXplOiAxOHB4OworfQorCisubGVhcm4gaDUgewor
ICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgZm9udC1zaXplOiAxNHB4OworfQorCisubGVhcm4g
dWwgeworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OworfQorCisu
bGVhcm4gbGkgeworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorCisubGVhcm4gcCB7CisgICAg
Zm9udC1zaXplOiAxNXB4OworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgbGluZS1oZWlnaHQ6
IDEuMzsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5x
dW90ZSB7CisgICAgYm9yZGVyOiBub25lOworICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKK30K
KworLnF1b3RlIHAgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLnF1b3RlIHA6YmVm
b3JlIHsKKyAgICBjb250ZW50OiAn4oCcJzsKKyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3Bh
Y2l0eTogLjE1OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0yMHB4OworICAg
IGxlZnQ6IDNweDsKK30KKworLnF1b3RlIHA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfigJ0nOwor
ICAgIGZvbnQtc2l6ZTogNTBweDsKKyAgICBvcGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFi
c29sdXRlOworICAgIGJvdHRvbTogLTQycHg7CisgICAgcmlnaHQ6IDNweDsKK30KKworLnF1b3Rl
IGZvb3RlciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGJvdHRvbTogLTQwcHg7Cisg
ICAgcmlnaHQ6IDA7Cit9CisKKy5xdW90ZSBmb290ZXIgaW1nIHsKKyAgICBib3JkZXItcmFkaXVz
OiAzcHg7Cit9CisKKy5xdW90ZSBmb290ZXIgYSB7CisgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAg
ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuc3BlZWNoLWJ1YmJsZSB7CisgICAgcG9z
aXRpb246IHJlbGF0aXZlOworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYmFja2dyb3VuZDogcmdi
YSgwLCAwLCAwLCAuMDQpOworICAgIGJvcmRlci1yYWRpdXM6IDVweDsKK30KKworLnNwZWVjaC1i
dWJibGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsK
KyAgICB0b3A6IDEwMCU7CisgICAgcmlnaHQ6IDMwcHg7CisgICAgYm9yZGVyOiAxM3B4IHNvbGlk
IHRyYW5zcGFyZW50OworICAgIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsK
K30KKworLyoqYm9keSovLmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgcG9zaXRpb246IGFic29s
dXRlOworICAgIHdpZHRoOiAyNzJweDsKKyAgICB0b3A6IDhweDsKKyAgICBsZWZ0OiAtMzAwcHg7
CisgICAgcGFkZGluZzogMTBweDsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7CisgICAgYmFja2dy
b3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAuNik7CisgICAgdHJhbnNpdGlvbi1wcm9w
ZXJ0eTogbGVmdDsKKyAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKK30KKworQG1lZGlh
IChtaW4td2lkdGg6IDg5OXB4KSB7CisgICAgLyoqYm9keSovLmxlYXJuLWJhciB7CisgICAgd2lk
dGg6IGF1dG87CisgICAgbWFyZ2luOiAwIDAgMCAzMDBweDsKKyAgICB9CisgICAgLyoqYm9keSov
LmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgbGVmdDogOHB4OworICAgIH0KKyAgICAvKipib2R5
Ki8ubGVhcm4tYmFyICN0b2RvYXBwIHsKKyAgICB3aWR0aDogNTUwcHg7CisgICAgbWFyZ2luOiAx
MzBweCBhdXRvIDQwcHggYXV0bzsKKyAgICB9Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRz
L3RvZG9tdmMtY29tbW9uL2Jhc2UuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjA5IEBACisoZnVuY3Rpb24gKCkgeworICAgICd1c2Ug
c3RyaWN0JzsKKworICAgIC8vIFVuZGVyc2NvcmUncyBUZW1wbGF0ZSBNb2R1bGUKKyAgICAvLyBD
b3VydGVzeSBvZiB1bmRlcnNjb3JlanMub3JnCisgICAgdmFyIF8gPSAoZnVuY3Rpb24gKF8pIHsK
KyAgICBfLmRlZmF1bHRzID0gZnVuY3Rpb24gKG9iamVjdCkgeworICAgIGlmICghb2JqZWN0KSB7
CisgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisgICAgZm9yICh2YXIgYXJnc0luZGV4ID0gMSwg
YXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGg7IGFy
Z3NJbmRleCsrKSB7CisgICAgdmFyIGl0ZXJhYmxlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07Cisg
ICAgaWYgKGl0ZXJhYmxlKSB7CisgICAgZm9yICh2YXIga2V5IGluIGl0ZXJhYmxlKSB7CisgICAg
aWYgKG9iamVjdFtrZXldID09IG51bGwpIHsKKyAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxlW2tl
eV07CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBvYmplY3Q7CisgICAg
fQorCisgICAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzIEVSQi1zdHlsZSB0ZW1wbGF0
ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCisgICAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRp
bmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgorICAgIF8udGVtcGxhdGVTZXR0aW5n
cyA9IHsKKyAgICBldmFsdWF0ZSAgICA6IC88JShbXHNcU10rPyklPi9nLAorICAgIGludGVycG9s
YXRlIDogLzwlPShbXHNcU10rPyklPi9nLAorICAgIGVzY2FwZSAgICAgIDogLzwlLShbXHNcU10r
PyklPi9nCisgICAgfTsKKworICAgIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGlu
Z3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW4KKyAgICAvLyBpbnRlcnBvbGF0aW9u
LCBldmFsdWF0aW9uIG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBuZWVkIG9uZSB0aGF0IGlzCisgICAg
Ly8gZ3VhcmFudGVlZCBub3QgdG8gbWF0Y2guCisgICAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87CisK
KyAgICAvLyBDZXJ0YWluIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkIHNvIHRoYXQgdGhl
eSBjYW4gYmUgcHV0IGludG8gYQorICAgIC8vIHN0cmluZyBsaXRlcmFsLgorICAgIHZhciBlc2Nh
cGVzID0geworICAgICInIjogICAgICAiJyIsCisgICAgJ1xcJzogICAgICdcXCcsCisgICAgJ1xy
JzogICAgICdyJywKKyAgICAnXG4nOiAgICAgJ24nLAorICAgICdcdCc6ICAgICAndCcsCisgICAg
J1x1MjAyOCc6ICd1MjAyOCcsCisgICAgJ1x1MjAyOSc6ICd1MjAyOScKKyAgICB9OworCisgICAg
dmFyIGVzY2FwZXIgPSAvXFx8J3xccnxcbnxcdHxcdTIwMjh8XHUyMDI5L2c7CisKKyAgICAvLyBK
YXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxl
bWVudGF0aW9uLgorICAgIC8vIFVuZGVyc2NvcmUgdGVtcGxhdGluZyBoYW5kbGVzIGFyYml0cmFy
eSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSwKKyAgICAvLyBhbmQgY29ycmVjdGx5
IGVzY2FwZXMgcXVvdGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQgY29kZS4KKyAgICBfLnRlbXBsYXRl
ID0gZnVuY3Rpb24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKKyAgICB2YXIgcmVuZGVyOworICAg
IHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7
CisKKyAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9u
IHZpYSBhbHRlcm5hdGlvbi4KKyAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoWworICAgIChz
ZXR0aW5ncy5lc2NhcGUgfHwgbm9NYXRjaCkuc291cmNlLAorICAgIChzZXR0aW5ncy5pbnRlcnBv
bGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsCisgICAgKHNldHRpbmdzLmV2YWx1YXRlIHx8IG5vTWF0
Y2gpLnNvdXJjZQorICAgIF0uam9pbignfCcpICsgJ3wkJywgJ2cnKTsKKworICAgIC8vIENvbXBp
bGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVyYWxzIGFwcHJvcHJp
YXRlbHkuCisgICAgdmFyIGluZGV4ID0gMDsKKyAgICB2YXIgc291cmNlID0gIl9fcCs9JyI7Cisg
ICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9s
YXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7CisgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgs
IG9mZnNldCkKKyAgICAucmVwbGFjZShlc2NhcGVyLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4g
J1xcJyArIGVzY2FwZXNbbWF0Y2hdOyB9KTsKKworICAgIGlmIChlc2NhcGUpIHsKKyAgICBzb3Vy
Y2UgKz0gIicrXG4oKF9fdD0oIiArIGVzY2FwZSArICIpKT09bnVsbD8nJzpfLmVzY2FwZShfX3Qp
KStcbiciOworICAgIH0KKyAgICBpZiAoaW50ZXJwb2xhdGUpIHsKKyAgICBzb3VyY2UgKz0gIicr
XG4oKF9fdD0oIiArIGludGVycG9sYXRlICsgIikpPT1udWxsPycnOl9fdCkrXG4nIjsKKyAgICB9
CisgICAgaWYgKGV2YWx1YXRlKSB7CisgICAgc291cmNlICs9ICInO1xuIiArIGV2YWx1YXRlICsg
IlxuX19wKz0nIjsKKyAgICB9CisgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7Cisg
ICAgcmV0dXJuIG1hdGNoOworICAgIH0pOworICAgIHNvdXJjZSArPSAiJztcbiI7CisKKyAgICAv
LyBJZiBhIHZhcmlhYmxlIGlzIG5vdCBzcGVjaWZpZWQsIHBsYWNlIGRhdGEgdmFsdWVzIGluIGxv
Y2FsIHNjb3BlLgorICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9i
anx8e30pe1xuJyArIHNvdXJjZSArICd9XG4nOworCisgICAgc291cmNlID0gInZhciBfX3QsX19w
PScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbiwiICsKKyAgICAicHJpbnQ9ZnVuY3Rpb24oKXtf
X3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcbiIgKworICAgIHNvdXJjZSArICJyZXR1cm4g
X19wO1xuIjsKKworICAgIHRyeSB7CisgICAgcmVuZGVyID0gbmV3IEZ1bmN0aW9uKHNldHRpbmdz
LnZhcmlhYmxlIHx8ICdvYmonLCAnXycsIHNvdXJjZSk7CisgICAgfSBjYXRjaCAoZSkgeworICAg
IGUuc291cmNlID0gc291cmNlOworICAgIHRocm93IGU7CisgICAgfQorCisgICAgaWYgKGRhdGEp
IHJldHVybiByZW5kZXIoZGF0YSwgXyk7CisgICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0
YSkgeworICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTsKKyAgICB9OworCisg
ICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24gc291cmNlIGFzIGEgY29udmVuaWVu
Y2UgZm9yIHByZWNvbXBpbGF0aW9uLgorICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbign
ICsgKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsK
KworICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgICB9OworCisgICAgcmV0dXJuIF87CisgICAgfSko
e30pOworCisgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09PSAndG9kb212Yy5jb20nKSB7Cisg
ICAgd2luZG93Ll9nYXEgPSBbWydfc2V0QWNjb3VudCcsJ1VBLTMxMDgxMDYyLTEnXSxbJ190cmFj
a1BhZ2V2aWV3J11dOyhmdW5jdGlvbihkLHQpe3ZhciBnPWQuY3JlYXRlRWxlbWVudCh0KSxzPWQu
Z2V0RWxlbWVudHNCeVRhZ05hbWUodClbMF07Zy5zcmM9Jy8vd3d3Lmdvb2dsZS1hbmFseXRpY3Mu
Y29tL2dhLmpzJztzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcscyl9KGRvY3VtZW50LCdzY3Jp
cHQnKSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVkaXJlY3QoKSB7CisgICAgaWYgKGxvY2F0
aW9uLmhvc3RuYW1lID09PSAndGFzdGVqcy5naXRodWIuaW8nKSB7CisgICAgbG9jYXRpb24uaHJl
ZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgndGFzdGVqcy5naXRodWIuaW8vdG9kb212YycsICd0
b2RvbXZjLmNvbScpOworICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaW5kUm9vdCgpIHsK
KyAgICB2YXIgYmFzZTsKKworICAgIFsvbGFicy8sIC9cdyotZXhhbXBsZXMvXS5mb3JFYWNoKGZ1
bmN0aW9uIChocmVmKSB7CisgICAgdmFyIG1hdGNoID0gbG9jYXRpb24uaHJlZi5tYXRjaChocmVm
KTsKKworICAgIGlmICghYmFzZSAmJiBtYXRjaCkgeworICAgIGJhc2UgPSBsb2NhdGlvbi5ocmVm
LmluZGV4T2YobWF0Y2gpOworICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBsb2NhdGlvbi5o
cmVmLnN1YnN0cigwLCBiYXNlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBnZXRGaWxlKGZpbGUs
IGNhbGxiYWNrKSB7CisgICAgaWYgKCFsb2NhdGlvbi5ob3N0KSB7CisgICAgcmV0dXJuIGNvbnNv
bGUuaW5mbygnTWlzcyB0aGUgaW5mbyBiYXI/IFJ1biBUb2RvTVZDIGZyb20gYSBzZXJ2ZXIgdG8g
YXZvaWQgYSBjcm9zcy1vcmlnaW4gZXJyb3IuJyk7CisgICAgfQorCisgICAgdmFyIHhociA9IG5l
dyBYTUxIdHRwUmVxdWVzdCgpOworCisgICAgeGhyLm9wZW4oJ0dFVCcsIGZpbmRSb290KCkgKyBm
aWxlLCB0cnVlKTsKKyAgICB4aHIuc2VuZCgpOworCisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9u
ICgpIHsKKyAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIGNhbGxiYWNrKSB7CisgICAgY2Fs
bGJhY2soeGhyLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICAgIH07CisgICAgfQorCisgICAgZnVu
Y3Rpb24gTGVhcm4obGVhcm5KU09OLCBjb25maWcpIHsKKyAgICBpZiAoISh0aGlzIGluc3RhbmNl
b2YgTGVhcm4pKSB7CisgICAgcmV0dXJuIG5ldyBMZWFybihsZWFybkpTT04sIGNvbmZpZyk7Cisg
ICAgfQorCisgICAgdmFyIHRlbXBsYXRlLCBmcmFtZXdvcms7CisKKyAgICBpZiAodHlwZW9mIGxl
YXJuSlNPTiAhPT0gJ29iamVjdCcpIHsKKyAgICB0cnkgeworICAgIGxlYXJuSlNPTiA9IEpTT04u
cGFyc2UobGVhcm5KU09OKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuOworICAgIH0K
KyAgICB9CisKKyAgICBpZiAoY29uZmlnKSB7CisgICAgdGVtcGxhdGUgPSBjb25maWcudGVtcGxh
dGU7CisgICAgZnJhbWV3b3JrID0gY29uZmlnLmZyYW1ld29yazsKKyAgICB9CisKKyAgICBpZiAo
IXRlbXBsYXRlICYmIGxlYXJuSlNPTi50ZW1wbGF0ZXMpIHsKKyAgICB0ZW1wbGF0ZSA9IGxlYXJu
SlNPTi50ZW1wbGF0ZXMudG9kb212YzsKKyAgICB9CisKKyAgICBpZiAoIWZyYW1ld29yayAmJiBk
b2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdvcmtdJykpIHsKKyAgICBmcmFtZXdv
cmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdvcmtdJykuZ2V0QXR0cmli
dXRlKCdkYXRhLWZyYW1ld29yaycpOworICAgIH0KKworCisgICAgaWYgKHRlbXBsYXRlICYmIGxl
YXJuSlNPTltmcmFtZXdvcmtdKSB7CisgICAgdGhpcy5mcmFtZXdvcmtKU09OID0gbGVhcm5KU09O
W2ZyYW1ld29ya107CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworCisgICAgdGhpcy5h
cHBlbmQoKTsKKyAgICB9CisgICAgfQorCisgICAgTGVhcm4ucHJvdG90eXBlLmFwcGVuZCA9IGZ1
bmN0aW9uICgpIHsKKyAgICB2YXIgYXNpZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhc2lk
ZScpOworICAgIGFzaWRlLmlubmVySFRNTCA9IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhp
cy5mcmFtZXdvcmtKU09OKTsKKyAgICBhc2lkZS5jbGFzc05hbWUgPSAnbGVhcm4nOworCisgICAg
Ly8gTG9jYWxpemUgZGVtbyBsaW5rcworICAgIHZhciBkZW1vTGlua3MgPSBhc2lkZS5xdWVyeVNl
bGVjdG9yQWxsKCcuZGVtby1saW5rJyk7CisgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2Fs
bChkZW1vTGlua3MsIGZ1bmN0aW9uIChkZW1vTGluaykgeworICAgIGRlbW9MaW5rLnNldEF0dHJp
YnV0ZSgnaHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7
CisgICAgfSk7CisKKyAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IChkb2N1bWVudC5ib2R5
LmNsYXNzTmFtZSArICcgbGVhcm4tYmFyJykudHJpbSgpOworICAgIGRvY3VtZW50LmJvZHkuaW5z
ZXJ0QWRqYWNlbnRIVE1MKCdhZnRlckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsKKyAgICB9Owor
CisgICAgcmVkaXJlY3QoKTsKKyAgICBnZXRGaWxlKCdsZWFybi5qc29uJywgTGVhcm4pOworfSko
KTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9hcHAuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2FwcC5qcwkocmV2aXNp
b24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9hcHAuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwyIEBACisvKmdsb2JhbCBFbWJlciAqLword2luZG93LlRvZG9z
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvanMvcm91dGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMv
Tm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9qcy9yb3V0ZXIuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRl
c3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvanMvcm91dGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDYgQEAKKy8qZ2xvYmFsIFRvZG9zIEVtYmVyICovCisndXNlIHN0cmljdCc7CisKK1RvZG9zLlJv
dXRlci5tYXAoZnVuY3Rpb24gKCkgeworICAgIHRoaXMucmVzb3VyY2UoJ3RvZG9zJywgeyBwYXRo
OiAnLycgfSwgZnVuY3Rpb24gKCkgeworICAgIHRoaXMucm91dGUoJ2FjdGl2ZScpOworICAgIHRo
aXMucm91dGUoJ2NvbXBsZXRlZCcpOworICAgIH0pOworfSk7CisKK1RvZG9zLlRvZG9zUm91dGUg
PSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgIG1vZGVsOiBmdW5jdGlvbiAoKSB7CisgICAgcmV0
dXJuIFRvZG9zLlRvZG8uZmluZCgpOworICAgIH0KK30pOworCitUb2Rvcy5Ub2Rvc0luZGV4Um91
dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgIHNldHVwQ29udHJvbGxlcjogZnVuY3Rpb24g
KCkgeworICAgIHZhciB0b2RvcyA9IFRvZG9zLlRvZG8uZmluZCgpOworICAgIHRoaXMuY29udHJv
bGxlckZvcigndG9kb3MnKS5zZXQoJ2ZpbHRlcmVkVG9kb3MnLCB0b2Rvcyk7CisgICAgfQorfSk7
CisKK1RvZG9zLlRvZG9zQWN0aXZlUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgIHNl
dHVwQ29udHJvbGxlcjogZnVuY3Rpb24gKCkgeworICAgIHZhciB0b2RvcyA9IFRvZG9zLlRvZG8u
ZmlsdGVyKGZ1bmN0aW9uICh0b2RvKSB7CisgICAgaWYgKCF0b2RvLmdldCgnaXNDb21wbGV0ZWQn
KSkgeworICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9KTsKKworICAgIHRoaXMuY29udHJv
bGxlckZvcigndG9kb3MnKS5zZXQoJ2ZpbHRlcmVkVG9kb3MnLCB0b2Rvcyk7CisgICAgfQorfSk7
CisKK1RvZG9zLlRvZG9zQ29tcGxldGVkUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAg
IHNldHVwQ29udHJvbGxlcjogZnVuY3Rpb24gKCkgeworICAgIHZhciB0b2RvcyA9IFRvZG9zLlRv
ZG8uZmlsdGVyKGZ1bmN0aW9uICh0b2RvKSB7CisgICAgaWYgKHRvZG8uZ2V0KCdpc0NvbXBsZXRl
ZCcpKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0pOworCisgICAgdGhpcy5jb250
cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRvZG9zKTsKKyAgICB9Cit9
KTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90
b2RvX2NvbnRyb2xsZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21w
bGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9fY29udHJvbGxlci5qcwkocmV2aXNpb24gMCkKKysr
IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2RvX2NvbnRy
b2xsZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNyBAQAorLypnbG9iYWwgVG9kb3Mg
RW1iZXIgKi8KKyd1c2Ugc3RyaWN0JzsKKworVG9kb3MuVG9kb0NvbnRyb2xsZXIgPSBFbWJlci5P
YmplY3RDb250cm9sbGVyLmV4dGVuZCh7CisgICAgaXNFZGl0aW5nOiBmYWxzZSwKKworICAgIGVk
aXRUb2RvOiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5zZXQoJ2lzRWRpdGluZycsIHRydWUpOwor
ICAgIH0sCisKKyAgICByZW1vdmVUb2RvOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHRvZG8gPSB0
aGlzLmdldCgnbW9kZWwnKTsKKworICAgIHRvZG8uZGVsZXRlUmVjb3JkKCk7CisgICAgdG9kby5n
ZXQoJ3N0b3JlJykuY29tbWl0KCk7CisgICAgfQorfSk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3Rz
L05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb3NfY29udHJvbGxlci5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9k
b3NfY29udHJvbGxlci5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29t
cGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2Rvc19jb250cm9sbGVyLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNTkgQEAKKy8qZ2xvYmFsIFRvZG9zIEVtYmVyICovCisndXNlIHN0cmljdCc7
CisKK1RvZG9zLlRvZG9zQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQo
eworICAgIGNyZWF0ZVRvZG86IGZ1bmN0aW9uICgpIHsKKyAgICAvLyBHZXQgdGhlIHRvZG8gdGl0
bGUgc2V0IGJ5IHRoZSAiTmV3IFRvZG8iIHRleHQgZmllbGQKKyAgICB2YXIgdGl0bGUgPSB0aGlz
LmdldCgnbmV3VGl0bGUnKTsKKyAgICBpZiAoIXRpdGxlLnRyaW0oKSkgeworICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG5ldyBUb2RvIG1vZGVsCisgICAgVG9kb3MuVG9k
by5jcmVhdGVSZWNvcmQoeworICAgIHRpdGxlOiB0aXRsZSwKKyAgICBpc0NvbXBsZXRlZDogZmFs
c2UKKyAgICB9KTsKKworICAgIC8vIENsZWFyIHRoZSAiTmV3IFRvZG8iIHRleHQgZmllbGQKKyAg
ICB0aGlzLnNldCgnbmV3VGl0bGUnLCAnJyk7CisKKyAgICAvLyBTYXZlIHRoZSBuZXcgbW9kZWwK
KyAgICB0aGlzLmdldCgnc3RvcmUnKS5jb21taXQoKTsKKyAgICB9LAorCisgICAgY2xlYXJDb21w
bGV0ZWQ6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgY29tcGxldGVkID0gdGhpcy5maWx0ZXJQcm9w
ZXJ0eSgnaXNDb21wbGV0ZWQnLCB0cnVlKTsKKyAgICBjb21wbGV0ZWQuaW52b2tlKCdkZWxldGVS
ZWNvcmQnKTsKKworICAgIHRoaXMuZ2V0KCdzdG9yZScpLmNvbW1pdCgpOworICAgIH0sCisKKyAg
ICByZW1haW5pbmc6IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gdGhpcy5maWx0ZXJQcm9wZXJ0
eSgnaXNDb21wbGV0ZWQnLCBmYWxzZSkuZ2V0KCdsZW5ndGgnKTsKKyAgICB9LnByb3BlcnR5KCdA
ZWFjaC5pc0NvbXBsZXRlZCcpLAorCisgICAgcmVtYWluaW5nRm9ybWF0dGVkOiBmdW5jdGlvbiAo
KSB7CisgICAgdmFyIHJlbWFpbmluZyA9IHRoaXMuZ2V0KCdyZW1haW5pbmcnKTsKKyAgICB2YXIg
cGx1cmFsID0gcmVtYWluaW5nID09PSAxID8gJ2l0ZW0nIDogJ2l0ZW1zJzsKKyAgICByZXR1cm4g
JzxzdHJvbmc+JUA8L3N0cm9uZz4gJUAgbGVmdCcuZm10KHJlbWFpbmluZywgcGx1cmFsKTsKKyAg
ICB9LnByb3BlcnR5KCdyZW1haW5pbmcnKSwKKworICAgIGNvbXBsZXRlZDogZnVuY3Rpb24gKCkg
eworICAgIHJldHVybiB0aGlzLmZpbHRlclByb3BlcnR5KCdpc0NvbXBsZXRlZCcsIHRydWUpLmdl
dCgnbGVuZ3RoJyk7CisgICAgfS5wcm9wZXJ0eSgnQGVhY2guaXNDb21wbGV0ZWQnKSwKKworICAg
IGhhc0NvbXBsZXRlZDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLmdldCgnY29tcGxl
dGVkJykgPiAwOworICAgIH0ucHJvcGVydHkoJ2NvbXBsZXRlZCcpLAorCisgICAgYWxsQXJlRG9u
ZTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkg
eworICAgIHRoaXMuc2V0RWFjaCgnaXNDb21wbGV0ZWQnLCB2YWx1ZSk7CisgICAgcmV0dXJuIHZh
bHVlOworICAgIH0gZWxzZSB7CisgICAgcmV0dXJuICEhdGhpcy5nZXQoJ2xlbmd0aCcpICYmCisg
ICAgdGhpcy5ldmVyeVByb3BlcnR5KCdpc0NvbXBsZXRlZCcsIHRydWUpOworICAgIH0KKyAgICB9
LnByb3BlcnR5KCdAZWFjaC5pc0NvbXBsZXRlZCcpCit9KTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVz
dHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9qcy9saWJzL2VtYmVyLWRhdGEuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVy
Zm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2xpYnMvZW1iZXItZGF0YS5qcwkocmV2aXNp
b24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVu
Y2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9saWJzL2VtYmVyLWRh
dGEuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MzE2IEBACisvLyBMYXN0IGNvbW1pdDog
MmJjYzc2NyAoMjAxMy0wMy0wNyAxNzowNzo0NiAtMDgwMCkKKworCisoZnVuY3Rpb24oKSB7Cit3
aW5kb3cuRFMgPSBFbWJlci5OYW1lc3BhY2UuY3JlYXRlKHsKKyAgLy8gdGhpcyBvbmUgZ29lcyBw
YXN0IDExCisgIENVUlJFTlRfQVBJX1JFVklTSU9OOiAxMgorfSk7CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7Cit2YXIgRGVmZXJyZWRNaXhpbiA9IEVtYmVyLkRlZmVycmVkTWl4aW4sICAv
LyBlbWJlci1ydW50aW1lL21peGlucy9kZWZlcnJlZAorICAgIEV2ZW50ZWQgPSBFbWJlci5FdmVu
dGVkLCAgICAgICAgICAgICAgLy8gZW1iZXItcnVudGltZS9taXhpbnMvZXZlbnRlZAorICAgIHJ1
biA9IEVtYmVyLnJ1biwgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZXItbWV0YWwvcnVuLWxv
b3AKKyAgICBnZXQgPSBFbWJlci5nZXQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVyLW1l
dGFsL2FjY2Vzc29ycworCit2YXIgTG9hZFByb21pc2UgPSBFbWJlci5NaXhpbi5jcmVhdGUoRXZl
bnRlZCwgRGVmZXJyZWRNaXhpbiwgeworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9z
dXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIHRoaXMub25lKCdkaWRMb2FkJywgZnVu
Y3Rpb24oKSB7CisgICAgICBydW4odGhpcywgJ3Jlc29sdmUnLCB0aGlzKTsKKyAgICB9KTsKKwor
ICAgIGlmIChnZXQodGhpcywgJ2lzTG9hZGVkJykpIHsKKyAgICAgIHRoaXMudHJpZ2dlcignZGlk
TG9hZCcpOworICAgIH0KKyAgfQorfSk7CisKK0RTLkxvYWRQcm9taXNlID0gTG9hZFByb21pc2U7
CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQ7CisKK3ZhciBMb2FkUHJvbWlzZSA9IERTLkxvYWRQcm9taXNlOyAvLyBzeXN0
ZW0vbWl4aW5zL2xvYWRfcHJvbWlzZQorCisvKioKKyAgQSByZWNvcmQgYXJyYXkgaXMgYW4gYXJy
YXkgdGhhdCBjb250YWlucyByZWNvcmRzIG9mIGEgY2VydGFpbiB0eXBlLiBUaGUgcmVjb3JkCisg
IGFycmF5IG1hdGVyaWFsaXplcyByZWNvcmRzIGFzIG5lZWRlZCB3aGVuIHRoZXkgYXJlIHJldHJp
ZXZlZCBmb3IgdGhlIGZpcnN0CisgIHRpbWUuIFlvdSBzaG91bGQgbm90IGNyZWF0ZSByZWNvcmQg
YXJyYXlzIHlvdXJzZWxmLiBJbnN0ZWFkLCBhbiBpbnN0YW5jZSBvZgorICBEUy5SZWNvcmRBcnJh
eSBvciBpdHMgc3ViY2xhc3NlcyB3aWxsIGJlIHJldHVybmVkIGJ5IHlvdXIgYXBwbGljYXRpb24n
cyBzdG9yZQorICBpbiByZXNwb25zZSB0byBxdWVyaWVzLgorKi8KKworRFMuUmVjb3JkQXJyYXkg
PSBFbWJlci5BcnJheVByb3h5LmV4dGVuZChFbWJlci5FdmVudGVkLCBMb2FkUHJvbWlzZSwgewor
ICAvKioKKyAgICBUaGUgbW9kZWwgdHlwZSBjb250YWluZWQgYnkgdGhpcyByZWNvcmQgYXJyYXku
CisKKyAgICBAdHlwZSBEUy5Nb2RlbAorICAqLworICB0eXBlOiBudWxsLAorCisgIC8vIFRoZSBh
cnJheSBvZiBjbGllbnQgaWRzIGJhY2tpbmcgdGhlIHJlY29yZCBhcnJheS4gV2hlbiBhCisgIC8v
IHJlY29yZCBpcyByZXF1ZXN0ZWQgZnJvbSB0aGUgcmVjb3JkIGFycmF5LCB0aGUgcmVjb3JkCisg
IC8vIGZvciB0aGUgY2xpZW50IGlkIGF0IHRoZSBzYW1lIGluZGV4IGlzIG1hdGVyaWFsaXplZCwg
aWYKKyAgLy8gbmVjZXNzYXJ5LCBieSB0aGUgc3RvcmUuCisgIGNvbnRlbnQ6IG51bGwsCisKKyAg
aXNMb2FkZWQ6IGZhbHNlLAorICBpc1VwZGF0aW5nOiBmYWxzZSwKKworICAvLyBUaGUgc3RvcmUg
dGhhdCBjcmVhdGVkIHRoaXMgcmVjb3JkIGFycmF5LgorICBzdG9yZTogbnVsbCwKKworICBvYmpl
Y3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgdmFyIGNvbnRlbnQgPSBnZXQodGhp
cywgJ2NvbnRlbnQnKSwKKyAgICAgICAgcmVmZXJlbmNlID0gY29udGVudC5vYmplY3RBdChpbmRl
eCksCisgICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpOworCisgICAgaWYgKHJlZmVy
ZW5jZSkgeworICAgICAgcmV0dXJuIHN0b3JlLnJlY29yZEZvclJlZmVyZW5jZShyZWZlcmVuY2Up
OworICAgIH0KKyAgfSwKKworICBtYXRlcmlhbGl6ZWRPYmplY3RBdDogZnVuY3Rpb24oaW5kZXgp
IHsKKyAgICB2YXIgcmVmZXJlbmNlID0gZ2V0KHRoaXMsICdjb250ZW50Jykub2JqZWN0QXQoaW5k
ZXgpOworICAgIGlmICghcmVmZXJlbmNlKSB7IHJldHVybjsgfQorCisgICAgaWYgKGdldCh0aGlz
LCAnc3RvcmUnKS5yZWNvcmRJc01hdGVyaWFsaXplZChyZWZlcmVuY2UpKSB7CisgICAgICByZXR1
cm4gdGhpcy5vYmplY3RBdChpbmRleCk7CisgICAgfQorICB9LAorCisgIHVwZGF0ZTogZnVuY3Rp
b24oKSB7CisgICAgaWYgKGdldCh0aGlzLCAnaXNVcGRhdGluZycpKSB7IHJldHVybjsgfQorCisg
ICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpLAorICAgICAgICB0eXBlID0gZ2V0KHRo
aXMsICd0eXBlJyk7CisKKyAgICBzdG9yZS5mZXRjaEFsbCh0eXBlLCB0aGlzKTsKKyAgfSwKKwor
ICBhZGRSZWZlcmVuY2U6IGZ1bmN0aW9uKHJlZmVyZW5jZSkgeworICAgIGdldCh0aGlzLCAnY29u
dGVudCcpLmFkZE9iamVjdChyZWZlcmVuY2UpOworICB9LAorCisgIHJlbW92ZVJlZmVyZW5jZTog
ZnVuY3Rpb24ocmVmZXJlbmNlKSB7CisgICAgZ2V0KHRoaXMsICdjb250ZW50JykucmVtb3ZlT2Jq
ZWN0KHJlZmVyZW5jZSk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewor
dmFyIGdldCA9IEVtYmVyLmdldDsKKworRFMuRmlsdGVyZWRSZWNvcmRBcnJheSA9IERTLlJlY29y
ZEFycmF5LmV4dGVuZCh7CisgIGZpbHRlckZ1bmN0aW9uOiBudWxsLAorICBpc0xvYWRlZDogdHJ1
ZSwKKworICByZXBsYWNlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdHlwZSA9IGdldCh0aGlzLCAn
dHlwZScpLnRvU3RyaW5nKCk7CisgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgcmVzdWx0IG9mIGEg
Y2xpZW50LXNpZGUgZmlsdGVyIChvbiAiICsgdHlwZSArICIpIGlzIGltbXV0YWJsZS4iKTsKKyAg
fSwKKworICB1cGRhdGVGaWx0ZXI6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgeworICAgIHZh
ciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKKyAgICBzdG9yZS51cGRhdGVSZWNvcmRBcnJh
eUZpbHRlcih0aGlzLCBnZXQodGhpcywgJ3R5cGUnKSwgZ2V0KHRoaXMsICdmaWx0ZXJGdW5jdGlv
bicpKTsKKyAgfSwgJ2ZpbHRlckZ1bmN0aW9uJykKK30pOworCit9KSgpOworCisKKworKGZ1bmN0
aW9uKCkgewordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworCitEUy5BZGFw
dGVyUG9wdWxhdGVkUmVjb3JkQXJyYXkgPSBEUy5SZWNvcmRBcnJheS5leHRlbmQoeworICBxdWVy
eTogbnVsbCwKKworICByZXBsYWNlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdHlwZSA9IGdldCh0
aGlzLCAndHlwZScpLnRvU3RyaW5nKCk7CisgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgcmVzdWx0
IG9mIGEgc2VydmVyIHF1ZXJ5IChvbiAiICsgdHlwZSArICIpIGlzIGltbXV0YWJsZS4iKTsKKyAg
fSwKKworICBsb2FkOiBmdW5jdGlvbihyZWZlcmVuY2VzKSB7CisgICAgdmFyIHN0b3JlID0gZ2V0
KHRoaXMsICdzdG9yZScpLCB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJyk7CisKKyAgICB0aGlzLmJl
Z2luUHJvcGVydHlDaGFuZ2VzKCk7CisgICAgc2V0KHRoaXMsICdjb250ZW50JywgRW1iZXIuQShy
ZWZlcmVuY2VzKSk7CisgICAgc2V0KHRoaXMsICdpc0xvYWRlZCcsIHRydWUpOworICAgIHRoaXMu
ZW5kUHJvcGVydHlDaGFuZ2VzKCk7CisKKyAgICB2YXIgc2VsZiA9IHRoaXM7IAorICAgIC8vIFRP
RE86IGRvZXMgdHJpZ2dlcmluZyBkaWRMb2FkIGV2ZW50IHNob3VsZCBiZSB0aGUgbGFzdCBhY3Rp
b24gb2YgdGhlIHJ1bkxvb3A/CisgICAgRW1iZXIucnVuLm9uY2UoZnVuY3Rpb24oKSB7CisgICAg
ICBzZWxmLnRyaWdnZXIoJ2RpZExvYWQnKTsKKyAgICB9KTsKKyAgfQorfSk7CisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
CisKKy8qKgorICBBIE1hbnlBcnJheSBpcyBhIFJlY29yZEFycmF5IHRoYXQgcmVwcmVzZW50cyB0
aGUgY29udGVudHMgb2YgYSBoYXMtbWFueQorICByZWxhdGlvbnNoaXAuCisKKyAgVGhlIE1hbnlB
cnJheSBpcyBpbnN0YW50aWF0ZWQgbGF6aWx5IHRoZSBmaXJzdCB0aW1lIHRoZSByZWxhdGlvbnNo
aXAgaXMKKyAgcmVxdWVzdGVkLgorCisgICMjIyBJbnZlcnNlcworCisgIE9mdGVuLCB0aGUgcmVs
YXRpb25zaGlwcyBpbiBFbWJlciBEYXRhIGFwcGxpY2F0aW9ucyB3aWxsIGhhdmUKKyAgYW4gaW52
ZXJzZS4gRm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyBtb2RlbHMgYXJlCisgIGRl
ZmluZWQ6CisKKyAgICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgICAgY29t
bWVudHM6IERTLmhhc01hbnkoJ0FwcC5Db21tZW50JykKKyAgICAgIH0pOworCisgICAgICBBcHAu
Q29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgICAgIHBvc3Q6IERTLmJlbG9uZ3NUbygn
QXBwLlBvc3QnKQorICAgICAgfSk7CisKKyAgSWYgeW91IGNyZWF0ZWQgYSBuZXcgaW5zdGFuY2Ug
b2YgYEFwcC5Qb3N0YCBhbmQgYWRkZWQKKyAgYSBgQXBwLkNvbW1lbnRgIHJlY29yZCB0byBpdHMg
YGNvbW1lbnRzYCBoYXMtbWFueQorICByZWxhdGlvbnNoaXAsIHlvdSB3b3VsZCBleHBlY3QgdGhl
IGNvbW1lbnQncyBgcG9zdGAKKyAgcHJvcGVydHkgdG8gYmUgc2V0IHRvIHRoZSBwb3N0IHRoYXQg
Y29udGFpbmVkCisgIHRoZSBoYXMtbWFueS4KKworICBXZSBjYWxsIHRoZSByZWNvcmQgdG8gd2hp
Y2ggYSByZWxhdGlvbnNoaXAgYmVsb25ncyB0aGUKKyAgcmVsYXRpb25zaGlwJ3MgX293bmVyXy4K
KyovCitEUy5NYW55QXJyYXkgPSBEUy5SZWNvcmRBcnJheS5leHRlbmQoeworICBpbml0OiBmdW5j
dGlvbigpIHsKKyAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIHRo
aXMuX2NoYW5nZXNUb1N5bmMgPSBFbWJlci5PcmRlcmVkU2V0LmNyZWF0ZSgpOworICB9LAorCisg
IC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGUgcmVjb3JkIHRvIHdoaWNoIHRoaXMgcmVsYXRp
b25zaGlwIGJlbG9uZ3MuCisKKyAgICBAcHJvcGVydHkge0RTLk1vZGVsfQorICAqLworICBvd25l
cjogbnVsbCwKKworICAvLyBMT0FESU5HIFNUQVRFCisKKyAgaXNMb2FkZWQ6IGZhbHNlLAorCisg
IGxvYWRpbmdSZWNvcmRzQ291bnQ6IGZ1bmN0aW9uKGNvdW50KSB7CisgICAgdGhpcy5sb2FkaW5n
UmVjb3Jkc0NvdW50ID0gY291bnQ7CisgIH0sCisKKyAgbG9hZGVkUmVjb3JkOiBmdW5jdGlvbigp
IHsKKyAgICB0aGlzLmxvYWRpbmdSZWNvcmRzQ291bnQtLTsKKyAgICBpZiAodGhpcy5sb2FkaW5n
UmVjb3Jkc0NvdW50ID09PSAwKSB7CisgICAgICBzZXQodGhpcywgJ2lzTG9hZGVkJywgdHJ1ZSk7
CisgICAgICB0aGlzLnRyaWdnZXIoJ2RpZExvYWQnKTsKKyAgICB9CisgIH0sCisKKyAgZmV0Y2g6
IGZ1bmN0aW9uKCkgeworICAgIHZhciByZWZlcmVuY2VzID0gZ2V0KHRoaXMsICdjb250ZW50Jyks
CisgICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpLAorICAgICAgICB0eXBlID0gZ2V0
KHRoaXMsICd0eXBlJyksCisgICAgICAgIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpOworCisg
ICAgc3RvcmUuZmV0Y2hVbmxvYWRlZFJlZmVyZW5jZXModHlwZSwgcmVmZXJlbmNlcywgb3duZXIp
OworICB9LAorCisgIC8vIE92ZXJyaWRlcyBFbWJlci5BcnJheSdzIHJlcGxhY2UgbWV0aG9kIHRv
IGltcGxlbWVudAorICByZXBsYWNlQ29udGVudDogZnVuY3Rpb24oaW5kZXgsIHJlbW92ZWQsIGFk
ZGVkKSB7CisgICAgLy8gTWFwIHRoZSBhcnJheSBvZiByZWNvcmQgb2JqZWN0cyBpbnRvIGFuIGFy
cmF5IG9mICBjbGllbnQgaWRzLgorICAgIGFkZGVkID0gYWRkZWQubWFwKGZ1bmN0aW9uKHJlY29y
ZCkgeworICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkgYWRkIHJlY29yZHMgb2YgIiAr
IChnZXQodGhpcywgJ3R5cGUnKSAmJiBnZXQodGhpcywgJ3R5cGUnKS50b1N0cmluZygpKSArICIg
dG8gdGhpcyByZWxhdGlvbnNoaXAuIiwgIWdldCh0aGlzLCAndHlwZScpIHx8IChnZXQodGhpcywg
J3R5cGUnKSA9PT0gcmVjb3JkLmNvbnN0cnVjdG9yKSk7CisgICAgICByZXR1cm4gZ2V0KHJlY29y
ZCwgJ19yZWZlcmVuY2UnKTsKKyAgICB9LCB0aGlzKTsKKworICAgIHRoaXMuX3N1cGVyKGluZGV4
LCByZW1vdmVkLCBhZGRlZCk7CisgIH0sCisKKyAgYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOiBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLmZldGNoKCk7CisgIH0sCisKKyAgYXJyYXlDb250ZW50V2ls
bENoYW5nZTogZnVuY3Rpb24oaW5kZXgsIHJlbW92ZWQsIGFkZGVkKSB7CisgICAgdmFyIG93bmVy
ID0gZ2V0KHRoaXMsICdvd25lcicpLAorICAgICAgICBuYW1lID0gZ2V0KHRoaXMsICduYW1lJyk7
CisKKyAgICBpZiAoIW93bmVyLl9zdXNwZW5kZWRSZWxhdGlvbnNoaXBzKSB7CisgICAgICAvLyBU
aGlzIGNvZGUgaXMgdGhlIGZpcnN0IGhhbGYgb2YgY29kZSB0aGF0IGNvbnRpbnVlcyBpbnNpZGUK
KyAgICAgIC8vIG9mIGFycmF5Q29udGVudERpZENoYW5nZS4gSXQgZ2V0cyBvciBjcmVhdGVzIGEg
Y2hhbmdlIGZyb20KKyAgICAgIC8vIHRoZSBjaGlsZCBvYmplY3QsIGFkZHMgdGhlIGN1cnJlbnQg
b3duZXIgYXMgdGhlIG9sZAorICAgICAgLy8gcGFyZW50IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRp
bWUgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZAorICAgICAgLy8gZnJvbSBhIE1hbnlBcnJheSwgYW5k
IHNldHMgYG5ld1BhcmVudGAgdG8gbnVsbC4KKyAgICAgIC8vCisgICAgICAvLyBMYXRlciwgaWYg
dGhlIG9iamVjdCBpcyBhZGRlZCB0byBhbm90aGVyIE1hbnlBcnJheSwKKyAgICAgIC8vIHRoZSBg
YXJyYXlDb250ZW50RGlkQ2hhbmdlYCB3aWxsIHNldCBgbmV3UGFyZW50YCBvbgorICAgICAgLy8g
dGhlIGNoYW5nZS4KKyAgICAgIGZvciAodmFyIGk9aW5kZXg7IGk8aW5kZXgrcmVtb3ZlZDsgaSsr
KSB7CisgICAgICAgIHZhciByZWZlcmVuY2UgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RB
dChpKTsKKworICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0
ZUNoYW5nZShvd25lci5nZXQoJ19yZWZlcmVuY2UnKSwgcmVmZXJlbmNlLCBnZXQodGhpcywgJ3N0
b3JlJyksIHsKKyAgICAgICAgICBwYXJlbnRUeXBlOiBvd25lci5jb25zdHJ1Y3RvciwKKyAgICAg
ICAgICBjaGFuZ2VUeXBlOiAicmVtb3ZlIiwKKyAgICAgICAgICBraW5kOiAiaGFzTWFueSIsCisg
ICAgICAgICAga2V5OiBuYW1lCisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX2NoYW5nZXNU
b1N5bmMuYWRkKGNoYW5nZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3N1
cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0sCisKKyAgYXJyYXlDb250ZW50RGlkQ2hh
bmdlOiBmdW5jdGlvbihpbmRleCwgcmVtb3ZlZCwgYWRkZWQpIHsKKyAgICB0aGlzLl9zdXBlci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25l
cicpLAorICAgICAgICBuYW1lID0gZ2V0KHRoaXMsICduYW1lJyksCisgICAgICAgIHN0b3JlID0g
Z2V0KHRoaXMsICdzdG9yZScpOworCisgICAgaWYgKCFvd25lci5fc3VzcGVuZGVkUmVsYXRpb25z
aGlwcykgeworICAgICAgLy8gVGhpcyBjb2RlIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiBjb2RlIHRo
YXQgc3RhcnRlZCBpbgorICAgICAgLy8gYGFycmF5Q29udGVudFdpbGxDaGFuZ2VgLiBJdCBnZXRz
IG9yIGNyZWF0ZXMgYSBjaGFuZ2UKKyAgICAgIC8vIGZyb20gdGhlIGNoaWxkIG9iamVjdCwgYW5k
IGFkZHMgdGhlIGN1cnJlbnQgb3duZXIgYXMKKyAgICAgIC8vIHRoZSBuZXcgcGFyZW50LgorICAg
ICAgZm9yICh2YXIgaT1pbmRleDsgaTxpbmRleCthZGRlZDsgaSsrKSB7CisgICAgICAgIHZhciBy
ZWZlcmVuY2UgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChpKTsKKworICAgICAgICB2
YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShvd25lci5nZXQo
J19yZWZlcmVuY2UnKSwgcmVmZXJlbmNlLCBzdG9yZSwgeworICAgICAgICAgIHBhcmVudFR5cGU6
IG93bmVyLmNvbnN0cnVjdG9yLAorICAgICAgICAgIGNoYW5nZVR5cGU6ICJhZGQiLAorICAgICAg
ICAgIGtpbmQ6Imhhc01hbnkiLAorICAgICAgICAgIGtleTogbmFtZQorICAgICAgICB9KTsKKyAg
ICAgICAgY2hhbmdlLmhhc01hbnlOYW1lID0gbmFtZTsKKworICAgICAgICB0aGlzLl9jaGFuZ2Vz
VG9TeW5jLmFkZChjaGFuZ2UpOworICAgICAgfQorCisgICAgICAvLyBXZSB3YWl0IHVudGlsIHRo
ZSBhcnJheSBoYXMgZmluaXNoZWQgYmVpbmcKKyAgICAgIC8vIG11dGF0ZWQgYmVmb3JlIHN5bmNp
bmcgdGhlIE9uZVRvTWFueUNoYW5nZXMgY3JlYXRlZAorICAgICAgLy8gaW4gYXJyYXlDb250ZW50
V2lsbENoYW5nZSwgc28gdGhhdCB0aGUgYXJyYXkKKyAgICAgIC8vIG1lbWJlcnNoaXAgdGVzdCBp
biB0aGUgc3luYygpIGxvZ2ljIG9wZXJhdGVzCisgICAgICAvLyBvbiB0aGUgZmluYWwgcmVzdWx0
cy4KKyAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuZm9yRWFjaChmdW5jdGlvbihjaGFuZ2UpIHsK
KyAgICAgICAgY2hhbmdlLnN5bmMoKTsKKyAgICAgIH0pOworICAgICAgRFMuT25lVG9NYW55Q2hh
bmdlLmVuc3VyZVNhbWVUcmFuc2FjdGlvbih0aGlzLl9jaGFuZ2VzVG9TeW5jLCBzdG9yZSk7Cisg
ICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmNsZWFyKCk7CisgICAgfQorICB9LAorCisgIC8vIENy
ZWF0ZSBhIGNoaWxkIHJlY29yZCB3aXRoaW4gdGhlIG93bmVyCisgIGNyZWF0ZVJlY29yZDogZnVu
Y3Rpb24oaGFzaCwgdHJhbnNhY3Rpb24pIHsKKyAgICB2YXIgb3duZXIgPSBnZXQodGhpcywgJ293
bmVyJyksCisgICAgICAgIHN0b3JlID0gZ2V0KG93bmVyLCAnc3RvcmUnKSwKKyAgICAgICAgdHlw
ZSA9IGdldCh0aGlzLCAndHlwZScpLAorICAgICAgICByZWNvcmQ7CisKKyAgICB0cmFuc2FjdGlv
biA9IHRyYW5zYWN0aW9uIHx8IGdldChvd25lciwgJ3RyYW5zYWN0aW9uJyk7CisKKyAgICByZWNv
cmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQuY2FsbChzdG9yZSwgdHlwZSwgaGFzaCwgdHJhbnNhY3Rp
b24pOworICAgIHRoaXMucHVzaE9iamVjdChyZWNvcmQpOworCisgICAgcmV0dXJuIHJlY29yZDsK
KyAgfQorCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKworfSkoKTsKKworCisK
KyhmdW5jdGlvbigpIHsKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10
ID0gRW1iZXIuU3RyaW5nLmZtdCwKKyAgICByZW1vdmVPYmplY3QgPSBFbWJlci5FbnVtZXJhYmxl
VXRpbHMucmVtb3ZlT2JqZWN0LCBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVh
Y2g7CisKKy8qKgorICBBIHRyYW5zYWN0aW9uIGFsbG93cyB5b3UgdG8gY29sbGVjdCBtdWx0aXBs
ZSByZWNvcmRzIGludG8gYSB1bml0IG9mIHdvcmsKKyAgdGhhdCBjYW4gYmUgY29tbWl0dGVkIG9y
IHJvbGxlZCBiYWNrIGFzIGEgZ3JvdXAuCisKKyAgRm9yIGV4YW1wbGUsIGlmIGEgcmVjb3JkIGhh
cyBsb2NhbCBtb2RpZmljYXRpb25zIHRoYXQgaGF2ZSBub3QgeWV0CisgIGJlZW4gc2F2ZWQsIGNh
bGxpbmcgYGNvbW1pdCgpYCBvbiBpdHMgdHJhbnNhY3Rpb24gd2lsbCBjYXVzZSB0aG9zZQorICBt
b2RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIGFkYXB0ZXIgdG8gYmUgc2F2ZWQuIENhbGxp
bmcKKyAgYHJvbGxiYWNrKClgIG9uIGl0cyB0cmFuc2FjdGlvbiB3b3VsZCBjYXVzZSBhbGwgb2Yg
dGhlIG1vZGlmaWNhdGlvbnMgdG8KKyAgYmUgZGlzY2FyZGVkIGFuZCB0aGUgcmVjb3JkIHRvIHJl
dHVybiB0byB0aGUgbGFzdCBrbm93biBzdGF0ZSBiZWZvcmUKKyAgY2hhbmdlcyB3ZXJlIG1hZGUu
CisKKyAgSWYgYSBuZXdseSBjcmVhdGVkIHJlY29yZCdzIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBi
YWNrLCBpdCB3aWxsCisgIGltbWVkaWF0ZWx5IHRyYW5zaXRpb24gdG8gdGhlIGRlbGV0ZWQgc3Rh
dGUuCisKKyAgSWYgeW91IGRvIG5vdCBleHBsaWNpdGx5IGNyZWF0ZSBhIHRyYW5zYWN0aW9uLCBh
IHJlY29yZCBpcyBhc3NpZ25lZCB0bworICBhbiBpbXBsaWNpdCB0cmFuc2FjdGlvbiBjYWxsZWQg
dGhlIGRlZmF1bHQgdHJhbnNhY3Rpb24uIEluIHRoZXNlIGNhc2VzLAorICB5b3UgY2FuIHRyZWF0
IHlvdXIgYXBwbGljYXRpb24ncyBpbnN0YW5jZSBvZiBgRFMuU3RvcmVgIGFzIGEgdHJhbnNhY3Rp
b24KKyAgYW5kIGNhbGwgdGhlIGBjb21taXQoKWAgYW5kIGByb2xsYmFjaygpYCBtZXRob2RzIG9u
IHRoZSBzdG9yZSBpdHNlbGYuCisKKyAgT25jZSBhIHJlY29yZCBoYXMgYmVlbiBzdWNjZXNzZnVs
bHkgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLCBpdCB3aWxsCisgIGJlIG1vdmVkIGJhY2sgdG8g
dGhlIGltcGxpY2l0IHRyYW5zYWN0aW9uLiBCZWNhdXNlIGl0IHdpbGwgbm93IGJlIGluCisgIGEg
Y2xlYW4gc3RhdGUsIGl0IGNhbiBiZSBtb3ZlZCB0byBhIG5ldyB0cmFuc2FjdGlvbiBpZiB5b3Ug
d2lzaC4KKworICAjIyMgQ3JlYXRpbmcgYSBUcmFuc2FjdGlvbgorCisgIFRvIGNyZWF0ZSBhIG5l
dyB0cmFuc2FjdGlvbiwgY2FsbCB0aGUgYHRyYW5zYWN0aW9uKClgIG1ldGhvZCBvZiB5b3VyCisg
IGFwcGxpY2F0aW9uJ3MgYERTLlN0b3JlYCBpbnN0YW5jZToKKworICAgICAgdmFyIHRyYW5zYWN0
aW9uID0gQXBwLnN0b3JlLnRyYW5zYWN0aW9uKCk7CisKKyAgVGhpcyB3aWxsIHJldHVybiBhIG5l
dyBpbnN0YW5jZSBvZiBgRFMuVHJhbnNhY3Rpb25gIHdpdGggbm8gcmVjb3JkcworICB5ZXQgYXNz
aWduZWQgdG8gaXQuCisKKyAgIyMjIEFkZGluZyBFeGlzdGluZyBSZWNvcmRzCisKKyAgQWRkIHJl
Y29yZHMgdG8gYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgYGFkZCgpYCBtZXRob2Q6CisKKyAgICAg
IHJlY29yZCA9IEFwcC5zdG9yZS5maW5kKEFwcC5QZXJzb24sIDEpOworICAgICAgdHJhbnNhY3Rp
b24uYWRkKHJlY29yZCk7CisKKyAgTm90ZSB0aGF0IG9ubHkgcmVjb3JkcyB3aG9zZSBgaXNEaXJ0
eWAgZmxhZyBpcyBgZmFsc2VgIG1heSBiZSBhZGRlZAorICB0byBhIHRyYW5zYWN0aW9uLiBPbmNl
IG1vZGlmaWNhdGlvbnMgdG8gYSByZWNvcmQgaGF2ZSBiZWVuIG1hZGUKKyAgKGl0cyBgaXNEaXJ0
eWAgZmxhZyBpcyBgdHJ1ZWApLCBpdCBpcyBub3QgbG9uZ2VyIGFibGUgdG8gYmUgYWRkZWQgdG8K
KyAgYSB0cmFuc2FjdGlvbi4KKworICAjIyMgQ3JlYXRpbmcgTmV3IFJlY29yZHMKKworICBCZWNh
dXNlIG5ld2x5IGNyZWF0ZWQgcmVjb3JkcyBhcmUgZGlydHkgZnJvbSB0aGUgdGltZSB0aGV5IGFy
ZSBjcmVhdGVkLAorICBhbmQgYmVjYXVzZSBkaXJ0eSByZWNvcmRzIGNhbiBub3QgYmUgYWRkZWQg
dG8gYSB0cmFuc2FjdGlvbiwgeW91IG11c3QKKyAgdXNlIHRoZSBgY3JlYXRlUmVjb3JkKClgIG1l
dGhvZCB0byBhc3NpZ24gbmV3IHJlY29yZHMgdG8gYSB0cmFuc2FjdGlvbi4KKworICBGb3IgZXhh
bXBsZSwgaW5zdGVhZCBvZiB0aGlzOgorCisgICAgdmFyIHRyYW5zYWN0aW9uID0gc3RvcmUudHJh
bnNhY3Rpb24oKTsKKyAgICB2YXIgcGVyc29uID0gQXBwLlBlcnNvbi5jcmVhdGVSZWNvcmQoeyBu
YW1lOiAiU3RldmUiIH0pOworCisgICAgLy8gd29uJ3Qgd29yayBiZWNhdXNlIHBlcnNvbiBpcyBk
aXJ0eQorICAgIHRyYW5zYWN0aW9uLmFkZChwZXJzb24pOworCisgIENhbGwgYGNyZWF0ZVJlY29y
ZCgpYCBvbiB0aGUgdHJhbnNhY3Rpb24gZGlyZWN0bHk6CisKKyAgICB2YXIgdHJhbnNhY3Rpb24g
PSBzdG9yZS50cmFuc2FjdGlvbigpOworICAgIHRyYW5zYWN0aW9uLmNyZWF0ZVJlY29yZChBcHAu
UGVyc29uLCB7IG5hbWU6ICJTdGV2ZSIgfSk7CisKKyAgIyMjIEFzeW5jaHJvbm91cyBDb21taXRz
CisKKyAgVHlwaWNhbGx5LCBhbGwgb2YgdGhlIHJlY29yZHMgaW4gYSB0cmFuc2FjdGlvbiB3aWxs
IGJlIGNvbW1pdHRlZAorICB0b2dldGhlci4gSG93ZXZlciwgbmV3IHJlY29yZHMgdGhhdCBoYXZl
IGEgZGVwZW5kZW5jeSBvbiBvdGhlciBuZXcKKyAgcmVjb3JkcyBuZWVkIHRvIHdhaXQgZm9yIHRo
ZWlyIHBhcmVudCByZWNvcmQgdG8gYmUgc2F2ZWQgYW5kIGFzc2lnbmVkIGFuCisgIElELiBJbiB0
aGF0IGNhc2UsIHRoZSBjaGlsZCByZWNvcmQgd2lsbCBjb250aW51ZSB0byBsaXZlIGluIHRoZQor
ICB0cmFuc2FjdGlvbiB1bnRpbCBpdHMgcGFyZW50IGlzIHNhdmVkLCBhdCB3aGljaCB0aW1lIHRo
ZSB0cmFuc2FjdGlvbiB3aWxsCisgIGF0dGVtcHQgdG8gY29tbWl0IGFnYWluLgorCisgIEZvciB0
aGlzIHJlYXNvbiwgeW91IHNob3VsZCBub3QgcmUtdXNlIHRyYW5zYWN0aW9ucyBvbmNlIHlvdSBo
YXZlIGNvbW1pdHRlZAorICB0aGVtLiBBbHdheXMgbWFrZSBhIG5ldyB0cmFuc2FjdGlvbiBhbmQg
bW92ZSB0aGUgZGVzaXJlZCByZWNvcmRzIHRvIGl0IGJlZm9yZQorICBjYWxsaW5nIGNvbW1pdC4K
KyovCisKK3ZhciBhcnJheURlZmF1bHQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9OworCitE
Uy5UcmFuc2FjdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAvKioKKyAgICBAcHJpdmF0
ZQorCisgICAgQ3JlYXRlcyB0aGUgYnVja2V0IGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gc2VncmVn
YXRlIHJlY29yZHMgYnkKKyAgICB0eXBlLgorICAqLworICBpbml0OiBmdW5jdGlvbigpIHsKKyAg
ICBzZXQodGhpcywgJ2J1Y2tldHMnLCB7CisgICAgICBjbGVhbjogICAgRW1iZXIuT3JkZXJlZFNl
dC5jcmVhdGUoKSwKKyAgICAgIGNyZWF0ZWQ6ICBFbWJlci5PcmRlcmVkU2V0LmNyZWF0ZSgpLAor
ICAgICAgdXBkYXRlZDogIEVtYmVyLk9yZGVyZWRTZXQuY3JlYXRlKCksCisgICAgICBkZWxldGVk
OiAgRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKSwKKyAgICAgIGluZmxpZ2h0OiBFbWJlci5PcmRl
cmVkU2V0LmNyZWF0ZSgpCisgICAgfSk7CisKKyAgICBzZXQodGhpcywgJ3JlbGF0aW9uc2hpcHMn
LCBFbWJlci5PcmRlcmVkU2V0LmNyZWF0ZSgpKTsKKyAgfSwKKworICAvKioKKyAgICBDcmVhdGVz
IGEgbmV3IHJlY29yZCBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgYXNzaWducyBpdCB0byB0aGUgdHJh
bnNhY3Rpb24KKyAgICBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuCisKKyAgICBUaGlz
IGlzIHVzZWZ1bCBhcyBvbmx5IGNsZWFuIHJlY29yZHMgY2FuIGJlIGFkZGVkIHRvIGEgdHJhbnNh
Y3Rpb24gYW5kCisgICAgbmV3IHJlY29yZHMgY3JlYXRlZCB1c2luZyBvdGhlciBtZXRob2RzIGlt
bWVkaWF0ZWx5IGJlY29tZSBkaXJ0eS4KKworICAgIEBwYXJhbSB7RFMuTW9kZWx9IHR5cGUgdGhl
IG1vZGVsIHR5cGUgdG8gY3JlYXRlCisgICAgQHBhcmFtIHtPYmplY3R9IGhhc2ggdGhlIGRhdGEg
aGFzaCB0byBhc3NpZ24gdGhlIG5ldyByZWNvcmQKKyAgKi8KKyAgY3JlYXRlUmVjb3JkOiBmdW5j
dGlvbih0eXBlLCBoYXNoKSB7CisgICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpOwor
CisgICAgcmV0dXJuIHN0b3JlLmNyZWF0ZVJlY29yZCh0eXBlLCBoYXNoLCB0aGlzKTsKKyAgfSwK
KworICBpc0VxdWFsT3JEZWZhdWx0OiBmdW5jdGlvbihvdGhlcikgeworICAgIGlmICh0aGlzID09
PSBvdGhlciB8fCBvdGhlciA9PT0gZ2V0KHRoaXMsICdzdG9yZS5kZWZhdWx0VHJhbnNhY3Rpb24n
KSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9LAorCisgIGlzRGVmYXVsdDogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMgPT09IGdldCh0aGlzLCAn
c3RvcmUuZGVmYXVsdFRyYW5zYWN0aW9uJyk7CisgIH0pLAorCisgIC8qKgorICAgIEFkZHMgYW4g
ZXhpc3RpbmcgcmVjb3JkIHRvIHRoaXMgdHJhbnNhY3Rpb24uIE9ubHkgcmVjb3JkcyB3aXRob3V0
CisgICAgbW9kZmljaWF0aW9ucyAoaS5lLiwgcmVjb3JkcyB3aG9zZSBgaXNEaXJ0eWAgcHJvcGVy
dHkgaXMgYGZhbHNlYCkKKyAgICBjYW4gYmUgYWRkZWQgdG8gYSB0cmFuc2FjdGlvbi4KKworICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUgcmVjb3JkIHRvIGFkZCB0byB0aGUgdHJhbnNh
Y3Rpb24KKyAgKi8KKyAgYWRkOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICBFbWJlci5hc3NlcnQo
IllvdSBtdXN0IHBhc3MgYSByZWNvcmQgaW50byB0cmFuc2FjdGlvbi5hZGQoKSIsIHJlY29yZCBp
bnN0YW5jZW9mIERTLk1vZGVsKTsKKworICAgIHZhciByZWNvcmRUcmFuc2FjdGlvbiA9IGdldChy
ZWNvcmQsICd0cmFuc2FjdGlvbicpLAorICAgICAgICBkZWZhdWx0VHJhbnNhY3Rpb24gPSBnZXQo
dGhpcywgJ3N0b3JlLmRlZmF1bHRUcmFuc2FjdGlvbicpOworCisgICAgLy8gTWFrZSBgYWRkYCBp
ZGVtcG90ZW50CisgICAgaWYgKHJlY29yZFRyYW5zYWN0aW9uID09PSB0aGlzKSB7IHJldHVybjsg
fQorCisgICAgLy8gWFhYIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtb3ZlIGEgZGlydHkgdHJh
bnNhY3Rpb24gZnJvbSB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvbgorCisgICAgLy8gd2UgY291bGQg
cHJvYmFibHkgbWFrZSB0aGlzIHdvcmsgaWYgc29tZW9uZSBoYXMgYSB2YWxpZCB1c2UgY2FzZS4g
RG8geW91PworICAgIEVtYmVyLmFzc2VydCgiT25jZSBhIHJlY29yZCBoYXMgY2hhbmdlZCwgeW91
IGNhbm5vdCBtb3ZlIGl0IGludG8gYSBkaWZmZXJlbnQgdHJhbnNhY3Rpb24iLCAhZ2V0KHJlY29y
ZCwgJ2lzRGlydHknKSk7CisKKyAgICBFbWJlci5hc3NlcnQoIk1vZGVscyBjYW5ub3QgYmVsb25n
IHRvIG1vcmUgdGhhbiBvbmUgdHJhbnNhY3Rpb24gYXQgYSB0aW1lLiIsIHJlY29yZFRyYW5zYWN0
aW9uID09PSBkZWZhdWx0VHJhbnNhY3Rpb24pOworCisgICAgdGhpcy5hZG9wdFJlY29yZChyZWNv
cmQpOworICB9LAorCisgIHJlbGF0aW9uc2hpcEJlY2FtZURpcnR5OiBmdW5jdGlvbihyZWxhdGlv
bnNoaXApIHsKKyAgICBnZXQodGhpcywgJ3JlbGF0aW9uc2hpcHMnKS5hZGQocmVsYXRpb25zaGlw
KTsKKyAgfSwKKworICByZWxhdGlvbnNoaXBCZWNhbWVDbGVhbjogZnVuY3Rpb24ocmVsYXRpb25z
aGlwKSB7CisgICAgZ2V0KHRoaXMsICdyZWxhdGlvbnNoaXBzJykucmVtb3ZlKHJlbGF0aW9uc2hp
cCk7CisgIH0sCisKKyAgLyoqCisgICAgQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24sIHdoaWNoIGNh
dXNlcyBhbGwgb2YgdGhlIG1vZGlmaWVkIHJlY29yZHMgdGhhdAorICAgIGJlbG9uZyB0byB0aGUg
dHJhbnNhY3Rpb24gdG8gYmUgc2VudCB0byB0aGUgYWRhcHRlciB0byBiZSBzYXZlZC4KKworICAg
IE9uY2UgeW91IGNhbGwgYGNvbW1pdCgpYCBvbiBhIHRyYW5zYWN0aW9uLCB5b3Ugc2hvdWxkIG5v
dCByZS11c2UgaXQuCisKKyAgICBXaGVuIGEgcmVjb3JkIGlzIHNhdmVkLCBpdCB3aWxsIGJlIHJl
bW92ZWQgZnJvbSB0aGlzIHRyYW5zYWN0aW9uIGFuZAorICAgIG1vdmVkIGJhY2sgdG8gdGhlIHN0
b3JlJ3MgZGVmYXVsdCB0cmFuc2FjdGlvbi4KKyAgKi8KKyAgY29tbWl0OiBmdW5jdGlvbigpIHsK
KyAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyk7CisgICAgdmFyIGFkYXB0ZXIgPSBn
ZXQoc3RvcmUsICdfYWRhcHRlcicpOworICAgIHZhciBkZWZhdWx0VHJhbnNhY3Rpb24gPSBnZXQo
c3RvcmUsICdkZWZhdWx0VHJhbnNhY3Rpb24nKTsKKworICAgIHZhciBpdGVyYXRlID0gZnVuY3Rp
b24ocmVjb3JkcykgeworICAgICAgdmFyIHNldCA9IHJlY29yZHMuY29weSgpOworICAgICAgc2V0
LmZvckVhY2goZnVuY3Rpb24gKHJlY29yZCkgeworICAgICAgICByZWNvcmQuc2VuZCgnd2lsbENv
bW1pdCcpOworICAgICAgfSk7CisgICAgICByZXR1cm4gc2V0OworICAgIH07CisKKyAgICB2YXIg
cmVsYXRpb25zaGlwcyA9IGdldCh0aGlzLCAncmVsYXRpb25zaGlwcycpOworCisgICAgdmFyIGNv
bW1pdERldGFpbHMgPSB7CisgICAgICBjcmVhdGVkOiBpdGVyYXRlKHRoaXMuYnVja2V0Rm9yVHlw
ZSgnY3JlYXRlZCcpKSwKKyAgICAgIHVwZGF0ZWQ6IGl0ZXJhdGUodGhpcy5idWNrZXRGb3JUeXBl
KCd1cGRhdGVkJykpLAorICAgICAgZGVsZXRlZDogaXRlcmF0ZSh0aGlzLmJ1Y2tldEZvclR5cGUo
J2RlbGV0ZWQnKSksCisgICAgICByZWxhdGlvbnNoaXBzOiByZWxhdGlvbnNoaXBzCisgICAgfTsK
KworICAgIGlmICh0aGlzID09PSBkZWZhdWx0VHJhbnNhY3Rpb24pIHsKKyAgICAgIHNldChzdG9y
ZSwgJ2RlZmF1bHRUcmFuc2FjdGlvbicsIHN0b3JlLnRyYW5zYWN0aW9uKCkpOworICAgIH0KKwor
ICAgIHRoaXMucmVtb3ZlQ2xlYW5SZWNvcmRzKCk7CisKKyAgICBpZiAoIWNvbW1pdERldGFpbHMu
Y3JlYXRlZC5pc0VtcHR5KCkgfHwgIWNvbW1pdERldGFpbHMudXBkYXRlZC5pc0VtcHR5KCkgfHwg
IWNvbW1pdERldGFpbHMuZGVsZXRlZC5pc0VtcHR5KCkgfHwgIXJlbGF0aW9uc2hpcHMuaXNFbXB0
eSgpKSB7CisgICAgICBpZiAoYWRhcHRlciAmJiBhZGFwdGVyLmNvbW1pdCkgeyBhZGFwdGVyLmNv
bW1pdChzdG9yZSwgY29tbWl0RGV0YWlscyk7IH0KKyAgICAgIGVsc2UgeyB0aHJvdyBmbXQoIkFk
YXB0ZXIgaXMgZWl0aGVyIG51bGwgb3IgZG9lcyBub3QgaW1wbGVtZW50IGBjb21taXRgIG1ldGhv
ZCIsIHRoaXMpOyB9CisgICAgfQorCisgICAgLy8gT25jZSB3ZSd2ZSBjb21taXR0ZWQgdGhlIHRy
YW5zYWN0aW9uLCB0aGVyZSBpcyBubyBuZWVkIHRvCisgICAgLy8ga2VlcCB0aGUgT25lVG9NYW55
Q2hhbmdlcyBhcm91bmQuIERlc3Ryb3kgdGhlbSBzbyB0aGV5CisgICAgLy8gY2FuIGJlIGdhcmJh
Z2UgY29sbGVjdGVkLgorICAgIHJlbGF0aW9uc2hpcHMuZm9yRWFjaChmdW5jdGlvbihyZWxhdGlv
bnNoaXApIHsKKyAgICAgIHJlbGF0aW9uc2hpcC5kZXN0cm95KCk7CisgICAgfSk7CisgIH0sCisK
KyAgLyoqCisgICAgUm9sbGluZyBiYWNrIGEgdHJhbnNhY3Rpb24gcmVzZXRzIHRoZSByZWNvcmRz
IHRoYXQgYmVsb25nIHRvCisgICAgdGhhdCB0cmFuc2FjdGlvbi4KKworICAgIFVwZGF0ZWQgcmVj
b3JkcyBoYXZlIHRoZWlyIHByb3BlcnRpZXMgcmVzZXQgdG8gdGhlIGxhc3Qga25vd24KKyAgICB2
YWx1ZSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gRGVsZXRlZCByZWNvcmRzIGFyZSByZXZl
cnRlZAorICAgIHRvIGEgY2xlYW4sIG5vbi1kZWxldGVkIHN0YXRlLiBOZXdseSBjcmVhdGVkIHJl
Y29yZHMgaW1tZWRpYXRlbHkKKyAgICBiZWNvbWUgZGVsZXRlZCwgYW5kIGFyZSBub3Qgc2VudCB0
byB0aGUgYWRhcHRlciB0byBiZSBwZXJzaXN0ZWQuCisKKyAgICBBZnRlciB0aGUgdHJhbnNhY3Rp
b24gaXMgcm9sbGVkIGJhY2ssIGFueSByZWNvcmRzIHRoYXQgYmVsb25nCisgICAgdG8gaXQgd2ls
bCByZXR1cm4gdG8gdGhlIHN0b3JlJ3MgZGVmYXVsdCB0cmFuc2FjdGlvbiwgYW5kIHRoZQorICAg
IGN1cnJlbnQgdHJhbnNhY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIGFnYWluLgorICAqLworICBy
b2xsYmFjazogZnVuY3Rpb24oKSB7CisgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgcmVj
b3JkcyBpbiBlYWNoIG9mIHRoZSBkaXJ0eSBzdGF0ZXMKKyAgICAvLyBhbmQgaW5pdGlhdGUgYSBy
b2xsYmFjayBvbiB0aGVtLiBBcyBhIHNpZGUgZWZmZWN0IG9mIHRlbGxpbmcKKyAgICAvLyB0aGUg
cmVjb3JkIHRvIHJvbGwgYmFjaywgaXQgc2hvdWxkIGFsc28gbW92ZSBpdHNlbGYgb3V0IG9mCisg
ICAgLy8gdGhlIGRpcnR5IGJ1Y2tldCBhbmQgaW50byB0aGUgY2xlYW4gYnVja2V0LgorICAgIFsn
Y3JlYXRlZCcsICd1cGRhdGVkJywgJ2RlbGV0ZWQnLCAnaW5mbGlnaHQnXS5mb3JFYWNoKGZ1bmN0
aW9uKGJ1Y2tldFR5cGUpIHsKKyAgICAgIHZhciByZWNvcmRzID0gdGhpcy5idWNrZXRGb3JUeXBl
KGJ1Y2tldFR5cGUpOworICAgICAgZm9yRWFjaChyZWNvcmRzLCBmdW5jdGlvbihyZWNvcmQpIHsK
KyAgICAgICAgcmVjb3JkLnNlbmQoJ3JvbGxiYWNrJyk7CisgICAgICB9KTsKKyAgICAgIHJlY29y
ZHMuY2xlYXIoKTsKKyAgICB9LCB0aGlzKTsKKworICAgIC8vIE5vdyB0aGF0IGFsbCByZWNvcmRz
IGluIHRoZSB0cmFuc2FjdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZQorICAgIC8vIGNsZWFuLCBt
aWdyYXRlIHRoZW0gYWxsIHRvIHRoZSBzdG9yZSdzIGRlZmF1bHQgdHJhbnNhY3Rpb24uCisgICAg
dGhpcy5yZW1vdmVDbGVhblJlY29yZHMoKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQor
CisgICAgUmVtb3ZlcyBhIHJlY29yZCBmcm9tIHRoaXMgdHJhbnNhY3Rpb24gYW5kIGJhY2sgdG8g
dGhlIHN0b3JlJ3MKKyAgICBkZWZhdWx0IHRyYW5zYWN0aW9uLgorCisgICAgTm90ZTogVGhpcyBt
ZXRob2QgaXMgcHJpdmF0ZSBmb3Igbm93LCBidXQgc2hvdWxkIHByb2JhYmx5IGJlIGV4cG9zZWQK
KyAgICBpbiB0aGUgZnV0dXJlIG9uY2Ugd2UgaGF2ZSBzdHJpY3RlciBlcnJvciBjaGVja2luZyAo
Zm9yIGV4YW1wbGUsIGluIHRoZQorICAgIGNhc2Ugb2YgdGhlIHJlY29yZCBiZWluZyBkaXJ0eSku
CisKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8KKyAgcmVtb3ZlOiBmdW5jdGlv
bihyZWNvcmQpIHsKKyAgICB2YXIgZGVmYXVsdFRyYW5zYWN0aW9uID0gZ2V0KHRoaXMsICdzdG9y
ZS5kZWZhdWx0VHJhbnNhY3Rpb24nKTsKKyAgICBkZWZhdWx0VHJhbnNhY3Rpb24uYWRvcHRSZWNv
cmQocmVjb3JkKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgUmVtb3ZlcyBh
bGwgb2YgdGhlIHJlY29yZHMgaW4gdGhlIHRyYW5zYWN0aW9uJ3MgY2xlYW4gYnVja2V0LgorICAq
LworICByZW1vdmVDbGVhblJlY29yZHM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBjbGVhbiA9IHRo
aXMuYnVja2V0Rm9yVHlwZSgnY2xlYW4nKTsKKyAgICBjbGVhbi5mb3JFYWNoKGZ1bmN0aW9uKHJl
Y29yZCkgeworICAgICAgdGhpcy5yZW1vdmUocmVjb3JkKTsKKyAgICB9LCB0aGlzKTsKKyAgICBj
bGVhbi5jbGVhcigpOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBSZXR1cm5z
IHRoZSBidWNrZXQgZm9yIHRoZSBnaXZlbiBidWNrZXQgdHlwZS4gRm9yIGV4YW1wbGUsIHlvdSBt
aWdodCBjYWxsCisgICAgYHRoaXMuYnVja2V0Rm9yVHlwZSgndXBkYXRlZCcpYCB0byBnZXQgdGhl
IGBFbWJlci5NYXBgIHRoYXQgY29udGFpbnMgYWxsCisgICAgb2YgdGhlIHJlY29yZHMgdGhhdCBo
YXZlIGNoYW5nZXMgcGVuZGluZy4KKworICAgIEBwYXJhbSB7U3RyaW5nfSBidWNrZXRUeXBlIHRo
ZSB0eXBlIG9mIGJ1Y2tldAorICAgIEByZXR1cm5zIEVtYmVyLk1hcAorICAqLworICBidWNrZXRG
b3JUeXBlOiBmdW5jdGlvbihidWNrZXRUeXBlKSB7CisgICAgdmFyIGJ1Y2tldHMgPSBnZXQodGhp
cywgJ2J1Y2tldHMnKTsKKworICAgIHJldHVybiBnZXQoYnVja2V0cywgYnVja2V0VHlwZSk7Cisg
IH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFRoaXMgbWV0aG9kIG1vdmVzIGEgcmVj
b3JkIGludG8gYSBkaWZmZXJlbnQgdHJhbnNhY3Rpb24gd2l0aG91dCB0aGUgbm9ybWFsCisgICAg
Y2hlY2tzIHRoYXQgZW5zdXJlIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRvaW5nIHNvbWV0aGluZyB3
ZWlyZCwgbGlrZSBtb3ZpbmcKKyAgICBhIGRpcnR5IHJlY29yZCBpbnRvIGEgbmV3IHRyYW5zYWN0
aW9uLgorCisgICAgSXQgaXMgZGVzaWduZWQgZm9yIGludGVybmFsIHVzZSwgc3VjaCBhcyB3aGVu
IHdlIGFyZSBtb3ZpbmcgYSBjbGVhbiByZWNvcmQKKyAgICBpbnRvIGEgbmV3IHRyYW5zYWN0aW9u
IHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KKworICAgIFRoaXMgbWV0aG9kIG11
c3Qgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIHJlY29yZCBpcyBjbGVhbi4KKworICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAorICAqLworICBhZG9wdFJlY29yZDogZnVuY3Rpb24ocmVjb3Jk
KSB7CisgICAgdmFyIG9sZFRyYW5zYWN0aW9uID0gZ2V0KHJlY29yZCwgJ3RyYW5zYWN0aW9uJyk7
CisKKyAgICBpZiAob2xkVHJhbnNhY3Rpb24pIHsKKyAgICAgIG9sZFRyYW5zYWN0aW9uLnJlbW92
ZUZyb21CdWNrZXQoJ2NsZWFuJywgcmVjb3JkKTsKKyAgICB9CisKKyAgICB0aGlzLmFkZFRvQnVj
a2V0KCdjbGVhbicsIHJlY29yZCk7CisgICAgc2V0KHJlY29yZCwgJ3RyYW5zYWN0aW9uJywgdGhp
cyk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIEFkZHMgYSByZWNvcmQgdG8g
dGhlIG5hbWVkIGJ1Y2tldC4KKworICAgIEBwYXJhbSB7U3RyaW5nfSBidWNrZXRUeXBlIG9uZSBv
ZiBgY2xlYW5gLCBgY3JlYXRlZGAsIGB1cGRhdGVkYCwgb3IgYGRlbGV0ZWRgCisgICovCisgIGFk
ZFRvQnVja2V0OiBmdW5jdGlvbihidWNrZXRUeXBlLCByZWNvcmQpIHsKKyAgICB0aGlzLmJ1Y2tl
dEZvclR5cGUoYnVja2V0VHlwZSkuYWRkKHJlY29yZCk7CisgIH0sCisKKyAgLyoqCisgICAgQHBy
aXZhdGUKKworICAgIFJlbW92ZXMgYSByZWNvcmQgZnJvbSB0aGUgbmFtZWQgYnVja2V0LgorCisg
ICAgQHBhcmFtIHtTdHJpbmd9IGJ1Y2tldFR5cGUgb25lIG9mIGBjbGVhbmAsIGBjcmVhdGVkYCwg
YHVwZGF0ZWRgLCBvciBgZGVsZXRlZGAKKyAgKi8KKyAgcmVtb3ZlRnJvbUJ1Y2tldDogZnVuY3Rp
b24oYnVja2V0VHlwZSwgcmVjb3JkKSB7CisgICAgdGhpcy5idWNrZXRGb3JUeXBlKGJ1Y2tldFR5
cGUpLnJlbW92ZShyZWNvcmQpOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBD
YWxsZWQgYnkgYSByZWNvcmQncyBzdGF0ZSBtYW5hZ2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIHJl
Y29yZCBoYXMgZW50ZXJlZAorICAgIGEgZGlydHkgc3RhdGUuIFRoZSByZWNvcmQgd2lsbCBiZSBt
b3ZlZCBmcm9tIHRoZSBgY2xlYW5gIGJ1Y2tldCBhbmQgaW50bworICAgIHRoZSBhcHByb3ByaWF0
ZSBkaXJ0eSBidWNrZXQuCisKKyAgICBAcGFyYW0ge1N0cmluZ30gYnVja2V0VHlwZSBvbmUgb2Yg
YGNyZWF0ZWRgLCBgdXBkYXRlZGAsIG9yIGBkZWxldGVkYAorICAqLworICByZWNvcmRCZWNhbWVE
aXJ0eTogZnVuY3Rpb24oYnVja2V0VHlwZSwgcmVjb3JkKSB7CisgICAgdGhpcy5yZW1vdmVGcm9t
QnVja2V0KCdjbGVhbicsIHJlY29yZCk7CisgICAgdGhpcy5hZGRUb0J1Y2tldChidWNrZXRUeXBl
LCByZWNvcmQpOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBDYWxsZWQgYnkg
YSByZWNvcmQncyBzdGF0ZSBtYW5hZ2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlY29yZCBoYXMg
ZW50ZXJlZAorICAgIGluZmxpZ2h0IHN0YXRlLiBUaGUgcmVjb3JkIHdpbGwgYmUgbW92ZWQgZnJv
bSBpdHMgY3VycmVudCBkaXJ0eSBidWNrZXQgYW5kIGludG8KKyAgICB0aGUgYGluZmxpZ2h0YCBi
dWNrZXQuCisKKyAgICBAcGFyYW0ge1N0cmluZ30gYnVja2V0VHlwZSBvbmUgb2YgYGNyZWF0ZWRg
LCBgdXBkYXRlZGAsIG9yIGBkZWxldGVkYAorICAqLworICByZWNvcmRCZWNhbWVJbkZsaWdodDog
ZnVuY3Rpb24oa2luZCwgcmVjb3JkKSB7CisgICAgdGhpcy5yZW1vdmVGcm9tQnVja2V0KGtpbmQs
IHJlY29yZCk7CisgICAgdGhpcy5hZGRUb0J1Y2tldCgnaW5mbGlnaHQnLCByZWNvcmQpOworICB9
LAorCisgIHJlY29yZElzTW92aW5nOiBmdW5jdGlvbihraW5kLCByZWNvcmQpIHsKKyAgICB0aGlz
LnJlbW92ZUZyb21CdWNrZXQoa2luZCwgcmVjb3JkKTsKKyAgICB0aGlzLmFkZFRvQnVja2V0KCdj
bGVhbicsIHJlY29yZCk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIENhbGxl
ZCBieSBhIHJlY29yZCdzIHN0YXRlIG1hbmFnZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVjb3Jk
IGhhcyBlbnRlcmVkCisgICAgYSBjbGVhbiBzdGF0ZS4gVGhlIHJlY29yZCB3aWxsIGJlIG1vdmVk
IGZyb20gaXRzIGN1cnJlbnQgZGlydHkgb3IgaW5mbGlnaHQgYnVja2V0IGFuZCBpbnRvCisgICAg
dGhlIGBjbGVhbmAgYnVja2V0LgorCisgICAgQHBhcmFtIHtTdHJpbmd9IGJ1Y2tldFR5cGUgb25l
IG9mIGBjcmVhdGVkYCwgYHVwZGF0ZWRgLCBvciBgZGVsZXRlZGAKKyAgKi8KKyAgcmVjb3JkQmVj
YW1lQ2xlYW46IGZ1bmN0aW9uKGtpbmQsIHJlY29yZCkgeworICAgIHRoaXMucmVtb3ZlRnJvbUJ1
Y2tldChraW5kLCByZWNvcmQpOworICAgIHRoaXMucmVtb3ZlKHJlY29yZCk7CisgIH0KK30pOwor
Cit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5n
LmNsYXNzaWZ5LCBnZXQgPSBFbWJlci5nZXQ7CisKKy8qKgorQHByaXZhdGUKKworICBUaGUgTWFw
cGFibGUgbWl4aW4gaXMgZGVzaWduZWQgZm9yIGNsYXNzZXMgdGhhdCB3b3VsZCBsaWtlIHRvCisg
IGJlaGF2ZSBhcyBhIG1hcCBmb3IgY29uZmlndXJhdGlvbiBwdXJwb3Nlcy4KKworICBGb3IgZXhh
bXBsZSwgdGhlIERTLkFkYXB0ZXIgY2xhc3MgY2FuIGJlaGF2ZSBsaWtlIGEgbWFwLCB3aXRoCisg
IG1vcmUgc2VtYW50aWMgQVBJLCB2aWEgdGhlIGBtYXBgIEFQSToKKworICAgIERTLkFkYXB0ZXIu
bWFwKCdBcHAuUGVyc29uJywgeyBmaXJzdE5hbWU6IHsga2V5TmFtZTogJ0ZJUlNUJyB9IH0pOwor
CisgIENsYXNzIGNvbmZpZ3VyYXRpb24gdmlhIGEgbWFwLWxpa2UgQVBJIGhhcyBhIGZldyBjb21t
b24gcmVxdWlyZW1lbnRzCisgIHRoYXQgZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBzdGFuZGFy
ZCBFbWJlci5NYXAgaW1wbGVtZW50YXRpb24uCisKKyAgRmlyc3QsIHZhbHVlcyBvZnRlbiBhcmUg
cHJvdmlkZWQgYXMgc3RyaW5ncyB0aGF0IHNob3VsZCBiZSBub3JtYWxpemVkCisgIGludG8gY2xh
c3NlcyB0aGUgZmlyc3QgdGltZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkLgor
CisgIFNlY29uZCwgdGhlIHZhbHVlcyBjb25maWd1cmVkIG9uIHBhcmVudCBjbGFzc2VzIHNob3Vs
ZCBhbHNvIGJlIHRha2VuCisgIGludG8gYWNjb3VudC4KKworICBGaW5hbGx5LCBzZXR0aW5nIHRo
ZSB2YWx1ZSBvZiBhIGtleSBzb21ldGltZXMgc2hvdWxkIG1lcmdlIHdpdGggdGhlCisgIHByZXZp
b3VzIHZhbHVlLCByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuCisKKyAgVGhpcyBtaXhpbiBwcm92
aWRlcyBhIGluc3RhbmNlIG1ldGhvZCwgYGNyZWF0ZUluc3RhbmNlTWFwRm9yYCwgdGhhdAorICB3
aWxsIHJlaWZ5IGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHNldCBvbiBhbiBpbnN0
YW5jZSdzCisgIGNvbnN0cnVjdG9yIGFuZCBwcm92aWRlIGl0IGZvciB0aGUgaW5zdGFuY2UgdG8g
dXNlLgorCisgIENsYXNzZXMgY2FuIGltcGxlbWVudCBjZXJ0YWluIGhvb2tzIHRoYXQgYWxsb3cg
dGhlbSB0byBjdXN0b21pemUKKyAgdGhlIHJlcXVpcmVtZW50cyBsaXN0ZWQgYWJvdmU6CisKKyAg
KiBgcmVzb2x2ZU1hcENvbmZsaWN0YCAtIGNhbGxlZCB3aGVuIGEgdmFsdWUgaXMgc2V0IGZvciBh
biBleGlzdGluZworICAgIHZhbHVlCisgICogYHRyYW5zZm9ybU1hcEtleWAgLSBhbGxvd3MgYSBr
ZXkgbmFtZSAoZm9yIGV4YW1wbGUsIGEgZ2xvYmFsIHBhdGgKKyAgICB0byBhIGNsYXNzKSB0byBi
ZSBub3JtYWxpemVkCisgICogYHRyYW5zZm9ybU1hcFZhbHVlYCAtIGFsbG93cyBhIHZhbHVlIChm
b3IgZXhhbXBsZSwgYSBjbGFzcyB0aGF0CisgICAgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCkgdG8g
YmUgbm9ybWFsaXplZAorCisgIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBtaXhpbiBzaG91
bGQgYWxzbyBpbXBsZW1lbnQgYSBjbGFzcworICBtZXRob2QgYnVpbHQgdXNpbmcgdGhlIGBnZW5l
cmF0ZU1hcEZ1bmN0aW9uRm9yYCBtZXRob2Q6CisKKyAgICBEUy5BZGFwdGVyLnJlb3BlbkNsYXNz
KHsKKyAgICAgIG1hcDogRFMuTWFwcGFibGUuZ2VuZXJhdGVNYXBGdW5jdGlvbkZvcignYXR0cmli
dXRlcycsIGZ1bmN0aW9uKGtleSwgbmV3VmFsdWUsIG1hcCkgeworICAgICAgICB2YXIgZXhpc3Rp
bmdWYWx1ZSA9IG1hcC5nZXQoa2V5KTsKKworICAgICAgICBmb3IgKHZhciBwcm9wIGluIG5ld1Zh
bHVlKSB7CisgICAgICAgICAgaWYgKCFuZXdWYWx1ZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBj
b250aW51ZTsgfQorICAgICAgICAgIGV4aXN0aW5nVmFsdWVbcHJvcF0gPSBuZXdWYWx1ZVtwcm9w
XTsKKyAgICAgICAgfQorICAgICAgfSkKKyAgICB9KTsKKworICAgVGhlIGZ1bmN0aW9uIHBhc3Nl
ZCB0byBgZ2VuZXJhdGVNYXBGdW5jdGlvbkZvcmAgaXMgaW52b2tlZCBldmVyeSB0aW1lIGEKKyAg
IG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbWFwLgorKiovCisKK3ZhciByZXNvbHZlTWFwQ29u
ZmxpY3QgPSBmdW5jdGlvbihvbGRWYWx1ZSwgbmV3VmFsdWUsIG1hcHBpbmdzS2V5KSB7CisgIHJl
dHVybiBvbGRWYWx1ZTsKK307CisKK3ZhciB0cmFuc2Zvcm1NYXBLZXkgPSBmdW5jdGlvbihrZXks
IHZhbHVlKSB7CisgIHJldHVybiBrZXk7Cit9OworCit2YXIgdHJhbnNmb3JtTWFwVmFsdWUgPSBm
dW5jdGlvbihrZXksIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZTsKK307CisKK0RTLl9NYXBwYWJs
ZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CisgIGNyZWF0ZUluc3RhbmNlTWFwRm9yOiBmdW5jdGlv
bihtYXBOYW1lKSB7CisgICAgdmFyIGluc3RhbmNlTWV0YSA9IEVtYmVyLm1ldGFQYXRoKHRoaXMs
IFsnRFMuTWFwcGFibGUnXSwgdHJ1ZSk7CisKKyAgICBpbnN0YW5jZU1ldGEudmFsdWVzID0gaW5z
dGFuY2VNZXRhLnZhbHVlcyB8fCB7fTsKKworICAgIGlmIChpbnN0YW5jZU1ldGEudmFsdWVzW21h
cE5hbWVdKSB7IHJldHVybiBpbnN0YW5jZU1ldGEudmFsdWVzW21hcE5hbWVdOyB9CisKKyAgICB2
YXIgaW5zdGFuY2VNYXAgPSBpbnN0YW5jZU1ldGEudmFsdWVzW21hcE5hbWVdID0gbmV3IEVtYmVy
Lk1hcCgpOworCisgICAgdmFyIGtsYXNzID0gdGhpcy5jb25zdHJ1Y3RvcjsKKworICAgIHdoaWxl
IChrbGFzcyAmJiBrbGFzcyAhPT0gRFMuU3RvcmUpIHsKKyAgICAgIHRoaXMuX2NvcHlNYXAobWFw
TmFtZSwga2xhc3MsIGluc3RhbmNlTWFwKTsKKyAgICAgIGtsYXNzID0ga2xhc3Muc3VwZXJjbGFz
czsKKyAgICB9CisKKyAgICBpbnN0YW5jZU1ldGEudmFsdWVzW21hcE5hbWVdID0gaW5zdGFuY2VN
YXA7CisgICAgcmV0dXJuIGluc3RhbmNlTWFwOworICB9LAorCisgIF9jb3B5TWFwOiBmdW5jdGlv
bihtYXBOYW1lLCBrbGFzcywgaW5zdGFuY2VNYXApIHsKKyAgICB2YXIgY2xhc3NNZXRhID0gRW1i
ZXIubWV0YVBhdGgoa2xhc3MsIFsnRFMuTWFwcGFibGUnXSwgdHJ1ZSk7CisKKyAgICB2YXIgY2xh
c3NNYXAgPSBjbGFzc01ldGFbbWFwTmFtZV07CisgICAgaWYgKGNsYXNzTWFwKSB7CisgICAgICBj
bGFzc01hcC5mb3JFYWNoKGVhY2hNYXAsIHRoaXMpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGVh
Y2hNYXAoa2V5LCB2YWx1ZSkgeworICAgICAgdmFyIHRyYW5zZm9ybWVkS2V5ID0gKGtsYXNzLnRy
YW5zZm9ybU1hcEtleSB8fCB0cmFuc2Zvcm1NYXBLZXkpKGtleSwgdmFsdWUpOworICAgICAgdmFy
IHRyYW5zZm9ybWVkVmFsdWUgPSAoa2xhc3MudHJhbnNmb3JtTWFwVmFsdWUgfHwgdHJhbnNmb3Jt
TWFwVmFsdWUpKGtleSwgdmFsdWUpOworCisgICAgICB2YXIgb2xkVmFsdWUgPSBpbnN0YW5jZU1h
cC5nZXQodHJhbnNmb3JtZWRLZXkpOworICAgICAgdmFyIG5ld1ZhbHVlID0gdHJhbnNmb3JtZWRW
YWx1ZTsKKworICAgICAgaWYgKG9sZFZhbHVlKSB7CisgICAgICAgIG5ld1ZhbHVlID0gKHRoaXMu
Y29uc3RydWN0b3IucmVzb2x2ZU1hcENvbmZsaWN0IHx8IHJlc29sdmVNYXBDb25mbGljdCkob2xk
VmFsdWUsIG5ld1ZhbHVlLCBtYXBOYW1lKTsKKyAgICAgIH0KKworICAgICAgaW5zdGFuY2VNYXAu
c2V0KHRyYW5zZm9ybWVkS2V5LCBuZXdWYWx1ZSk7CisgICAgfQorICB9CisKKworfSk7CisKK0RT
Ll9NYXBwYWJsZS5nZW5lcmF0ZU1hcEZ1bmN0aW9uRm9yID0gZnVuY3Rpb24obWFwTmFtZSwgdHJh
bnNmb3JtKSB7CisgIHJldHVybiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgdmFyIG1ldGEg
PSBFbWJlci5tZXRhUGF0aCh0aGlzLCBbJ0RTLk1hcHBhYmxlJ10sIHRydWUpOworICAgIHZhciBt
YXAgPSBtZXRhW21hcE5hbWVdIHx8IEVtYmVyLk1hcFdpdGhEZWZhdWx0LmNyZWF0ZSh7CisgICAg
ICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge307IH0KKyAgICB9KTsKKworICAg
IHRyYW5zZm9ybS5jYWxsKHRoaXMsIGtleSwgdmFsdWUsIG1hcCk7CisKKyAgICBtZXRhW21hcE5h
bWVdID0gbWFwOworICB9OworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qZ2xv
YmFscyBFbWJlciovCisvKmpzaGludCBlcW51bGw6dHJ1ZSovCit2YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsIG9uY2UgPSBFbWJlci5y
dW4ub25jZTsKK3ZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Cisv
LyBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgaW4gdGhlIGRhdGEgY2FjaGUgd2hlbiBjbGllbnRJZHMg
YXJlCisvLyBuZWVkZWQgYnV0IHRoZSB1bmRlcmx5aW5nIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbiBs
b2FkZWQgYnkKKy8vIHRoZSBzZXJ2ZXIuCit2YXIgVU5MT0FERUQgPSAndW5sb2FkZWQnOwordmFy
IExPQURJTkcgPSAnbG9hZGluZyc7Cit2YXIgTUFURVJJQUxJWkVEID0geyBtYXRlcmlhbGl6ZWQ6
IHRydWUgfTsKK3ZhciBDUkVBVEVEID0geyBjcmVhdGVkOiB0cnVlIH07CisKKy8vIEltcGxlbWVu
dG9ycyBOb3RlOgorLy8KKy8vICAgVGhlIHZhcmlhYmxlcyBpbiB0aGlzIGZpbGUgYXJlIGNvbnNp
c3RlbnRseSBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZworLy8gICBzY2hlbWU6Cisv
LworLy8gICAqICtpZCsgbWVhbnMgYW4gaWRlbnRpZmllciBtYW5hZ2VkIGJ5IGFuIGV4dGVybmFs
IHNvdXJjZSwgcHJvdmlkZWQgaW5zaWRlCisvLyAgICAgdGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhh
dCBzb3VyY2UuCisvLyAgICogK2NsaWVudElkKyBtZWFucyBhIHRyYW5zaWVudCBudW1lcmljYWwg
aWRlbnRpZmllciBnZW5lcmF0ZWQgYXQgcnVudGltZSBieQorLy8gICAgIHRoZSBkYXRhIHN0b3Jl
LiBJdCBpcyBpbXBvcnRhbnQgcHJpbWFyaWx5IGJlY2F1c2UgbmV3bHkgY3JlYXRlZCBvYmplY3Rz
IG1heQorLy8gICAgIG5vdCB5ZXQgaGF2ZSBhbiBleHRlcm5hbGx5IGdlbmVyYXRlZCBpZC4KKy8v
ICAgKiArdHlwZSsgbWVhbnMgYSBzdWJjbGFzcyBvZiBEUy5Nb2RlbC4KKworLy8gVXNlZCBieSB0
aGUgc3RvcmUgdG8gbm9ybWFsaXplIElEcyBlbnRlcmluZyB0aGUgc3RvcmUuICBEZXNwaXRlIHRo
ZSBmYWN0CisvLyB0aGF0IGRldmVsb3BlcnMgbWF5IHByb3ZpZGUgSURzIGFzIG51bWJlcnMgKGUu
Zy4sIGBzdG9yZS5maW5kKFBlcnNvbiwgMSlgKSwKKy8vIGl0IGlzIGltcG9ydGFudCB0aGF0IGlu
dGVybmFsbHkgd2UgdXNlIHN0cmluZ3MsIHNpbmNlIElEcyBtYXkgYmUgc2VyaWFsaXplZAorLy8g
YW5kIGxvc2UgdHlwZSBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBFbWJlcidzIHJvdXRlciBt
YXkgcHV0IGEgcmVjb3JkJ3MKKy8vIElEIGludG8gdGhlIFVSTCwgYW5kIGlmIHdlIGxhdGVyIHRy
eSB0byBkZXNlcmlhbGl6ZSB0aGF0IFVSTCBhbmQgZmluZCB0aGUKKy8vIGNvcnJlc3BvbmRpbmcg
cmVjb3JkLCB3ZSB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGEgc3RyaW5nIG9yIGEgbnVtYmVyLgor
dmFyIGNvZXJjZUlkID0gZnVuY3Rpb24oaWQpIHsKKyAgcmV0dXJuIGlkID09IG51bGwgPyBudWxs
IDogaWQrJyc7Cit9OworCit2YXIgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcDsKKwor
LyoqCisgIFRoZSBzdG9yZSBjb250YWlucyBhbGwgb2YgdGhlIGRhdGEgZm9yIHJlY29yZHMgbG9h
ZGVkIGZyb20gdGhlIHNlcnZlci4KKyAgSXQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgY3JlYXRp
bmcgaW5zdGFuY2VzIG9mIERTLk1vZGVsIHRoYXQgd3JhcHMKKyAgdGhlIGluZGl2aWR1YWwgZGF0
YSBmb3IgYSByZWNvcmQsIHNvIHRoYXQgdGhleSBjYW4gYmUgYm91bmQgdG8gaW4geW91cgorICBI
YW5kbGViYXJzIHRlbXBsYXRlcy4KKworICBDcmVhdGUgYSBuZXcgc3RvcmUgbGlrZSB0aGlzOgor
CisgICAgICAgTXlBcHAuc3RvcmUgPSBEUy5TdG9yZS5jcmVhdGUoKTsKKworICBZb3UgY2FuIHJl
dHJpZXZlIERTLk1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSBzdG9yZSBpbiBzZXZlcmFsIHdheXMu
IFRvIHJldHJpZXZlCisgIGEgcmVjb3JkIGZvciBhIHNwZWNpZmljIGlkLCB1c2UgdGhlIGBmaW5k
KClgIG1ldGhvZDoKKworICAgICAgIHZhciByZWNvcmQgPSBNeUFwcC5zdG9yZS5maW5kKE15QXBw
LkNvbnRhY3QsIDEyMyk7CisKKyAgIEJ5IGRlZmF1bHQsIHRoZSBzdG9yZSB3aWxsIHRhbGsgdG8g
eW91ciBiYWNrZW5kIHVzaW5nIGEgc3RhbmRhcmQgUkVTVCBtZWNoYW5pc20uCisgICBZb3UgY2Fu
IGN1c3RvbWl6ZSBob3cgdGhlIHN0b3JlIHRhbGtzIHRvIHlvdXIgYmFja2VuZCBieSBzcGVjaWZ5
aW5nIGEgY3VzdG9tIGFkYXB0ZXI6CisKKyAgICAgICBNeUFwcC5zdG9yZSA9IERTLlN0b3JlLmNy
ZWF0ZSh7CisgICAgICAgICBhZGFwdGVyOiAnTXlBcHAuQ3VzdG9tQWRhcHRlcicKKyAgICAgICB9
KTsKKworICAgIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCB3cml0aW5nIGEgY3VzdG9tIGFkYXB0
ZXIgYnkgcmVhZGluZyB0aGUgYERTLkFkYXB0ZXJgCisgICAgZG9jdW1lbnRhdGlvbi4KKyovCitE
Uy5TdG9yZSA9IEVtYmVyLk9iamVjdC5leHRlbmQoRFMuX01hcHBhYmxlLCB7CisKKyAgLyoqCisg
ICAgTWFueSBtZXRob2RzIGNhbiBiZSBpbnZva2VkIHdpdGhvdXQgc3BlY2lmeWluZyB3aGljaCBz
dG9yZSBzaG91bGQgYmUgdXNlZC4KKyAgICBJbiB0aG9zZSBjYXNlcywgdGhlIGZpcnN0IHN0b3Jl
IGNyZWF0ZWQgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0LiBJZgorICAgIGFuIGFwcGxpY2F0
aW9uIGhhcyBtdWx0aXBsZSBzdG9yZXMsIGl0IHNob3VsZCBzcGVjaWZ5IHdoaWNoIHN0b3JlIHRv
IHVzZQorICAgIHdoZW4gcGVyZm9ybWluZyBhY3Rpb25zLCBzdWNoIGFzIGZpbmRpbmcgcmVjb3Jk
cyBieSBpZC4KKworICAgIFRoZSBpbml0IG1ldGhvZCByZWdpc3RlcnMgdGhpcyBzdG9yZSBhcyB0
aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmllZC4KKyAgKi8KKyAgaW5pdDogZnVuY3Rpb24o
KSB7CisgICAgLy8gRW5mb3JjZSBBUEkgcmV2aXNpb25pbmcuIFNlZSBCUkVBS0lOR19DSEFOR0VT
Lm1kIGZvciBtb3JlLgorICAgIHZhciByZXZpc2lvbiA9IGdldCh0aGlzLCAncmV2aXNpb24nKTsK
KworICAgIGlmIChyZXZpc2lvbiAhPT0gRFMuQ1VSUkVOVF9BUElfUkVWSVNJT04gJiYgIUVtYmVy
LkVOVi5URVNUSU5HKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVycm9yOiBUaGUgRW1iZXIg
RGF0YSBsaWJyYXJ5IGhhcyBoYWQgYnJlYWtpbmcgQVBJIGNoYW5nZXMgc2luY2UgdGhlIGxhc3Qg
dGltZSB5b3UgdXBkYXRlZCB0aGUgbGlicmFyeS4gUGxlYXNlIHJldmlldyB0aGUgbGlzdCBvZiBi
cmVha2luZyBjaGFuZ2VzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2RhdGEvYmxvYi9t
YXN0ZXIvQlJFQUtJTkdfQ0hBTkdFUy5tZCwgdGhlbiB1cGRhdGUgeW91ciBzdG9yZSdzIGByZXZp
c2lvbmAgcHJvcGVydHkgdG8gIiArIERTLkNVUlJFTlRfQVBJX1JFVklTSU9OKTsKKyAgICB9CisK
KyAgICBpZiAoIWdldChEUywgJ2RlZmF1bHRTdG9yZScpIHx8IGdldCh0aGlzLCAnaXNEZWZhdWx0
U3RvcmUnKSkgeworICAgICAgc2V0KERTLCAnZGVmYXVsdFN0b3JlJywgdGhpcyk7CisgICAgfQor
CisgICAgLy8gaW50ZXJuYWwgYm9va2tlZXBpbmc7IG5vdCBvYnNlcnZhYmxlCisgICAgdGhpcy50
eXBlTWFwcyA9IHt9OworICAgIHRoaXMucmVjb3JkQ2FjaGUgPSBbXTsKKyAgICB0aGlzLmNsaWVu
dElkVG9JZCA9IHt9OworICAgIHRoaXMuY2xpZW50SWRUb1R5cGUgPSB7fTsKKyAgICB0aGlzLmNs
aWVudElkVG9EYXRhID0ge307CisgICAgdGhpcy5jbGllbnRJZFRvUHJlbWF0ZXJpYWxpemVkRGF0
YSA9IHt9OworICAgIHRoaXMucmVjb3JkQXJyYXlzQnlDbGllbnRJZCA9IHt9OworICAgIHRoaXMu
cmVsYXRpb25zaGlwQ2hhbmdlcyA9IHt9OworICAgIHRoaXMucmVjb3JkUmVmZXJlbmNlcyA9IHt9
OworCisgICAgLy8gSW50ZXJuYWxseSwgd2UgbWFpbnRhaW4gYSBtYXAgb2YgYWxsIHVubG9hZGVk
IElEcyByZXF1ZXN0ZWQgYnkKKyAgICAvLyBhIE1hbnlBcnJheS4gQXMgdGhlIGFkYXB0ZXIgbG9h
ZHMgZGF0YSBpbnRvIHRoZSBzdG9yZSwgdGhlCisgICAgLy8gc3RvcmUgbm90aWZpZXMgYW55IGlu
dGVyZXN0ZWQgTWFueUFycmF5cy4gV2hlbiB0aGUgTWFueUFycmF5J3MKKyAgICAvLyB0b3RhbCBu
dW1iZXIgb2YgbG9hZGluZyByZWNvcmRzIGRyb3BzIHRvIHplcm8sIGl0IGJlY29tZXMKKyAgICAv
LyBgaXNMb2FkZWRgIGFuZCBmaXJlcyBhIGBkaWRMb2FkYCBldmVudC4KKyAgICB0aGlzLmxvYWRp
bmdSZWNvcmRBcnJheXMgPSB7fTsKKworICAgIHNldCh0aGlzLCAnZGVmYXVsdFRyYW5zYWN0aW9u
JywgdGhpcy50cmFuc2FjdGlvbigpKTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIGEgbmV3
IHRyYW5zYWN0aW9uIHNjb3BlZCB0byB0aGlzIHN0b3JlLiBUaGlzIGRlbGVnYXRlcworICAgIHJl
c3BvbnNpYmlsaXR5IGZvciBpbnZva2luZyB0aGUgYWRhcHRlcidzIGNvbW1pdCBtZWNoYW5pc20g
dG8KKyAgICBhIHRyYW5zYWN0aW9uLgorCisgICAgVHJhbnNhY3Rpb24gYXJlIHJlc3BvbnNpYmxl
IGZvciB0cmFja2luZyBjaGFuZ2VzIHRvIHJlY29yZHMKKyAgICBhZGRlZCB0byB0aGVtLCBhbmQg
c3VwcG9ydGluZyBgY29tbWl0YCBhbmQgYHJvbGxiYWNrYAorICAgIGZ1bmN0aW9uYWxpdHkuIENv
bW1pdHRpbmcgYSB0cmFuc2FjdGlvbiBpbnZva2VzIHRoZSBzdG9yZSdzCisgICAgYWRhcHRlciwg
d2hpbGUgcm9sbGluZyBiYWNrIGEgdHJhbnNhY3Rpb24gcmV2ZXJzZXMgYWxsCisgICAgY2hhbmdl
cyBtYWRlIHRvIHJlY29yZHMgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLgorCisgICAgQSBzdG9y
ZSBoYXMgYW4gaW1wbGljaXQgKGRlZmF1bHQpIHRyYW5zYWN0aW9uLCB3aGljaCB0cmFja3MgY2hh
bmdlcworICAgIG1hZGUgdG8gcmVjb3JkcyBub3QgZXhwbGljaXRseSBhZGRlZCB0byBhIHRyYW5z
YWN0aW9uLgorCisgICAgQHNlZSB7RFMuVHJhbnNhY3Rpb259CisgICAgQHJldHVybnMgRFMuVHJh
bnNhY3Rpb24KKyAgKi8KKyAgdHJhbnNhY3Rpb246IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBE
Uy5UcmFuc2FjdGlvbi5jcmVhdGUoeyBzdG9yZTogdGhpcyB9KTsKKyAgfSwKKworICBlbnN1cmVT
YW1lVHJhbnNhY3Rpb246IGZ1bmN0aW9uKHJlY29yZHMpeworICAgIHZhciB0cmFuc2FjdGlvbnMg
PSBFbWJlci5BKCk7CisgICAgZm9yRWFjaCggcmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKXsKKyAg
ICAgIGlmIChyZWNvcmQpeyB0cmFuc2FjdGlvbnMucHVzaE9iamVjdChnZXQocmVjb3JkLCAndHJh
bnNhY3Rpb24nKSk7IH0KKyAgICB9KTsKKworICAgIHZhciB0cmFuc2FjdGlvbiA9IHRyYW5zYWN0
aW9ucy5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgdCkgeworICAgICAgaWYgKCFnZXQodCwgJ2lzRGVm
YXVsdCcpKSB7CisgICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7IHJldHVybiB0OyB9CisgICAg
ICAgIEVtYmVyLmFzc2VydCgiQWxsIHJlY29yZHMgaW4gYSBjaGFuZ2VkIHJlbGF0aW9uc2hpcCBt
dXN0IGJlIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiBZb3UgdHJpZWQgdG8gY2hhbmdlIHRoZSBy
ZWxhdGlvbnNoaXAgYmV0d2VlbiByZWNvcmRzIHdoZW4gb25lIGlzIGluICIgKyB0ICsgIiBhbmQg
dGhlIG90aGVyIGlzIGluICIgKyBwcmV2LCB0ID09PSBwcmV2KTsKKyAgICAgIH0KKworICAgICAg
cmV0dXJuIHByZXY7CisgICAgfSwgbnVsbCk7CisKKyAgICBpZiAodHJhbnNhY3Rpb24pIHsKKyAg
ICAgIGZvckVhY2goIHJlY29yZHMsIGZ1bmN0aW9uKHJlY29yZCl7CisgICAgICAgIGlmIChyZWNv
cmQpeyB0cmFuc2FjdGlvbi5hZGQocmVjb3JkKTsgfQorICAgICAgfSk7CisgICAgfSBlbHNlIHsK
KyAgICAgIHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25zLm9iamVjdEF0KDApOworICAgIH0KKyAg
ICByZXR1cm4gdHJhbnNhY3Rpb247CisKKyAgIH0sCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAg
ICBJbnN0cnVjdHMgdGhlIHN0b3JlIHRvIG1hdGVyaWFsaXplIHRoZSBkYXRhIGZvciBhIGdpdmVu
IHJlY29yZC4KKworICAgIFRvIG1hdGVyaWFsaXplIGEgcmVjb3JkLCB0aGUgc3RvcmUgZmlyc3Qg
cmV0cmlldmVzIHRoZSBvcGFxdWUgZGF0YSB0aGF0IHdhcworICAgIHBhc3NlZCB0byBlaXRoZXIg
YGxvYWQoKWAgb3IgYGxvYWRNYW55KClgLiBUaGVuLCB0aGUgZGF0YSBhbmQgdGhlIHJlY29yZAor
ICAgIGFyZSBwYXNzZWQgdG8gdGhlIGFkYXB0ZXIncyBgbWF0ZXJpYWxpemUoKWAgbWV0aG9kLCB3
aGljaCBhbGxvd3MgdGhlIGFkYXB0ZXIKKyAgICB0byB0cmFuc2xhdGUgYXJiaXRyYXJ5IGRhdGEg
c3RydWN0dXJlcyBmcm9tIHRoZSBhZGFwdGVyIGludG8gdGhlIG5vcm1hbGl6ZWQKKyAgICBmb3Jt
IHRoZSByZWNvcmQgZXhwZWN0cy4KKworICAgIFRoZSBhZGFwdGVyJ3MgYG1hdGVyaWFsaXplKClg
IG1ldGhvZCB3aWxsIGludm9rZSBgbWF0ZXJpYWxpemVBdHRyaWJ1dGUoKWAsCisgICAgYG1hdGVy
aWFsaXplSGFzTWFueSgpYCBhbmQgYG1hdGVyaWFsaXplQmVsb25nc1RvKClgIG9uIHRoZSByZWNv
cmQgdG8KKyAgICBwb3B1bGF0ZSBpdCB3aXRoIG5vcm1hbGl6ZWQgdmFsdWVzLgorCisgICAgQHBh
cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICovCisgIG1hdGVyaWFsaXplRGF0YTogZnVuY3Rpb24o
cmVjb3JkKSB7CisgICAgdmFyIGNsaWVudElkID0gZ2V0KHJlY29yZCwgJ2NsaWVudElkJyksCisg
ICAgICAgIGNpZFRvRGF0YSA9IHRoaXMuY2xpZW50SWRUb0RhdGEsCisgICAgICAgIGFkYXB0ZXIg
PSB0aGlzLmFkYXB0ZXJGb3JUeXBlKHJlY29yZC5jb25zdHJ1Y3RvciksCisgICAgICAgIGRhdGEg
PSBjaWRUb0RhdGFbY2xpZW50SWRdOworCisgICAgY2lkVG9EYXRhW2NsaWVudElkXSA9IE1BVEVS
SUFMSVpFRDsKKworICAgIHZhciBwcmVtYXRlcmlhbGl6ZWQgPSB0aGlzLmNsaWVudElkVG9QcmVt
YXRlcmlhbGl6ZWREYXRhW2NsaWVudElkXTsKKworICAgIC8vIEVuc3VyZXMgdGhlIHJlY29yZCdz
IGRhdGEgc3RydWN0dXJlcyBhcmUgc2V0dXAKKyAgICAvLyBiZWZvcmUgYmVpbmcgcG9wdWxhdGVk
IGJ5IHRoZSBhZGFwdGVyLgorICAgIHJlY29yZC5zZXR1cERhdGEoKTsKKworICAgIGlmIChkYXRh
ICE9PSBDUkVBVEVEKSB7CisgICAgICAvLyBJbnN0cnVjdHMgdGhlIGFkYXB0ZXIgdG8gZXh0cmFj
dCBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgICAgLy8gb3BhcXVlIGRhdGEgYW5kIG1hdGVyaWFs
aXplIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzIGFuZAorICAgICAgLy8gcmVsYXRpb25zaGlwcy4K
KyAgICAgIGFkYXB0ZXIubWF0ZXJpYWxpemUocmVjb3JkLCBkYXRhLCBwcmVtYXRlcmlhbGl6ZWQp
OworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgUmV0dXJucyB0cnVl
IGlmIHRoZXJlIGlzIGFscmVhZHkgYSByZWNvcmQgZm9yIHRoaXMgY2xpZW50SWQuCisKKyAgICBU
aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgY2xlYW51cCBpcyByZXF1aXJlZCwgc28g
dGhhdAorICAgICJjaGFuZ2VzIiB0byB1bm1hdGVyaWFsaXplZCByZWNvcmRzIGRvIG5vdCB0cmln
Z2VyIG1hc3MKKyAgICBtYXRlcmlhbGl6YXRpb24uCisKKyAgICBGb3IgZXhhbXBsZSwgaWYgYSBw
YXJlbnQgcmVjb3JkIGluIGEgcmVsYXRpb25zaGlwIHdpdGggYSBsYXJnZQorICAgIG51bWJlciBv
ZiBjaGlsZHJlbiBpcyBkZWxldGVkLCB3ZSB3YW50IHRvIGF2b2lkIG1hdGVyaWFsaXppbmcKKyAg
ICB0aG9zZSBjaGlsZHJlbi4KKworICAgIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2UKKyAgICBA
cmV0dXJuIHtCb29sZWFufQorICAqLworICByZWNvcmRJc01hdGVyaWFsaXplZDogZnVuY3Rpb24o
cmVmZXJlbmNlKSB7CisgICAgcmV0dXJuICEhdGhpcy5yZWNvcmRDYWNoZVtyZWZlcmVuY2UuY2xp
ZW50SWRdOworICB9LAorCisgIC8qKgorICAgIFRoZSBhZGFwdGVyIHRvIHVzZSB0byBjb21tdW5p
Y2F0ZSB0byBhIGJhY2tlbmQgc2VydmVyIG9yIG90aGVyIHBlcnNpc3RlbmNlIGxheWVyLgorCisg
ICAgVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIGluc3RhbmNlLCBhIGNsYXNzLCBvciBhIHBy
b3BlcnR5IHBhdGggdGhhdCBzcGVjaWZpZXMKKyAgICB3aGVyZSB0aGUgYWRhcHRlciBjYW4gYmUg
bG9jYXRlZC4KKworICAgIEBwcm9wZXJ0eSB7RFMuQWRhcHRlcnxTdHJpbmd9CisgICovCisgIGFk
YXB0ZXI6ICdEUy5SRVNUQWRhcHRlcicsCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFJl
dHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNvcmQgdXNpbmcgdGhlIGFkYXB0
ZXIncworICAgIHNlcmlhbGl6YXRpb24gc3RyYXRlZ3kuIFRoaXMgbWV0aG9kIGV4aXN0cyBwcmlt
YXJpbHkgdG8gZW5hYmxlCisgICAgYSByZWNvcmQsIHdoaWNoIGhhcyBhY2Nlc3MgdG8gaXRzIHN0
b3JlIChidXQgbm90IHRoZSBzdG9yZSdzCisgICAgYWRhcHRlcikgdG8gcHJvdmlkZSBhIGBzZXJp
YWxpemUoKWAgY29udmVuaWVuY2UuCisKKyAgICBUaGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOgor
CisgICAgKiBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQncyBJRCBzaG91bGQgYmUg
aW5jbHVkZWQgaW4KKyAgICAgIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uCisKKyAgICBAcGFyYW0g
e0RTLk1vZGVsfSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxpemUKKyAgICBAcGFyYW0ge09i
amVjdH0gb3B0aW9ucyBhbiBvcHRpb25zIGhhc2gKKyAgKi8KKyAgc2VyaWFsaXplOiBmdW5jdGlv
bihyZWNvcmQsIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gdGhpcy5hZGFwdGVyRm9yVHlwZShyZWNv
cmQuY29uc3RydWN0b3IpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOworICB9LAorCisgIC8q
KgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIHByb3BlcnR5IHJldHVybnMgdGhlIGFkYXB0ZXIs
IGFmdGVyIHJlc29sdmluZyBhIHBvc3NpYmxlCisgICAgcHJvcGVydHkgcGF0aC4KKworICAgIElm
IHRoZSBzdXBwbGllZCBgYWRhcHRlcmAgd2FzIGEgY2xhc3MsIG9yIGEgU3RyaW5nIHByb3BlcnR5
CisgICAgcGF0aCByZXNvbHZlZCB0byBhIGNsYXNzLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5zdGFu
dGlhdGUgdGhlCisgICAgY2xhc3MuCisKKyAgICBUaGlzIHByb3BlcnR5IGlzIGNhY2hlYWJsZSwg
c28gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgYSBzcGVjaWZpZWQKKyAgICBhZGFwdGVyIGNsYXNzIHNo
b3VsZCBiZSB1c2VkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHN0b3JlLgorCisgICAgQHJldHVy
bnMgRFMuQWRhcHRlcgorICAqLworICBfYWRhcHRlcjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o
KSB7CisgICAgdmFyIGFkYXB0ZXIgPSBnZXQodGhpcywgJ2FkYXB0ZXInKTsKKyAgICBpZiAodHlw
ZW9mIGFkYXB0ZXIgPT09ICdzdHJpbmcnKSB7CisgICAgICBhZGFwdGVyID0gZ2V0KHRoaXMsIGFk
YXB0ZXIsIGZhbHNlKSB8fCBnZXQoRW1iZXIubG9va3VwLCBhZGFwdGVyKTsKKyAgICB9CisKKyAg
ICBpZiAoRFMuQWRhcHRlci5kZXRlY3QoYWRhcHRlcikpIHsKKyAgICAgIGFkYXB0ZXIgPSBhZGFw
dGVyLmNyZWF0ZSgpOworICAgIH0KKworICAgIHJldHVybiBhZGFwdGVyOworICB9KS5wcm9wZXJ0
eSgnYWRhcHRlcicpLAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBBIG1vbm90b25pY2Fs
bHkgaW5jcmVhc2luZyBudW1iZXIgdG8gYmUgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeQorICAg
IGRhdGEgYW5kIHJlY29yZHMuCisKKyAgICBJdCBzdGFydHMgYXQgMSBzbyBvdGhlciBwYXJ0cyBv
ZiB0aGUgY29kZSBjYW4gdGVzdCBmb3IgdHJ1dGhpbmVzcworICAgIHdoZW4gcHJvdmlkZWQgYSBg
Y2xpZW50SWRgIGluc3RlYWQgb2YgaGF2aW5nIHRvIGV4cGxpY2l0bHkgdGVzdAorICAgIGZvciB1
bmRlZmluZWQuCisgICovCisgIGNsaWVudElkQ291bnRlcjogMSwKKworICAvLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgLy8gLiBDUkVBVEUgTkVXIFJFQ09SRCAuCisgIC8vIC4uLi4uLi4uLi4u
Li4uLi4uLi4uLgorCisgIC8qKgorICAgIENyZWF0ZSBhIG5ldyByZWNvcmQgaW4gdGhlIGN1cnJl
bnQgc3RvcmUuIFRoZSBwcm9wZXJ0aWVzIHBhc3NlZAorICAgIHRvIHRoaXMgbWV0aG9kIGFyZSBz
ZXQgb24gdGhlIG5ld2x5IGNyZWF0ZWQgcmVjb3JkLgorCisgICAgTm90ZTogVGhlIHRoaXJkIGB0
cmFuc2FjdGlvbmAgcHJvcGVydHkgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgIElmIHlv
dSB3YW50IHRvIGNyZWF0ZSBhIHJlY29yZCBpbnNpZGUgb2YgYSBnaXZlbiB0cmFuc2FjdGlvbiwK
KyAgICB1c2UgYHRyYW5zYWN0aW9uLmNyZWF0ZVJlY29yZCgpYCBpbnN0ZWFkIG9mIGBzdG9yZS5j
cmVhdGVSZWNvcmQoKWAuCisKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
CisgICAgQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8g
c2V0IG9uIHRoZQorICAgICAgbmV3bHkgY3JlYXRlZCByZWNvcmQuCisgICAgQHJldHVybnMgRFMu
TW9kZWwKKyAgKi8KKyAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbih0eXBlLCBwcm9wZXJ0aWVzLCB0
cmFuc2FjdGlvbikgeworICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9OworCisgICAg
Ly8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2RlbCBgdHlwZWAgYW5kIHB1dCBpdAor
ICAgIC8vIGludG8gdGhlIHNwZWNpZmllZCBgdHJhbnNhY3Rpb25gLiBJZiBubyB0cmFuc2FjdGlv
biBpcworICAgIC8vIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdHJhbnNhY3Rpb24gd2lsbCBiZSB1
c2VkLgorICAgIHZhciByZWNvcmQgPSB0eXBlLl9jcmVhdGUoeworICAgICAgc3RvcmU6IHRoaXMK
KyAgICB9KTsKKworICAgIHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24gfHwgZ2V0KHRoaXMsICdk
ZWZhdWx0VHJhbnNhY3Rpb24nKTsKKworICAgIC8vIGFkb3B0UmVjb3JkIGlzIGFuIGludGVybmFs
IEFQSSB0aGF0IGFsbG93cyByZWNvcmRzIHRvIG1vdmUKKyAgICAvLyBpbnRvIGEgdHJhbnNhY3Rp
b24gd2l0aG91dCBhc3NlcnRpb25zIGRlc2lnbmVkIGZvciBhcHAKKyAgICAvLyBjb2RlLiBJdCBp
cyB1c2VkIGhlcmUgdG8gZW5zdXJlIHRoYXQgcmVnYXJkbGVzcyBvZiBuZXcKKyAgICAvLyByZXN0
cmljdGlvbnMgb24gdGhlIHVzZSBvZiB0aGUgcHVibGljIGB0cmFuc2FjdGlvbi5hZGQoKWAKKyAg
ICAvLyBBUEksIHdlIHdpbGwgYWx3YXlzIGJlIGFibGUgdG8gaW5zZXJ0IG5ldyByZWNvcmRzIGlu
dG8KKyAgICAvLyB0aGVpciB0cmFuc2FjdGlvbi4KKyAgICB0cmFuc2FjdGlvbi5hZG9wdFJlY29y
ZChyZWNvcmQpOworCisgICAgLy8gYGlkYCBpcyBhIHNwZWNpYWwgcHJvcGVydHkgdGhhdCBtYXkg
bm90IGJlIGEgYERTLmF0dHJgCisgICAgdmFyIGlkID0gcHJvcGVydGllcy5pZDsKKworICAgIC8v
IElmIHRoZSBwYXNzZWQgcHJvcGVydGllcyBkbyBub3QgaW5jbHVkZSBhIHByaW1hcnkga2V5LAor
ICAgIC8vIGdpdmUgdGhlIGFkYXB0ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gZ2VuZXJhdGUgb25lLiBU
eXBpY2FsbHksCisgICAgLy8gY2xpZW50LXNpZGUgSUQgZ2VuZXJhdG9ycyB3aWxsIHVzZSBzb21l
dGhpbmcgbGlrZSB1dWlkLmpzCisgICAgLy8gdG8gYXZvaWQgY29uZmxpY3RzLgorICAgIHZhciBh
ZGFwdGVyOworICAgIGlmIChFbWJlci5pc05vbmUoaWQpKSB7CisgICAgICBhZGFwdGVyID0gdGhp
cy5hZGFwdGVyRm9yVHlwZSh0eXBlKTsKKyAgICAgIGlmIChhZGFwdGVyICYmIGFkYXB0ZXIuZ2Vu
ZXJhdGVJZEZvclJlY29yZCkgeworICAgICAgICBpZCA9IGNvZXJjZUlkKGFkYXB0ZXIuZ2VuZXJh
dGVJZEZvclJlY29yZCh0aGlzLCByZWNvcmQpKTsKKyAgICAgICAgcHJvcGVydGllcy5pZCA9IGlk
OworICAgICAgfQorICAgIH0KKworICAgIGlkID0gY29lcmNlSWQoaWQpOworCisgICAgLy8gQ3Jl
YXRlIGEgbmV3IGBjbGllbnRJZGAgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZQorICAgIC8vIHNw
ZWNpZmllZCAob3IgZ2VuZXJhdGVkKSBgaWRgLiBTaW5jZSB3ZSBkb24ndCBoYXZlCisgICAgLy8g
YW55IGRhdGEgZm9yIHRoZSBzZXJ2ZXIgeWV0IChieSBkZWZpbml0aW9uKSwgc3RvcmUKKyAgICAv
LyB0aGUgc2VudGluZWwgdmFsdWUgQ1JFQVRFRCBhcyB0aGUgZGF0YSBmb3IgdGhpcworICAgIC8v
IGNsaWVudElkLiBJZiB3ZSBzZWUgdGhpcyB2YWx1ZSBsYXRlciwgd2Ugd2lsbCBza2lwCisgICAg
Ly8gbWF0ZXJpYWxpemF0aW9uLgorICAgIHZhciBjbGllbnRJZCA9IHRoaXMucHVzaERhdGEoQ1JF
QVRFRCwgaWQsIHR5cGUpOworCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudElkLCBh
dHRhY2ggaXQgdG8gdGhlIHJlY29yZCB3ZQorICAgIC8vIGp1c3QgY3JlYXRlZC4KKyAgICBzZXQo
cmVjb3JkLCAnY2xpZW50SWQnLCBjbGllbnRJZCk7CisKKyAgICAvLyBNb3ZlIHRoZSByZWNvcmQg
b3V0IG9mIGl0cyBpbml0aWFsIGBlbXB0eWAgc3RhdGUgaW50bworICAgIC8vIHRoZSBgbG9hZGVk
YCBzdGF0ZS4KKyAgICByZWNvcmQubG9hZGVkRGF0YSgpOworCisgICAgLy8gTWFrZSBzdXJlIHRo
ZSBkYXRhIGlzIHNldCB1cCBzbyB0aGUgcmVjb3JkIGRvZXNuJ3QKKyAgICAvLyB0cnkgdG8gbWF0
ZXJpYWxpemUgaXRzIG5vbmV4aXN0ZW50IGRhdGEuCisgICAgcmVjb3JkLnNldHVwRGF0YSgpOwor
CisgICAgLy8gU3RvcmUgdGhlIHJlY29yZCB3ZSBqdXN0IGNyZWF0ZWQgaW4gdGhlIHJlY29yZCBj
YWNoZSBmb3IKKyAgICAvLyB0aGlzIGNsaWVudElkLgorICAgIHRoaXMucmVjb3JkQ2FjaGVbY2xp
ZW50SWRdID0gcmVjb3JkOworCisgICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBv
biB0aGUgcmVjb3JkLgorICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisg
ICAgLy8gUmVzb2x2ZSByZWNvcmQgcHJvbWlzZQorICAgIEVtYmVyLnJ1bihyZWNvcmQsICdyZXNv
bHZlJywgcmVjb3JkKTsKKworICAgIHJldHVybiByZWNvcmQ7CisgIH0sCisKKyAgLy8gLi4uLi4u
Li4uLi4uLi4uLi4KKyAgLy8gLiBERUxFVEUgUkVDT1JEIC4KKyAgLy8gLi4uLi4uLi4uLi4uLi4u
Li4KKworICAvKioKKyAgICBGb3Igc3ltbWV0cnksIGEgcmVjb3JkIGNhbiBiZSBkZWxldGVkIHZp
YSB0aGUgc3RvcmUuCisKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8KKyAgZGVs
ZXRlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7
CisgIH0sCisKKyAgLyoqCisgICAgRm9yIHN5bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgdW5sb2Fk
ZWQgdmlhIHRoZSBzdG9yZS4KKworICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAqLwor
ICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHJlY29yZC51bmxvYWRSZWNv
cmQoKTsKKyAgfSwKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uCisgIC8vIC4gRklORCBSRUNPUkRT
IC4KKyAgLy8gLi4uLi4uLi4uLi4uLi4uLgorCisgIC8qKgorICAgIFRoaXMgaXMgdGhlIG1haW4g
ZW50cnkgcG9pbnQgaW50byBmaW5kaW5nIHJlY29yZHMuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8K
KyAgICB0aGlzIG1ldGhvZCBpcyBhbHdheXMgYSBzdWJjbGFzcyBvZiBgRFMuTW9kZWxgLgorCisg
ICAgWW91IGNhbiB1c2UgdGhlIGBmaW5kYCBtZXRob2Qgb24gYSBzdWJjbGFzcyBvZiBgRFMuTW9k
ZWxgIGRpcmVjdGx5IGlmIHlvdXIKKyAgICBhcHBsaWNhdGlvbiBvbmx5IGhhcyBvbmUgc3RvcmUu
IEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mCisgICAgYHN0b3JlLmZpbmQoQXBwLlBlcnNvbiwgMSlg
LCB5b3UgY291bGQgc2F5IGBBcHAuUGVyc29uLmZpbmQoMSlgLgorCisgICAgLS0tCisKKyAgICBU
byBmaW5kIGEgcmVjb3JkIGJ5IElELCBwYXNzIHRoZSBgaWRgIGFzIHRoZSBzZWNvbmQgcGFyYW1l
dGVyOgorCisgICAgICAgIHN0b3JlLmZpbmQoQXBwLlBlcnNvbiwgMSk7CisgICAgICAgIEFwcC5Q
ZXJzb24uZmluZCgxKTsKKworICAgIElmIHRoZSByZWNvcmQgd2l0aCB0aGF0IGBpZGAgaGFkIG5v
dCBwcmV2aW91c2x5IGJlZW4gbG9hZGVkLCB0aGUgc3RvcmUgd2lsbAorICAgIHJldHVybiBhbiBl
bXB0eSByZWNvcmQgaW1tZWRpYXRlbHkgYW5kIGFzayB0aGUgYWRhcHRlciB0byBmaW5kIHRoZSBk
YXRhIGJ5CisgICAgY2FsbGluZyB0aGUgYWRhcHRlcidzIGBmaW5kYCBtZXRob2QuCisKKyAgICBU
aGUgYGZpbmRgIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IGZvciBh
IGdpdmVuIHR5cGUgYW5kCisgICAgYGlkYC4gVG8gY2hlY2sgd2hldGhlciB0aGUgYWRhcHRlciBo
YXMgcG9wdWxhdGVkIGEgcmVjb3JkLCB5b3UgY2FuIGNoZWNrCisgICAgaXRzIGBpc0xvYWRlZGAg
cHJvcGVydHkuCisKKyAgICAtLS0KKworICAgIFRvIGZpbmQgYWxsIHJlY29yZHMgZm9yIGEgdHlw
ZSwgY2FsbCBgZmluZGAgd2l0aCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnM6CisKKyAgICAgICAg
c3RvcmUuZmluZChBcHAuUGVyc29uKTsKKyAgICAgICAgQXBwLlBlcnNvbi5maW5kKCk7CisKKyAg
ICBUaGlzIHdpbGwgcmV0dXJuIGEgYFJlY29yZEFycmF5YCByZXByZXNlbnRpbmcgYWxsIGtub3du
IHJlY29yZHMgZm9yIHRoZQorICAgIGdpdmVuIHR5cGUgYW5kIGtpY2sgb2ZmIGEgcmVxdWVzdCB0
byB0aGUgYWRhcHRlcidzIGBmaW5kQWxsYCBtZXRob2QgdG8gbG9hZAorICAgIGFueSBhZGRpdGlv
bmFsIHJlY29yZHMgZm9yIHRoZSB0eXBlLgorCisgICAgVGhlIGBSZWNvcmRBcnJheWAgcmV0dXJu
ZWQgYnkgYGZpbmQoKWAgaXMgbGl2ZS4gSWYgYW55IG1vcmUgcmVjb3JkcyBmb3IgdGhlCisgICAg
dHlwZSBhcmUgYWRkZWQgYXQgYSBsYXRlciB0aW1lIHRocm91Z2ggYW55IG1lY2hhbmlzbSwgaXQg
d2lsbCBhdXRvbWF0aWNhbGx5CisgICAgdXBkYXRlIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4KKwor
ICAgIC0tLQorCisgICAgVG8gZmluZCBhIHJlY29yZCBieSBhIHF1ZXJ5LCBjYWxsIGBmaW5kYCB3
aXRoIGEgaGFzaCBhcyB0aGUgc2Vjb25kCisgICAgcGFyYW1ldGVyOgorCisgICAgICAgIHN0b3Jl
LmZpbmQoQXBwLlBlcnNvbiwgeyBwYWdlOiAxIH0pOworICAgICAgICBBcHAuUGVyc29uLmZpbmQo
eyBwYWdlOiAxIH0pOworCisgICAgVGhpcyB3aWxsIHJldHVybiBhIGBSZWNvcmRBcnJheWAgaW1t
ZWRpYXRlbHksIGJ1dCBpdCB3aWxsIGFsd2F5cyBiZSBhbgorICAgIGVtcHR5IGBSZWNvcmRBcnJh
eWAgYXQgZmlyc3QuIEl0IHdpbGwgY2FsbCB0aGUgYWRhcHRlcidzIGBmaW5kUXVlcnlgCisgICAg
bWV0aG9kLCB3aGljaCB3aWxsIHBvcHVsYXRlIHRoZSBgUmVjb3JkQXJyYXlgIG9uY2UgdGhlIHNl
cnZlciBoYXMgcmV0dXJuZWQKKyAgICByZXN1bHRzLgorCisgICAgWW91IGNhbiBjaGVjayB3aGV0
aGVyIGEgcXVlcnkgcmVzdWx0cyBgUmVjb3JkQXJyYXlgIGhhcyBsb2FkZWQgYnkgY2hlY2tpbmcK
KyAgICBpdHMgYGlzTG9hZGVkYCBwcm9wZXJ0eS4KKyAgKi8KKyAgZmluZDogZnVuY3Rpb24odHlw
ZSwgaWQpIHsKKyAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHRoaXMu
ZmluZEFsbCh0eXBlKTsKKyAgICB9CisKKyAgICAvLyBXZSBhcmUgcGFzc2VkIGEgcXVlcnkgaW5z
dGVhZCBvZiBhbiBpZC4KKyAgICBpZiAoRW1iZXIudHlwZU9mKGlkKSA9PT0gJ29iamVjdCcpIHsK
KyAgICAgIHJldHVybiB0aGlzLmZpbmRRdWVyeSh0eXBlLCBpZCk7CisgICAgfQorCisgICAgcmV0
dXJuIHRoaXMuZmluZEJ5SWQodHlwZSwgY29lcmNlSWQoaWQpKTsKKyAgfSwKKworICAvKioKKyAg
ICBAcHJpdmF0ZQorCisgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIHJlY29yZCBmb3IgYSBnaXZl
biB0eXBlIGFuZCBpZCBjb21iaW5hdGlvbi4KKworICAgIElmIHRoZSBzdG9yZSBoYXMgbmV2ZXIg
c2VlbiB0aGlzIGNvbWJpbmF0aW9uIG9mIHR5cGUgYW5kIGlkIGJlZm9yZSwgaXQKKyAgICBjcmVh
dGVzIGEgbmV3IGBjbGllbnRJZGAgd2l0aCB0aGUgTE9BRElORyBzZW50aW5lbCBhbmQgYXNrcyB0
aGUgYWRhcHRlciB0bworICAgIGxvYWQgdGhlIGRhdGEuCisKKyAgICBJZiB0aGUgc3RvcmUgaGFz
IHNlZW4gdGhlIGNvbWJpbmF0aW9uLCB0aGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8KKyAgICBgZ2V0
QnlSZWZlcmVuY2VgLgorICAqLworICBmaW5kQnlJZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKKyAg
ICB2YXIgY2xpZW50SWQgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSkuaWRUb0NpZFtpZF07CisKKyAg
ICBpZiAoY2xpZW50SWQpIHsKKyAgICAgIHJldHVybiB0aGlzLmZpbmRCeUNsaWVudElkKHR5cGUs
IGNsaWVudElkKTsKKyAgICB9CisKKyAgICBjbGllbnRJZCA9IHRoaXMucHVzaERhdGEoTE9BRElO
RywgaWQsIHR5cGUpOworCisgICAgLy8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2Rl
bCB0eXBlIGluIHRoZQorICAgIC8vICdpc0xvYWRpbmcnIHN0YXRlCisgICAgdmFyIHJlY29yZCA9
IHRoaXMubWF0ZXJpYWxpemVSZWNvcmQodHlwZSwgY2xpZW50SWQsIGlkKTsKKworICAgIC8vIGxl
dCB0aGUgYWRhcHRlciBzZXQgdGhlIGRhdGEsIHBvc3NpYmx5IGFzeW5jCisgICAgdmFyIGFkYXB0
ZXIgPSB0aGlzLmFkYXB0ZXJGb3JUeXBlKHR5cGUpOworICAgIGlmIChhZGFwdGVyICYmIGFkYXB0
ZXIuZmluZCkgeyBhZGFwdGVyLmZpbmQodGhpcywgdHlwZSwgaWQpOyB9CisgICAgZWxzZSB7IHRo
cm93ICJBZGFwdGVyIGlzIGVpdGhlciBudWxsIG9yIGRvZXMgbm90IGltcGxlbWVudCBgZmluZGAg
bWV0aG9kIjsgfQorCisgICAgcmV0dXJuIHJlY29yZDsKKyAgfSwKKworICByZWxvYWRSZWNvcmQ6
IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHZhciB0eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9yLAor
ICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yVHlwZSh0eXBlKSwKKyAgICAgICAgaWQg
PSBnZXQocmVjb3JkLCAnaWQnKTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCB1cGRh
dGUgYSByZWNvcmQgd2l0aG91dCBhbiBJRCIsIGlkKTsKKyAgICBFbWJlci5hc3NlcnQoIllvdSB0
cmllZCB0byB1cGRhdGUgYSByZWNvcmQgYnV0IHlvdSBoYXZlIG5vIGFkYXB0ZXIgKGZvciAiICsg
dHlwZSArICIpIiwgYWRhcHRlcik7CisgICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gdXBk
YXRlIGEgcmVjb3JkIGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5kYCIs
IGFkYXB0ZXIuZmluZCk7CisKKyAgICBhZGFwdGVyLmZpbmQodGhpcywgdHlwZSwgaWQpOworICB9
LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVj
b3JkIGZvciBhIGdpdmVuIGNsaWVudElkLgorCisgICAgSWYgdGhlcmUgaXMgbm8gcmVjb3JkIG9i
amVjdCB5ZXQgZm9yIHRoZSBjbGllbnRJZCwgdGhpcyBtZXRob2QgbWF0ZXJpYWxpemVzCisgICAg
YSBuZXcgcmVjb3JkIG9iamVjdC4gVGhpcyBhbGxvd3MgYWRhcHRlcnMgdG8gZWFnZXJseSBsb2Fk
IGxhcmdlIGFtb3VudHMgb2YKKyAgICBkYXRhIGludG8gdGhlIHN0b3JlLCBhbmQgYXZvaWQgaW5j
dXJyaW5nIHRoZSBjb3N0IHRvIGNyZWF0ZSB0aGUgb2JqZWN0cworICAgIHVudGlsIHRoZXkgYXJl
IHJlcXVlc3RlZC4KKworICAgIFNldmVyYWwgcGFydHMgb2YgRW1iZXIgRGF0YSBjYWxsIHRoaXMg
bWV0aG9kOgorCisgICAgKiBmaW5kQnlJZCwgaWYgYSBjbGllbnRJZCBhbHJlYWR5IGV4aXN0cyBm
b3IgYSBnaXZlbiB0eXBlIGFuZAorICAgICAgaWQgY29tYmluYXRpb24KKyAgICAqIE9uZVRvTWFu
eUNoYW5nZSwgd2hpY2ggaXMgYmFja2VkIGJ5IGNsaWVudElkcywgd2hlbiBnZXRDaGlsZCwKKyAg
ICAgIGdldE9sZFBhcmVudCBvciBnZXROZXdQYXJlbnQgYXJlIGNhbGxlZAorICAgICogUmVjb3Jk
QXJyYXksIHdoaWNoIGlzIGJhY2tlZCBieSBjbGllbnRJZHMsIHdoZW4gYW4gb2JqZWN0IGF0Cisg
ICAgICBhIHBhcnRpY3VsYXIgaW5kZXggaXMgbG9va2VkIHVwCisKKyAgICBJbiBzaG9ydCwgaXQn
cyBhIGNvbnZlbmllbnQgd2F5IHRvIGdldCBhIHJlY29yZCBmb3IgYSBrbm93bgorICAgIGNsaWVu
dElkLCBtYXRlcmlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeS4KKworICAgIEBwYXJhbSB7Q2xhc3N9
IHR5cGUKKyAgICBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGNsaWVudElkCisgICovCisgIGZpbmRC
eUNsaWVudElkOiBmdW5jdGlvbih0eXBlLCBjbGllbnRJZCkgeworICAgIHZhciBjaWRUb0RhdGEs
IHJlY29yZCwgaWQ7CisKKyAgICByZWNvcmQgPSB0aGlzLnJlY29yZENhY2hlW2NsaWVudElkXTsK
KworICAgIGlmICghcmVjb3JkKSB7CisgICAgICAvLyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2Yg
dGhlIG1vZGVsIHR5cGUgaW4gdGhlCisgICAgICAvLyAnaXNMb2FkaW5nJyBzdGF0ZQorICAgICAg
aWQgPSB0aGlzLmNsaWVudElkVG9JZFtjbGllbnRJZF07CisgICAgICByZWNvcmQgPSB0aGlzLm1h
dGVyaWFsaXplUmVjb3JkKHR5cGUsIGNsaWVudElkLCBpZCk7CisKKyAgICAgIGNpZFRvRGF0YSA9
IHRoaXMuY2xpZW50SWRUb0RhdGE7CisKKyAgICAgIGlmICh0eXBlb2YgY2lkVG9EYXRhW2NsaWVu
dElkXSA9PT0gJ29iamVjdCcpIHsKKyAgICAgICAgcmVjb3JkLmxvYWRlZERhdGEoKTsKKyAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVjb3JkOworICB9LAorCisgIC8qKgorICAgIEBwcml2
YXRlCisKKyAgICBHaXZlbiBhIHR5cGUgYW5kIGFycmF5IG9mIGBjbGllbnRJZGBzLCBkZXRlcm1p
bmVzIHdoaWNoIG9mIHRob3NlCisgICAgYGNsaWVudElkYHMgaGFzIG5vdCB5ZXQgYmVlbiBsb2Fk
ZWQuCisKKyAgICBJbiBwcmVwYXJhdGlvbiBmb3IgbG9hZGluZywgdGhpcyBtZXRob2QgYWxzbyBt
YXJrcyBhbnkgdW5sb2FkZWQKKyAgICBgY2xpZW50SWRgcyBhcyBsb2FkaW5nLgorICAqLworICBu
ZWVkZWRSZWZlcmVuY2VzOiBmdW5jdGlvbih0eXBlLCByZWZlcmVuY2VzKSB7CisgICAgdmFyIG5l
ZWRlZFJlZmVyZW5jZXMgPSBbXSwKKyAgICAgICAgY2lkVG9EYXRhID0gdGhpcy5jbGllbnRJZFRv
RGF0YSwKKyAgICAgICAgcmVmZXJlbmNlOworCisgICAgZm9yICh2YXIgaT0wLCBsPXJlZmVyZW5j
ZXMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsK
KworICAgICAgaWYgKGNpZFRvRGF0YVtyZWZlcmVuY2UuY2xpZW50SWRdID09PSBVTkxPQURFRCkg
eworICAgICAgICBuZWVkZWRSZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTsKKyAgICAgICAgY2lk
VG9EYXRhW3JlZmVyZW5jZS5jbGllbnRJZF0gPSBMT0FESU5HOworICAgICAgfQorICAgIH0KKwor
ICAgIHJldHVybiBuZWVkZWRSZWZlcmVuY2VzOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRl
CisKKyAgICBUaGlzIG1ldGhvZCBpcyB0aGUgZW50cnkgcG9pbnQgdGhhdCByZWxhdGlvbnNoaXBz
IHVzZSB0byB1cGRhdGUKKyAgICB0aGVtc2VsdmVzIHdoZW4gdGhlaXIgdW5kZXJseWluZyBkYXRh
IGNoYW5nZXMuCisKKyAgICBGaXJzdCwgaXQgZGV0ZXJtaW5lcyB3aGljaCBvZiBpdHMgYGNsaWVu
dElkYHMgYXJlIHN0aWxsIHVubG9hZGVkLAorICAgIHRoZW4gY29udmVydHMgdGhlIG5lZWRlZCBg
Y2xpZW50SWRgcyB0byBJRHMgYW5kIGludm9rZXMgYGZpbmRNYW55YAorICAgIG9uIHRoZSBhZGFw
dGVyLgorICAqLworICBmZXRjaFVubG9hZGVkUmVmZXJlbmNlczogZnVuY3Rpb24odHlwZSwgcmVm
ZXJlbmNlcywgb3duZXIpIHsKKyAgICB2YXIgbmVlZGVkUmVmZXJlbmNlcyA9IHRoaXMubmVlZGVk
UmVmZXJlbmNlcyh0eXBlLCByZWZlcmVuY2VzKTsKKyAgICB0aGlzLmZldGNoTWFueSh0eXBlLCBu
ZWVkZWRSZWZlcmVuY2VzLCBvd25lcik7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKwor
ICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgdHlwZSBhbmQgbGlzdCBvZiBgY2xpZW50SWRgcywgY29u
dmVydHMgdGhlCisgICAgYGNsaWVudElkYHMgaW50byBJRHMsIGFuZCB0aGVuIGludm9rZXMgdGhl
IGFkYXB0ZXIncyBgZmluZE1hbnlgCisgICAgbWV0aG9kLgorCisgICAgSXQgaXMgdXNlZCBib3Ro
IGJ5IGEgYnJhbmQgbmV3IHJlbGF0aW9uc2hpcCAodmlhIHRoZSBgZmluZE1hbnlgCisgICAgbWV0
aG9kKSBvciB3aGVuIHRoZSBkYXRhIHVuZGVybHlpbmcgYW4gZXhpc3RpbmcgcmVsYXRpb25zaGlw
CisgICAgY2hhbmdlcyAodmlhIHRoZSBgZmV0Y2hVbmxvYWRlZFJlZmVyZW5jZXNgIG1ldGhvZCku
CisgICovCisgIGZldGNoTWFueTogZnVuY3Rpb24odHlwZSwgcmVmZXJlbmNlcywgb3duZXIpIHsK
KyAgICBpZiAoIXJlZmVyZW5jZXMubGVuZ3RoKSB7IHJldHVybjsgfQorCisgICAgdmFyIGlkcyA9
IG1hcChyZWZlcmVuY2VzLCBmdW5jdGlvbihyZWZlcmVuY2UpIHsKKyAgICAgIHJldHVybiByZWZl
cmVuY2UuaWQ7CisgICAgfSk7CisKKyAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvclR5
cGUodHlwZSk7CisgICAgaWYgKGFkYXB0ZXIgJiYgYWRhcHRlci5maW5kTWFueSkgeyBhZGFwdGVy
LmZpbmRNYW55KHRoaXMsIHR5cGUsIGlkcywgb3duZXIpOyB9CisgICAgZWxzZSB7IHRocm93ICJB
ZGFwdGVyIGlzIGVpdGhlciBudWxsIG9yIGRvZXMgbm90IGltcGxlbWVudCBgZmluZE1hbnlgIG1l
dGhvZCI7IH0KKyAgfSwKKworICByZWZlcmVuY2VGb3JJZDogZnVuY3Rpb24odHlwZSwgaWQpIHsK
KyAgICB2YXIgY2xpZW50SWQgPSB0aGlzLmNsaWVudElkRm9ySWQodHlwZSwgaWQpOworICAgIHJl
dHVybiB0aGlzLnJlZmVyZW5jZUZvckNsaWVudElkKGNsaWVudElkKTsKKyAgfSwKKworICByZWZl
cmVuY2VGb3JDbGllbnRJZDogZnVuY3Rpb24oY2xpZW50SWQpIHsKKyAgICB2YXIgcmVmZXJlbmNl
cyA9IHRoaXMucmVjb3JkUmVmZXJlbmNlczsKKworICAgIGlmIChyZWZlcmVuY2VzW2NsaWVudElk
XSkgeworICAgICAgcmV0dXJuIHJlZmVyZW5jZXNbY2xpZW50SWRdOworICAgIH0KKworICAgIHZh
ciB0eXBlID0gdGhpcy5jbGllbnRJZFRvVHlwZVtjbGllbnRJZF07CisKKyAgICByZXR1cm4gcmVm
ZXJlbmNlc1tjbGllbnRJZF0gPSB7CisgICAgICBpZDogdGhpcy5pZEZvckNsaWVudElkKGNsaWVu
dElkKSwKKyAgICAgIGNsaWVudElkOiBjbGllbnRJZCwKKyAgICAgIHR5cGU6IHR5cGUKKyAgICB9
OworICB9LAorCisgIHJlY29yZEZvclJlZmVyZW5jZTogZnVuY3Rpb24ocmVmZXJlbmNlKSB7Cisg
ICAgcmV0dXJuIHRoaXMuZmluZEJ5Q2xpZW50SWQocmVmZXJlbmNlLnR5cGUsIHJlZmVyZW5jZS5j
bGllbnRJZCk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIGBmaW5kTWFueWAg
aXMgdGhlIGVudHJ5IHBvaW50IHRoYXQgcmVsYXRpb25zaGlwcyB1c2UgdG8gZ2VuZXJhdGUgYQor
ICAgIG5ldyBgTWFueUFycmF5YCBmb3IgdGhlIGxpc3Qgb2YgSURzIHNwZWNpZmllZCBieSB0aGUg
c2VydmVyIGZvcgorICAgIHRoZSByZWxhdGlvbnNoaXAuCisKKyAgICBJdHMgcmVzcG9uc2liaWxp
dGllcyBhcmU6CisKKyAgICAqIGNvbnZlcnQgdGhlIElEcyBpbnRvIGNsaWVudElkcworICAgICog
ZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBjbGllbnRJZHMgc3RpbGwgbmVlZCB0byBiZSBsb2FkZWQK
KyAgICAqIGNyZWF0ZSBhIG5ldyBNYW55QXJyYXkgd2hvc2UgY29udGVudCBpcyAqYWxsKiBvZiB0
aGUgY2xpZW50SWRzCisgICAgKiBub3RpZnkgdGhlIE1hbnlBcnJheSBvZiB0aGUgbnVtYmVyIG9m
IGl0cyBlbGVtZW50cyB0aGF0IGFyZQorICAgICAgYWxyZWFkeSBsb2FkZWQKKyAgICAqIGluc2Vy
dCB0aGUgdW5sb2FkZWQgY2xpZW50SWRzIGludG8gdGhlIGBsb2FkaW5nUmVjb3JkQXJyYXlzYAor
ICAgICAgYm9va2tlZXBpbmcgc3RydWN0dXJlLCB3aGljaCB3aWxsIGFsbG93IHRoZSBgTWFueUFy
cmF5YCB0byBrbm93CisgICAgICB3aGVuIGFsbCBvZiBpdHMgbG9hZGluZyBlbGVtZW50cyBhcmUg
bG9hZGVkIGZyb20gdGhlIHNlcnZlci4KKyAgICAqIGFzayB0aGUgYWRhcHRlciB0byBsb2FkIHRo
ZSB1bmxvYWRlZCBlbGVtZW50cywgYnkgaW52b2tpbmcKKyAgICAgIGZpbmRNYW55IHdpdGggdGhl
IHN0aWxsLXVubG9hZGVkIElEcy4KKyAgKi8KKyAgZmluZE1hbnk6IGZ1bmN0aW9uKHR5cGUsIGlk
cywgcmVjb3JkLCByZWxhdGlvbnNoaXApIHsKKyAgICAvLyAxLiBDb252ZXJ0IGlkcyB0byBjbGll
bnQgaWRzCisgICAgLy8gMi4gRGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBjbGllbnQgaWRzIG5lZWQg
dG8gYmUgbG9hZGVkCisgICAgLy8gMy4gQ3JlYXRlIGEgbmV3IE1hbnlBcnJheSB3aG9zZSBjb250
ZW50IGlzIEFMTCBvZiB0aGUgY2xpZW50SWRzCisgICAgLy8gNC4gRGVjcmVtZW50IHRoZSBNYW55
QXJyYXkncyBjb3VudGVyIGJ5IHRoZSBudW1iZXIgb2YgbG9hZGVkIGNsaWVudElkcworICAgIC8v
IDUuIFB1dCB0aGUgTWFueUFycmF5IGludG8gb3VyIGJvb2trZWVwaW5nIGRhdGEgc3RydWN0dXJl
LCBrZXllZCBvbgorICAgIC8vICAgIHRoZSBuZWVkZWQgY2xpZW50SWRzCisgICAgLy8gNi4gQXNr
IHRoZSBhZGFwdGVyIHRvIGxvYWQgdGhlIHJlY29yZHMgZm9yIHRoZSB1bmxvYWRlZCBjbGllbnRJ
ZHMgKGJ1dAorICAgIC8vICAgIGNvbnZlcnQgdGhlbSBiYWNrIHRvIGlkcykKKworICAgIGlmICgh
RW1iZXIuaXNBcnJheShpZHMpKSB7CisgICAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZv
clR5cGUodHlwZSk7CisgICAgICBpZiAoYWRhcHRlciAmJiBhZGFwdGVyLmZpbmRIYXNNYW55KSB7
IGFkYXB0ZXIuZmluZEhhc01hbnkodGhpcywgcmVjb3JkLCByZWxhdGlvbnNoaXAsIGlkcyk7IH0K
KyAgICAgIGVsc2UgeyB0aHJvdyBmbXQoIkFkYXB0ZXIgaXMgZWl0aGVyIG51bGwgb3IgZG9lcyBu
b3QgaW1wbGVtZW50IGBmaW5kSGFzTWFueWAgbWV0aG9kIiwgdGhpcyk7IH0KKworICAgICAgcmV0
dXJuIHRoaXMuY3JlYXRlTWFueUFycmF5KHR5cGUsIEVtYmVyLkEoKSk7CisgICAgfQorCisgICAg
Ly8gQ29lcmNlIHNlcnZlciBJRHMgaW50byBSZWNvcmQgUmVmZXJlbmNlCisgICAgdmFyIHJlZmVy
ZW5jZXMgPSBtYXAoaWRzLCBmdW5jdGlvbihyZWZlcmVuY2UpIHsKKyAgICAgIGlmICh0eXBlb2Yg
cmVmZXJlbmNlICE9PSAnb2JqZWN0JyAmJiByZWZlcmVuY2UgIT09IG51bGwpIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMucmVmZXJlbmNlRm9ySWQodHlwZSwgcmVmZXJlbmNlKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAgICB9LCB0aGlzKTsKKworICAgIHZhciBuZWVkZWRS
ZWZlcmVuY2VzID0gdGhpcy5uZWVkZWRSZWZlcmVuY2VzKHR5cGUsIHJlZmVyZW5jZXMpLAorICAg
ICAgICBtYW55QXJyYXkgPSB0aGlzLmNyZWF0ZU1hbnlBcnJheSh0eXBlLCBFbWJlci5BKHJlZmVy
ZW5jZXMpKSwKKyAgICAgICAgbG9hZGluZ1JlY29yZEFycmF5cyA9IHRoaXMubG9hZGluZ1JlY29y
ZEFycmF5cywKKyAgICAgICAgcmVmZXJlbmNlLCBjbGllbnRJZCwgaSwgbDsKKworICAgIC8vIFN0
YXJ0IHRoZSBkZWNyZW1lbnRpbmcgY291bnRlciBvbiB0aGUgTWFueUFycmF5IGF0IHRoZSBudW1i
ZXIgb2YKKyAgICAvLyByZWNvcmRzIHdlIG5lZWQgdG8gbG9hZCBmcm9tIHRoZSBhZGFwdGVyCisg
ICAgbWFueUFycmF5LmxvYWRpbmdSZWNvcmRzQ291bnQobmVlZGVkUmVmZXJlbmNlcy5sZW5ndGgp
OworCisgICAgaWYgKG5lZWRlZFJlZmVyZW5jZXMubGVuZ3RoKSB7CisgICAgICBmb3IgKGk9MCwg
bD1uZWVkZWRSZWZlcmVuY2VzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgcmVmZXJlbmNl
ID0gbmVlZGVkUmVmZXJlbmNlc1tpXTsKKyAgICAgICAgY2xpZW50SWQgPSByZWZlcmVuY2UuY2xp
ZW50SWQ7CisKKyAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgcmVjb3JkIGFycmF5cyB0aGF0
IGEgZ2l2ZW4gbG9hZGluZyByZWNvcmQKKyAgICAgICAgLy8gaXMgcGFydCBvZi4gVGhpcyB3YXks
IGlmIHRoZSBzYW1lIHJlY29yZCBpcyBpbiBtdWx0aXBsZQorICAgICAgICAvLyBNYW55QXJyYXlz
LCBhbGwgb2YgdGhlaXIgbG9hZGluZyByZWNvcmRzIGNvdW50ZXJzIHdpbGwgYmUKKyAgICAgICAg
Ly8gZGVjcmVtZW50ZWQgd2hlbiB0aGUgYWRhcHRlciBwcm92aWRlcyB0aGUgZGF0YS4KKyAgICAg
ICAgaWYgKGxvYWRpbmdSZWNvcmRBcnJheXNbY2xpZW50SWRdKSB7CisgICAgICAgICAgbG9hZGlu
Z1JlY29yZEFycmF5c1tjbGllbnRJZF0ucHVzaChtYW55QXJyYXkpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIHRoaXMubG9hZGluZ1JlY29yZEFycmF5c1tjbGllbnRJZF0gPSBbIG1hbnlB
cnJheSBdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMuZmV0Y2hNYW55KHR5cGUs
IG5lZWRlZFJlZmVyZW5jZXMsIHJlY29yZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGFsbCBy
ZXF1ZXN0ZWQgcmVjb3JkcyBhcmUgYXZhaWxhYmxlCisgICAgICBtYW55QXJyYXkuc2V0KCdpc0xv
YWRlZCcsIHRydWUpOworCisgICAgICBFbWJlci5ydW4ub25jZShmdW5jdGlvbigpIHsKKyAgICAg
ICAgbWFueUFycmF5LnRyaWdnZXIoJ2RpZExvYWQnKTsKKyAgICAgIH0pOworICAgIH0KKworICAg
IHJldHVybiBtYW55QXJyYXk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFRo
aXMgbWV0aG9kIGRlbGVnYXRlcyBhIHF1ZXJ5IHRvIHRoZSBhZGFwdGVyLiBUaGlzIGlzIHRoZSBv
bmUgcGxhY2Ugd2hlcmUKKyAgICBhZGFwdGVyLWxldmVsIHNlbWFudGljcyBhcmUgZXhwb3NlZCB0
byB0aGUgYXBwbGljYXRpb24uCisKKyAgICBFeHBvc2luZyBxdWVyaWVzIHRoaXMgd2F5IHNlZW1z
IHByZWZlcmFibGUgdG8gY3JlYXRpbmcgYW4gYWJzdHJhY3QgcXVlcnkKKyAgICBsYW5ndWFnZSBm
b3IgYWxsIHNlcnZlci1zaWRlIHF1ZXJpZXMsIGFuZCB0aGVuIHJlcXVpcmUgYWxsIGFkYXB0ZXJz
IHRvCisgICAgaW1wbGVtZW50IHRoZW0uCisKKyAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCisgICAg
QHBhcmFtIHtPYmplY3R9IHF1ZXJ5IGFuIG9wYXF1ZSBxdWVyeSB0byBiZSB1c2VkIGJ5IHRoZSBh
ZGFwdGVyCisgICAgQHJldHVybiB7RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5fQorICAq
LworICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHR5cGUsIHF1ZXJ5KSB7CisgICAgdmFyIGFycmF5ID0g
RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5LmNyZWF0ZSh7IHR5cGU6IHR5cGUsIHF1ZXJ5
OiBxdWVyeSwgY29udGVudDogRW1iZXIuQShbXSksIHN0b3JlOiB0aGlzIH0pOworICAgIHZhciBh
ZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yVHlwZSh0eXBlKTsKKyAgICBpZiAoYWRhcHRlciAmJiBh
ZGFwdGVyLmZpbmRRdWVyeSkgeyBhZGFwdGVyLmZpbmRRdWVyeSh0aGlzLCB0eXBlLCBxdWVyeSwg
YXJyYXkpOyB9CisgICAgZWxzZSB7IHRocm93ICJBZGFwdGVyIGlzIGVpdGhlciBudWxsIG9yIGRv
ZXMgbm90IGltcGxlbWVudCBgZmluZFF1ZXJ5YCBtZXRob2QiOyB9CisgICAgcmV0dXJuIGFycmF5
OworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCByZXR1cm5z
IGFuIGFycmF5IG9mIGFsbCByZWNvcmRzIGFkYXB0ZXIgY2FuIGZpbmQuCisgICAgSXQgdHJpZ2dl
cnMgdGhlIGFkYXB0ZXIncyBgZmluZEFsbGAgbWV0aG9kIHRvIGdpdmUgaXQgYW4gb3Bwb3J0dW5p
dHkgdG8gcG9wdWxhdGUKKyAgICB0aGUgYXJyYXkgd2l0aCByZWNvcmRzIG9mIHRoYXQgdHlwZS4K
KworICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKKyAgICBAcmV0dXJuIHtEUy5BZGFwdGVyUG9wdWxh
dGVkUmVjb3JkQXJyYXl9CisgICovCisgIGZpbmRBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICB2
YXIgYXJyYXkgPSB0aGlzLmFsbCh0eXBlKTsKKyAgICB0aGlzLmZldGNoQWxsKHR5cGUsIGFycmF5
KTsKKyAgICByZXR1cm4gYXJyYXk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgKi8K
KyAgZmV0Y2hBbGw6IGZ1bmN0aW9uKHR5cGUsIGFycmF5KSB7CisgICAgdmFyIHNpbmNlVG9rZW4g
PSB0aGlzLnR5cGVNYXBGb3IodHlwZSkuc2luY2VUb2tlbiwKKyAgICAgICAgYWRhcHRlciA9IHRo
aXMuYWRhcHRlckZvclR5cGUodHlwZSk7CisKKyAgICBzZXQoYXJyYXksICdpc1VwZGF0aW5nJywg
dHJ1ZSk7CisKKyAgICBpZiAoYWRhcHRlciAmJiBhZGFwdGVyLmZpbmRBbGwpIHsgYWRhcHRlci5m
aW5kQWxsKHRoaXMsIHR5cGUsIHNpbmNlVG9rZW4pOyB9CisgICAgZWxzZSB7IHRocm93ICJBZGFw
dGVyIGlzIGVpdGhlciBudWxsIG9yIGRvZXMgbm90IGltcGxlbWVudCBgZmluZEFsbGAgbWV0aG9k
IjsgfQorICB9LAorCisgIC8qKgorICAqLworICBzaW5jZUZvclR5cGU6IGZ1bmN0aW9uKHR5cGUs
IHNpbmNlVG9rZW4pIHsKKyAgICB0aGlzLnR5cGVNYXBGb3IodHlwZSkuc2luY2VUb2tlbiA9IHNp
bmNlVG9rZW47CisgIH0sCisKKyAgLyoqCisgICovCisgIGRpZFVwZGF0ZUFsbDogZnVuY3Rpb24o
dHlwZSkgeworICAgIHZhciBmaW5kQWxsQ2FjaGUgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSkuZmlu
ZEFsbENhY2hlOworICAgIHNldChmaW5kQWxsQ2FjaGUsICdpc1VwZGF0aW5nJywgZmFsc2UpOwor
ICB9LAorCisgIC8qKgorICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBmaWx0ZXJlZCBhcnJheSB0
aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUga25vd24gcmVjb3JkcworICAgIGZvciBhIGdpdmVuIHR5
cGUuCisKKyAgICBOb3RlIHRoYXQgYmVjYXVzZSBpdCdzIGp1c3QgYSBmaWx0ZXIsIGl0IHdpbGwg
aGF2ZSBhbnkgbG9jYWxseQorICAgIGNyZWF0ZWQgcmVjb3JkcyBvZiB0aGUgdHlwZS4KKworICAg
IEFsc28gbm90ZSB0aGF0IG11bHRpcGxlIGNhbGxzIHRvIGBhbGxgIGZvciBhIGdpdmVuIHR5cGUg
d2lsbCBhbHdheXMKKyAgICByZXR1cm4gdGhlIHNhbWUgUmVjb3JkQXJyYXkuCisKKyAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlCisgICAgQHJldHVybiB7RFMuUmVjb3JkQXJyYXl9CisgICovCisgIGFs
bDogZnVuY3Rpb24odHlwZSkgeworICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5
cGUpLAorICAgICAgICBmaW5kQWxsQ2FjaGUgPSB0eXBlTWFwLmZpbmRBbGxDYWNoZTsKKworICAg
IGlmIChmaW5kQWxsQ2FjaGUpIHsgcmV0dXJuIGZpbmRBbGxDYWNoZTsgfQorCisgICAgdmFyIGFy
cmF5ID0gRFMuUmVjb3JkQXJyYXkuY3JlYXRlKHsgdHlwZTogdHlwZSwgY29udGVudDogRW1iZXIu
QShbXSksIHN0b3JlOiB0aGlzLCBpc0xvYWRlZDogdHJ1ZSB9KTsKKyAgICB0aGlzLnJlZ2lzdGVy
UmVjb3JkQXJyYXkoYXJyYXksIHR5cGUpOworCisgICAgdHlwZU1hcC5maW5kQWxsQ2FjaGUgPSBh
cnJheTsKKyAgICByZXR1cm4gYXJyYXk7CisgIH0sCisKKyAgLyoqCisgICAgVGFrZXMgYSB0eXBl
IGFuZCBmaWx0ZXIgZnVuY3Rpb24sIGFuZCByZXR1cm5zIGEgbGl2ZSBSZWNvcmRBcnJheSB0aGF0
CisgICAgcmVtYWlucyB1cCB0byBkYXRlIGFzIG5ldyByZWNvcmRzIGFyZSBsb2FkZWQgaW50byB0
aGUgc3RvcmUgb3IgY3JlYXRlZAorICAgIGxvY2FsbHkuCisKKyAgICBUaGUgY2FsbGJhY2sgZnVu
Y3Rpb24gdGFrZXMgYSBtYXRlcmlhbGl6ZWQgcmVjb3JkLCBhbmQgcmV0dXJucyB0cnVlCisgICAg
aWYgdGhlIHJlY29yZCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbHRlciBhbmQgZmFsc2Ug
aWYgaXQgc2hvdWxkCisgICAgbm90LgorCisgICAgVGhlIGZpbHRlciBmdW5jdGlvbiBpcyBjYWxs
ZWQgb25jZSBvbiBhbGwgcmVjb3JkcyBmb3IgdGhlIHR5cGUgd2hlbgorICAgIGl0IGlzIGNyZWF0
ZWQsIGFuZCB0aGVuIG9uY2Ugb24gZWFjaCBuZXdseSBsb2FkZWQgb3IgY3JlYXRlZCByZWNvcmQu
CisKKyAgICBJZiBhbnkgb2YgYSByZWNvcmQncyBwcm9wZXJ0aWVzIGNoYW5nZSwgb3IgaWYgaXQg
Y2hhbmdlcyBzdGF0ZSwgdGhlCisgICAgZmlsdGVyIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBh
Z2FpbiB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBzaG91bGQKKyAgICBzdGlsbCBiZSBpbiB0aGUg
YXJyYXkuCisKKyAgICBOb3RlIHRoYXQgdGhlIGV4aXN0ZW5jZSBvZiBhIGZpbHRlciBvbiBhIHR5
cGUgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQorICAgIG1hdGVyaWFsaXphdGlvbiBvZiBhbGwgbG9h
ZGVkIGRhdGEgZm9yIGEgZ2l2ZW4gdHlwZSwgc28geW91IG1pZ2h0CisgICAgbm90IHdhbnQgdG8g
dXNlIGZpbHRlcnMgZm9yIGEgdHlwZSBpZiB5b3UgYXJlIGxvYWRpbmcgbWFueSByZWNvcmRzCisg
ICAgaW50byB0aGUgc3RvcmUsIG1hbnkgb2Ygd2hpY2ggYXJlIG5vdCBhY3RpdmUgYXQgYW55IGdp
dmVuIHRpbWUuCisKKyAgICBJbiB0aGlzIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjb25z
aWRlciBmaWx0ZXJpbmcgdGhlIHJhdworICAgIGRhdGEgYmVmb3JlIGxvYWRpbmcgaXQgaW50byB0
aGUgc3RvcmUuCisKKyAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCisgICAgQHBhcmFtIHtGdW5jdGlv
bn0gZmlsdGVyCisKKyAgICBAcmV0dXJuIHtEUy5GaWx0ZXJlZFJlY29yZEFycmF5fQorICAqLwor
ICBmaWx0ZXI6IGZ1bmN0aW9uKHR5cGUsIHF1ZXJ5LCBmaWx0ZXIpIHsKKyAgICAvLyBhbGxvdyBh
biBvcHRpb25hbCBzZXJ2ZXIgcXVlcnkKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykg
eworICAgICAgdGhpcy5maW5kUXVlcnkodHlwZSwgcXVlcnkpOworICAgIH0gZWxzZSBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgZmlsdGVyID0gcXVlcnk7CisgICAgfQorCisg
ICAgdmFyIGFycmF5ID0gRFMuRmlsdGVyZWRSZWNvcmRBcnJheS5jcmVhdGUoeyB0eXBlOiB0eXBl
LCBjb250ZW50OiBFbWJlci5BKFtdKSwgc3RvcmU6IHRoaXMsIGZpbHRlckZ1bmN0aW9uOiBmaWx0
ZXIgfSk7CisKKyAgICB0aGlzLnJlZ2lzdGVyUmVjb3JkQXJyYXkoYXJyYXksIHR5cGUsIGZpbHRl
cik7CisKKyAgICByZXR1cm4gYXJyYXk7CisgIH0sCisKKyAgLyoqCisgICAgVGhpcyBtZXRob2Qg
cmV0dXJucyBpZiBhIGNlcnRhaW4gcmVjb3JkIGlzIGFscmVhZHkgbG9hZGVkCisgICAgaW4gdGhl
IHN0b3JlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBrbm93IGJlZm9yZWhhbmQgaWYgYSBmaW5kKCkK
KyAgICB3aWxsIHJlc3VsdCBpbiBhIHJlcXVlc3Qgb3IgdGhhdCBpdCB3aWxsIGJlIGEgY2FjaGUg
aGl0LgorCisgICAgQHBhcmFtIHtDbGFzc30gdHlwZQorICAgIEBwYXJhbSB7c3RyaW5nfSBpZAor
ICAgIEByZXR1cm4ge2Jvb2xlYW59CisgICovCisgIHJlY29yZElzTG9hZGVkOiBmdW5jdGlvbih0
eXBlLCBpZCkgeworICAgIHJldHVybiAhRW1iZXIuaXNOb25lKHRoaXMudHlwZU1hcEZvcih0eXBl
KS5pZFRvQ2lkW2lkXSk7CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uCisgIC8vIC4gVVBEQVRJ
TkcgLgorICAvLyAuLi4uLi4uLi4uLi4KKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgSWYg
dGhlIGFkYXB0ZXIgdXBkYXRlcyBhdHRyaWJ1dGVzIG9yIGFja25vd2xlZGdlcyBjcmVhdGlvbgor
ICAgIG9yIGRlbGV0aW9uLCB0aGUgcmVjb3JkIHdpbGwgbm90aWZ5IHRoZSBzdG9yZSB0byB1cGRh
dGUgaXRzCisgICAgbWVtYmVyc2hpcCBpbiBhbnkgZmlsdGVycy4KKworICAgIFRvIGF2b2lkIHRo
cmFzaGluZywgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5IG9uY2UgcGVyCisgICAgcnVuIGxv
b3AgcGVyIHJlY29yZC4KKworICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKKyAgICBAcGFyYW0ge051
bWJlcnxTdHJpbmd9IGNsaWVudElkCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICov
CisgIGRhdGFXYXNVcGRhdGVkOiBmdW5jdGlvbih0eXBlLCByZWZlcmVuY2UsIHJlY29yZCkgewor
ICAgIC8vIEJlY2F1c2UgZGF0YSB1cGRhdGVzIGFyZSBpbnZva2VkIGF0IHRoZSBlbmQgb2YgdGhl
IHJ1biBsb29wLAorICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSByZWNvcmQgbWlnaHQgYmUg
ZGVsZXRlZCBhZnRlciBpdHMgZGF0YQorICAgIC8vIGhhcyBiZWVuIG1vZGlmaWVkIGFuZCB0aGlz
IG1ldGhvZCB3YXMgc2NoZWR1bGVkIHRvIGJlIGNhbGxlZC4KKyAgICAvLworICAgIC8vIElmIHRo
YXQncyB0aGUgY2FzZSwgdGhlIHJlY29yZCB3b3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVk
CisgICAgLy8gZnJvbSBhbGwgcmVjb3JkIGFycmF5czsgY2FsbGluZyB1cGRhdGVSZWNvcmRBcnJh
eXMgd291bGQganVzdAorICAgIC8vIGFkZCBpdCBiYWNrLiBJZiB0aGUgcmVjb3JkIGlzIGRlbGV0
ZWQsIGp1c3QgYmFpbC4gSXQgc2hvdWxkbid0CisgICAgLy8gZ2l2ZSB1cyBhbnkgbW9yZSB0cm91
YmxlIGFmdGVyIHRoaXMuCisKKyAgICBpZiAoZ2V0KHJlY29yZCwgJ2lzRGVsZXRlZCcpKSB7IHJl
dHVybjsgfQorCisgICAgdmFyIGNpZFRvRGF0YSA9IHRoaXMuY2xpZW50SWRUb0RhdGEsCisgICAg
ICAgIGNsaWVudElkID0gcmVmZXJlbmNlLmNsaWVudElkLAorICAgICAgICBkYXRhID0gY2lkVG9E
YXRhW2NsaWVudElkXTsKKworICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpIHsKKyAg
ICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzKHR5cGUsIGNsaWVudElkKTsKKyAgICB9CisgIH0s
CisKKyAgLy8gLi4uLi4uLi4uLi4uLi4KKyAgLy8gLiBQRVJTSVNUSU5HIC4KKyAgLy8gLi4uLi4u
Li4uLi4uLi4KKworICAvKioKKyAgICBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgY29tbWl0dGluZyB0
byB0aGUgc3RvcmUncyBpbXBsaWNpdAorICAgIHRyYW5zYWN0aW9uLgorCisgICAgQ2FsbGluZyB0
aGlzIG1ldGhvZCBpcyBlc3NlbnRpYWxseSBhIHJlcXVlc3QgdG8gcGVyc2lzdAorICAgIGFueSBj
aGFuZ2VzIHRvIHJlY29yZHMgdGhhdCB3ZXJlIG5vdCBleHBsaWNpdGx5IGFkZGVkIHRvCisgICAg
YSB0cmFuc2FjdGlvbi4KKyAgKi8KKyAgY29tbWl0OiBmdW5jdGlvbigpIHsKKyAgICBnZXQodGhp
cywgJ2RlZmF1bHRUcmFuc2FjdGlvbicpLmNvbW1pdCgpOworICB9LAorCisgIC8qKgorICAgIEFk
YXB0ZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZXkgd291bGQgbGlrZSB0byBhY2tu
b3dsZWRnZQorICAgIHRoYXQgYWxsIGNoYW5nZXMgcmVsYXRlZCB0byBhIHJlY29yZCAob3RoZXIg
dGhhbiByZWxhdGlvbnNoaXAKKyAgICBjaGFuZ2VzKSBoYXZlIHBlcnNpc3RlZC4KKworICAgIEJl
Y2F1c2UgcmVsYXRpb25zaGlwIGNoYW5nZXMgYWZmZWN0IG11bHRpcGxlIHJlY29yZHMsIHRoZSBh
ZGFwdGVyCisgICAgaXMgcmVzcG9uc2libGUgZm9yIGFja25vd2xlZGdpbmcgdGhlIGNoYW5nZSB0
byB0aGUgcmVsYXRpb25zaGlwCisgICAgZGlyZWN0bHkgKHVzaW5nIGBzdG9yZS5kaWRVcGRhdGVS
ZWxhdGlvbnNoaXBgKSB3aGVuIGFsbCBhc3BlY3RzCisgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCBj
aGFuZ2UgaGF2ZSBwZXJzaXN0ZWQuCisKKyAgICBJdCBjYW4gYmUgY2FsbGVkIGZvciBjcmVhdGVk
LCBkZWxldGVkIG9yIHVwZGF0ZWQgcmVjb3Jkcy4KKworICAgIElmIHRoZSBhZGFwdGVyIHN1cHBs
aWVzIG5ldyBkYXRhLCB0aGF0IGRhdGEgd2lsbCBiZWNvbWUgdGhlIG5ldworICAgIGNhbm9uaWNh
bCBkYXRhIGZvciB0aGUgcmVjb3JkLiBUaGF0IHdpbGwgcmVzdWx0IGluIGJsb3dpbmcgYXdheQor
ICAgIGFsbCBsb2NhbCBjaGFuZ2VzIGFuZCByZW1hdGVyaWFsaXppbmcgdGhlIHJlY29yZCB3aXRo
IHRoZSBuZXcKKyAgICBkYXRhICh0aGUgInNsZWRnZWhhbW1lciIgYXBwcm9hY2gpLgorCisgICAg
QWx0ZXJuYXRpdmVseSwgaWYgdGhlIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcGx5IG5ldyBkYXRhLCB0
aGUgcmVjb3JkCisgICAgd2lsbCBjb2xsYXBzZSBhbGwgbG9jYWwgY2hhbmdlcyBpbnRvIGl0cyBz
YXZlZCBkYXRhLiBTdWJzZXF1ZW50CisgICAgcm9sbGJhY2tzIG9mIHRoZSByZWNvcmQgd2lsbCBy
b2xsIGJhY2sgdG8gdGhpcyBwb2ludC4KKworICAgIElmIGFuIGFkYXB0ZXIgaXMgYWNrbm93bGVk
Z2luZyByZWNlaXB0IG9mIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQKKyAgICB0aGF0IGRpZCBub3Qg
Z2VuZXJhdGUgYW4gaWQgaW4gdGhlIGNsaWVudCwgaXQgKm11c3QqIGVpdGhlcgorICAgIHByb3Zp
ZGUgZGF0YSBvciBleHBsaWNpdGx5IGludm9rZSBgc3RvcmUuZGlkUmVjZWl2ZUlkYCB3aXRoCisg
ICAgdGhlIHNlcnZlci1wcm92aWRlZCBpZC4KKworICAgIE5vdGUgdGhhdCBhbiBhZGFwdGVyIG1h
eSBub3Qgc3VwcGx5IG5ldyBkYXRhIHdoZW4gYWNrbm93bGVkZ2luZworICAgIGEgZGVsZXRlZCBy
ZWNvcmQuCisKKyAgICBAc2VlIERTLlN0b3JlI2RpZFVwZGF0ZVJlbGF0aW9uc2hpcAorCisgICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRoZSBpbi1mbGlnaHQgcmVjb3JkCisgICAgQHBhcmFt
IHtPYmplY3R9IGRhdGEgb3B0aW9uYWwgZGF0YSAoc2VlIGFib3ZlKQorICAqLworICBkaWRTYXZl
UmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIGRhdGEpIHsKKyAgICByZWNvcmQuYWRhcHRlckRpZENv
bW1pdCgpOworCisgICAgaWYgKGRhdGEpIHsKKyAgICAgIHRoaXMudXBkYXRlSWQocmVjb3JkLCBk
YXRhKTsKKyAgICAgIHRoaXMudXBkYXRlUmVjb3JkRGF0YShyZWNvcmQsIGRhdGEpOworICAgIH0g
ZWxzZSB7CisgICAgICB0aGlzLmRpZFVwZGF0ZUF0dHJpYnV0ZXMocmVjb3JkKTsKKyAgICB9Cisg
IH0sCisKKyAgLyoqCisgICAgRm9yIGNvbnZlbmllbmNlLCBpZiBhbiBhZGFwdGVyIGlzIHBlcmZv
cm1pbmcgYSBidWxrIGNvbW1pdCwgaXQgY2FuIGFsc28KKyAgICBhY2tub3dsZWRnZSBhbGwgb2Yg
dGhlIHJlY29yZHMgYXQgb25jZS4KKworICAgIElmIHRoZSBhZGFwdGVyIHN1cHBsaWVzIGFuIGFy
cmF5IG9mIGRhdGEsIHRoZXkgbXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcworICAgIHRoZSBh
cnJheSBvZiByZWNvcmRzIHBhc3NlZCBpbiBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLgorCisgICAg
QHBhcmFtIHsjZm9yRWFjaH0gbGlzdCBhIGxpc3Qgb2YgcmVjb3JkcyB3aG9zZSBjaGFuZ2VzIHRo
ZQorICAgICAgYWRhcHRlciBpcyBhY2tub3dsZWRnaW5nLiBZb3UgY2FuIHBhc3MgYW55IG9iamVj
dCB0aGF0CisgICAgICBoYXMgYW4gRVM1LWxpa2UgYGZvckVhY2hgIG1ldGhvZCwgaW5jbHVkaW5n
IHRoZQorICAgICAgYE9yZGVyZWRTZXRgIG9iamVjdHMgcGFzc2VkIGludG8gdGhlIGFkYXB0ZXIg
YXQgY29tbWl0CisgICAgICB0aW1lLgorICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gZGF0YUxp
c3QgYW4gQXJyYXkgb2YgZGF0YS4gVGhpcworICAgICAgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW50
ZWdlci1pbmRleGVkIEFycmF5LWxpa2UuCisgICovCisgIGRpZFNhdmVSZWNvcmRzOiBmdW5jdGlv
bihsaXN0LCBkYXRhTGlzdCkgeworICAgIHZhciBpID0gMDsKKyAgICBsaXN0LmZvckVhY2goZnVu
Y3Rpb24ocmVjb3JkKSB7CisgICAgICB0aGlzLmRpZFNhdmVSZWNvcmQocmVjb3JkLCBkYXRhTGlz
dCAmJiBkYXRhTGlzdFtpKytdKTsKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAgICBU
aGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFkYXB0ZXIgdG8gc3BlY2lmeSB0aGF0IGEgcmVjb3JkCisg
ICAgY291bGQgbm90IGJlIHNhdmVkIGJlY2F1c2UgaXQgaGFkIGJhY2tlbmQtc3VwcGxpZWQgdmFs
aWRhdGlvbgorICAgIGVycm9ycy4KKworICAgIFRoZSBlcnJvcnMgb2JqZWN0IG11c3QgaGF2ZSBr
ZXlzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUKKyAgICBhdHRyaWJ1dGUgbmFtZXMuIE9uY2UgZWFj
aCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZXMgaGF2ZQorICAgIGNoYW5nZWQsIHRoZSByZWNv
cmQgd2lsbCBhdXRvbWF0aWNhbGx5IG1vdmUgb3V0IG9mIHRoZQorICAgIGludmFsaWQgc3RhdGUg
YW5kIGJlIHJlYWR5IHRvIGNvbW1pdCBhZ2Fpbi4KKworICAgIFRPRE86IFdlIHNob3VsZCBwcm9i
YWJseSBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZiBjb252ZXJ0aW5nCisgICAgc2VydmVyIG5hbWVz
IHRvIGF0dHJpYnV0ZSBuYW1lcyB1c2luZyB0aGUgZXhpc3Rpbmcgc2VyaWFsaXplcgorICAgIGlu
ZnJhc3RydWN0dXJlLgorCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHBhcmFt
IHtPYmplY3R9IGVycm9ycworICAqLworICByZWNvcmRXYXNJbnZhbGlkOiBmdW5jdGlvbihyZWNv
cmQsIGVycm9ycykgeworICAgIHJlY29yZC5hZGFwdGVyRGlkSW52YWxpZGF0ZShlcnJvcnMpOwor
ICB9LAorCisgIC8qKgorICAgICBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFkYXB0ZXIgdG8gc3Bl
Y2lmeSB0aGF0IGEgcmVjb3JkCisgICAgIGNvdWxkIG5vdCBiZSBzYXZlZCBiZWNhdXNlIHRoZSBz
ZXJ2ZXIgcmV0dXJuZWQgYW4gdW5oYW5kbGVkCisgICAgIGVycm9yLgorCisgICAgIEBwYXJhbSB7
RFMuTW9kZWx9IHJlY29yZAorICAqLworICByZWNvcmRXYXNFcnJvcjogZnVuY3Rpb24ocmVjb3Jk
KSB7CisgICAgcmVjb3JkLmFkYXB0ZXJEaWRFcnJvcigpOworICB9LAorCisgIC8qKgorICAgIFRo
aXMgaXMgYSBsb3dlci1sZXZlbCBBUEkgdGhhbiBgZGlkU2F2ZVJlY29yZGAgdGhhdCBhbGxvd3Mg
YW4KKyAgICBhZGFwdGVyIHRvIGFja25vd2xlZGdlIHRoZSBwZXJzaXN0ZW5jZSBvZiBhIHNpbmds
ZSBhdHRyaWJ1dGUuCisKKyAgICBUaGlzIGlzIHVzZWZ1bCBpZiBhbiBhZGFwdGVyIG5lZWRzIHRv
IG1ha2UgbXVsdGlwbGUgYXN5bmNocm9ub3VzCisgICAgY2FsbHMgdG8gZnVsbHkgcGVyc2lzdCBh
IHJlY29yZC4gVGhlIHJlY29yZCB3aWxsIGtlZXAgdHJhY2sgb2YKKyAgICB3aGljaCBhdHRyaWJ1
dGVzIGFuZCByZWxhdGlvbnNoaXBzIGFyZSBzdGlsbCBvdXRzdGFuZGluZyBhbmQKKyAgICBhdXRv
bWF0aWNhbGx5IG1vdmUgaW50byB0aGUgYHNhdmVkYCBzdGF0ZSBvbmNlIHRoZSBhZGFwdGVyIGhh
cworICAgIGFja25vd2xlZGdlZCBldmVyeXRoaW5nLgorCisgICAgSWYgYSB2YWx1ZSBpcyBwcm92
aWRlZCwgaXQgY2xvYmJlcnMgdGhlIGxvY2FsbHkgc3BlY2lmaWVkIHZhbHVlLgorICAgIE90aGVy
d2lzZSwgdGhlIGxvY2FsIHZhbHVlIGJlY29tZXMgdGhlIHJlY29yZCdzIGxhc3Qga25vd24KKyAg
ICBzYXZlZCB2YWx1ZSAod2hpY2ggaXMgdXNlZCB3aGVuIHJvbGxpbmcgYmFjayBhIHJlY29yZCku
CisKKyAgICBOb3RlIHRoYXQgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVOYW1lIGlzIHRoZSBub3Jt
YWxpemVkIG5hbWUKKyAgICBzcGVjaWZpZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIGBEUy5N
b2RlbGAsIG5vdCBhIGtleSBpbgorICAgIHRoZSBzZXJ2ZXItcHJvdmlkZWQgZGF0YS4KKworICAg
IEFsc28gbm90ZSB0aGF0IHRoZSBhZGFwdGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5n
IGFueQorICAgIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgdmFsdWUgdXNpbmcgdGhlIHNlcmlhbGl6
ZXIgQVBJLgorCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHBhcmFtIHtTdHJp
bmd9IGF0dHJpYnV0ZU5hbWUKKyAgICBAcGFyYW0ge09iamVjdH0gdmFsdWUKKyAgKi8KKyAgZGlk
VXBkYXRlQXR0cmlidXRlOiBmdW5jdGlvbihyZWNvcmQsIGF0dHJpYnV0ZU5hbWUsIHZhbHVlKSB7
CisgICAgcmVjb3JkLmFkYXB0ZXJEaWRVcGRhdGVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFs
dWUpOworICB9LAorCisgIC8qKgorICAgIFRoaXMgbWV0aG9kIGFsbG93cyBhbiBhZGFwdGVyIHRv
IGFja25vd2xlZGdlIHBlcnNpc3RlbmNlCisgICAgb2YgYWxsIGF0dHJpYnV0ZXMgb2YgYSByZWNv
cmQgYnV0IG5vdCByZWxhdGlvbnNoaXBzIG9yCisgICAgb3RoZXIgZmFjdG9ycy4KKworICAgIEl0
IGxvb3BzIHRocm91Z2ggdGhlIHJlY29yZCdzIGRlZmluZWQgYXR0cmlidXRlcyBhbmQKKyAgICBu
b3RpZmllcyB0aGUgcmVjb3JkIHRoYXQgdGhleSBhcmUgYWxsIGFja25vd2xlZGdlZC4KKworICAg
IFRoaXMgbWV0aG9kIGRvZXMgbm90IHRha2Ugb3B0aW9uYWwgdmFsdWVzLCBiZWNhdXNlCisgICAg
dGhlIGFkYXB0ZXIgaXMgdW5saWtlbHkgdG8gaGF2ZSBhIGhhc2ggb2Ygbm9ybWFsaXplZAorICAg
IGtleXMgYW5kIHRyYW5zZm9ybWVkIHZhbHVlcywgYW5kIGluc3RlYWQgb2YgYnVpbGRpbmcKKyAg
ICBvbmUgdXAsIGl0IHNob3VsZCBqdXN0IGNhbGwgYGRpZFVwZGF0ZUF0dHJpYnV0ZWAgYXMKKyAg
ICBuZWVkZWQuCisKKyAgICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBhcyBhIG1pZGRsZS1ncm91
bmQgYmV0d2VlbgorICAgIGBkaWRTYXZlUmVjb3JkYCwgd2hpY2ggYWNrbm93bGVkZ2VzIGFsbCBj
aGFuZ2VzIHRvCisgICAgYSByZWNvcmQsIGFuZCBgZGlkVXBkYXRlQXR0cmlidXRlYCwgd2hpY2gg
YWxsb3dzIGFuCisgICAgYWRhcHRlciBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHVwZGF0ZXMu
CisKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8KKyAgZGlkVXBkYXRlQXR0cmli
dXRlczogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rp
b24oYXR0cmlidXRlTmFtZSkgeworICAgICAgdGhpcy5kaWRVcGRhdGVBdHRyaWJ1dGUocmVjb3Jk
LCBhdHRyaWJ1dGVOYW1lKTsKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAgICBUaGlz
IGFsbG93cyBhbiBhZGFwdGVyIHRvIGFja25vd2xlZGdlIHRoYXQgaXQgaGFzIHNhdmVkIGFsbAor
ICAgIG5lY2Vzc2FyeSBhc3BlY3RzIG9mIGEgcmVsYXRpb25zaGlwIGNoYW5nZS4KKworICAgIFRo
aXMgaXMgc2VwYXJhdGVkIGZyb20gYWNrbm93bGVkZ2luZyB0aGUgcmVjb3JkIGl0c2VsZgorICAg
ICh2aWEgYGRpZFNhdmVSZWNvcmRgKSBiZWNhdXNlIGEgcmVsYXRpb25zaGlwIGNoYW5nZSBjYW4K
KyAgICBpbnZvbHZlIGFzIG1hbnkgYXMgdGhyZWUgc2VwYXJhdGUgcmVjb3Jkcy4gUmVjb3JkcyBz
aG91bGQKKyAgICBvbmx5IG1vdmUgb3V0IG9mIHRoZSBpbi1mbGlnaHQgc3RhdGUgb25jZSB0aGUg
c2VydmVyIGhhcworICAgIGFja25vd2xlZGdlZCBhbGwgb2YgdGhlaXIgcmVsYXRpb25zaGlwcywg
YW5kIHRoaXMgZGlmZmVycworICAgIGJhc2VkIHVwb24gdGhlIGFkYXB0ZXIncyBzZW1hbnRpY3Mu
CisKKyAgICBUaGVyZSBhcmUgdGhyZWUgYmFzaWMgc2NlbmFyaW9zIGJ5IHdoaWNoIGFuIGFkYXB0
ZXIgY2FuCisgICAgc2F2ZSBhIHJlbGF0aW9uc2hpcC4KKworICAgICMjIyBGb3JlaWduIEtleQor
CisgICAgQW4gYWRhcHRlciBjYW4gc2F2ZSBhbGwgcmVsYXRpb25zaGlwIGNoYW5nZXMgYnkgdXBk
YXRpbmcKKyAgICBhIGZvcmVpZ24ga2V5IG9uIHRoZSBjaGlsZCByZWNvcmQuIElmIGl0IGRvZXMg
dGhpcywgaXQKKyAgICBzaG91bGQgYWNrbm93bGVkZ2UgdGhlIGNoYW5nZXMgd2hlbiB0aGUgY2hp
bGQgcmVjb3JkIGlzCisgICAgc2F2ZWQuCisKKyAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNo
aXAoZnVuY3Rpb24obmFtZSwgbWV0YSkgeworICAgICAgICAgIGlmIChtZXRhLmtpbmQgPT09ICdi
ZWxvbmdzVG8nKSB7CisgICAgICAgICAgICBzdG9yZS5kaWRVcGRhdGVSZWxhdGlvbnNoaXAocmVj
b3JkLCBuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHN0b3JlLmRp
ZFNhdmVSZWNvcmQocmVjb3JkLCBkYXRhKTsKKworICAgICMjIyBFbWJlZGRlZCBpbiBQYXJlbnQK
KworICAgIEFuIGFkYXB0ZXIgY2FuIHNhdmUgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwcyBieSBl
bWJlZGRpbmcKKyAgICBJRHMgKG9yIHJlY29yZHMpIGluIHRoZSBwYXJlbnQgb2JqZWN0LiBJbiB0
aGlzIGNhc2UsIHRoZQorICAgIHJlbGF0aW9uc2hpcCBpcyBub3QgY29uc2lkZXJlZCBhY2tub3ds
ZWRnZWQgdW50aWwgYm90aCB0aGUKKyAgICBvbGQgcGFyZW50IGFuZCBuZXcgcGFyZW50IGhhdmUg
YWNrbm93bGVkZ2VkIHRoZSBjaGFuZ2UuCisKKyAgICBJbiB0aGlzIGNhc2UsIHRoZSBhZGFwdGVy
IHNob3VsZCBrZWVwIHRyYWNrIG9mIHRoZSBvbGQKKyAgICBwYXJlbnQgYW5kIG5ldyBwYXJlbnQs
IGFuZCBhY2tub3dsZWRnZSB0aGUgcmVsYXRpb25zaGlwCisgICAgY2hhbmdlIG9uY2UgYm90aCBo
YXZlIGFja25vd2xlZGdlZC4gSWYgb25lIG9mIHRoZSB0d28KKyAgICBzaWRlcyBkb2VzIG5vdCBl
eGlzdCAoZS5nLiB0aGUgbmV3IHBhcmVudCBkb2VzIG5vdCBleGlzdAorICAgIGJlY2F1c2Ugb2Yg
bnVsbGluZyBvdXQgdGhlIGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwKSwKKyAgICB0aGUgYWRhcHRl
ciBzaG91bGQgYWNrbm93bGVkZ2UgdGhlIHJlbGF0aW9uc2hpcCBvbmNlCisgICAgdGhlIG90aGVy
IHNpZGUgaGFzIGFja25vd2xlZGdlZC4KKworICAgICMjIyBTZXBhcmF0ZSBFbnRpdHkKKworICAg
IEFuIGFkYXB0ZXIgY2FuIHNhdmUgcmVsYXRpb25zaGlwcyBhcyBzZXBhcmF0ZSBlbnRpdGllcwor
ICAgIG9uIHRoZSBzZXJ2ZXIuIEluIHRoaXMgY2FzZSwgdGhleSBzaG91bGQgYWNrbm93bGVkZ2UK
KyAgICB0aGUgcmVsYXRpb25zaGlwIGFzIHNhdmVkIG9uY2UgdGhlIHNlcnZlciBoYXMKKyAgICBh
Y2tub3dsZWRnZWQgdGhlIGVudGl0eS4KKworICAgIEBzZWUgRFMuU3RvcmUjZGlkU2F2ZVJlY29y
ZAorCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0g
cmVsYXRpb25zaGlwTmFtZQorICAqLworICBkaWRVcGRhdGVSZWxhdGlvbnNoaXA6IGZ1bmN0aW9u
KHJlY29yZCwgcmVsYXRpb25zaGlwTmFtZSkgeworICAgIHZhciByZWxhdGlvbnNoaXAgPSB0aGlz
LnJlbGF0aW9uc2hpcENoYW5nZUZvcihnZXQocmVjb3JkLCAnY2xpZW50SWQnKSwgcmVsYXRpb25z
aGlwTmFtZSk7CisgICAgLy9UT0RPKElnb3IpCisgICAgaWYgKHJlbGF0aW9uc2hpcCkgeyByZWxh
dGlvbnNoaXAuYWRhcHRlckRpZFVwZGF0ZSgpOyB9CisgIH0sCisKKyAgLyoqCisgICAgVGhpcyBh
bGxvd3MgYW4gYWRhcHRlciB0byBhY2tub3dsZWRnZSBhbGwgcmVsYXRpb25zaGlwIGNoYW5nZXMK
KyAgICBmb3IgYSBnaXZlbiByZWNvcmQuCisKKyAgICBMaWtlIGBkaWRVcGRhdGVBdHRyaWJ1dGVz
YCwgdGhpcyBpcyBpbnRlbmRlZCBhcyBhIG1pZGRsZSBncm91bmQKKyAgICBiZXR3ZWVuIGBkaWRT
YXZlUmVjb3JkYCBhbmQgZmluZS1ncmFpbmVkIGNvbnRyb2wgdmlhIHRoZQorICAgIGBkaWRVcGRh
dGVSZWxhdGlvbnNoaXBgIEFQSS4KKyAgKi8KKyAgZGlkVXBkYXRlUmVsYXRpb25zaGlwczogZnVu
Y3Rpb24ocmVjb3JkKSB7CisgICAgdmFyIGNoYW5nZXMgPSB0aGlzLnJlbGF0aW9uc2hpcENoYW5n
ZXNGb3IoZ2V0KHJlY29yZCwgJ19yZWZlcmVuY2UnKSk7CisKKyAgICBmb3IgKHZhciBuYW1lIGlu
IGNoYW5nZXMpIHsKKyAgICAgIGlmICghY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeyBj
b250aW51ZTsgfQorICAgICAgY2hhbmdlc1tuYW1lXS5hZGFwdGVyRGlkVXBkYXRlKCk7CisgICAg
fQorICB9LAorCisgIC8qKgorICAgIFdoZW4gYWNrbm93bGVkZ2luZyB0aGUgY3JlYXRpb24gb2Yg
YSBsb2NhbGx5IGNyZWF0ZWQgcmVjb3JkLAorICAgIGFkYXB0ZXJzIG11c3Qgc3VwcGx5IGFuIGlk
IChpZiB0aGV5IGRpZCBub3QgaW1wbGVtZW50CisgICAgYGdlbmVyYXRlSWRGb3JSZWNvcmRgIHRv
IGdlbmVyYXRlIGFuIGlkIGxvY2FsbHkpLgorCisgICAgSWYgYW4gYWRhcHRlciBkb2VzIG5vdCB1
c2UgYGRpZFNhdmVSZWNvcmRgIGFuZCBzdXBwbHkgYSBoYXNoCisgICAgKGZvciBleGFtcGxlLCBp
ZiBpdCBuZWVkcyB0byBtYWtlIG11bHRpcGxlIEhUVFAgcmVxdWVzdHMgdG8KKyAgICBjcmVhdGUg
YW5kIHRoZW4gdXBkYXRlIHRoZSByZWNvcmQpLCBpdCB3aWxsIG5lZWQgdG8gaW52b2tlCisgICAg
YGRpZFJlY2VpdmVJZGAgd2l0aCB0aGUgYmFja2VuZC1zdXBwbGllZCBpZC4KKworICAgIFdoZW4g
bm90IHVzaW5nIGBkaWRTYXZlUmVjb3JkYCwgYW4gYWRhcHRlciB3aWxsIG5lZWQgdG8KKyAgICBp
bnZva2U6CisKKyAgICAqIGRpZFJlY2VpdmVJZCAodW5sZXNzIHRoZSBpZCB3YXMgZ2VuZXJhdGVk
IGxvY2FsbHkpCisgICAgKiBkaWRDcmVhdGVSZWNvcmQKKyAgICAqIGRpZFVwZGF0ZUF0dHJpYnV0
ZShzKQorICAgICogZGlkVXBkYXRlUmVsYXRpb25zaGlwKHMpCisKKyAgICBAcGFyYW0ge0RTLk1v
ZGVsfSByZWNvcmQKKyAgICBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGlkCisgICovCisgIGRpZFJl
Y2VpdmVJZDogZnVuY3Rpb24ocmVjb3JkLCBpZCkgeworICAgIHZhciB0eXBlTWFwID0gdGhpcy50
eXBlTWFwRm9yKHJlY29yZC5jb25zdHJ1Y3RvciksCisgICAgICAgIGNsaWVudElkID0gZ2V0KHJl
Y29yZCwgJ2NsaWVudElkJyksCisgICAgICAgIG9sZElkID0gZ2V0KHJlY29yZCwgJ2lkJyk7CisK
KyAgICBFbWJlci5hc3NlcnQoIkFuIGFkYXB0ZXIgY2Fubm90IGFzc2lnbiBhIG5ldyBpZCB0byBh
IHJlY29yZCB0aGF0IGFscmVhZHkgaGFzIGFuIGlkLiAiICsgcmVjb3JkICsgIiBoYWQgaWQ6ICIg
KyBvbGRJZCArICIgYW5kIHlvdSB0cmllZCB0byB1cGRhdGUgaXQgd2l0aCAiICsgaWQgKyAiLiBU
aGlzIGxpa2VseSBoYXBwZW5lZCBiZWNhdXNlIHlvdXIgc2VydmVyIHJldHVybmVkIGRhdGEgaW4g
cmVzcG9uc2UgdG8gYSBmaW5kIG9yIHVwZGF0ZSB0aGF0IGhhZCBhIGRpZmZlcmVudCBpZCB0aGFu
IHRoZSBvbmUgeW91IHNlbnQuIiwgb2xkSWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gb2xkSWQp
OworCisgICAgdHlwZU1hcC5pZFRvQ2lkW2lkXSA9IGNsaWVudElkOworICAgIHRoaXMuY2xpZW50
SWRUb0lkW2NsaWVudElkXSA9IGlkOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAg
ICBUaGlzIG1ldGhvZCByZS1pbmRleGVzIHRoZSBkYXRhIGJ5IGl0cyBjbGllbnRJZCBpbiB0aGUg
c3RvcmUKKyAgICBhbmQgdGhlbiBub3RpZmllcyB0aGUgcmVjb3JkIHRoYXQgaXQgc2hvdWxkIHJl
bWF0ZXJpYWxpemUKKyAgICBpdHNlbGYuCisKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQK
KyAgICBAcGFyYW0ge09iamVjdH0gZGF0YQorICAqLworICB1cGRhdGVSZWNvcmREYXRhOiBmdW5j
dGlvbihyZWNvcmQsIGRhdGEpIHsKKyAgICB2YXIgY2xpZW50SWQgPSBnZXQocmVjb3JkLCAnY2xp
ZW50SWQnKSwKKyAgICAgICAgY2lkVG9EYXRhID0gdGhpcy5jbGllbnRJZFRvRGF0YTsKKworICAg
IGNpZFRvRGF0YVtjbGllbnRJZF0gPSBkYXRhOworCisgICAgcmVjb3JkLmRpZENoYW5nZURhdGEo
KTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgSWYgYW4gYWRhcHRlciBpbnZv
a2VzIGBkaWRTYXZlUmVjb3JkYCB3aXRoIGRhdGEsIHRoaXMgbWV0aG9kCisgICAgZXh0cmFjdHMg
dGhlIGlkIGZyb20gdGhlIHN1cHBsaWVkIGRhdGEgKHVzaW5nIHRoZSBhZGFwdGVyJ3MKKyAgICBg
ZXh0cmFjdElkKClgIG1ldGhvZCkgYW5kIGluZGV4ZXMgdGhlIGNsaWVudElkIHdpdGggdGhhdCBp
ZC4KKworICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEBwYXJhbSB7T2JqZWN0fSBk
YXRhCisgICovCisgIHVwZGF0ZUlkOiBmdW5jdGlvbihyZWNvcmQsIGRhdGEpIHsKKyAgICB2YXIg
dHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcihyZWNvcmQuY29uc3RydWN0b3IpLAorICAgICAgICBj
bGllbnRJZCA9IGdldChyZWNvcmQsICdjbGllbnRJZCcpLAorICAgICAgICBvbGRJZCA9IGdldChy
ZWNvcmQsICdpZCcpLAorICAgICAgICB0eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9yLAorICAgICAg
ICBpZCA9IHRoaXMucHJlcHJvY2Vzc0RhdGEodHlwZSwgZGF0YSk7CisKKyAgICBFbWJlci5hc3Nl
cnQoIkFuIGFkYXB0ZXIgY2Fubm90IGFzc2lnbiBhIG5ldyBpZCB0byBhIHJlY29yZCB0aGF0IGFs
cmVhZHkgaGFzIGFuIGlkLiAiICsgcmVjb3JkICsgIiBoYWQgaWQ6ICIgKyBvbGRJZCArICIgYW5k
IHlvdSB0cmllZCB0byB1cGRhdGUgaXQgd2l0aCAiICsgaWQgKyAiLiBUaGlzIGxpa2VseSBoYXBw
ZW5lZCBiZWNhdXNlIHlvdXIgc2VydmVyIHJldHVybmVkIGRhdGEgaW4gcmVzcG9uc2UgdG8gYSBm
aW5kIG9yIHVwZGF0ZSB0aGF0IGhhZCBhIGRpZmZlcmVudCBpZCB0aGFuIHRoZSBvbmUgeW91IHNl
bnQuIiwgb2xkSWQgPT09IG51bGwgfHwgaWQgPT09IG9sZElkKTsKKworICAgIHR5cGVNYXAuaWRU
b0NpZFtpZF0gPSBjbGllbnRJZDsKKyAgICB0aGlzLmNsaWVudElkVG9JZFtjbGllbnRJZF0gPSBp
ZDsKKyAgICB0aGlzLnJlZmVyZW5jZUZvckNsaWVudElkKGNsaWVudElkKS5pZCA9IGlkOworICB9
LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyBvcGFx
dWUgZGF0YSBwcm92aWRlZCBieSB0aGUgYWRhcHRlciBhbmQKKyAgICBwcmVwcm9jZXNzZXMgaXQs
IHJldHVybmluZyBhbiBJRC4KKworICAgIFRoZSBhY3R1YWwgcHJlcHJvY2Vzc2luZyB0YWtlcyBw
bGFjZSBpbiB0aGUgYWRhcHRlci4gSWYgeW91IHdvdWxkCisgICAgbGlrZSB0byBjaGFuZ2UgdGhl
IGRlZmF1bHQgYmVoYXZpb3IsIHlvdSBzaG91bGQgb3ZlcnJpZGUgdGhlCisgICAgYXBwcm9wcmlh
dGUgaG9va3MgaW4gYERTLlNlcmlhbGl6ZXJgLgorCisgICAgQHNlZSB7RFMuU2VyaWFsaXplcn0K
KyAgICBAcmV0dXJuIHtTdHJpbmd9IGlkIHRoZSBpZCByZXByZXNlbnRlZCBieSB0aGUgZGF0YQor
ICAqLworICBwcmVwcm9jZXNzRGF0YTogZnVuY3Rpb24odHlwZSwgZGF0YSkgeworICAgIHJldHVy
biB0aGlzLmFkYXB0ZXJGb3JUeXBlKHR5cGUpLmV4dHJhY3RJZCh0eXBlLCBkYXRhKTsKKyAgfSwK
KworICAvLyAuLi4uLi4uLi4uLi4uLi4uLgorICAvLyAuIFJFQ09SRCBBUlJBWVMgLgorICAvLyAu
Li4uLi4uLi4uLi4uLi4uLgorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBSZWdpc3RlciBh
IFJlY29yZEFycmF5IGZvciBhIGdpdmVuIHR5cGUgdG8gYmUgYmFja2VkIGJ5CisgICAgYSBmaWx0
ZXIgZnVuY3Rpb24uIFRoaXMgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gdXBkYXRlCisgICAgYXV0
b21hdGljYWxseSB3aGVuIHJlY29yZHMgb2YgdGhhdCB0eXBlIGNoYW5nZSBhdHRyaWJ1dGUKKyAg
ICB2YWx1ZXMgb3Igc3RhdGVzLgorCisgICAgQHBhcmFtIHtEUy5SZWNvcmRBcnJheX0gYXJyYXkK
KyAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyCisg
ICovCisgIHJlZ2lzdGVyUmVjb3JkQXJyYXk6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBmaWx0ZXIp
IHsKKyAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLnJlY29yZEFy
cmF5czsKKworICAgIHJlY29yZEFycmF5cy5wdXNoKGFycmF5KTsKKworICAgIHRoaXMudXBkYXRl
UmVjb3JkQXJyYXlGaWx0ZXIoYXJyYXksIHR5cGUsIGZpbHRlcik7CisgIH0sCisKKyAgLyoqCisg
ICAgQHByaXZhdGUKKworICAgIENyZWF0ZSBhIGBEUy5NYW55QXJyYXlgIGZvciBhIHR5cGUgYW5k
IGxpc3Qgb2YgY2xpZW50SWRzCisgICAgYW5kIGluZGV4IHRoZSBgTWFueUFycmF5YCB1bmRlciBl
YWNoIGNsaWVudElkLiBUaGlzIGFsbG93cworICAgIHVzIHRvIGVmZmljaWVudGx5IHJlbW92ZSBy
ZWNvcmRzIGZyb20gYE1hbnlBcnJheWBzIHdoZW4KKyAgICB0aGV5IGFyZSBkZWxldGVkLgorCisg
ICAgQHBhcmFtIHtDbGFzc30gdHlwZQorICAgIEBwYXJhbSB7QXJyYXl9IGNsaWVudElkcworCisg
ICAgQHJldHVybiB7RFMuTWFueUFycmF5fQorICAqLworICBjcmVhdGVNYW55QXJyYXk6IGZ1bmN0
aW9uKHR5cGUsIGNsaWVudElkcykgeworICAgIHZhciBhcnJheSA9IERTLk1hbnlBcnJheS5jcmVh
dGUoeyB0eXBlOiB0eXBlLCBjb250ZW50OiBjbGllbnRJZHMsIHN0b3JlOiB0aGlzIH0pOworCisg
ICAgY2xpZW50SWRzLmZvckVhY2goZnVuY3Rpb24oY2xpZW50SWQpIHsKKyAgICAgIHZhciByZWNv
cmRBcnJheXMgPSB0aGlzLnJlY29yZEFycmF5c0ZvckNsaWVudElkKGNsaWVudElkKTsKKyAgICAg
IHJlY29yZEFycmF5cy5hZGQoYXJyYXkpOworICAgIH0sIHRoaXMpOworCisgICAgcmV0dXJuIGFy
cmF5OworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCBpcyBp
bnZva2VkIGlmIHRoZSBgZmlsdGVyRnVuY3Rpb25gIHByb3BlcnR5IGlzCisgICAgY2hhbmdlZCBv
biBhIGBEUy5GaWx0ZXJlZFJlY29yZEFycmF5YC4KKworICAgIEl0IGVzc2VudGlhbGx5IHJlLXJ1
bnMgdGhlIGZpbHRlciBmcm9tIHNjcmF0Y2guIFRoaXMgc2FtZQorICAgIG1ldGhvZCBpcyBpbnZv
a2VkIHdoZW4gdGhlIGZpbHRlciBpcyBjcmVhdGVkIGluIHRoIGZpcnN0IHBsYWNlLgorICAqLwor
ICB1cGRhdGVSZWNvcmRBcnJheUZpbHRlcjogZnVuY3Rpb24oYXJyYXksIHR5cGUsIGZpbHRlcikg
eworICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAorICAgICAgICBjaWRU
b0RhdGEgPSB0aGlzLmNsaWVudElkVG9EYXRhLAorICAgICAgICBjbGllbnRJZHMgPSB0eXBlTWFw
LmNsaWVudElkcywKKyAgICAgICAgY2xpZW50SWQsIGRhdGEsIHNob3VsZEZpbHRlciwgcmVjb3Jk
OworCisgICAgZm9yICh2YXIgaT0wLCBsPWNsaWVudElkcy5sZW5ndGg7IGk8bDsgaSsrKSB7Cisg
ICAgICBjbGllbnRJZCA9IGNsaWVudElkc1tpXTsKKyAgICAgIHNob3VsZEZpbHRlciA9IGZhbHNl
OworCisgICAgICBkYXRhID0gY2lkVG9EYXRhW2NsaWVudElkXTsKKworICAgICAgaWYgKHR5cGVv
ZiBkYXRhID09PSAnb2JqZWN0JykgeworICAgICAgICBpZiAocmVjb3JkID0gdGhpcy5yZWNvcmRD
YWNoZVtjbGllbnRJZF0pIHsKKyAgICAgICAgICBpZiAoIWdldChyZWNvcmQsICdpc0RlbGV0ZWQn
KSkgeyBzaG91bGRGaWx0ZXIgPSB0cnVlOyB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
c2hvdWxkRmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaG91bGRGaWx0
ZXIpIHsKKyAgICAgICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5KGFycmF5LCBmaWx0ZXIsIHR5
cGUsIGNsaWVudElkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwKKworICB1cGRh
dGVSZWNvcmRBcnJheXNMYXRlcjogZnVuY3Rpb24odHlwZSwgY2xpZW50SWQpIHsKKyAgICBFbWJl
ci5ydW4ub25jZSh0aGlzLCBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMudXBkYXRlUmVjb3JkQXJy
YXlzKHR5cGUsIGNsaWVudElkKTsKKyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0
ZQorCisgICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuZXZlciBkYXRhIGlzIGxvYWRlZCBp
bnRvIHRoZSBzdG9yZQorICAgIGJ5IHRoZSBhZGFwdGVyIG9yIHVwZGF0ZWQgYnkgdGhlIGFkYXB0
ZXIsIG9yIHdoZW4gYW4gYXR0cmlidXRlCisgICAgY2hhbmdlcyBvbiBhIHJlY29yZC4KKworICAg
IEl0IHVwZGF0ZXMgYWxsIGZpbHRlcnMgdGhhdCBhIHJlY29yZCBiZWxvbmdzIHRvLgorCisgICAg
VG8gYXZvaWQgdGhyYXNoaW5nLCBpdCBvbmx5IHJ1bnMgb25jZSBwZXIgcnVuIGxvb3AgcGVyIHJl
Y29yZC4KKworICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKKyAgICBAcGFyYW0ge051bWJlcnxTdHJp
bmd9IGNsaWVudElkCisgICovCisgIHVwZGF0ZVJlY29yZEFycmF5czogZnVuY3Rpb24odHlwZSwg
Y2xpZW50SWQpIHsKKyAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy50eXBlTWFwRm9yKHR5cGUp
LnJlY29yZEFycmF5cywKKyAgICAgICAgZmlsdGVyOworCisgICAgcmVjb3JkQXJyYXlzLmZvckVh
Y2goZnVuY3Rpb24oYXJyYXkpIHsKKyAgICAgIGZpbHRlciA9IGdldChhcnJheSwgJ2ZpbHRlckZ1
bmN0aW9uJyk7CisgICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5KGFycmF5LCBmaWx0ZXIsIHR5
cGUsIGNsaWVudElkKTsKKyAgICB9LCB0aGlzKTsKKworICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwg
bWFueUFycmF5cyBjb250YWluaW5nIGFuIHVubG9hZGVkIGNvcHkgb2YgdGhpcworICAgIC8vIGNs
aWVudElkIGFuZCBub3RpZnkgdGhlbSB0aGF0IHRoZSByZWNvcmQgd2FzIGxvYWRlZC4KKyAgICB2
YXIgbWFueUFycmF5cyA9IHRoaXMubG9hZGluZ1JlY29yZEFycmF5c1tjbGllbnRJZF07CisKKyAg
ICBpZiAobWFueUFycmF5cykgeworICAgICAgZm9yICh2YXIgaT0wLCBsPW1hbnlBcnJheXMubGVu
Z3RoOyBpPGw7IGkrKykgeworICAgICAgICBtYW55QXJyYXlzW2ldLmxvYWRlZFJlY29yZCgpOwor
ICAgICAgfQorCisgICAgICB0aGlzLmxvYWRpbmdSZWNvcmRBcnJheXNbY2xpZW50SWRdID0gbnVs
bDsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFVwZGF0ZSBhbiBp
bmRpdmlkdWFsIGZpbHRlci4KKworICAgIEBwYXJhbSB7RFMuRmlsdGVyZWRSZWNvcmRBcnJheX0g
YXJyYXkKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKKyAgICBAcGFyYW0ge0NsYXNzfSB0
eXBlCisgICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBjbGllbnRJZAorICAqLworICB1cGRhdGVS
ZWNvcmRBcnJheTogZnVuY3Rpb24oYXJyYXksIGZpbHRlciwgdHlwZSwgY2xpZW50SWQpIHsKKyAg
ICB2YXIgc2hvdWxkQmVJbkFycmF5LCByZWNvcmQ7CisKKyAgICBpZiAoIWZpbHRlcikgeworICAg
ICAgc2hvdWxkQmVJbkFycmF5ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVjb3JkID0g
dGhpcy5maW5kQnlDbGllbnRJZCh0eXBlLCBjbGllbnRJZCk7CisgICAgICBzaG91bGRCZUluQXJy
YXkgPSBmaWx0ZXIocmVjb3JkKTsKKyAgICB9CisKKyAgICB2YXIgY29udGVudCA9IGdldChhcnJh
eSwgJ2NvbnRlbnQnKTsKKworICAgIHZhciByZWNvcmRBcnJheXMgPSB0aGlzLnJlY29yZEFycmF5
c0ZvckNsaWVudElkKGNsaWVudElkKTsKKyAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy5yZWZlcmVu
Y2VGb3JDbGllbnRJZChjbGllbnRJZCk7CisKKyAgICBpZiAoc2hvdWxkQmVJbkFycmF5KSB7Cisg
ICAgICByZWNvcmRBcnJheXMuYWRkKGFycmF5KTsKKyAgICAgIGFycmF5LmFkZFJlZmVyZW5jZShy
ZWZlcmVuY2UpOworICAgIH0gZWxzZSBpZiAoIXNob3VsZEJlSW5BcnJheSkgeworICAgICAgcmVj
b3JkQXJyYXlzLnJlbW92ZShhcnJheSk7CisgICAgICBhcnJheS5yZW1vdmVSZWZlcmVuY2UocmVm
ZXJlbmNlKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFdoZW4g
YSByZWNvcmQgaXMgZGVsZXRlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFsbCBpdHMKKyAgICByZWNv
cmQgYXJyYXlzLgorCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICovCisgIHJlbW92
ZUZyb21SZWNvcmRBcnJheXM6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHZhciByZWZlcmVuY2Ug
PSBnZXQocmVjb3JkLCAnX3JlZmVyZW5jZScpOworICAgIHZhciByZWNvcmRBcnJheXMgPSB0aGlz
LnJlY29yZEFycmF5c0ZvckNsaWVudElkKHJlZmVyZW5jZS5jbGllbnRJZCk7CisKKyAgICByZWNv
cmRBcnJheXMuZm9yRWFjaChmdW5jdGlvbihhcnJheSkgeworICAgICAgYXJyYXkucmVtb3ZlUmVm
ZXJlbmNlKHJlZmVyZW5jZSk7CisgICAgfSk7CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uCisg
IC8vIC4gSU5ERVhJTkcgLgorICAvLyAuLi4uLi4uLi4uLi4KKworICAvKioKKyAgICBAcHJpdmF0
ZQorCisgICAgUmV0dXJuIGEgbGlzdCBvZiBhbGwgYERTLlJlY29yZEFycmF5YHMgYSBjbGllbnRJ
ZCBpcworICAgIHBhcnQgb2YuCisKKyAgICBAcmV0dXJuIHtPYmplY3QoY2xpZW50SWQ6IEVtYmVy
Lk9yZGVyZWRTZXQpfQorICAqLworICByZWNvcmRBcnJheXNGb3JDbGllbnRJZDogZnVuY3Rpb24o
Y2xpZW50SWQpIHsKKyAgICB2YXIgcmVjb3JkQXJyYXlzID0gZ2V0KHRoaXMsICdyZWNvcmRBcnJh
eXNCeUNsaWVudElkJyk7CisgICAgdmFyIHJldCA9IHJlY29yZEFycmF5c1tjbGllbnRJZF07CisK
KyAgICBpZiAoIXJldCkgeworICAgICAgcmV0ID0gcmVjb3JkQXJyYXlzW2NsaWVudElkXSA9IEVt
YmVyLk9yZGVyZWRTZXQuY3JlYXRlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfSwK
KworICB0eXBlTWFwRm9yOiBmdW5jdGlvbih0eXBlKSB7CisgICAgdmFyIHR5cGVNYXBzID0gZ2V0
KHRoaXMsICd0eXBlTWFwcycpOworICAgIHZhciBndWlkRm9yVHlwZSA9IEVtYmVyLmd1aWRGb3Io
dHlwZSk7CisKKyAgICB2YXIgdHlwZU1hcCA9IHR5cGVNYXBzW2d1aWRGb3JUeXBlXTsKKworICAg
IGlmICh0eXBlTWFwKSB7CisgICAgICByZXR1cm4gdHlwZU1hcDsKKyAgICB9IGVsc2UgeworICAg
ICAgcmV0dXJuICh0eXBlTWFwc1tndWlkRm9yVHlwZV0gPQorICAgICAgICB7CisgICAgICAgICAg
aWRUb0NpZDoge30sCisgICAgICAgICAgY2xpZW50SWRzOiBbXSwKKyAgICAgICAgICByZWNvcmRB
cnJheXM6IFtdCisgICAgICB9KTsKKyAgICB9CisgIH0sCisKKyAgLyoqIEBwcml2YXRlCisKKyAg
ICBGb3IgYSBnaXZlbiB0eXBlIGFuZCBpZCBjb21iaW5hdGlvbiwgcmV0dXJucyB0aGUgY2xpZW50
IGlkIHVzZWQgYnkgdGhlIHN0b3JlLgorICAgIElmIG5vIGNsaWVudCBpZCBoYXMgYmVlbiBhc3Np
Z25lZCB5ZXQsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorCisgICAgQHBhcmFt
IHtEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gaWQKKyAgKi8KKyAg
Y2xpZW50SWRGb3JJZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKKyAgICBpZCA9IGNvZXJjZUlkKGlk
KTsKKworICAgIHZhciBjbGllbnRJZCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKS5pZFRvQ2lkW2lk
XTsKKyAgICBpZiAoY2xpZW50SWQgIT09IHVuZGVmaW5lZCkgeyByZXR1cm4gY2xpZW50SWQ7IH0K
KworICAgIHJldHVybiB0aGlzLnB1c2hEYXRhKFVOTE9BREVELCBpZCwgdHlwZSk7CisgIH0sCisK
KyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIFRoaXMgbWV0aG9kIHdvcmtzIGV4YWN0bHkgbGlr
ZSBgY2xpZW50SWRGb3JJZGAsIGJ1dCBkb2VzIG5vdAorICAgIHJlcXVpcmUgbG9va2luZyB1cCB0
aGUgYHR5cGVNYXBgIGZvciBldmVyeSBgY2xpZW50SWRgIGFuZAorICAgIGludm9raW5nIGEgbWV0
aG9kIHBlciBgY2xpZW50SWRgLgorICAqLworICBjbGllbnRJZHNGb3JJZHM6IGZ1bmN0aW9uKHR5
cGUsIGlkcykgeworICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAorICAg
ICAgICBpZFRvQ2xpZW50SWRNYXAgPSB0eXBlTWFwLmlkVG9DaWQ7CisKKyAgICByZXR1cm4gbWFw
KGlkcywgZnVuY3Rpb24oaWQpIHsKKyAgICAgIGlkID0gY29lcmNlSWQoaWQpOworCisgICAgICB2
YXIgY2xpZW50SWQgPSBpZFRvQ2xpZW50SWRNYXBbaWRdOworICAgICAgaWYgKGNsaWVudElkKSB7
IHJldHVybiBjbGllbnRJZDsgfQorICAgICAgcmV0dXJuIHRoaXMucHVzaERhdGEoVU5MT0FERUQs
IGlkLCB0eXBlKTsKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICB0eXBlRm9yQ2xpZW50SWQ6IGZ1
bmN0aW9uKGNsaWVudElkKSB7CisgICAgcmV0dXJuIHRoaXMuY2xpZW50SWRUb1R5cGVbY2xpZW50
SWRdOworICB9LAorCisgIGlkRm9yQ2xpZW50SWQ6IGZ1bmN0aW9uKGNsaWVudElkKSB7CisgICAg
cmV0dXJuIHRoaXMuY2xpZW50SWRUb0lkW2NsaWVudElkXTsKKyAgfSwKKworICAvLyAuLi4uLi4u
Li4uLi4uLi4uCisgIC8vIC4gTE9BRElORyBEQVRBIC4KKyAgLy8gLi4uLi4uLi4uLi4uLi4uLgor
CisgIC8qKgorICAgIExvYWQgbmV3IGRhdGEgaW50byB0aGUgc3RvcmUgZm9yIGEgZ2l2ZW4gaWQg
YW5kIHR5cGUgY29tYmluYXRpb24uCisgICAgSWYgZGF0YSBmb3IgdGhhdCByZWNvcmQgaGFkIGJl
ZW4gbG9hZGVkIHByZXZpb3VzbHksIHRoZSBuZXcgaW5mb3JtYXRpb24KKyAgICBvdmVyd3JpdGVz
IHRoZSBvbGQuCisKKyAgICBJZiB0aGUgcmVjb3JkIHlvdSBhcmUgbG9hZGluZyBkYXRhIGZvciBo
YXMgb3V0c3RhbmRpbmcgY2hhbmdlcyB0aGF0IGhhdmUgbm90CisgICAgeWV0IGJlZW4gc2F2ZWQs
IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKworICAgIEBwYXJhbSB7RFMuTW9kZWx9IHR5
cGUKKyAgICBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGlkCisgICAgQHBhcmFtIHtPYmplY3R9IGRh
dGEgdGhlIGRhdGEgdG8gbG9hZAorICAqLworICBsb2FkOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBw
cmVtYXRlcmlhbGl6ZWQpIHsKKyAgICB2YXIgaWQ7CisKKyAgICBpZiAodHlwZW9mIGRhdGEgPT09
ICdudW1iZXInIHx8IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgeworICAgICAgaWQgPSBkYXRh
OworICAgICAgZGF0YSA9IHByZW1hdGVyaWFsaXplZDsKKyAgICAgIHByZW1hdGVyaWFsaXplZCA9
IG51bGw7CisgICAgfQorCisgICAgaWYgKHByZW1hdGVyaWFsaXplZCAmJiBwcmVtYXRlcmlhbGl6
ZWQuaWQpIHsKKyAgICAgIGlkID0gcHJlbWF0ZXJpYWxpemVkLmlkOworICAgIH0gZWxzZSBpZiAo
aWQgPT09IHVuZGVmaW5lZCkgeworICAgICAgaWQgPSB0aGlzLnByZXByb2Nlc3NEYXRhKHR5cGUs
IGRhdGEpOworICAgIH0KKworICAgIGlkID0gY29lcmNlSWQoaWQpOworCisgICAgdmFyIHR5cGVN
YXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSksCisgICAgICAgIGNpZFRvRGF0YSA9IHRoaXMuY2xp
ZW50SWRUb0RhdGEsCisgICAgICAgIGNsaWVudElkID0gdHlwZU1hcC5pZFRvQ2lkW2lkXSwKKyAg
ICAgICAgY2lkVG9QcmVtYXRlcmlhbGl6ZWQgPSB0aGlzLmNsaWVudElkVG9QcmVtYXRlcmlhbGl6
ZWREYXRhOworCisgICAgaWYgKGNsaWVudElkICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGNpZFRv
RGF0YVtjbGllbnRJZF0gPSBkYXRhOworICAgICAgY2lkVG9QcmVtYXRlcmlhbGl6ZWRbY2xpZW50
SWRdID0gcHJlbWF0ZXJpYWxpemVkOworCisgICAgICB2YXIgcmVjb3JkID0gdGhpcy5yZWNvcmRD
YWNoZVtjbGllbnRJZF07CisgICAgICBpZiAocmVjb3JkKSB7CisgICAgICAgIG9uY2UocmVjb3Jk
LCAnbG9hZGVkRGF0YScpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjbGllbnRJZCA9
IHRoaXMucHVzaERhdGEoZGF0YSwgaWQsIHR5cGUpOworICAgICAgY2lkVG9QcmVtYXRlcmlhbGl6
ZWRbY2xpZW50SWRdID0gcHJlbWF0ZXJpYWxpemVkOworICAgIH0KKworICAgIHRoaXMudXBkYXRl
UmVjb3JkQXJyYXlzTGF0ZXIodHlwZSwgY2xpZW50SWQpOworCisgICAgcmV0dXJuIHRoaXMucmVm
ZXJlbmNlRm9yQ2xpZW50SWQoY2xpZW50SWQpOworICB9LAorCisgIHByZW1hdGVyaWFsaXplOiBm
dW5jdGlvbihyZWZlcmVuY2UsIHByZW1hdGVyaWFsaXplZCkgeworICAgIHRoaXMuY2xpZW50SWRU
b1ByZW1hdGVyaWFsaXplZERhdGFbcmVmZXJlbmNlLmNsaWVudElkXSA9IHByZW1hdGVyaWFsaXpl
ZDsKKyAgfSwKKworICBsb2FkTWFueTogZnVuY3Rpb24odHlwZSwgaWRzLCBkYXRhTGlzdCkgewor
ICAgIGlmIChkYXRhTGlzdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBkYXRhTGlzdCA9IGlkczsK
KyAgICAgIGlkcyA9IG1hcChkYXRhTGlzdCwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICByZXR1
cm4gdGhpcy5wcmVwcm9jZXNzRGF0YSh0eXBlLCBkYXRhKTsKKyAgICAgIH0sIHRoaXMpOworICAg
IH0KKworICAgIHJldHVybiBtYXAoaWRzLCBmdW5jdGlvbihpZCwgaSkgeworICAgICAgcmV0dXJu
IHRoaXMubG9hZCh0eXBlLCBpZCwgZGF0YUxpc3RbaV0pOworICAgIH0sIHRoaXMpOworICB9LAor
CisgIGxvYWRIYXNNYW55OiBmdW5jdGlvbihyZWNvcmQsIGtleSwgaWRzKSB7CisgICAgcmVjb3Jk
Lm1hdGVyaWFsaXplSGFzTWFueShrZXksIGlkcyk7CisKKyAgICAvLyBVcGRhdGUgYW55IGV4aXN0
aW5nIG1hbnkgYXJyYXlzIHRoYXQgdXNlIHRoZSBwcmV2aW91cyBJRHMsCisgICAgLy8gaWYgbmVj
ZXNzYXJ5LgorICAgIHJlY29yZC5oYXNNYW55RGlkQ2hhbmdlKGtleSk7CisKKyAgICB2YXIgcmVs
YXRpb25zaGlwID0gcmVjb3JkLmNhY2hlRm9yKGtleSk7CisKKyAgICAvLyBUT0RPICh0b21kYWxl
KSB0aGlzIGFzc3VtZXMgdGhhdCBsb2FkSGFzTWFueSAqYWx3YXlzKiBtZWFucworICAgIC8vIHRo
YXQgdGhlIHJlY29yZHMgZm9yIHRoZSBwcm92aWRlZCBJRHMgYXJlIGxvYWRlZC4KKyAgICBpZiAo
cmVsYXRpb25zaGlwKSB7IHNldChyZWxhdGlvbnNoaXAsICdpc0xvYWRlZCcsIHRydWUpOyB9Cisg
IH0sCisKKyAgLyoqIEBwcml2YXRlCisKKyAgICBTdG9yZXMgZGF0YSBmb3IgdGhlIHNwZWNpZmll
ZCB0eXBlIGFuZCBpZCBjb21iaW5hdGlvbiBhbmQgcmV0dXJucworICAgIHRoZSBjbGllbnQgaWQu
CisKKyAgICBAcGFyYW0ge09iamVjdH0gZGF0YQorICAgIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0g
aWQKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSB0eXBlCisgICAgQHJldHVybnMge051bWJlcn0KKyAg
Ki8KKyAgcHVzaERhdGE6IGZ1bmN0aW9uKGRhdGEsIGlkLCB0eXBlKSB7CisgICAgdmFyIHR5cGVN
YXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSk7CisKKyAgICB2YXIgaWRUb0NsaWVudElkTWFwID0g
dHlwZU1hcC5pZFRvQ2lkLAorICAgICAgICBjbGllbnRJZFRvSWRNYXAgPSB0aGlzLmNsaWVudElk
VG9JZCwKKyAgICAgICAgY2xpZW50SWRUb1R5cGVNYXAgPSB0aGlzLmNsaWVudElkVG9UeXBlLAor
ICAgICAgICBjbGllbnRJZHMgPSB0eXBlTWFwLmNsaWVudElkcywKKyAgICAgICAgY2lkVG9EYXRh
ID0gdGhpcy5jbGllbnRJZFRvRGF0YTsKKworICAgIEVtYmVyLmFzc2VydCgnVGhlIGlkICcgKyBp
ZCArICcgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggYW5vdGhlciByZWNvcmQgb2YgdHlwZSAn
ICsgdHlwZS50b1N0cmluZygpICsgJy4nLCAhaWQgfHwgIWlkVG9DbGllbnRJZE1hcFtpZF0pOwor
CisgICAgdmFyIGNsaWVudElkID0gKyt0aGlzLmNsaWVudElkQ291bnRlcjsKKworICAgIGNpZFRv
RGF0YVtjbGllbnRJZF0gPSBkYXRhOworICAgIGNsaWVudElkVG9UeXBlTWFwW2NsaWVudElkXSA9
IHR5cGU7CisKKyAgICAvLyBpZiB3ZSdyZSBjcmVhdGluZyBhbiBpdGVtLCB0aGlzIHByb2Nlc3Mg
d2lsbCBiZSBkb25lCisgICAgLy8gbGF0ZXIsIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBwZXJz
aXN0ZWQuCisgICAgaWYgKGlkKSB7CisgICAgICBpZFRvQ2xpZW50SWRNYXBbaWRdID0gY2xpZW50
SWQ7CisgICAgICBjbGllbnRJZFRvSWRNYXBbY2xpZW50SWRdID0gaWQ7CisgICAgfQorCisgICAg
Y2xpZW50SWRzLnB1c2goY2xpZW50SWQpOworCisgICAgcmV0dXJuIGNsaWVudElkOworICB9LAor
CisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIC4gUkVDT1JEIE1BVEVSSUFM
SVpBVElPTiAuCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKyAgbWF0ZXJpYWxp
emVSZWNvcmQ6IGZ1bmN0aW9uKHR5cGUsIGNsaWVudElkLCBpZCkgeworICAgIHZhciByZWNvcmQ7
CisKKyAgICB0aGlzLnJlY29yZENhY2hlW2NsaWVudElkXSA9IHJlY29yZCA9IHR5cGUuX2NyZWF0
ZSh7CisgICAgICBzdG9yZTogdGhpcywKKyAgICAgIGNsaWVudElkOiBjbGllbnRJZAorICAgIH0p
OworCisgICAgc2V0KHJlY29yZCwgJ2lkJywgaWQpOworCisgICAgZ2V0KHRoaXMsICdkZWZhdWx0
VHJhbnNhY3Rpb24nKS5hZG9wdFJlY29yZChyZWNvcmQpOworCisgICAgcmVjb3JkLmxvYWRpbmdE
YXRhKCk7CisgICAgcmV0dXJuIHJlY29yZDsKKyAgfSwKKworICBkZW1hdGVyaWFsaXplUmVjb3Jk
OiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICB2YXIgaWQgPSBnZXQocmVjb3JkLCAnaWQnKSwKKyAg
ICAgICAgY2xpZW50SWQgPSBnZXQocmVjb3JkLCAnY2xpZW50SWQnKSwKKyAgICAgICAgdHlwZSA9
IHRoaXMudHlwZUZvckNsaWVudElkKGNsaWVudElkKSwKKyAgICAgICAgdHlwZU1hcCA9IHRoaXMu
dHlwZU1hcEZvcih0eXBlKTsKKworICAgIHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXMoKTsKKwor
ICAgIGRlbGV0ZSB0aGlzLnJlY29yZENhY2hlW2NsaWVudElkXTsKKyAgICBkZWxldGUgdGhpcy5j
bGllbnRJZFRvSWRbY2xpZW50SWRdOworICAgIGRlbGV0ZSB0aGlzLmNsaWVudElkVG9UeXBlW2Ns
aWVudElkXTsKKyAgICBkZWxldGUgdGhpcy5jbGllbnRJZFRvRGF0YVtjbGllbnRJZF07CisgICAg
ZGVsZXRlIHRoaXMucmVjb3JkQXJyYXlzQnlDbGllbnRJZFtjbGllbnRJZF07CisKKyAgICBpZiAo
aWQpIHsgZGVsZXRlIHR5cGVNYXAuaWRUb0NpZFtpZF07IH0KKyAgfSwKKworICB3aWxsRGVzdHJv
eTogZnVuY3Rpb24oKSB7CisgICAgaWYgKGdldChEUywgJ2RlZmF1bHRTdG9yZScpID09PSB0aGlz
KSB7CisgICAgICBzZXQoRFMsICdkZWZhdWx0U3RvcmUnLCBudWxsKTsKKyAgICB9CisgIH0sCisK
KyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIC4gUkVMQVRJT05TSElQIENIQU5H
RVMgLgorICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworICBhZGRSZWxhdGlvbnNoaXBD
aGFuZ2VGb3I6IGZ1bmN0aW9uKGNsaWVudFJlZmVyZW5jZSwgY2hpbGRLZXksIHBhcmVudFJlZmVy
ZW5jZSwgcGFyZW50S2V5LCBjaGFuZ2UpIHsKKyAgICB2YXIgY2xpZW50SWQgPSBjbGllbnRSZWZl
cmVuY2UuY2xpZW50SWQsCisgICAgICAgIHBhcmVudENsaWVudElkID0gcGFyZW50UmVmZXJlbmNl
ID8gcGFyZW50UmVmZXJlbmNlLmNsaWVudElkIDogcGFyZW50UmVmZXJlbmNlOworICAgIHZhciBr
ZXkgPSBjaGlsZEtleSArIHBhcmVudEtleTsKKyAgICB2YXIgY2hhbmdlcyA9IHRoaXMucmVsYXRp
b25zaGlwQ2hhbmdlczsKKyAgICBpZiAoIShjbGllbnRJZCBpbiBjaGFuZ2VzKSkgeworICAgICAg
Y2hhbmdlc1tjbGllbnRJZF0gPSB7fTsKKyAgICB9CisgICAgaWYgKCEocGFyZW50Q2xpZW50SWQg
aW4gY2hhbmdlc1tjbGllbnRJZF0pKSB7CisgICAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRD
bGllbnRJZF0gPSB7fTsKKyAgICB9CisgICAgaWYgKCEoa2V5IGluIGNoYW5nZXNbY2xpZW50SWRd
W3BhcmVudENsaWVudElkXSkpIHsKKyAgICAgIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVu
dElkXVtrZXldID0ge307CisgICAgfQorICAgIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVu
dElkXVtrZXldW2NoYW5nZS5jaGFuZ2VUeXBlXSA9IGNoYW5nZTsKKyAgfSwKKworICByZW1vdmVS
ZWxhdGlvbnNoaXBDaGFuZ2VGb3I6IGZ1bmN0aW9uKGNsaWVudFJlZmVyZW5jZSwgY2hpbGRLZXks
IHBhcmVudFJlZmVyZW5jZSwgcGFyZW50S2V5LCB0eXBlKSB7CisgICAgdmFyIGNsaWVudElkID0g
Y2xpZW50UmVmZXJlbmNlLmNsaWVudElkLAorICAgICAgICBwYXJlbnRDbGllbnRJZCA9IHBhcmVu
dFJlZmVyZW5jZSA/IHBhcmVudFJlZmVyZW5jZS5jbGllbnRJZCA6IHBhcmVudFJlZmVyZW5jZTsK
KyAgICB2YXIgY2hhbmdlcyA9IHRoaXMucmVsYXRpb25zaGlwQ2hhbmdlczsKKyAgICB2YXIga2V5
ID0gY2hpbGRLZXkgKyBwYXJlbnRLZXk7CisgICAgaWYgKCEoY2xpZW50SWQgaW4gY2hhbmdlcykg
fHwgIShwYXJlbnRDbGllbnRJZCBpbiBjaGFuZ2VzW2NsaWVudElkXSkgfHwgIShrZXkgaW4gY2hh
bmdlc1tjbGllbnRJZF1bcGFyZW50Q2xpZW50SWRdKSl7CisgICAgICByZXR1cm47CisgICAgfQor
ICAgIGRlbGV0ZSBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XVt0eXBlXTsK
KyAgfSwKKworICByZWxhdGlvbnNoaXBDaGFuZ2VGb3I6IGZ1bmN0aW9uKGNsaWVudElkLCBjaGls
ZEtleSwgcGFyZW50Q2xpZW50SWQsIHBhcmVudEtleSwgdHlwZSkgeworICAgIHZhciBjaGFuZ2Vz
ID0gdGhpcy5yZWxhdGlvbnNoaXBDaGFuZ2VzOworICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBh
cmVudEtleTsKKyAgICBpZiAoIShjbGllbnRJZCBpbiBjaGFuZ2VzKSB8fCAhKHBhcmVudENsaWVu
dElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSl7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlm
KHR5cGUpeworICAgICAgcmV0dXJuIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtr
ZXldW3R5cGVdOworICAgIH0KKyAgICBlbHNleworICAgICAgLy9UT0RPKElnb3IpIHdoYXQgaWYg
Ym90aCBwcmVzZW50CisgICAgICByZXR1cm4gY2hhbmdlc1tjbGllbnRJZF1bcGFyZW50Q2xpZW50
SWRdW2tleV1bImFkZCJdIHx8IGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtrZXld
WyJyZW1vdmUiXTsKKyAgICB9CisgIH0sCisKKyAgcmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3I6
IGZ1bmN0aW9uKHJlZmVyZW5jZSl7CisgICAgdmFyIHRvUmV0dXJuID0gW107CisKKyAgICBpZigg
IXJlZmVyZW5jZSApIHsgcmV0dXJuIHRvUmV0dXJuOyB9CisKKyAgICAvL1RPRE8oSWdvcikgV2hh
dCBhYm91dCB0aGUgb3RoZXIgc2lkZQorICAgIHZhciBjaGFuZ2VzT2JqZWN0ID0gdGhpcy5yZWxh
dGlvbnNoaXBDaGFuZ2VzW3JlZmVyZW5jZS5jbGllbnRJZF07CisgICAgZm9yICh2YXIgb2JqS2V5
IGluIGNoYW5nZXNPYmplY3QpeworICAgICAgaWYoY2hhbmdlc09iamVjdC5oYXNPd25Qcm9wZXJ0
eShvYmpLZXkpKXsKKyAgICAgICAgZm9yICh2YXIgY2hhbmdlS2V5IGluIGNoYW5nZXNPYmplY3Rb
b2JqS2V5XSl7CisgICAgICAgICAgaWYoY2hhbmdlc09iamVjdFtvYmpLZXldLmhhc093blByb3Bl
cnR5KGNoYW5nZUtleSkpeworICAgICAgICAgICAgdG9SZXR1cm4ucHVzaChjaGFuZ2VzT2JqZWN0
W29iaktleV1bY2hhbmdlS2V5XSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiB0b1JldHVybjsKKyAgfSwKKworICByZWxhdGlvbnNoaXBDaGFuZ2Vz
Rm9yOiBmdW5jdGlvbihyZWZlcmVuY2UpIHsKKyAgICB2YXIgdG9SZXR1cm4gPSBbXTsKKworICAg
IGlmKCAhcmVmZXJlbmNlICkgeyByZXR1cm4gdG9SZXR1cm47IH0KKworICAgIHZhciByZWxhdGlv
bnNoaXBQYWlycyA9IHRoaXMucmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3IocmVmZXJlbmNlKTsK
KyAgICBmb3JFYWNoKHJlbGF0aW9uc2hpcFBhaXJzLCBmdW5jdGlvbihwYWlyKXsKKyAgICAgIHZh
ciBhZGRlZENoYW5nZSA9IHBhaXJbImFkZCJdOworICAgICAgdmFyIHJlbW92ZWRDaGFuZ2UgPSBw
YWlyWyJyZW1vdmUiXTsKKyAgICAgIGlmKGFkZGVkQ2hhbmdlKXsKKyAgICAgICAgdG9SZXR1cm4u
cHVzaChhZGRlZENoYW5nZSk7CisgICAgICB9CisgICAgICBpZihyZW1vdmVkQ2hhbmdlKXsKKyAg
ICAgICAgdG9SZXR1cm4ucHVzaChyZW1vdmVkQ2hhbmdlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAg
ICByZXR1cm4gdG9SZXR1cm47CisgIH0sCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAg
Ly8gLiBQRVItVFlQRSBBREFQVEVSUworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKyAg
YWRhcHRlckZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICB0aGlzLl9hZGFwdGVyc01hcCA9
IHRoaXMuY3JlYXRlSW5zdGFuY2VNYXBGb3IoJ2FkYXB0ZXJzJyk7CisKKyAgICB2YXIgYWRhcHRl
ciA9IHRoaXMuX2FkYXB0ZXJzTWFwLmdldCh0eXBlKTsKKyAgICBpZiAoYWRhcHRlcikgeyByZXR1
cm4gYWRhcHRlcjsgfQorCisgICAgcmV0dXJuIHRoaXMuZ2V0KCdfYWRhcHRlcicpOworICB9LAor
CisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyAuIFJFQ09SRCBDSEFO
R0UgTk9USUZJQ0FUSU9OIC4KKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisK
KyAgcmVjb3JkQXR0cmlidXRlRGlkQ2hhbmdlOiBmdW5jdGlvbihyZWZlcmVuY2UsIGF0dHJpYnV0
ZU5hbWUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSkgeworICAgIHZhciByZWNvcmQgPSB0aGlzLnJlY29y
ZEZvclJlZmVyZW5jZShyZWZlcmVuY2UpLAorICAgICAgICBkaXJ0eVNldCA9IG5ldyBFbWJlci5P
cmRlcmVkU2V0KCksCisgICAgICAgIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3JUeXBlKHJlY29y
ZC5jb25zdHJ1Y3Rvcik7CisKKyAgICBpZiAoYWRhcHRlci5kaXJ0eVJlY29yZHNGb3JBdHRyaWJ1
dGVDaGFuZ2UpIHsKKyAgICAgIGFkYXB0ZXIuZGlydHlSZWNvcmRzRm9yQXR0cmlidXRlQ2hhbmdl
KGRpcnR5U2V0LCByZWNvcmQsIGF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7Cisg
ICAgfQorCisgICAgZGlydHlTZXQuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIHJl
Y29yZC5hZGFwdGVyRGlkRGlydHkoKTsKKyAgICB9KTsKKyAgfSwKKworICByZWNvcmRCZWxvbmdz
VG9EaWRDaGFuZ2U6IGZ1bmN0aW9uKGRpcnR5U2V0LCBjaGlsZCwgcmVsYXRpb25zaGlwKSB7Cisg
ICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3JUeXBlKGNoaWxkLmNvbnN0cnVjdG9yKTsK
KworICAgIGlmIChhZGFwdGVyLmRpcnR5UmVjb3Jkc0ZvckJlbG9uZ3NUb0NoYW5nZSkgeworICAg
ICAgYWRhcHRlci5kaXJ0eVJlY29yZHNGb3JCZWxvbmdzVG9DaGFuZ2UoZGlydHlTZXQsIGNoaWxk
LCByZWxhdGlvbnNoaXApOworICAgIH0KKworICAgIC8vIGFkYXB0ZXJEaWREaXJ0eSBpcyBjYWxs
ZWQgYnkgdGhlIFJlbGF0aW9uc2hpcENoYW5nZSB0aGF0IGNyZWF0ZWQKKyAgICAvLyB0aGUgZGly
dHlTZXQuCisgIH0sCisKKyAgcmVjb3JkSGFzTWFueURpZENoYW5nZTogZnVuY3Rpb24oZGlydHlT
ZXQsIHBhcmVudCwgcmVsYXRpb25zaGlwKSB7CisgICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0
ZXJGb3JUeXBlKHBhcmVudC5jb25zdHJ1Y3Rvcik7CisKKyAgICBpZiAoYWRhcHRlci5kaXJ0eVJl
Y29yZHNGb3JIYXNNYW55Q2hhbmdlKSB7CisgICAgICBhZGFwdGVyLmRpcnR5UmVjb3Jkc0Zvckhh
c01hbnlDaGFuZ2UoZGlydHlTZXQsIHBhcmVudCwgcmVsYXRpb25zaGlwKTsKKyAgICB9CisKKyAg
ICAvLyBhZGFwdGVyRGlkRGlydHkgaXMgY2FsbGVkIGJ5IHRoZSBSZWxhdGlvbnNoaXBDaGFuZ2Ug
dGhhdCBjcmVhdGVkCisgICAgLy8gdGhlIGRpcnR5U2V0LgorICB9Cit9KTsKKworRFMuU3RvcmUu
cmVvcGVuQ2xhc3MoeworICByZWdpc3RlckFkYXB0ZXI6IERTLl9NYXBwYWJsZS5nZW5lcmF0ZU1h
cEZ1bmN0aW9uRm9yKCdhZGFwdGVycycsIGZ1bmN0aW9uKHR5cGUsIGFkYXB0ZXIsIG1hcCkgewor
ICAgIG1hcC5zZXQodHlwZSwgYWRhcHRlcik7CisgIH0pLAorCisgIHRyYW5zZm9ybU1hcEtleTog
ZnVuY3Rpb24oa2V5KSB7CisgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7CisgICAg
ICB2YXIgdHJhbnNmb3JtZWRLZXk7CisgICAgICB0cmFuc2Zvcm1lZEtleSA9IGdldChFbWJlci5s
b29rdXAsIGtleSk7CisgICAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIG1vZGVsIGF0
IHBhdGggIiArIGtleSwgdHJhbnNmb3JtZWRLZXkpOworICAgICAgcmV0dXJuIHRyYW5zZm9ybWVk
S2V5OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4ga2V5OworICAgIH0KKyAgfSwKKworICB0
cmFuc2Zvcm1NYXBWYWx1ZTogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgIGlmIChFbWJlci5P
YmplY3QuZGV0ZWN0KHZhbHVlKSkgeworICAgICAgcmV0dXJuIHZhbHVlLmNyZWF0ZSgpOworICAg
IH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rp
b24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGd1aWRGb3IgPSBF
bWJlci5ndWlkRm9yLAorICAgIG9uY2UgPSBFbWJlci5ydW4ub25jZSwgYXJyYXlNYXAgPSBFbWJl
ci5BcnJheVBvbHlmaWxscy5tYXA7CisKKy8qKgorICBUaGlzIGZpbGUgZW5jYXBzdWxhdGVzIHRo
ZSB2YXJpb3VzIHN0YXRlcyB0aGF0IGEgcmVjb3JkIGNhbiB0cmFuc2l0aW9uCisgIHRocm91Z2gg
ZHVyaW5nIGl0cyBsaWZlY3ljbGUuCisKKyAgIyMjIFN0YXRlIE1hbmFnZXIKKworICBBIHJlY29y
ZCdzIHN0YXRlIG1hbmFnZXIgZXhwbGljaXRseSB0cmFja3Mgd2hhdCBzdGF0ZSBhIHJlY29yZCBp
cyBpbgorICBhdCBhbnkgZ2l2ZW4gdGltZS4gRm9yIGluc3RhbmNlLCBpZiBhIHJlY29yZCBpcyBu
ZXdseSBjcmVhdGVkIGFuZCBoYXMKKyAgbm90IHlldCBiZWVuIHNlbnQgdG8gdGhlIGFkYXB0ZXIg
dG8gYmUgc2F2ZWQsIGl0IHdvdWxkIGJlIGluIHRoZQorICBgY3JlYXRlZC51bmNvbW1pdHRlZGAg
c3RhdGUuICBJZiBhIHJlY29yZCBoYXMgaGFkIGxvY2FsIG1vZGlmaWNhdGlvbnMKKyAgbWFkZSB0
byBpdCB0aGF0IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzYXZlZCwgdGhlIHJlY29yZCB3
b3VsZCBiZQorICBpbiB0aGUgYHVwZGF0ZWQuaW5GbGlnaHRgIHN0YXRlLiAoVGhlc2Ugc3RhdGUg
cGF0aHMgd2lsbCBiZSBleHBsYWluZWQKKyAgaW4gbW9yZSBkZXRhaWwgYmVsb3cuKQorCisgIEV2
ZW50cyBhcmUgc2VudCBieSB0aGUgcmVjb3JkIG9yIGl0cyBzdG9yZSB0byB0aGUgcmVjb3JkJ3Mg
c3RhdGUgbWFuYWdlci4KKyAgSG93IHRoZSBzdGF0ZSBtYW5hZ2VyIHJlYWN0cyB0byB0aGVzZSBl
dmVudHMgaXMgZGVwZW5kZW50IG9uIHdoaWNoIHN0YXRlCisgIGl0IGlzIGluLiBJbiBzb21lIHN0
YXRlcywgY2VydGFpbiBldmVudHMgd2lsbCBiZSBpbnZhbGlkIGFuZCB3aWxsIGNhdXNlCisgIGFu
IGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCisKKyAgU3RhdGVzIGFyZSBoaWVyYXJjaGljYWwuIEZv
ciBleGFtcGxlLCBhIHJlY29yZCBjYW4gYmUgaW4gdGhlCisgIGBkZWxldGVkLnN0YXJ0YCBzdGF0
ZSwgdGhlbiB0cmFuc2l0aW9uIGludG8gdGhlIGBkZWxldGVkLmluRmxpZ2h0YCBzdGF0ZS4KKyAg
SWYgYSBjaGlsZCBzdGF0ZSBkb2VzIG5vdCBpbXBsZW1lbnQgYW4gZXZlbnQgaGFuZGxlciwgdGhl
IHN0YXRlIG1hbmFnZXIKKyAgd2lsbCBhdHRlbXB0IHRvIGludm9rZSB0aGUgZXZlbnQgb24gYWxs
IHBhcmVudCBzdGF0ZXMgdW50aWwgdGhlIHJvb3Qgc3RhdGUgaXMKKyAgcmVhY2hlZC4gVGhlIHN0
YXRlIGhpZXJhcmNoeSBvZiBhIHJlY29yZCBpcyBkZXNjcmliZWQgaW4gdGVybXMgb2YgYSBwYXRo
CisgIHN0cmluZy4gWW91IGNhbiBkZXRlcm1pbmUgYSByZWNvcmQncyBjdXJyZW50IHN0YXRlIGJ5
IGdldHRpbmcgaXRzIG1hbmFnZXIncworICBjdXJyZW50IHN0YXRlIHBhdGg6CisKKyAgICAgIHJl
Y29yZC5nZXQoJ3N0YXRlTWFuYWdlci5jdXJyZW50UGF0aCcpOworICAgICAgLy89PiAiY3JlYXRl
ZC51bmNvbW1pdHRlZCIKKworICBUaGUgYERTLk1vZGVsYCBzdGF0ZXMgYXJlIHRoZW1zZWx2ZXMg
c3RhdGVsZXNzLiBXaGF0IHdlIG1lYW4gaXMgdGhhdCwKKyAgdGhvdWdoIGVhY2ggaW5zdGFuY2Ug
b2YgYSByZWNvcmQgYWxzbyBoYXMgYSB1bmlxdWUgaW5zdGFuY2Ugb2YgYQorICBgRFMuU3RhdGVN
YW5hZ2VyYCwgdGhlIGhpZXJhcmNoaWNhbCBzdGF0ZXMgdGhhdCBlYWNoIG9mICp0aG9zZSogcG9p
bnRzCisgIHRvIGlzIGEgc2hhcmVkIGRhdGEgc3RydWN0dXJlLiBGb3IgcGVyZm9ybWFuY2UgcmVh
c29ucywgaW5zdGVhZCBvZiBlYWNoCisgIHJlY29yZCBnZXR0aW5nIGl0cyBvd24gY29weSBvZiB0
aGUgaGllcmFyY2h5IG9mIHN0YXRlcywgZWFjaCBzdGF0ZQorICBtYW5hZ2VyIHBvaW50cyB0byB0
aGlzIGdsb2JhbCwgaW1tdXRhYmxlIHNoYXJlZCBpbnN0YW5jZS4gSG93IGRvZXMgYQorICBzdGF0
ZSBrbm93IHdoaWNoIHJlY29yZCBpdCBzaG91bGQgYmUgYWN0aW5nIG9uPyAgV2UgcGFzcyBhIHJl
ZmVyZW5jZSB0bworICB0aGUgY3VycmVudCBzdGF0ZSBtYW5hZ2VyIGFzIHRoZSBmaXJzdCBwYXJh
bWV0ZXIgdG8gZXZlcnkgbWV0aG9kIGludm9rZWQKKyAgb24gYSBzdGF0ZS4KKworICBUaGUgc3Rh
dGUgbWFuYWdlciBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB3aGVyZSB5b3Ugc2hv
dWxkIHN0YXNoCisgIHN0YXRlIGFib3V0IHRoZSByZWNvcmQgaWYgbmVlZGVkOyB5b3Ugc2hvdWxk
IG5ldmVyIHN0b3JlIGRhdGEgb24gdGhlIHN0YXRlCisgIG9iamVjdCBpdHNlbGYuIElmIHlvdSBu
ZWVkIGFjY2VzcyB0byB0aGUgcmVjb3JkIGJlaW5nIGFjdGVkIG9uLCB5b3UgY2FuCisgIHJldHJp
ZXZlIHRoZSBzdGF0ZSBtYW5hZ2VyJ3MgYHJlY29yZGAgcHJvcGVydHkuIEZvciBleGFtcGxlLCBp
ZiB5b3UgaGFkCisgIGFuIGV2ZW50IGhhbmRsZXIgYG15RXZlbnRgOgorCisgICAgICBteUV2ZW50
OiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICAgIHZhciByZWNvcmQgPSBtYW5hZ2VyLmdldCgn
cmVjb3JkJyk7CisgICAgICAgIHJlY29yZC5kb1NvbWV0aGluZygpOworICAgICAgfQorCisgIEZv
ciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHN0YXRlIG1hbmFnZXJzIGluIGdlbmVyYWwsIHNlZSB0
aGUgRW1iZXIuanMKKyAgZG9jdW1lbnRhdGlvbiBvbiBgRW1iZXIuU3RhdGVNYW5hZ2VyYC4KKwor
ICAjIyMgRXZlbnRzLCBGbGFncywgYW5kIFRyYW5zaXRpb25zCisKKyAgQSBzdGF0ZSBtYXkgaW1w
bGVtZW50IHplcm8gb3IgbW9yZSBldmVudHMsIGZsYWdzLCBvciB0cmFuc2l0aW9ucy4KKworICAj
IyMjIEV2ZW50cworCisgIEV2ZW50cyBhcmUgbmFtZWQgZnVuY3Rpb25zIHRoYXQgYXJlIGludm9r
ZWQgd2hlbiBzZW50IHRvIGEgcmVjb3JkLiBUaGUKKyAgc3RhdGUgbWFuYWdlciB3aWxsIGZpcnN0
IGxvb2sgZm9yIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgb24gdGhlCisgIGN1cnJlbnQg
c3RhdGUuIElmIG5vIG1ldGhvZCBpcyBmb3VuZCwgaXQgd2lsbCBzZWFyY2ggdGhlIGN1cnJlbnQg
c3RhdGUncworICBwYXJlbnQsIGFuZCB0aGVuIGl0cyBncmFuZHBhcmVudCwgYW5kIHNvIG9uIHVu
dGlsIHJlYWNoaW5nIHRoZSB0b3Agb2YKKyAgdGhlIGhpZXJhcmNoeS4gSWYgdGhlIHJvb3QgaXMg
cmVhY2hlZCB3aXRob3V0IGFuIGV2ZW50IGhhbmRsZXIgYmVpbmcgZm91bmQsCisgIGFuIGV4Y2Vw
dGlvbiB3aWxsIGJlIHJhaXNlZC4gVGhpcyBjYW4gYmUgdmVyeSBoZWxwZnVsIHdoZW4gZGVidWdn
aW5nIG5ldworICBmZWF0dXJlcy4KKworICBIZXJlJ3MgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlv
biBvZiBhIHN0YXRlIHdpdGggYSBgbXlFdmVudGAgZXZlbnQgaGFuZGxlcjoKKworICAgICAgYVN0
YXRlOiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAgICBteUV2ZW50OiBmdW5jdGlvbihtYW5hZ2Vy
LCBwYXJhbSkgeworICAgICAgICAgIGNvbnNvbGUubG9nKCJSZWNlaXZlZCBteUV2ZW50IHdpdGgg
IitwYXJhbSk7CisgICAgICAgIH0KKyAgICAgIH0pCisKKyAgVG8gdHJpZ2dlciB0aGlzIGV2ZW50
OgorCisgICAgICByZWNvcmQuc2VuZCgnbXlFdmVudCcsICdmb28nKTsKKyAgICAgIC8vPT4gIlJl
Y2VpdmVkIG15RXZlbnQgd2l0aCBmb28iCisKKyAgTm90ZSB0aGF0IGFuIG9wdGlvbmFsIHBhcmFt
ZXRlciBjYW4gYmUgc2VudCB0byBhIHJlY29yZCdzIGBzZW5kKClgIG1ldGhvZCwKKyAgd2hpY2gg
d2lsbCBiZSBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gdGhlIGV2ZW50IGhhbmRs
ZXIuCisKKyAgRXZlbnRzIHNob3VsZCB0cmFuc2l0aW9uIHRvIGEgZGlmZmVyZW50IHN0YXRlIGlm
IGFwcHJvcHJpYXRlLiBUaGlzIGNhbiBiZQorICBkb25lIGJ5IGNhbGxpbmcgdGhlIHN0YXRlIG1h
bmFnZXIncyBgdHJhbnNpdGlvblRvKClgIG1ldGhvZCB3aXRoIGEgcGF0aCB0byB0aGUKKyAgZGVz
aXJlZCBzdGF0ZS4gVGhlIHN0YXRlIG1hbmFnZXIgd2lsbCBhdHRlbXB0IHRvIHJlc29sdmUgdGhl
IHN0YXRlIHBhdGgKKyAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc3RhdGUuIElmIG5vIHN0YXRl
IGlzIGZvdW5kIGF0IHRoYXQgcGF0aCwgaXQgd2lsbAorICBhdHRlbXB0IHRvIHJlc29sdmUgaXQg
cmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc3RhdGUncyBwYXJlbnQsIGFuZCB0aGVuIGl0cworICBw
YXJlbnQsIGFuZCBzbyBvbiB1bnRpbCB0aGUgcm9vdCBpcyByZWFjaGVkLiBGb3IgZXhhbXBsZSwg
aW1hZ2luZSBhIGhpZXJhcmNoeQorICBsaWtlIHRoaXM6CisKKyAgICAgICogY3JlYXRlZAorICAg
ICAgICAqIHN0YXJ0IDwtLSBjdXJyZW50U3RhdGUKKyAgICAgICAgKiBpbkZsaWdodAorICAgICAg
KiB1cGRhdGVkCisgICAgICAgICogaW5GbGlnaHQKKworICBJZiB3ZSBhcmUgY3VycmVudGx5IGlu
IHRoZSBgc3RhcnRgIHN0YXRlLCBjYWxsaW5nCisgIGB0cmFuc2l0aW9uVG8oJ2luRmxpZ2h0Jylg
IHdvdWxkIHRyYW5zaXRpb24gdG8gdGhlIGBjcmVhdGVkLmluRmxpZ2h0YCBzdGF0ZSwKKyAgd2hp
bGUgY2FsbGluZyBgdHJhbnNpdGlvblRvKCd1cGRhdGVkLmluRmxpZ2h0JylgIHdvdWxkIHRyYW5z
aXRpb24gdG8KKyAgdGhlIGB1cGRhdGVkLmluRmxpZ2h0YCBzdGF0ZS4KKworICBSZW1lbWJlciB0
aGF0ICpvbmx5IGV2ZW50cyogc2hvdWxkIGV2ZXIgY2F1c2UgYSBzdGF0ZSB0cmFuc2l0aW9uLiBZ
b3Ugc2hvdWxkCisgIG5ldmVyIGNhbGwgYHRyYW5zaXRpb25UbygpYCBmcm9tIG91dHNpZGUgYSBz
dGF0ZSdzIGV2ZW50IGhhbmRsZXIuIElmIHlvdSBhcmUKKyAgdGVtcHRlZCB0byBkbyBzbywgY3Jl
YXRlIGEgbmV3IGV2ZW50IGFuZCBzZW5kIHRoYXQgdG8gdGhlIHN0YXRlIG1hbmFnZXIuCisKKyAg
IyMjIyBGbGFncworCisgIEZsYWdzIGFyZSBCb29sZWFuIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2Vk
IHRvIGludHJvc3BlY3QgYSByZWNvcmQncyBjdXJyZW50CisgIHN0YXRlIGluIGEgbW9yZSB1c2Vy
LWZyaWVuZGx5IHdheSB0aGFuIGV4YW1pbmluZyBpdHMgc3RhdGUgcGF0aC4gRm9yIGV4YW1wbGUs
CisgIGluc3RlYWQgb2YgZG9pbmcgdGhpczoKKworICAgICAgdmFyIHN0YXRlUGF0aCA9IHJlY29y
ZC5nZXQoJ3N0YXRlTWFuYWdlci5jdXJyZW50UGF0aCcpOworICAgICAgaWYgKHN0YXRlUGF0aCA9
PT0gJ2NyZWF0ZWQuaW5GbGlnaHQnKSB7CisgICAgICAgIGRvU29tZXRoaW5nKCk7CisgICAgICB9
CisKKyAgWW91IGNhbiBzYXk6CisKKyAgICAgIGlmIChyZWNvcmQuZ2V0KCdpc05ldycpICYmIHJl
Y29yZC5nZXQoJ2lzU2F2aW5nJykpIHsKKyAgICAgICAgZG9Tb21ldGhpbmcoKTsKKyAgICAgIH0K
KworICBJZiB5b3VyIHN0YXRlIGRvZXMgbm90IHNldCBhIHZhbHVlIGZvciBhIGdpdmVuIGZsYWcs
IHRoZSB2YWx1ZSB3aWxsCisgIGJlIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgKG9yIHRoZSBm
aXJzdCBwbGFjZSBpbiB0aGUgc3RhdGUgaGllcmFyY2h5CisgIHdoZXJlIGl0IGlzIGRlZmluZWQp
LgorCisgIFRoZSBjdXJyZW50IHNldCBvZiBmbGFncyBhcmUgZGVmaW5lZCBiZWxvdy4gSWYgeW91
IHdhbnQgdG8gYWRkIGEgbmV3IGZsYWcsCisgIGluIGFkZGl0aW9uIHRvIHRoZSBhcmVhIGJlbG93
LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gZGVjbGFyZSBpdCBpbiB0aGUKKyAgYERTLk1vZGVsYCBj
bGFzcy4KKworICAjIyMjIFRyYW5zaXRpb25zCisKKyAgVHJhbnNpdGlvbnMgYXJlIGxpa2UgZXZl
bnQgaGFuZGxlcnMgYnV0IGFyZSBjYWxsZWQgYXV0b21hdGljYWxseSB1cG9uCisgIGVudGVyaW5n
IG9yIGV4aXRpbmcgYSBzdGF0ZS4gVG8gaW1wbGVtZW50IGEgdHJhbnNpdGlvbiwganVzdCBjYWxs
IGEgbWV0aG9kCisgIGVpdGhlciBgZW50ZXJgIG9yIGBleGl0YDoKKworICAgICAgbXlTdGF0ZTog
RFMuU3RhdGUuY3JlYXRlKHsKKyAgICAgICAgLy8gR2V0cyBjYWxsZWQgYXV0b21hdGljYWxseSB3
aGVuIGVudGVyaW5nCisgICAgICAgIC8vIHRoaXMgc3RhdGUuCisgICAgICAgIGVudGVyOiBmdW5j
dGlvbihtYW5hZ2VyKSB7CisgICAgICAgICAgY29uc29sZS5sb2coIkVudGVyZWQgbXlTdGF0ZSIp
OworICAgICAgICB9CisgICAgICB9KQorCisgICBOb3RlIHRoYXQgZW50ZXIgYW5kIGV4aXQgZXZl
bnRzIGFyZSBjYWxsZWQgb25jZSBwZXIgdHJhbnNpdGlvbi4gSWYgdGhlCisgICBjdXJyZW50IHN0
YXRlIGNoYW5nZXMsIGJ1dCBjaGFuZ2VzIHRvIGFub3RoZXIgY2hpbGQgc3RhdGUgb2YgdGhlIHBh
cmVudCwKKyAgIHRoZSB0cmFuc2l0aW9uIGV2ZW50IG9uIHRoZSBwYXJlbnQgd2lsbCBub3QgYmUg
dHJpZ2dlcmVkLgorKi8KKwordmFyIHN0YXRlUHJvcGVydHkgPSBFbWJlci5jb21wdXRlZChmdW5j
dGlvbihrZXkpIHsKKyAgdmFyIHBhcmVudCA9IGdldCh0aGlzLCAncGFyZW50U3RhdGUnKTsKKyAg
aWYgKHBhcmVudCkgeworICAgIHJldHVybiBnZXQocGFyZW50LCBrZXkpOworICB9Cit9KS5wcm9w
ZXJ0eSgpOworCit2YXIgaXNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uKG9iamVjdCkgeworICBmb3Ig
KHZhciBuYW1lIGluIG9iamVjdCkgeworICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkobmFt
ZSkpIHsgcmV0dXJuIGZhbHNlOyB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK307CisKK3ZhciBo
YXNEZWZpbmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uKG9iamVjdCkgeworICBmb3IgKHZhciBuYW1l
IGluIG9iamVjdCkgeworICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgb2Jq
ZWN0W25hbWVdKSB7IHJldHVybiB0cnVlOyB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9Owor
Cit2YXIgZGlkQ2hhbmdlRGF0YSA9IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgdmFyIHJlY29yZCA9
IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7CisgIHJlY29yZC5tYXRlcmlhbGl6ZURhdGEoKTsKK307
CisKK3ZhciB3aWxsU2V0UHJvcGVydHkgPSBmdW5jdGlvbihtYW5hZ2VyLCBjb250ZXh0KSB7Cisg
IGNvbnRleHQub2xkVmFsdWUgPSBnZXQoZ2V0KG1hbmFnZXIsICdyZWNvcmQnKSwgY29udGV4dC5u
YW1lKTsKKworICB2YXIgY2hhbmdlID0gRFMuQXR0cmlidXRlQ2hhbmdlLmNyZWF0ZUNoYW5nZShj
b250ZXh0KTsKKyAgZ2V0KG1hbmFnZXIsICdyZWNvcmQnKS5fY2hhbmdlc1RvU3luY1tjb250ZXh0
LmF0dHJpYnV0ZU5hbWVdID0gY2hhbmdlOworfTsKKwordmFyIGRpZFNldFByb3BlcnR5ID0gZnVu
Y3Rpb24obWFuYWdlciwgY29udGV4dCkgeworICB2YXIgY2hhbmdlID0gZ2V0KG1hbmFnZXIsICdy
ZWNvcmQnKS5fY2hhbmdlc1RvU3luY1tjb250ZXh0LmF0dHJpYnV0ZU5hbWVdOworICBjaGFuZ2Uu
dmFsdWUgPSBnZXQoZ2V0KG1hbmFnZXIsICdyZWNvcmQnKSwgY29udGV4dC5uYW1lKTsKKyAgY2hh
bmdlLnN5bmMoKTsKK307CisKKy8vIFdoZW5ldmVyIGEgcHJvcGVydHkgaXMgc2V0LCByZWNvbXB1
dGUgYWxsIGRlcGVuZGVudCBmaWx0ZXJzCit2YXIgdXBkYXRlUmVjb3JkQXJyYXlzID0gZnVuY3Rp
b24obWFuYWdlcikgeworICB2YXIgcmVjb3JkID0gbWFuYWdlci5nZXQoJ3JlY29yZCcpOworICBy
ZWNvcmQudXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXIoKTsKK307CisKK0RTLlN0YXRlID0gRW1iZXIu
U3RhdGUuZXh0ZW5kKHsKKyAgaXNMb2FkZWQ6IHN0YXRlUHJvcGVydHksCisgIGlzUmVsb2FkaW5n
OiBzdGF0ZVByb3BlcnR5LAorICBpc0RpcnR5OiBzdGF0ZVByb3BlcnR5LAorICBpc1NhdmluZzog
c3RhdGVQcm9wZXJ0eSwKKyAgaXNEZWxldGVkOiBzdGF0ZVByb3BlcnR5LAorICBpc0Vycm9yOiBz
dGF0ZVByb3BlcnR5LAorICBpc05ldzogc3RhdGVQcm9wZXJ0eSwKKyAgaXNWYWxpZDogc3RhdGVQ
cm9wZXJ0eSwKKworICAvLyBGb3Igc3RhdGVzIHRoYXQgYXJlIHN1YnN0YXRlcyBvZiBhCisgIC8v
IERpcnR5U3RhdGUgKHVwZGF0ZWQgb3IgY3JlYXRlZCksIGl0IGlzCisgIC8vIHVzZWZ1bCB0byBi
ZSBhYmxlIHRvIGRldGVybWluZSB3aGljaAorICAvLyB0eXBlIG9mIGRpcnR5IHN0YXRlIGl0IGlz
LgorICBkaXJ0eVR5cGU6IHN0YXRlUHJvcGVydHkKK30pOworCisvLyBJbXBsZW1lbnRhdGlvbiBu
b3RlczoKKy8vCisvLyBFYWNoIHN0YXRlIGhhcyBhIGJvb2xlYW4gdmFsdWUgZm9yIGFsbCBvZiB0
aGUgZm9sbG93aW5nIGZsYWdzOgorLy8KKy8vICogaXNMb2FkZWQ6IFRoZSByZWNvcmQgaGFzIGEg
cG9wdWxhdGVkIGBkYXRhYCBwcm9wZXJ0eS4gV2hlbiBhCisvLyAgIHJlY29yZCBpcyBsb2FkZWQg
dmlhIGBzdG9yZS5maW5kYCwgYGlzTG9hZGVkYCBpcyBmYWxzZQorLy8gICB1bnRpbCB0aGUgYWRh
cHRlciBzZXRzIGl0LiBXaGVuIGEgcmVjb3JkIGlzIGNyZWF0ZWQgbG9jYWxseSwKKy8vICAgaXRz
IGBpc0xvYWRlZGAgcHJvcGVydHkgaXMgYWx3YXlzIHRydWUuCisvLyAqIGlzRGlydHk6IFRoZSBy
ZWNvcmQgaGFzIGxvY2FsIGNoYW5nZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgorLy8gICBzYXZl
ZCBieSB0aGUgYWRhcHRlci4gVGhpcyBpbmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuCisv
LyAgIGNyZWF0ZWQgKGJ1dCBub3QgeWV0IHNhdmVkKSBvciBkZWxldGVkLgorLy8gKiBpc1Nhdmlu
ZzogVGhlIHJlY29yZCdzIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZCwgYnV0CisvLyAg
IHRoZSBhZGFwdGVyIGhhcyBub3QgeWV0IGFja25vd2xlZGdlZCB0aGF0IHRoZSBjaGFuZ2VzIGhh
dmUKKy8vICAgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIGJhY2tlbmQuCisvLyAqIGlzRGVsZXRlZDog
VGhlIHJlY29yZCB3YXMgbWFya2VkIGZvciBkZWxldGlvbi4gV2hlbiBgaXNEZWxldGVkYAorLy8g
ICBpcyB0cnVlIGFuZCBgaXNEaXJ0eWAgaXMgdHJ1ZSwgdGhlIHJlY29yZCBpcyBkZWxldGVkIGxv
Y2FsbHkKKy8vICAgYnV0IHRoZSBkZWxldGlvbiB3YXMgbm90IHlldCBwZXJzaXN0ZWQuIFdoZW4g
YGlzU2F2aW5nYCBpcworLy8gICB0cnVlLCB0aGUgY2hhbmdlIGlzIGluLWZsaWdodC4gV2hlbiBi
b3RoIGBpc0RpcnR5YCBhbmQKKy8vICAgYGlzU2F2aW5nYCBhcmUgZmFsc2UsIHRoZSBjaGFuZ2Ug
aGFzIHBlcnNpc3RlZC4KKy8vICogaXNFcnJvcjogVGhlIGFkYXB0ZXIgcmVwb3J0ZWQgdGhhdCBp
dCB3YXMgdW5hYmxlIHRvIHNhdmUKKy8vICAgbG9jYWwgY2hhbmdlcyB0byB0aGUgYmFja2VuZC4g
VGhpcyBtYXkgYWxzbyByZXN1bHQgaW4gdGhlCisvLyAgIHJlY29yZCBoYXZpbmcgaXRzIGBpc1Zh
bGlkYCBwcm9wZXJ0eSBiZWNvbWUgZmFsc2UgaWYgdGhlCisvLyAgIGFkYXB0ZXIgcmVwb3J0ZWQg
dGhhdCBzZXJ2ZXItc2lkZSB2YWxpZGF0aW9ucyBmYWlsZWQuCisvLyAqIGlzTmV3OiBUaGUgcmVj
b3JkIHdhcyBjcmVhdGVkIG9uIHRoZSBjbGllbnQgYW5kIHRoZSBhZGFwdGVyCisvLyAgIGRpZCBu
b3QgeWV0IHJlcG9ydCB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQuCisvLyAqIGlzVmFs
aWQ6IE5vIGNsaWVudC1zaWRlIHZhbGlkYXRpb25zIGhhdmUgZmFpbGVkIGFuZCB0aGUKKy8vICAg
YWRhcHRlciBkaWQgbm90IHJlcG9ydCBhbnkgc2VydmVyLXNpZGUgdmFsaWRhdGlvbiBmYWlsdXJl
cy4KKworLy8gVGhlIGRpcnR5IHN0YXRlIGlzIGEgYWJzdHJhY3Qgc3RhdGUgd2hvc2UgZnVuY3Rp
b25hbGl0eSBpcworLy8gc2hhcmVkIGJldHdlZW4gdGhlIGBjcmVhdGVkYCBhbmQgYHVwZGF0ZWRg
IHN0YXRlcy4KKy8vCisvLyBUaGUgZGVsZXRlZCBzdGF0ZSBzaGFyZXMgdGhlIGBpc0RpcnR5YCBm
bGFnIHdpdGggdGhlCisvLyBzdWJjbGFzc2VzIG9mIGBEaXJ0eVN0YXRlYCwgYnV0IHdpdGggYSB2
ZXJ5IGRpZmZlcmVudAorLy8gaW1wbGVtZW50YXRpb24uCisvLworLy8gRGlydHkgc3RhdGVzIGhh
dmUgdGhyZWUgY2hpbGQgc3RhdGVzOgorLy8KKy8vIGB1bmNvbW1pdHRlZGA6IHRoZSBzdG9yZSBo
YXMgbm90IHlldCBoYW5kZWQgb2ZmIHRoZSByZWNvcmQKKy8vICAgdG8gYmUgc2F2ZWQuCisvLyBg
aW5GbGlnaHRgOiB0aGUgc3RvcmUgaGFzIGhhbmRlZCBvZmYgdGhlIHJlY29yZCB0byBiZSBzYXZl
ZCwKKy8vICAgYnV0IHRoZSBhZGFwdGVyIGhhcyBub3QgeWV0IGFja25vd2xlZGdlZCBzdWNjZXNz
LgorLy8gYGludmFsaWRgOiB0aGUgcmVjb3JkIGhhcyBpbnZhbGlkIGluZm9ybWF0aW9uIGFuZCBj
YW5ub3QgYmUKKy8vICAgc2VuZCB0byB0aGUgYWRhcHRlciB5ZXQuCit2YXIgRGlydHlTdGF0ZSA9
IERTLlN0YXRlLmV4dGVuZCh7CisgIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywKKworICAv
LyBGTEFHUworICBpc0RpcnR5OiB0cnVlLAorCisgIC8vIFNVQlNUQVRFUworCisgIC8vIFdoZW4g
YSByZWNvcmQgZmlyc3QgYmVjb21lcyBkaXJ0eSwgaXQgaXMgYHVuY29tbWl0dGVkYC4KKyAgLy8g
VGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBsb2NhbCBwZW5kaW5nIGNoYW5nZXMsIGJ1dCB0aGV5
CisgIC8vIGhhdmUgbm90IHlldCBiZWd1biB0byBiZSBzYXZlZCwgYW5kIGFyZSBub3QgaW52YWxp
ZC4KKyAgdW5jb21taXR0ZWQ6IERTLlN0YXRlLmV4dGVuZCh7CisgICAgLy8gVFJBTlNJVElPTlMK
KyAgICBlbnRlcjogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgdmFyIGRpcnR5VHlwZSA9IGdl
dCh0aGlzLCAnZGlydHlUeXBlJyksCisgICAgICAgICAgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdy
ZWNvcmQnKTsKKworICAgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbiAodCkgewor
ICAgICAgICB0LnJlY29yZEJlY2FtZURpcnR5KGRpcnR5VHlwZSwgcmVjb3JkKTsKKyAgICAgIH0p
OworICAgIH0sCisKKyAgICAvLyBFVkVOVFMKKyAgICB3aWxsU2V0UHJvcGVydHk6IHdpbGxTZXRQ
cm9wZXJ0eSwKKyAgICBkaWRTZXRQcm9wZXJ0eTogZGlkU2V0UHJvcGVydHksCisKKyAgICBiZWNv
bWVEaXJ0eTogRW1iZXIuSywKKworICAgIHdpbGxDb21taXQ6IGZ1bmN0aW9uKG1hbmFnZXIpIHsK
KyAgICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdpbkZsaWdodCcpOworICAgIH0sCisKKyAgICBi
ZWNhbWVDbGVhbjogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgdmFyIHJlY29yZCA9IGdldCht
YW5hZ2VyLCAncmVjb3JkJyksCisgICAgICAgICAgZGlydHlUeXBlID0gZ2V0KHRoaXMsICdkaXJ0
eVR5cGUnKTsKKworICAgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbih0KSB7Cisg
ICAgICAgIHQucmVjb3JkQmVjYW1lQ2xlYW4oZGlydHlUeXBlLCByZWNvcmQpOworICAgICAgfSk7
CisKKyAgICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdsb2FkZWQubWF0ZXJpYWxpemluZycpOwor
ICAgIH0sCisKKyAgICBiZWNhbWVJbnZhbGlkOiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICB2
YXIgZGlydHlUeXBlID0gZ2V0KHRoaXMsICdkaXJ0eVR5cGUnKSwKKyAgICAgICAgICByZWNvcmQg
PSBnZXQobWFuYWdlciwgJ3JlY29yZCcpOworCisgICAgICByZWNvcmQud2l0aFRyYW5zYWN0aW9u
KGZ1bmN0aW9uICh0KSB7CisgICAgICAgIHQucmVjb3JkQmVjYW1lSW5GbGlnaHQoZGlydHlUeXBl
LCByZWNvcmQpOworICAgICAgfSk7CisKKyAgICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdpbnZh
bGlkJyk7CisgICAgfSwKKworICAgIHJvbGxiYWNrOiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAg
ICBnZXQobWFuYWdlciwgJ3JlY29yZCcpLnJvbGxiYWNrKCk7CisgICAgfQorICB9KSwKKworICAv
LyBPbmNlIGEgcmVjb3JkIGhhcyBiZWVuIGhhbmRlZCBvZmYgdG8gdGhlIGFkYXB0ZXIgdG8gYmUK
KyAgLy8gc2F2ZWQsIGl0IGlzIGluIHRoZSAnaW4gZmxpZ2h0JyBzdGF0ZS4gQ2hhbmdlcyB0byB0
aGUKKyAgLy8gcmVjb3JkIGNhbm5vdCBiZSBtYWRlIGR1cmluZyB0aGlzIHdpbmRvdy4KKyAgaW5G
bGlnaHQ6IERTLlN0YXRlLmV4dGVuZCh7CisgICAgLy8gRkxBR1MKKyAgICBpc1NhdmluZzogdHJ1
ZSwKKworICAgIC8vIFRSQU5TSVRJT05TCisgICAgZW50ZXI6IGZ1bmN0aW9uKG1hbmFnZXIpIHsK
KyAgICAgIHZhciBkaXJ0eVR5cGUgPSBnZXQodGhpcywgJ2RpcnR5VHlwZScpLAorICAgICAgICAg
IHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7CisKKyAgICAgIHJlY29yZC5iZWNhbWVJ
bkZsaWdodCgpOworCisgICAgICByZWNvcmQud2l0aFRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7
CisgICAgICAgIHQucmVjb3JkQmVjYW1lSW5GbGlnaHQoZGlydHlUeXBlLCByZWNvcmQpOworICAg
ICAgfSk7CisgICAgfSwKKworICAgIC8vIEVWRU5UUworICAgIGRpZENvbW1pdDogZnVuY3Rpb24o
bWFuYWdlcikgeworICAgICAgdmFyIGRpcnR5VHlwZSA9IGdldCh0aGlzLCAnZGlydHlUeXBlJyks
CisgICAgICAgICAgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKKworICAgICAgcmVj
b3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbih0KSB7CisgICAgICAgIHQucmVjb3JkQmVjYW1l
Q2xlYW4oJ2luZmxpZ2h0JywgcmVjb3JkKTsKKyAgICAgIH0pOworCisgICAgICBtYW5hZ2VyLnRy
YW5zaXRpb25Ubygnc2F2ZWQnKTsKKyAgICAgIG1hbmFnZXIuc2VuZCgnaW52b2tlTGlmZWN5Y2xl
Q2FsbGJhY2tzJywgZGlydHlUeXBlKTsKKyAgICB9LAorCisgICAgYmVjYW1lSW52YWxpZDogZnVu
Y3Rpb24obWFuYWdlciwgZXJyb3JzKSB7CisgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIs
ICdyZWNvcmQnKTsKKworICAgICAgc2V0KHJlY29yZCwgJ2Vycm9ycycsIGVycm9ycyk7CisKKyAg
ICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdpbnZhbGlkJyk7CisgICAgICBtYW5hZ2VyLnNlbmQo
J2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOworICAgIH0sCisKKyAgICBiZWNhbWVFcnJvcjog
ZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2Vycm9yJyk7
CisgICAgICBtYW5hZ2VyLnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOworICAgIH0K
KyAgfSksCisKKyAgLy8gQSByZWNvcmQgaXMgaW4gdGhlIGBpbnZhbGlkYCBzdGF0ZSB3aGVuIGl0
cyBjbGllbnQtc2lkZQorICAvLyBpbnZhbGlkYXRpb25zIGhhdmUgZmFpbGVkLCBvciBpZiB0aGUg
YWRhcHRlciBoYXMgaW5kaWNhdGVkCisgIC8vIHRoZSB0aGUgcmVjb3JkIGZhaWxlZCBzZXJ2ZXIt
c2lkZSBpbnZhbGlkYXRpb25zLgorICBpbnZhbGlkOiBEUy5TdGF0ZS5leHRlbmQoeworICAgIC8v
IEZMQUdTCisgICAgaXNWYWxpZDogZmFsc2UsCisKKyAgICBleGl0OiBmdW5jdGlvbihtYW5hZ2Vy
KSB7CisgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKKworICAgICAg
cmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbiAodCkgeworICAgICAgICB0LnJlY29yZEJl
Y2FtZUNsZWFuKCdpbmZsaWdodCcsIHJlY29yZCk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAg
Ly8gRVZFTlRTCisgICAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICBt
YW5hZ2VyLnRyYW5zaXRpb25UbygnZGVsZXRlZCcpOworICAgICAgZ2V0KG1hbmFnZXIsICdyZWNv
cmQnKS5jbGVhclJlbGF0aW9uc2hpcHMoKTsKKyAgICB9LAorCisgICAgd2lsbFNldFByb3BlcnR5
OiB3aWxsU2V0UHJvcGVydHksCisKKyAgICBkaWRTZXRQcm9wZXJ0eTogZnVuY3Rpb24obWFuYWdl
ciwgY29udGV4dCkgeworICAgICAgdmFyIHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyks
CisgICAgICAgICAgZXJyb3JzID0gZ2V0KHJlY29yZCwgJ2Vycm9ycycpLAorICAgICAgICAgIGtl
eSA9IGNvbnRleHQubmFtZTsKKworICAgICAgc2V0KGVycm9ycywga2V5LCBudWxsKTsKKworICAg
ICAgaWYgKCFoYXNEZWZpbmVkUHJvcGVydGllcyhlcnJvcnMpKSB7CisgICAgICAgIG1hbmFnZXIu
c2VuZCgnYmVjYW1lVmFsaWQnKTsKKyAgICAgIH0KKworICAgICAgZGlkU2V0UHJvcGVydHkobWFu
YWdlciwgY29udGV4dCk7CisgICAgfSwKKworICAgIGJlY29tZURpcnR5OiBFbWJlci5LLAorCisg
ICAgcm9sbGJhY2s6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgIG1hbmFnZXIuc2VuZCgnYmVj
YW1lVmFsaWQnKTsKKyAgICAgIG1hbmFnZXIuc2VuZCgncm9sbGJhY2snKTsKKyAgICB9LAorCisg
ICAgYmVjYW1lVmFsaWQ6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgIG1hbmFnZXIudHJhbnNp
dGlvblRvKCd1bmNvbW1pdHRlZCcpOworICAgIH0sCisKKyAgICBpbnZva2VMaWZlY3ljbGVDYWxs
YmFja3M6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdl
ciwgJ3JlY29yZCcpOworICAgICAgcmVjb3JkLnRyaWdnZXIoJ2JlY2FtZUludmFsaWQnLCByZWNv
cmQpOworICAgIH0KKyAgfSkKK30pOworCisvLyBUaGUgY3JlYXRlZCBhbmQgdXBkYXRlZCBzdGF0
ZXMgYXJlIGNyZWF0ZWQgb3V0c2lkZSB0aGUgc3RhdGUKKy8vIGNoYXJ0IHNvIHdlIGNhbiByZW9w
ZW4gdGhlaXIgc3Vic3RhdGVzIGFuZCBhZGQgbWl4aW5zIGFzCisvLyBuZWNlc3NhcnkuCisKK3Zh
ciBjcmVhdGVkU3RhdGUgPSBEaXJ0eVN0YXRlLmNyZWF0ZSh7CisgIGRpcnR5VHlwZTogJ2NyZWF0
ZWQnLAorCisgIC8vIEZMQUdTCisgIGlzTmV3OiB0cnVlCit9KTsKKwordmFyIHVwZGF0ZWRTdGF0
ZSA9IERpcnR5U3RhdGUuY3JlYXRlKHsKKyAgZGlydHlUeXBlOiAndXBkYXRlZCcKK30pOworCitj
cmVhdGVkU3RhdGUuc3RhdGVzLnVuY29tbWl0dGVkLnJlb3Blbih7CisgIGRlbGV0ZVJlY29yZDog
ZnVuY3Rpb24obWFuYWdlcikgeworICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29y
ZCcpOworCisgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbih0KSB7CisgICAgICB0
LnJlY29yZElzTW92aW5nKCdjcmVhdGVkJywgcmVjb3JkKTsKKyAgICB9KTsKKworICAgIHJlY29y
ZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKKyAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygnZGVsZXRl
ZC5zYXZlZCcpOworICB9Cit9KTsKKworY3JlYXRlZFN0YXRlLnN0YXRlcy51bmNvbW1pdHRlZC5y
ZW9wZW4oeworICByb2xsYmFjazogZnVuY3Rpb24obWFuYWdlcikgeworICAgIHRoaXMuX3N1cGVy
KG1hbmFnZXIpOworICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdkZWxldGVkLnNhdmVkJyk7Cisg
IH0KK30pOworCit1cGRhdGVkU3RhdGUuc3RhdGVzLnVuY29tbWl0dGVkLnJlb3Blbih7CisgIGRl
bGV0ZVJlY29yZDogZnVuY3Rpb24obWFuYWdlcikgeworICAgIHZhciByZWNvcmQgPSBnZXQobWFu
YWdlciwgJ3JlY29yZCcpOworCisgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbih0
KSB7CisgICAgICB0LnJlY29yZElzTW92aW5nKCd1cGRhdGVkJywgcmVjb3JkKTsKKyAgICB9KTsK
KworICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdkZWxldGVkJyk7CisgICAgZ2V0KG1hbmFnZXIs
ICdyZWNvcmQnKS5jbGVhclJlbGF0aW9uc2hpcHMoKTsKKyAgfQorfSk7CisKK3ZhciBzdGF0ZXMg
PSB7CisgIHJvb3RTdGF0ZTogRW1iZXIuU3RhdGUuY3JlYXRlKHsKKyAgICAvLyBGTEFHUworICAg
IGlzTG9hZGVkOiBmYWxzZSwKKyAgICBpc1JlbG9hZGluZzogZmFsc2UsCisgICAgaXNEaXJ0eTog
ZmFsc2UsCisgICAgaXNTYXZpbmc6IGZhbHNlLAorICAgIGlzRGVsZXRlZDogZmFsc2UsCisgICAg
aXNFcnJvcjogZmFsc2UsCisgICAgaXNOZXc6IGZhbHNlLAorICAgIGlzVmFsaWQ6IHRydWUsCisK
KyAgICAvLyBTVUJTVEFURVMKKworICAgIC8vIEEgcmVjb3JkIGJlZ2lucyBpdHMgbGlmZWN5Y2xl
IGluIHRoZSBgZW1wdHlgIHN0YXRlLgorICAgIC8vIElmIGl0cyBkYXRhIHdpbGwgY29tZSBmcm9t
IHRoZSBhZGFwdGVyLCBpdCB3aWxsCisgICAgLy8gdHJhbnNpdGlvbiBpbnRvIHRoZSBgbG9hZGlu
Z2Agc3RhdGUuIE90aGVyd2lzZSwgaWYKKyAgICAvLyB0aGUgcmVjb3JkIGlzIGJlaW5nIGNyZWF0
ZWQgb24gdGhlIGNsaWVudCwgaXQgd2lsbAorICAgIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGNy
ZWF0ZWRgIHN0YXRlLgorICAgIGVtcHR5OiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAgLy8gRVZF
TlRTCisgICAgICBsb2FkaW5nRGF0YTogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgICBtYW5h
Z2VyLnRyYW5zaXRpb25UbygnbG9hZGluZycpOworICAgICAgfSwKKworICAgICAgbG9hZGVkRGF0
YTogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygnbG9h
ZGVkLmNyZWF0ZWQnKTsKKyAgICAgIH0KKyAgICB9KSwKKworICAgIC8vIEEgcmVjb3JkIGVudGVy
cyB0aGlzIHN0YXRlIHdoZW4gdGhlIHN0b3JlIGFza2VzCisgICAgLy8gdGhlIGFkYXB0ZXIgZm9y
IGl0cyBkYXRhLiBJdCByZW1haW5zIGluIHRoaXMgc3RhdGUKKyAgICAvLyB1bnRpbCB0aGUgYWRh
cHRlciBwcm92aWRlcyB0aGUgcmVxdWVzdGVkIGRhdGEuCisgICAgLy8KKyAgICAvLyBVc3VhbGx5
LCB0aGlzIHByb2Nlc3MgaXMgYXN5bmNocm9ub3VzLCB1c2luZyBhbgorICAgIC8vIFhIUiB0byBy
ZXRyaWV2ZSB0aGUgZGF0YS4KKyAgICBsb2FkaW5nOiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAg
Ly8gRVZFTlRTCisgICAgICBsb2FkZWREYXRhOiBkaWRDaGFuZ2VEYXRhLAorCisgICAgICBtYXRl
cmlhbGl6aW5nRGF0YTogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgICBtYW5hZ2VyLnRyYW5z
aXRpb25UbygnbG9hZGVkLm1hdGVyaWFsaXppbmcuZmlyc3RUaW1lJyk7CisgICAgICB9CisgICAg
fSksCisKKyAgICAvLyBBIHJlY29yZCBlbnRlcnMgdGhpcyBzdGF0ZSB3aGVuIGl0cyBkYXRhIGlz
IHBvcHVsYXRlZC4KKyAgICAvLyBNb3N0IG9mIGEgcmVjb3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50
IGluc2lkZSBzdWJzdGF0ZXMKKyAgICAvLyBvZiB0aGUgYGxvYWRlZGAgc3RhdGUuCisgICAgbG9h
ZGVkOiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAgaW5pdGlhbFN0YXRlOiAnc2F2ZWQnLAorCisg
ICAgICAvLyBGTEFHUworICAgICAgaXNMb2FkZWQ6IHRydWUsCisKKyAgICAgIC8vIFNVQlNUQVRF
UworCisgICAgICBtYXRlcmlhbGl6aW5nOiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAgICAvLyBG
TEFHUworICAgICAgICBpc0xvYWRlZDogZmFsc2UsCisKKyAgICAgICAgLy8gRVZFTlRTCisgICAg
ICAgIHdpbGxTZXRQcm9wZXJ0eTogRW1iZXIuSywKKyAgICAgICAgZGlkU2V0UHJvcGVydHk6IEVt
YmVyLkssCisKKyAgICAgICAgZGlkQ2hhbmdlRGF0YTogZGlkQ2hhbmdlRGF0YSwKKworICAgICAg
ICBmaW5pc2hlZE1hdGVyaWFsaXppbmc6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgICAgICBt
YW5hZ2VyLnRyYW5zaXRpb25UbygnbG9hZGVkLnNhdmVkJyk7CisgICAgICAgIH0sCisKKyAgICAg
ICAgLy8gU1VCU1RBVEVTCisgICAgICAgIGZpcnN0VGltZTogRFMuU3RhdGUuY3JlYXRlKHsKKyAg
ICAgICAgICBleGl0OiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICAgICAgICB2YXIgcmVjb3Jk
ID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKKworICAgICAgICAgICAgRW1iZXIucnVuLm9uY2Uo
ZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgIHJlY29yZC50cmlnZ2VyKCdkaWRMb2FkJyk7Cisg
ICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pCisgICAgICB9KSwKKworICAg
ICAgcmVsb2FkaW5nOiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAgICAvLyBGTEFHUworICAgICAg
ICBpc1JlbG9hZGluZzogdHJ1ZSwKKworICAgICAgICAvLyBUUkFOU0lUSU9OUworICAgICAgICBl
bnRlcjogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgICAgIHZhciByZWNvcmQgPSBnZXQobWFu
YWdlciwgJ3JlY29yZCcpLAorICAgICAgICAgICAgICBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9y
ZScpOworCisgICAgICAgICAgc3RvcmUucmVsb2FkUmVjb3JkKHJlY29yZCk7CisgICAgICAgIH0s
CisKKyAgICAgICAgZXhpdDogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgICAgIHZhciByZWNv
cmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpOworCisgICAgICAgICAgb25jZShyZWNvcmQsICd0
cmlnZ2VyJywgJ2RpZFJlbG9hZCcpOworICAgICAgICB9LAorCisgICAgICAgIC8vIEVWRU5UUwor
ICAgICAgICBsb2FkZWREYXRhOiBkaWRDaGFuZ2VEYXRhLAorCisgICAgICAgIG1hdGVyaWFsaXpp
bmdEYXRhOiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICAgICAgbWFuYWdlci50cmFuc2l0aW9u
VG8oJ2xvYWRlZC5tYXRlcmlhbGl6aW5nJyk7CisgICAgICAgIH0KKyAgICAgIH0pLAorCisgICAg
ICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9jYWwgY2hhbmdlcyB0byBhIHJlY29yZCwgaXQgcmVtYWlu
cworICAgICAgLy8gaW4gdGhlIGBzYXZlZGAgc3RhdGUuCisgICAgICBzYXZlZDogRFMuU3RhdGUu
Y3JlYXRlKHsKKyAgICAgICAgLy8gRVZFTlRTCisgICAgICAgIHdpbGxTZXRQcm9wZXJ0eTogd2ls
bFNldFByb3BlcnR5LAorICAgICAgICBkaWRTZXRQcm9wZXJ0eTogZGlkU2V0UHJvcGVydHksCisK
KyAgICAgICAgZGlkQ2hhbmdlRGF0YTogZGlkQ2hhbmdlRGF0YSwKKyAgICAgICAgbG9hZGVkRGF0
YTogZGlkQ2hhbmdlRGF0YSwKKworICAgICAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKG1hbmFn
ZXIpIHsKKyAgICAgICAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygnbG9hZGVkLnJlbG9hZGluZycp
OworICAgICAgICB9LAorCisgICAgICAgIG1hdGVyaWFsaXppbmdEYXRhOiBmdW5jdGlvbihtYW5h
Z2VyKSB7CisgICAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2xvYWRlZC5tYXRlcmlhbGl6
aW5nJyk7CisgICAgICAgIH0sCisKKyAgICAgICAgYmVjb21lRGlydHk6IGZ1bmN0aW9uKG1hbmFn
ZXIpIHsKKyAgICAgICAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygndXBkYXRlZCcpOworICAgICAg
ICB9LAorCisgICAgICAgIGRlbGV0ZVJlY29yZDogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAg
ICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdkZWxldGVkJyk7CisgICAgICAgICAgZ2V0KG1hbmFn
ZXIsICdyZWNvcmQnKS5jbGVhclJlbGF0aW9uc2hpcHMoKTsKKyAgICAgICAgfSwKKworICAgICAg
ICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgICAgICBtYW5hZ2VyLnRy
YW5zaXRpb25UbygnZGVsZXRlZC5zYXZlZCcpOworICAgICAgICAgIGdldChtYW5hZ2VyLCAncmVj
b3JkJykuY2xlYXJSZWxhdGlvbnNoaXBzKCk7CisgICAgICAgIH0sCisKKyAgICAgICAgaW52b2tl
TGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlvbihtYW5hZ2VyLCBkaXJ0eVR5cGUpIHsKKyAgICAg
ICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKKyAgICAgICAgICBpZiAo
ZGlydHlUeXBlID09PSAnY3JlYXRlZCcpIHsKKyAgICAgICAgICAgIHJlY29yZC50cmlnZ2VyKCdk
aWRDcmVhdGUnLCByZWNvcmQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNv
cmQudHJpZ2dlcignZGlkVXBkYXRlJywgcmVjb3JkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgIH0pLAorCisgICAgICAvLyBBIHJlY29yZCBpcyBpbiB0aGlzIHN0YXRlIGFmdGVyIGl0
IGhhcyBiZWVuIGxvY2FsbHkKKyAgICAgIC8vIGNyZWF0ZWQgYnV0IGJlZm9yZSB0aGUgYWRhcHRl
ciBoYXMgaW5kaWNhdGVkIHRoYXQKKyAgICAgIC8vIGl0IGhhcyBiZWVuIHNhdmVkLgorICAgICAg
Y3JlYXRlZDogY3JlYXRlZFN0YXRlLAorCisgICAgICAvLyBBIHJlY29yZCBpcyBpbiB0aGlzIHN0
YXRlIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgIC8vIHNhdmVkIHRvIHRoZSBzZXJ2ZXIs
IGJ1dCB0aGVyZSBhcmUgbmV3IGxvY2FsIGNoYW5nZXMKKyAgICAgIC8vIHRoYXQgaGF2ZSBub3Qg
eWV0IGJlZW4gc2F2ZWQuCisgICAgICB1cGRhdGVkOiB1cGRhdGVkU3RhdGUKKyAgICB9KSwKKwor
ICAgIC8vIEEgcmVjb3JkIGlzIGluIHRoaXMgc3RhdGUgaWYgaXQgd2FzIGRlbGV0ZWQgZnJvbSB0
aGUgc3RvcmUuCisgICAgZGVsZXRlZDogRFMuU3RhdGUuY3JlYXRlKHsKKyAgICAgIGluaXRpYWxT
dGF0ZTogJ3VuY29tbWl0dGVkJywKKyAgICAgIGRpcnR5VHlwZTogJ2RlbGV0ZWQnLAorCisgICAg
ICAvLyBGTEFHUworICAgICAgaXNEZWxldGVkOiB0cnVlLAorICAgICAgaXNMb2FkZWQ6IHRydWUs
CisgICAgICBpc0RpcnR5OiB0cnVlLAorCisgICAgICAvLyBUUkFOU0lUSU9OUworICAgICAgc2V0
dXA6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgICAgdmFyIHJlY29yZCA9IGdldChtYW5hZ2Vy
LCAncmVjb3JkJyksCisgICAgICAgICAgICBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScpOwor
CisgICAgICAgIHN0b3JlLnJlbW92ZUZyb21SZWNvcmRBcnJheXMocmVjb3JkKTsKKyAgICAgIH0s
CisKKyAgICAgIC8vIFNVQlNUQVRFUworCisgICAgICAvLyBXaGVuIGEgcmVjb3JkIGlzIGRlbGV0
ZWQsIGl0IGVudGVycyB0aGUgYHN0YXJ0YAorICAgICAgLy8gc3RhdGUuIEl0IHdpbGwgZXhpdCB0
aGlzIHN0YXRlIHdoZW4gdGhlIHJlY29yZCdzCisgICAgICAvLyB0cmFuc2FjdGlvbiBzdGFydHMg
dG8gY29tbWl0LgorICAgICAgdW5jb21taXR0ZWQ6IERTLlN0YXRlLmNyZWF0ZSh7CisgICAgICAg
IC8vIFRSQU5TSVRJT05TCisgICAgICAgIGVudGVyOiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAg
ICAgICAgdmFyIHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7CisKKyAgICAgICAgICBy
ZWNvcmQud2l0aFRyYW5zYWN0aW9uKGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgICAgIHQucmVjb3Jk
QmVjYW1lRGlydHkoJ2RlbGV0ZWQnLCByZWNvcmQpOworICAgICAgICAgIH0pOworICAgICAgICB9
LAorCisgICAgICAgIC8vIEVWRU5UUworICAgICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihtYW5h
Z2VyKSB7CisgICAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2luRmxpZ2h0Jyk7CisgICAg
ICAgIH0sCisKKyAgICAgICAgcm9sbGJhY2s6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKKyAgICAgICAg
ICBnZXQobWFuYWdlciwgJ3JlY29yZCcpLnJvbGxiYWNrKCk7CisgICAgICAgIH0sCisKKyAgICAg
ICAgYmVjb21lRGlydHk6IEVtYmVyLkssCisKKyAgICAgICAgYmVjYW1lQ2xlYW46IGZ1bmN0aW9u
KG1hbmFnZXIpIHsKKyAgICAgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQn
KTsKKworICAgICAgICAgIHJlY29yZC53aXRoVHJhbnNhY3Rpb24oZnVuY3Rpb24odCkgeworICAg
ICAgICAgICAgdC5yZWNvcmRCZWNhbWVDbGVhbignZGVsZXRlZCcsIHJlY29yZCk7CisgICAgICAg
ICAgfSk7CisKKyAgICAgICAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygnbG9hZGVkLm1hdGVyaWFs
aXppbmcnKTsKKyAgICAgICAgfQorICAgICAgfSksCisKKyAgICAgIC8vIEFmdGVyIGEgcmVjb3Jk
J3MgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGluZywgYnV0CisgICAgICAvLyBiZWZvcmUgdGhlIGFk
YXB0ZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGRlbGV0aW9uCisgICAgICAvLyBoYXMgc2F2ZWQgdG8g
dGhlIHNlcnZlciwgYSByZWNvcmQgaXMgaW4gdGhlCisgICAgICAvLyBgaW5GbGlnaHRgIHN1YnN0
YXRlIG9mIGBkZWxldGVkYC4KKyAgICAgIGluRmxpZ2h0OiBEUy5TdGF0ZS5jcmVhdGUoeworICAg
ICAgICAvLyBGTEFHUworICAgICAgICBpc1NhdmluZzogdHJ1ZSwKKworICAgICAgICAvLyBUUkFO
U0lUSU9OUworICAgICAgICBlbnRlcjogZnVuY3Rpb24obWFuYWdlcikgeworICAgICAgICAgIHZh
ciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpOworCisgICAgICAgICAgcmVjb3JkLmJl
Y2FtZUluRmxpZ2h0KCk7CisKKyAgICAgICAgICByZWNvcmQud2l0aFRyYW5zYWN0aW9uKGZ1bmN0
aW9uICh0KSB7CisgICAgICAgICAgICB0LnJlY29yZEJlY2FtZUluRmxpZ2h0KCdkZWxldGVkJywg
cmVjb3JkKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBFVkVOVFMK
KyAgICAgICAgZGlkQ29tbWl0OiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICAgICAgdmFyIHJl
Y29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7CisKKyAgICAgICAgICByZWNvcmQud2l0aFRy
YW5zYWN0aW9uKGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgICAgIHQucmVjb3JkQmVjYW1lQ2xlYW4o
J2luZmxpZ2h0JywgcmVjb3JkKTsKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIG1hbmFnZXIu
dHJhbnNpdGlvblRvKCdzYXZlZCcpOworCisgICAgICAgICAgbWFuYWdlci5zZW5kKCdpbnZva2VM
aWZlY3ljbGVDYWxsYmFja3MnKTsKKyAgICAgICAgfQorICAgICAgfSksCisKKyAgICAgIC8vIE9u
Y2UgdGhlIGFkYXB0ZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGRlbGV0aW9uIGhhcworICAgICAgLy8g
YmVlbiBzYXZlZCwgdGhlIHJlY29yZCBlbnRlcnMgdGhlIGBzYXZlZGAgc3Vic3RhdGUKKyAgICAg
IC8vIG9mIGBkZWxldGVkYC4KKyAgICAgIHNhdmVkOiBEUy5TdGF0ZS5jcmVhdGUoeworICAgICAg
ICAvLyBGTEFHUworICAgICAgICBpc0RpcnR5OiBmYWxzZSwKKworICAgICAgICBzZXR1cDogZnVu
Y3Rpb24obWFuYWdlcikgeworICAgICAgICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3Jl
Y29yZCcpLAorICAgICAgICAgICAgICBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScpOworCisg
ICAgICAgICAgc3RvcmUuZGVtYXRlcmlhbGl6ZVJlY29yZChyZWNvcmQpOworICAgICAgICB9LAor
CisgICAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVuY3Rpb24obWFuYWdlcikgewor
ICAgICAgICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpOworICAgICAgICAg
IHJlY29yZC50cmlnZ2VyKCdkaWREZWxldGUnLCByZWNvcmQpOworICAgICAgICB9CisgICAgICB9
KQorICAgIH0pLAorCisgICAgLy8gSWYgdGhlIGFkYXB0ZXIgaW5kaWNhdGVzIHRoYXQgdGhlcmUg
d2FzIGFuIHVua25vd24KKyAgICAvLyBlcnJvciBzYXZpbmcgYSByZWNvcmQsIHRoZSByZWNvcmQg
ZW50ZXJzIHRoZSBgZXJyb3JgCisgICAgLy8gc3RhdGUuCisgICAgZXJyb3I6IERTLlN0YXRlLmNy
ZWF0ZSh7CisgICAgICBpc0Vycm9yOiB0cnVlLAorCisgICAgICAvLyBFVkVOVFMKKworICAgICAg
aW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlvbihtYW5hZ2VyKSB7CisgICAgICAgIHZh
ciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpOworICAgICAgICByZWNvcmQudHJpZ2dl
cignYmVjYW1lRXJyb3InLCByZWNvcmQpOworICAgICAgfQorICAgIH0pCisgIH0pCit9OworCitE
Uy5TdGF0ZU1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuZXh0ZW5kKHsKKyAgcmVjb3JkOiBu
dWxsLAorICBpbml0aWFsU3RhdGU6ICdyb290U3RhdGUnLAorICBzdGF0ZXM6IHN0YXRlcywKKyAg
dW5oYW5kbGVkRXZlbnQ6IGZ1bmN0aW9uKG1hbmFnZXIsIG9yaWdpbmFsRXZlbnQpIHsKKyAgICB2
YXIgcmVjb3JkID0gbWFuYWdlci5nZXQoJ3JlY29yZCcpLAorICAgICAgICBjb250ZXh0cyA9IFtd
LnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSwKKyAgICAgICAgZXJyb3JNZXNzYWdlOworICAgIGVy
cm9yTWVzc2FnZSAgPSAiQXR0ZW1wdGVkIHRvIGhhbmRsZSBldmVudCBgIiArIG9yaWdpbmFsRXZl
bnQgKyAiYCAiOworICAgIGVycm9yTWVzc2FnZSArPSAib24gIiArIHJlY29yZC50b1N0cmluZygp
ICsgIiB3aGlsZSBpbiBzdGF0ZSAiOworICAgIGVycm9yTWVzc2FnZSArPSBnZXQobWFuYWdlciwg
J2N1cnJlbnRTdGF0ZS5wYXRoJykgKyAiLiBDYWxsZWQgd2l0aCAiOworICAgIGVycm9yTWVzc2Fn
ZSArPSBhcnJheU1hcC5jYWxsKGNvbnRleHRzLCBmdW5jdGlvbihjb250ZXh0KXsKKyAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gRW1iZXIuaW5zcGVjdChjb250ZXh0KTsKKyAgICAgICAgICAg
ICAgICAgICAgfSkuam9pbignLCAnKTsKKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoZXJyb3JN
ZXNzYWdlKTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgTG9h
ZFByb21pc2UgPSBEUy5Mb2FkUHJvbWlzZTsgLy8gc3lzdGVtL21peGlucy9sb2FkX3Byb21pc2UK
KwordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBub25lID0gRW1iZXIuaXNO
b25lLCBtYXAgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMubWFwOworCit2YXIgcmV0cmlldmVGcm9t
Q3VycmVudFN0YXRlID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5KSB7CisgIHJldHVybiBn
ZXQoZ2V0KHRoaXMsICdzdGF0ZU1hbmFnZXIuY3VycmVudFN0YXRlJyksIGtleSk7Cit9KS5wcm9w
ZXJ0eSgnc3RhdGVNYW5hZ2VyLmN1cnJlbnRTdGF0ZScpOworCitEUy5Nb2RlbCA9IEVtYmVyLk9i
amVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgTG9hZFByb21pc2UsIHsKKyAgaXNMb2FkZWQ6IHJl
dHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKKyAgaXNSZWxvYWRpbmc6IHJldHJpZXZlRnJvbUN1cnJl
bnRTdGF0ZSwKKyAgaXNEaXJ0eTogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAorICBpc1Nhdmlu
ZzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAorICBpc0RlbGV0ZWQ6IHJldHJpZXZlRnJvbUN1
cnJlbnRTdGF0ZSwKKyAgaXNFcnJvcjogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAorICBpc05l
dzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAorICBpc1ZhbGlkOiByZXRyaWV2ZUZyb21DdXJy
ZW50U3RhdGUsCisKKyAgY2xpZW50SWQ6IG51bGwsCisgIGlkOiBudWxsLAorICB0cmFuc2FjdGlv
bjogbnVsbCwKKyAgc3RhdGVNYW5hZ2VyOiBudWxsLAorICBlcnJvcnM6IG51bGwsCisKKyAgLyoq
CisgICAgQ3JlYXRlIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkLCB1c2luZyB0
aGUgc2VyaWFsaXphdGlvbgorICAgIHN0cmF0ZWd5IG9mIHRoZSBzdG9yZSdzIGFkYXB0ZXIuCisK
KyAgICBBdmFpbGFibGUgb3B0aW9uczoKKworICAgICogYGluY2x1ZGVJZGA6IGB0cnVlYCBpZiB0
aGUgcmVjb3JkJ3MgSUQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZQorICAgICAgSlNPTiByZXBy
ZXNlbnRhdGlvbi4KKworICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgQHJldHVybnMg
e09iamVjdH0gYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcHJpbWl0aXZlIEpTT04gdmFsdWVz
IG9ubHkKKyAgKi8KKyAgc2VyaWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgdmFyIHN0
b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpOworICAgIHJldHVybiBzdG9yZS5zZXJpYWxpemUodGhp
cywgb3B0aW9ucyk7CisgIH0sCisKKyAgZGlkTG9hZDogRW1iZXIuSywKKyAgZGlkUmVsb2FkOiBF
bWJlci5LLAorICBkaWRVcGRhdGU6IEVtYmVyLkssCisgIGRpZENyZWF0ZTogRW1iZXIuSywKKyAg
ZGlkRGVsZXRlOiBFbWJlci5LLAorICBiZWNhbWVJbnZhbGlkOiBFbWJlci5LLAorICBiZWNhbWVF
cnJvcjogRW1iZXIuSywKKworICBkYXRhOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAg
ICBpZiAoIXRoaXMuX2RhdGEpIHsKKyAgICAgIHRoaXMubWF0ZXJpYWxpemVEYXRhKCk7CisgICAg
fQorCisgICAgcmV0dXJuIHRoaXMuX2RhdGE7CisgIH0pLnByb3BlcnR5KCksCisKKyAgbWF0ZXJp
YWxpemVEYXRhOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnNlbmQoJ21hdGVyaWFsaXppbmdEYXRh
Jyk7CisKKyAgICBnZXQodGhpcywgJ3N0b3JlJykubWF0ZXJpYWxpemVEYXRhKHRoaXMpOworCisg
ICAgdGhpcy5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgeworICAgICAg
dGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgnZGF0YScpOworICAgIH0pOworICB9LAorCisgIF9k
YXRhOiBudWxsLAorCisgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX3N1cGVyKCk7CisK
KyAgICB2YXIgc3RhdGVNYW5hZ2VyID0gRFMuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7IHJlY29yZDog
dGhpcyB9KTsKKyAgICBzZXQodGhpcywgJ3N0YXRlTWFuYWdlcicsIHN0YXRlTWFuYWdlcik7CisK
KyAgICB0aGlzLl9zZXR1cCgpOworCisgICAgc3RhdGVNYW5hZ2VyLmdvVG9TdGF0ZSgnZW1wdHkn
KTsKKyAgfSwKKworICBfc2V0dXA6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX3JlbGF0aW9uc2hp
cENoYW5nZXMgPSB7fTsKKyAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jID0ge307CisgIH0sCisKKyAg
c2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgeworICAgIHJldHVybiBnZXQodGhpcywgJ3N0
YXRlTWFuYWdlcicpLnNlbmQobmFtZSwgY29udGV4dCk7CisgIH0sCisKKyAgd2l0aFRyYW5zYWN0
aW9uOiBmdW5jdGlvbihmbikgeworICAgIHZhciB0cmFuc2FjdGlvbiA9IGdldCh0aGlzLCAndHJh
bnNhY3Rpb24nKTsKKyAgICBpZiAodHJhbnNhY3Rpb24pIHsgZm4odHJhbnNhY3Rpb24pOyB9Cisg
IH0sCisKKyAgbG9hZGluZ0RhdGE6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2VuZCgnbG9hZGlu
Z0RhdGEnKTsKKyAgfSwKKworICBsb2FkZWREYXRhOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnNl
bmQoJ2xvYWRlZERhdGEnKTsKKyAgfSwKKworICBkaWRDaGFuZ2VEYXRhOiBmdW5jdGlvbigpIHsK
KyAgICB0aGlzLnNlbmQoJ2RpZENoYW5nZURhdGEnKTsKKyAgfSwKKworICBzZXRQcm9wZXJ0eTog
ZnVuY3Rpb24oa2V5LCB2YWx1ZSwgb2xkVmFsdWUpIHsKKyAgICB0aGlzLnNlbmQoJ3NldFByb3Bl
cnR5JywgeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWUgfSk7Cisg
IH0sCisKKyAgLyoqCisgICAgUmVsb2FkIHRoZSByZWNvcmQgZnJvbSB0aGUgYWRhcHRlci4KKwor
ICAgIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHJlY29yZCBoYXMgYWxyZWFkeSBmaW5pc2hl
ZCBsb2FkaW5nCisgICAgYW5kIGhhcyBub3QgeWV0IGJlZW4gbW9kaWZpZWQgKGBpc0xvYWRlZGAg
YnV0IG5vdCBgaXNEaXJ0eWAsCisgICAgb3IgYGlzU2F2aW5nYCkuCisgICovCisgIHJlbG9hZDog
ZnVuY3Rpb24oKSB7CisgICAgdGhpcy5zZW5kKCdyZWxvYWRSZWNvcmQnKTsKKyAgfSwKKworICBk
ZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2VuZCgnZGVsZXRlUmVjb3JkJyk7
CisgIH0sCisKKyAgdW5sb2FkUmVjb3JkOiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5hc3NlcnQo
IllvdSBjYW4gb25seSB1bmxvYWQgYSBsb2FkZWQsIG5vbi1kaXJ0eSByZWNvcmQuIiwgIWdldCh0
aGlzLCAnaXNEaXJ0eScpKTsKKworICAgIHRoaXMuc2VuZCgndW5sb2FkUmVjb3JkJyk7CisgIH0s
CisKKyAgY2xlYXJSZWxhdGlvbnNoaXBzOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmVhY2hSZWxh
dGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7CisgICAgICBpZiAocmVsYXRp
b25zaGlwLmtpbmQgPT09ICdiZWxvbmdzVG8nKSB7CisgICAgICAgIHNldCh0aGlzLCBuYW1lLCBu
dWxsKTsKKyAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdoYXNNYW55Jykg
eworICAgICAgICBnZXQodGhpcywgbmFtZSkuY2xlYXIoKTsKKyAgICAgIH0KKyAgICB9LCB0aGlz
KTsKKyAgfSwKKworICB1cGRhdGVSZWNvcmRBcnJheXM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBz
dG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKKyAgICBpZiAoc3RvcmUpIHsKKyAgICAgIHN0b3Jl
LmRhdGFXYXNVcGRhdGVkKHRoaXMuY29uc3RydWN0b3IsIGdldCh0aGlzLCAnX3JlZmVyZW5jZScp
LCB0aGlzKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgSWYgdGhlIGFkYXB0ZXIgZGlkIG5v
dCByZXR1cm4gYSBoYXNoIGluIHJlc3BvbnNlIHRvIGEgY29tbWl0LAorICAgIG1lcmdlIHRoZSBj
aGFuZ2VkIGF0dHJpYnV0ZXMgYW5kIHJlbGF0aW9uc2hpcHMgaW50byB0aGUgZXhpc3RpbmcKKyAg
ICBzYXZlZCBkYXRhLgorICAqLworICBhZGFwdGVyRGlkQ29tbWl0OiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgYXR0cmlidXRlcyA9IGdldCh0aGlzLCAnZGF0YScpLmF0dHJpYnV0ZXM7CisKKyAgICBn
ZXQodGhpcy5jb25zdHJ1Y3RvciwgJ2F0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUs
IG1ldGEpIHsKKyAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSBnZXQodGhpcywgbmFtZSk7CisgICAg
fSwgdGhpcyk7CisKKyAgICB0aGlzLnNlbmQoJ2RpZENvbW1pdCcpOworICAgIHRoaXMudXBkYXRl
UmVjb3JkQXJyYXlzTGF0ZXIoKTsKKyAgfSwKKworICBhZGFwdGVyRGlkRGlydHk6IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMuc2VuZCgnYmVjb21lRGlydHknKTsKKyAgICB0aGlzLnVwZGF0ZVJlY29y
ZEFycmF5c0xhdGVyKCk7CisgIH0sCisKKyAgZGF0YURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIo
ZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSBnZXQodGhpcy5jb25zdHJ1Y3Rv
ciwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKTsKKworICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlz
TGF0ZXIoKTsKKworICAgIHJlbGF0aW9uc2hpcHMuZm9yRWFjaChmdW5jdGlvbihuYW1lLCByZWxh
dGlvbnNoaXApIHsKKyAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCA9PT0gJ2hhc01hbnknKSB7
CisgICAgICAgIHRoaXMuaGFzTWFueURpZENoYW5nZShyZWxhdGlvbnNoaXAua2V5KTsKKyAgICAg
IH0KKyAgICB9LCB0aGlzKTsKKworICAgIHRoaXMuc2VuZCgnZmluaXNoZWRNYXRlcmlhbGl6aW5n
Jyk7CisgIH0sICdkYXRhJyksCisKKyAgaGFzTWFueURpZENoYW5nZTogZnVuY3Rpb24oa2V5KSB7
CisgICAgdmFyIGNhY2hlZFZhbHVlID0gdGhpcy5jYWNoZUZvcihrZXkpOworCisgICAgaWYgKGNh
Y2hlZFZhbHVlKSB7CisgICAgICB2YXIgdHlwZSA9IGdldCh0aGlzLmNvbnN0cnVjdG9yLCAncmVs
YXRpb25zaGlwc0J5TmFtZScpLmdldChrZXkpLnR5cGU7CisgICAgICB2YXIgc3RvcmUgPSBnZXQo
dGhpcywgJ3N0b3JlJyk7CisgICAgICB2YXIgaWRzID0gdGhpcy5fZGF0YS5oYXNNYW55W2tleV0g
fHwgW107CisKKyAgICAgIHZhciByZWZlcmVuY2VzID0gbWFwKGlkcywgZnVuY3Rpb24oaWQpIHsK
KyAgICAgICAgLy8gaWYgaXQgd2FzIGFscmVhZHkgYSByZWZlcmVuY2UsIHJldHVybiB0aGUgcmVm
ZXJlbmNlCisgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7IHJldHVybiBpZDsg
fQorICAgICAgICByZXR1cm4gc3RvcmUucmVmZXJlbmNlRm9ySWQodHlwZSwgaWQpOworICAgICAg
fSk7CisKKyAgICAgIHNldChjYWNoZWRWYWx1ZSwgJ2NvbnRlbnQnLCBFbWJlci5BKHJlZmVyZW5j
ZXMpKTsKKyAgICB9CisgIH0sCisKKyAgdXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXI6IGZ1bmN0aW9u
KCkgeworICAgIEVtYmVyLnJ1bi5vbmNlKHRoaXMsIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzKTsK
KyAgfSwKKworICBzZXR1cERhdGE6IGZ1bmN0aW9uKHByZW1hdGVyaWFsaXplZCkgeworICAgIHRo
aXMuX2RhdGEgPSB7CisgICAgICBhdHRyaWJ1dGVzOiB7fSwKKyAgICAgIGJlbG9uZ3NUbzoge30s
CisgICAgICBoYXNNYW55OiB7fSwKKyAgICAgIGlkOiBudWxsCisgICAgfTsKKyAgfSwKKworICBt
YXRlcmlhbGl6ZUlkOiBmdW5jdGlvbihpZCkgeworICAgIHNldCh0aGlzLCAnaWQnLCBpZCk7Cisg
IH0sCisKKyAgbWF0ZXJpYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7Cisg
ICAgRW1iZXIuYXNzZXJ0KCJNdXN0IHBhc3MgYSBoYXNoIG9mIGF0dHJpYnV0ZXMgdG8gbWF0ZXJp
YWxpemVBdHRyaWJ1dGVzIiwgISFhdHRyaWJ1dGVzKTsKKyAgICB0aGlzLl9kYXRhLmF0dHJpYnV0
ZXMgPSBhdHRyaWJ1dGVzOworICB9LAorCisgIG1hdGVyaWFsaXplQXR0cmlidXRlOiBmdW5jdGlv
bihuYW1lLCB2YWx1ZSkgeworICAgIHRoaXMuX2RhdGEuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVl
OworICB9LAorCisgIG1hdGVyaWFsaXplSGFzTWFueTogZnVuY3Rpb24obmFtZSwgaWRzKSB7Cisg
ICAgdGhpcy5fZGF0YS5oYXNNYW55W25hbWVdID0gaWRzOworICB9LAorCisgIG1hdGVyaWFsaXpl
QmVsb25nc1RvOiBmdW5jdGlvbihuYW1lLCBpZCkgeworICAgIHRoaXMuX2RhdGEuYmVsb25nc1Rv
W25hbWVdID0gaWQ7CisgIH0sCisKKyAgcm9sbGJhY2s6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMu
X3NldHVwKCk7CisgICAgdGhpcy5zZW5kKCdiZWNhbWVDbGVhbicpOworCisgICAgdGhpcy5zdXNw
ZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5ub3RpZnlQ
cm9wZXJ0eUNoYW5nZSgnZGF0YScpOworICAgIH0pOworICB9LAorCisgIHRvU3RyaW5nRXh0ZW5z
aW9uOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZ2V0KHRoaXMsICdpZCcpOworICB9LAorCisg
IC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGUgZ29hbCBvZiB0aGlzIG1ldGhvZCBpcyB0byB0
ZW1wb3JhcmlseSBkaXNhYmxlIHNwZWNpZmljIG9ic2VydmVycworICAgIHRoYXQgdGFrZSBhY3Rp
b24gaW4gcmVzcG9uc2UgdG8gYXBwbGljYXRpb24gY2hhbmdlcy4KKworICAgIFRoaXMgYWxsb3dz
IHRoZSBzeXN0ZW0gdG8gbWFrZSBjaGFuZ2VzIChzdWNoIGFzIG1hdGVyaWFsaXphdGlvbiBhbmQK
KyAgICByb2xsYmFjaykgdGhhdCBzaG91bGQgbm90IHRyaWdnZXIgc2Vjb25kYXJ5IGJlaGF2aW9y
IChzdWNoIGFzIHNldHRpbmcgYW4KKyAgICBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvciBtYXJraW5n
IHJlY29yZHMgYXMgZGlydHkpLgorCisgICAgVGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdp
bGwgbGlrZWx5IGNoYW5nZSBhcyBFbWJlciBwcm9wZXIgcHJvdmlkZXMKKyAgICBiZXR0ZXIgaW5m
cmFzdHJ1Y3R1cmUgZm9yIHN1c3BlbmRpbmcgZ3JvdXBzIG9mIG9ic2VydmVycywgYW5kIGlmIEFy
cmF5CisgICAgb2JzZXJ2YXRpb24gYmVjb21lcyBtb3JlIHVuaWZpZWQgd2l0aCByZWd1bGFyIG9i
c2VydmVycy4KKyAgKi8KKyAgc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVyczogZnVuY3Rpb24o
Y2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICB2YXIgb2JzZXJ2ZXJzID0gZ2V0KHRoaXMuY29uc3Ry
dWN0b3IsICdyZWxhdGlvbnNoaXBOYW1lcycpLmJlbG9uZ3NUbzsKKyAgICB2YXIgc2VsZiA9IHRo
aXM7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcyA9IHRy
dWU7CisgICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVycyhzZWxmLCBvYnNlcnZlcnMsIG51bGws
ICdiZWxvbmdzVG9EaWRDaGFuZ2UnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgRW1iZXIuX3N1c3Bl
bmRCZWZvcmVPYnNlcnZlcnMoc2VsZiwgb2JzZXJ2ZXJzLCBudWxsLCAnYmVsb25nc1RvV2lsbENo
YW5nZScsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZyB8fCBz
ZWxmKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdGhp
cy5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcyA9IGZhbHNlOworICAgIH0KKyAgfSwKKworICBiZWNh
bWVJbkZsaWdodDogZnVuY3Rpb24oKSB7CisgIH0sCisKKyAgLy8gRk9SIFVTRSBEVVJJTkcgQ09N
TUlUIFBST0NFU1MKKworICBhZGFwdGVyRGlkVXBkYXRlQXR0cmlidXRlOiBmdW5jdGlvbihhdHRy
aWJ1dGVOYW1lLCB2YWx1ZSkgeworCisgICAgLy8gSWYgYSB2YWx1ZSBpcyBwYXNzZWQgaW4sIHVw
ZGF0ZSB0aGUgaW50ZXJuYWwgYXR0cmlidXRlcyBhbmQgY2xlYXIKKyAgICAvLyB0aGUgYXR0cmli
dXRlIGNhY2hlIHNvIGl0IHBpY2tzIHVwIHRoZSBuZXcgdmFsdWUuIE90aGVyd2lzZSwKKyAgICAv
LyBjb2xsYXBzZSB0aGUgY3VycmVudCB2YWx1ZSBpbnRvIHRoZSBpbnRlcm5hbCBhdHRyaWJ1dGVz
IGJlY2F1c2UKKyAgICAvLyB0aGUgYWRhcHRlciBoYXMgYWNrbm93bGVkZ2VkIGl0LgorICAgIGlm
ICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBnZXQodGhpcywgJ2RhdGEuYXR0cmlidXRl
cycpW2F0dHJpYnV0ZU5hbWVdID0gdmFsdWU7CisgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hh
bmdlKGF0dHJpYnV0ZU5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICB2YWx1ZSA9IGdldCh0aGlz
LCBhdHRyaWJ1dGVOYW1lKTsKKyAgICAgIGdldCh0aGlzLCAnZGF0YS5hdHRyaWJ1dGVzJylbYXR0
cmlidXRlTmFtZV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5
c0xhdGVyKCk7CisgIH0sCisKKyAgX3JlZmVyZW5jZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIGdldCh0aGlzLCAnc3RvcmUnKS5yZWZlcmVuY2VGb3JDbGllbnRJZChn
ZXQodGhpcywgJ2NsaWVudElkJykpOworICB9KSwKKworICBhZGFwdGVyRGlkSW52YWxpZGF0ZTog
ZnVuY3Rpb24oZXJyb3JzKSB7CisgICAgdGhpcy5zZW5kKCdiZWNhbWVJbnZhbGlkJywgZXJyb3Jz
KTsKKyAgfSwKKworICBhZGFwdGVyRGlkRXJyb3I6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2Vu
ZCgnYmVjYW1lRXJyb3InKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgT3Zl
cnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20gRW1iZXIuRXZlbnRlZCB0bworICAg
IGFsc28gY2FsbCBtZXRob2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICovCisgIHRyaWdnZXI6
IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICBFbWJlci50cnlJbnZva2UodGhpcywgbmFtZSwgW10uc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDEpKTsKKyAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworICB9Cit9KTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHN0b3Jl
IGFsaWFzZXMuCisvLyBUaGlzIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG5h
bWVkIGFsaWFzCisvLyBvbiB0aGUgZGVmYXVsdCBzdG9yZSwgYnV0IGluamVjdHMgdGhlIGNsYXNz
IGFzIHRoZQorLy8gZmlyc3QgcGFyYW1ldGVyLgordmFyIHN0b3JlQWxpYXMgPSBmdW5jdGlvbiht
ZXRob2ROYW1lKSB7CisgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3RvcmUgPSBnZXQo
RFMsICdkZWZhdWx0U3RvcmUnKSwKKyAgICAgICAgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1l
bnRzKTsKKworICAgIGFyZ3MudW5zaGlmdCh0aGlzKTsKKyAgICBFbWJlci5hc3NlcnQoIllvdXIg
YXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBhICdTdG9yZScgcHJvcGVydHkgZGVmaW5lZC4gQXR0
ZW1wdHMgdG8gY2FsbCAnIiArIG1ldGhvZE5hbWUgKyAiJyBvbiBtb2RlbCBjbGFzc2VzIHdpbGwg
ZmFpbC4gUGxlYXNlIHByb3ZpZGUgb25lIGFzIHdpdGggJ1lvdXJBcHBOYW1lLlN0b3JlID0gRFMu
U3RvcmUuZXh0ZW5kKCknIiwgISFzdG9yZSk7CisgICAgcmV0dXJuIHN0b3JlW21ldGhvZE5hbWVd
LmFwcGx5KHN0b3JlLCBhcmdzKTsKKyAgfTsKK307CisKK0RTLk1vZGVsLnJlb3BlbkNsYXNzKHsK
KyAgaXNMb2FkZWQ6IHN0b3JlQWxpYXMoJ3JlY29yZElzTG9hZGVkJyksCisgIGZpbmQ6IHN0b3Jl
QWxpYXMoJ2ZpbmQnKSwKKyAgYWxsOiBzdG9yZUFsaWFzKCdhbGwnKSwKKyAgcXVlcnk6IHN0b3Jl
QWxpYXMoJ2ZpbmRRdWVyeScpLAorICBmaWx0ZXI6IHN0b3JlQWxpYXMoJ2ZpbHRlcicpLAorCisg
IF9jcmVhdGU6IERTLk1vZGVsLmNyZWF0ZSwKKworICBjcmVhdGU6IGZ1bmN0aW9uKCkgeworICAg
IHRocm93IG5ldyBFbWJlci5FcnJvcigiWW91IHNob3VsZCBub3QgY2FsbCBgY3JlYXRlYCBvbiBh
IG1vZGVsLiBJbnN0ZWFkLCBjYWxsIGBjcmVhdGVSZWNvcmRgIHdpdGggdGhlIGF0dHJpYnV0ZXMg
eW91IHdvdWxkIGxpa2UgdG8gc2V0LiIpOworICB9LAorCisgIGNyZWF0ZVJlY29yZDogc3RvcmVB
bGlhcygnY3JlYXRlUmVjb3JkJykKK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewor
dmFyIGdldCA9IEVtYmVyLmdldDsKK0RTLk1vZGVsLnJlb3BlbkNsYXNzKHsKKyAgYXR0cmlidXRl
czogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgdmFyIG1hcCA9IEVtYmVyLk1hcC5j
cmVhdGUoKTsKKworICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwg
bWV0YSkgeworICAgICAgaWYgKG1ldGEuaXNBdHRyaWJ1dGUpIHsKKyAgICAgICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgbWF5IG5vdCBzZXQgYGlkYCBhcyBhbiBhdHRyaWJ1dGUgb24geW91ciBtb2RlbC4g
UGxlYXNlIHJlbW92ZSBhbnkgbGluZXMgdGhhdCBsb29rIGxpa2U6IGBpZDogRFMuYXR0cignPHR5
cGU+JylgIGZyb20gIiArIHRoaXMudG9TdHJpbmcoKSwgbmFtZSAhPT0gJ2lkJyk7CisKKyAgICAg
ICAgbWV0YS5uYW1lID0gbmFtZTsKKyAgICAgICAgbWFwLnNldChuYW1lLCBtZXRhKTsKKyAgICAg
IH0KKyAgICB9KTsKKworICAgIHJldHVybiBtYXA7CisgIH0pCit9KTsKKwordmFyIEF0dHJpYnV0
ZUNoYW5nZSA9IERTLkF0dHJpYnV0ZUNoYW5nZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgdGhp
cy5yZWZlcmVuY2UgPSBvcHRpb25zLnJlZmVyZW5jZTsKKyAgdGhpcy5zdG9yZSA9IG9wdGlvbnMu
c3RvcmU7CisgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTsKKyAgdGhpcy5vbGRWYWx1ZSA9IG9w
dGlvbnMub2xkVmFsdWU7Cit9OworCitBdHRyaWJ1dGVDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVu
Y3Rpb24ob3B0aW9ucykgeworICByZXR1cm4gbmV3IEF0dHJpYnV0ZUNoYW5nZShvcHRpb25zKTsK
K307CisKK0F0dHJpYnV0ZUNoYW5nZS5wcm90b3R5cGUgPSB7CisgIHN5bmM6IGZ1bmN0aW9uKCkg
eworICAgIHRoaXMuc3RvcmUucmVjb3JkQXR0cmlidXRlRGlkQ2hhbmdlKHRoaXMucmVmZXJlbmNl
LCB0aGlzLm5hbWUsIHRoaXMudmFsdWUsIHRoaXMub2xkVmFsdWUpOworCisgICAgLy8gVE9ETzog
VXNlIHRoaXMgb2JqZWN0IGluIHRoZSBjb21taXQgcHJvY2VzcworICAgIHRoaXMuZGVzdHJveSgp
OworICB9LAorCisgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIGRlbGV0ZSB0aGlzLnN0b3Jl
LnJlY29yZEZvclJlZmVyZW5jZSh0aGlzLnJlZmVyZW5jZSkuX2NoYW5nZXNUb1N5bmNbdGhpcy5u
YW1lXTsKKyAgfQorfTsKKworRFMuTW9kZWwucmVvcGVuKHsKKyAgZWFjaEF0dHJpYnV0ZTogZnVu
Y3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICBnZXQodGhpcy5jb25zdHJ1Y3RvciwgJ2F0
dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKKyAgICAgIGNhbGxiYWNr
LmNhbGwoYmluZGluZywgbmFtZSwgbWV0YSk7CisgICAgfSwgYmluZGluZyk7CisgIH0sCisKKyAg
YXR0cmlidXRlV2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3Jk
LCBrZXkpIHsKKyAgICB2YXIgcmVmZXJlbmNlID0gZ2V0KHJlY29yZCwgJ19yZWZlcmVuY2UnKSwK
KyAgICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKKworICAgIHJlY29yZC5zZW5k
KCd3aWxsU2V0UHJvcGVydHknLCB7IHJlZmVyZW5jZTogcmVmZXJlbmNlLCBzdG9yZTogc3RvcmUs
IG5hbWU6IGtleSB9KTsKKyAgfSksCisKKyAgYXR0cmlidXRlRGlkQ2hhbmdlOiBFbWJlci5vYnNl
cnZlcihmdW5jdGlvbihyZWNvcmQsIGtleSkgeworICAgIHJlY29yZC5zZW5kKCdkaWRTZXRQcm9w
ZXJ0eScsIHsgbmFtZToga2V5IH0pOworICB9KQorfSk7CisKK2Z1bmN0aW9uIGdldEF0dHIocmVj
b3JkLCBvcHRpb25zLCBrZXkpIHsKKyAgdmFyIGF0dHJpYnV0ZXMgPSBnZXQocmVjb3JkLCAnZGF0
YScpLmF0dHJpYnV0ZXM7CisgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNba2V5XTsKKworICBpZiAo
dmFsdWUgPT09IHVuZGVmaW5lZCkgeworICAgIHZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7
CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKK0RTLmF0dHIgPSBmdW5jdGlvbih0eXBlLCBv
cHRpb25zKSB7CisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgIHZhciBtZXRhID0gewor
ICAgIHR5cGU6IHR5cGUsCisgICAgaXNBdHRyaWJ1dGU6IHRydWUsCisgICAgb3B0aW9uczogb3B0
aW9ucworICB9OworCisgIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVl
LCBvbGRWYWx1ZSkgeworICAgIHZhciBkYXRhOworCisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PiAxKSB7CisgICAgICBFbWJlci5hc3NlcnQoIllvdSBtYXkgbm90IHNldCBgaWRgIGFzIGFuIGF0
dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQbGVhc2UgcmVtb3ZlIGFueSBsaW5lcyB0aGF0IGxvb2sg
bGlrZTogYGlkOiBEUy5hdHRyKCc8dHlwZT4nKWAgZnJvbSAiICsgdGhpcy5jb25zdHJ1Y3Rvci50
b1N0cmluZygpLCBrZXkgIT09ICdpZCcpOworICAgIH0gZWxzZSB7CisgICAgICB2YWx1ZSA9IGdl
dEF0dHIodGhpcywgb3B0aW9ucywga2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7Cisg
IC8vIGBkYXRhYCBpcyBuZXZlciBzZXQgZGlyZWN0bHkuIEhvd2V2ZXIsIGl0IG1heSBiZQorICAv
LyBpbnZhbGlkYXRlZCBmcm9tIHRoZSBzdGF0ZSBtYW5hZ2VyJ3Mgc2V0RGF0YQorICAvLyBldmVu
dC4KKyAgfSkucHJvcGVydHkoJ2RhdGEnKS5tZXRhKG1ldGEpOworfTsKKworCit9KSgpOworCisK
KworKGZ1bmN0aW9uKCkgeworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIGdldCA9
IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAorICAgIG5vbmUgPSBFbWJlci5pc05vbmU7CisK
K0RTLmJlbG9uZ3NUbyA9IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKKyAgRW1iZXIuYXNzZXJ0
KCJUaGUgZmlyc3QgYXJndW1lbnQgRFMuYmVsb25nc1RvIG11c3QgYmUgYSBtb2RlbCB0eXBlIG9y
IHN0cmluZywgbGlrZSBEUy5iZWxvbmdzVG8oQXBwLlBlcnNvbikiLCAhIXR5cGUgJiYgKHR5cGVv
ZiB0eXBlID09PSAnc3RyaW5nJyB8fCBEUy5Nb2RlbC5kZXRlY3QodHlwZSkpKTsKKworICBvcHRp
b25zID0gb3B0aW9ucyB8fCB7fTsKKworICB2YXIgbWV0YSA9IHsgdHlwZTogdHlwZSwgaXNSZWxh
dGlvbnNoaXA6IHRydWUsIG9wdGlvbnM6IG9wdGlvbnMsIGtpbmQ6ICdiZWxvbmdzVG8nIH07CisK
KyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmlu
ZWQgPyBudWxsIDogdmFsdWU7CisgICAgfQorCisgICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2Rh
dGEnKS5iZWxvbmdzVG8sCisgICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpLCBpZDsK
KworICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHR5cGUgPSBnZXQo
dGhpcywgdHlwZSwgZmFsc2UpIHx8IGdldChFbWJlci5sb29rdXAsIHR5cGUpOworICAgIH0KKwor
ICAgIGlkID0gZGF0YVtrZXldOworCisgICAgaWYoIWlkKSB7CisgICAgICByZXR1cm4gbnVsbDsK
KyAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHsKKyAgICAgIHJldHVybiBz
dG9yZS5yZWNvcmRGb3JSZWZlcmVuY2UoaWQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4g
c3RvcmUuZmluZCh0eXBlLCBpZCk7CisgICAgfQorICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEo
bWV0YSk7Cit9OworCisvKioKKyAgVGhlc2Ugb2JzZXJ2ZXJzIG9ic2VydmUgYWxsIGBiZWxvbmdz
VG9gIHJlbGF0aW9uc2hpcHMgb24gdGhlIHJlY29yZC4gU2VlCisgIGByZWxhdGlvbnNoaXBzL2V4
dGAgdG8gc2VlIGhvdyB0aGVzZSBvYnNlcnZlcnMgZ2V0IHRoZWlyIGRlcGVuZGVuY2llcy4KKwor
Ki8KKworRFMuTW9kZWwucmVvcGVuKHsKKyAgLyoqIEBwcml2YXRlICovCisgIGJlbG9uZ3NUb1dp
bGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0aW9uKHJlY29yZCwga2V5KSB7Cisg
ICAgaWYgKGdldChyZWNvcmQsICdpc0xvYWRlZCcpKSB7CisgICAgICB2YXIgb2xkUGFyZW50ID0g
Z2V0KHJlY29yZCwga2V5KTsKKworICAgICAgdmFyIGNoaWxkUmVmZXJlbmNlID0gZ2V0KHJlY29y
ZCwgJ19yZWZlcmVuY2UnKSwKKyAgICAgICAgICBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScp
OworICAgICAgaWYgKG9sZFBhcmVudCl7CisgICAgICAgIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlv
bnNoaXBDaGFuZ2UuY3JlYXRlQ2hhbmdlKGNoaWxkUmVmZXJlbmNlLCBnZXQob2xkUGFyZW50LCAn
X3JlZmVyZW5jZScpLCBzdG9yZSwgeyBrZXk6IGtleSwga2luZDoiYmVsb25nc1RvIiwgY2hhbmdl
VHlwZTogInJlbW92ZSIgfSk7CisgICAgICAgIGNoYW5nZS5zeW5jKCk7CisgICAgICAgIHRoaXMu
X2NoYW5nZXNUb1N5bmNba2V5XSA9IGNoYW5nZTsKKyAgICAgIH0KKyAgICB9CisgIH0pLAorCisg
IC8qKiBAcHJpdmF0ZSAqLworICBiZWxvbmdzVG9EaWRDaGFuZ2U6IEVtYmVyLmltbWVkaWF0ZU9i
c2VydmVyKGZ1bmN0aW9uKHJlY29yZCwga2V5KSB7CisgICAgaWYgKGdldChyZWNvcmQsICdpc0xv
YWRlZCcpKSB7CisgICAgICB2YXIgbmV3UGFyZW50ID0gZ2V0KHJlY29yZCwga2V5KTsKKyAgICAg
IGlmKG5ld1BhcmVudCl7CisgICAgICAgIHZhciBjaGlsZFJlZmVyZW5jZSA9IGdldChyZWNvcmQs
ICdfcmVmZXJlbmNlJyksCisgICAgICAgICAgICBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScp
OworICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5n
ZShjaGlsZFJlZmVyZW5jZSwgZ2V0KG5ld1BhcmVudCwgJ19yZWZlcmVuY2UnKSwgc3RvcmUsIHsg
a2V5OiBrZXksIGtpbmQ6ImJlbG9uZ3NUbyIsIGNoYW5nZVR5cGU6ICJhZGQiIH0pOworICAgICAg
ICBjaGFuZ2Uuc3luYygpOworICAgICAgICBpZih0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV0pewor
ICAgICAgICAgIERTLk9uZVRvTWFueUNoYW5nZS5lbnN1cmVTYW1lVHJhbnNhY3Rpb24oW2NoYW5n
ZSwgdGhpcy5fY2hhbmdlc1RvU3luY1trZXldXSwgc3RvcmUpOworICAgICAgICB9CisgICAgICB9
CisgICAgfQorICAgIGRlbGV0ZSB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV07CisgIH0pCit9KTsK
KworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9
IEVtYmVyLnNldDsKK3ZhciBoYXNSZWxhdGlvbnNoaXAgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25z
KSB7CisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgIHZhciBtZXRhID0geyB0eXBlOiB0
eXBlLCBpc1JlbGF0aW9uc2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2hhc01h
bnknIH07CisKKyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
KyAgICB2YXIgZGF0YSA9IGdldCh0aGlzLCAnZGF0YScpLmhhc01hbnksCisgICAgICAgIHN0b3Jl
ID0gZ2V0KHRoaXMsICdzdG9yZScpLAorICAgICAgICBpZHMsIHJlbGF0aW9uc2hpcDsKKworICAg
IGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHR5cGUgPSBnZXQodGhpcywg
dHlwZSwgZmFsc2UpIHx8IGdldChFbWJlci5sb29rdXAsIHR5cGUpOworICAgIH0KKworICAgIGlk
cyA9IGRhdGFba2V5XTsKKyAgICByZWxhdGlvbnNoaXAgPSBzdG9yZS5maW5kTWFueSh0eXBlLCBp
ZHMgfHwgW10sIHRoaXMsIG1ldGEpOworICAgIHNldChyZWxhdGlvbnNoaXAsICdvd25lcicsIHRo
aXMpOworICAgIHNldChyZWxhdGlvbnNoaXAsICduYW1lJywga2V5KTsKKworICAgIHJldHVybiBy
ZWxhdGlvbnNoaXA7CisgIH0pLnByb3BlcnR5KCkubWV0YShtZXRhKTsKK307CisKK0RTLmhhc01h
bnkgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7CisgIEVtYmVyLmFzc2VydCgiVGhlIHR5cGUg
cGFzc2VkIHRvIERTLmhhc01hbnkgbXVzdCBiZSBkZWZpbmVkIiwgISF0eXBlKTsKKyAgcmV0dXJu
IGhhc1JlbGF0aW9uc2hpcCh0eXBlLCBvcHRpb25zKTsKK307CisKK30pKCk7CisKKworCisoZnVu
Y3Rpb24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKKy8qKgor
ICBAcHJpdmF0ZQorCisgIFRoaXMgZmlsZSBkZWZpbmVzIHNldmVyYWwgZXh0ZW5zaW9ucyB0byB0
aGUgYmFzZSBgRFMuTW9kZWxgIGNsYXNzIHRoYXQKKyAgYWRkIHN1cHBvcnQgZm9yIG9uZS10by1t
YW55IHJlbGF0aW9uc2hpcHMuCisqLworCitEUy5Nb2RlbC5yZW9wZW4oeworICAvLyBUaGlzIEVt
YmVyLmpzIGhvb2sgYWxsb3dzIGFuIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGVuIGEgcHJvcGVy
dHkKKyAgLy8gaXMgZGVmaW5lZC4KKyAgLy8KKyAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB1c2UgaXQg
dG8gYmUgbm90aWZpZWQgd2hlbiBhbiBFbWJlciBEYXRhIHVzZXIgZGVmaW5lcyBhCisgIC8vIGJl
bG9uZ3MtdG8gcmVsYXRpb25zaGlwLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gc2V0IHVwIG9i
c2VydmVycyBmb3IKKyAgLy8gZWFjaCBvbmUsIGFsbG93aW5nIHVzIHRvIHRyYWNrIHJlbGF0aW9u
c2hpcCBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5CisgIC8vIHJlZmxlY3QgY2hhbmdlcyBpbiB0
aGUgaW52ZXJzZSBoYXMtbWFueSBhcnJheS4KKyAgLy8KKyAgLy8gVGhpcyBob29rIHBhc3NlcyB0
aGUgY2xhc3MgYmVpbmcgc2V0IHVwLCBhcyB3ZWxsIGFzIHRoZSBrZXkgYW5kIHZhbHVlCisgIC8v
IGJlaW5nIGRlZmluZWQuIFNvLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlciBkb2VzIHRoaXM6
CisgIC8vCisgIC8vICAgRFMuTW9kZWwuZXh0ZW5kKHsKKyAgLy8gICAgIHBhcmVudDogRFMuYmVs
b25nc1RvKEFwcC5Vc2VyKQorICAvLyAgIH0pOworICAvLworICAvLyBUaGlzIGhvb2sgd291bGQg
YmUgY2FsbGVkIHdpdGggInBhcmVudCIgYXMgdGhlIGtleSBhbmQgdGhlIGNvbXB1dGVkCisgIC8v
IHByb3BlcnR5IHJldHVybmVkIGJ5IGBEUy5iZWxvbmdzVG9gIGFzIHRoZSB2YWx1ZS4KKyAgZGlk
RGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uKHByb3RvLCBrZXksIHZhbHVlKSB7CisgICAgLy8gQ2hl
Y2sgaWYgdGhlIHZhbHVlIGJlaW5nIHNldCBpcyBhIGNvbXB1dGVkIHByb3BlcnR5LgorICAgIGlm
ICh2YWx1ZSBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3IpIHsKKworICAgICAgLy8gSWYgaXQg
aXMsIGdldCB0aGUgbWV0YWRhdGEgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoaXMgaXMKKyAgICAg
IC8vIHBvcHVsYXRlZCBieSB0aGUgYERTLmJlbG9uZ3NUb2AgaGVscGVyIHdoZW4gaXQgaXMgY3Jl
YXRpbmcKKyAgICAgIC8vIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KKyAgICAgIHZhciBtZXRhID0g
dmFsdWUubWV0YSgpOworCisgICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCAmJiBtZXRhLmtp
bmQgPT09ICdiZWxvbmdzVG8nKSB7CisgICAgICAgIEVtYmVyLmFkZE9ic2VydmVyKHByb3RvLCBr
ZXksIG51bGwsICdiZWxvbmdzVG9EaWRDaGFuZ2UnKTsKKyAgICAgICAgRW1iZXIuYWRkQmVmb3Jl
T2JzZXJ2ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2JlbG9uZ3NUb1dpbGxDaGFuZ2UnKTsKKyAgICAg
IH0KKworICAgICAgaWYgKG1ldGEuaXNBdHRyaWJ1dGUpIHsKKyAgICAgICAgRW1iZXIuYWRkT2Jz
ZXJ2ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2F0dHJpYnV0ZURpZENoYW5nZScpOworICAgICAgICBF
bWJlci5hZGRCZWZvcmVPYnNlcnZlcihwcm90bywga2V5LCBudWxsLCAnYXR0cmlidXRlV2lsbENo
YW5nZScpOworICAgICAgfQorCisgICAgICBtZXRhLnBhcmVudFR5cGUgPSBwcm90by5jb25zdHJ1
Y3RvcjsKKyAgICB9CisgIH0KK30pOworCisvKioKKyAgVGhlc2UgRFMuTW9kZWwgZXh0ZW5zaW9u
cyBhZGQgY2xhc3MgbWV0aG9kcyB0aGF0IHByb3ZpZGUgcmVsYXRpb25zaGlwCisgIGludHJvc3Bl
Y3Rpb24gYWJpbGl0aWVzIGFib3V0IHJlbGF0aW9uc2hpcHMuCisKKyAgQSBub3RlIGFib3V0IHRo
ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBoZXJlOgorCisgICoqVGhlc2UgcHJvcGVy
dGllcyBhcmUgZWZmZWN0aXZlbHkgc2VhbGVkIG9uY2UgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGlt
ZS4qKgorICBUbyBhdm9pZCByZXBlYXRlZGx5IGRvaW5nIGV4cGVuc2l2ZSBpdGVyYXRpb24gb3Zl
ciBhIG1vZGVsJ3MgZmllbGRzLCB0aGVzZQorICB2YWx1ZXMgYXJlIGNvbXB1dGVkIG9uY2UgYW5k
IHRoZW4gY2FjaGVkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBydW50aW1lIG9mCisgIHlvdXIg
YXBwbGljYXRpb24uCisKKyAgSWYgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0byBtb2RpZnkgYSBj
bGFzcyBhZnRlciBpdHMgaW5pdGlhbCBkZWZpbml0aW9uCisgIChmb3IgZXhhbXBsZSwgdXNpbmcg
YHJlb3BlbigpYCB0byBhZGQgYWRkaXRpb25hbCBhdHRyaWJ1dGVzKSwgbWFrZSBzdXJlIHlvdQor
ICBkbyBpdCBiZWZvcmUgdXNpbmcgeW91ciBtb2RlbCB3aXRoIHRoZSBzdG9yZSwgd2hpY2ggdXNl
cyB0aGVzZSBwcm9wZXJ0aWVzCisgIGV4dGVuc2l2ZWx5LgorKi8KKworRFMuTW9kZWwucmVvcGVu
Q2xhc3MoeworICAvKioKKyAgICBGb3IgYSBnaXZlbiByZWxhdGlvbnNoaXAgbmFtZSwgcmV0dXJu
cyB0aGUgbW9kZWwgdHlwZSBvZiB0aGUgcmVsYXRpb25zaGlwLgorCisgICAgRm9yIGV4YW1wbGUs
IGlmIHlvdSBkZWZpbmUgYSBtb2RlbCBsaWtlIHRoaXM6CisKKyAgICAgICAgQXBwLlBvc3QgPSBE
Uy5Nb2RlbC5leHRlbmQoeworICAgICAgICAgIGNvbW1lbnRzOiBEUy5oYXNNYW55KEFwcC5Db21t
ZW50KQorICAgICAgICB9KTsKKworICAgIENhbGxpbmcgYEFwcC5Qb3N0LnR5cGVGb3JSZWxhdGlv
bnNoaXAoJ2NvbW1lbnRzJylgIHdpbGwgcmV0dXJuIGBBcHAuQ29tbWVudGAuCisKKyAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCisgICAgQHJldHVy
biB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHRoZSB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAsIG9y
IHVuZGVmaW5lZAorICAqLworICB0eXBlRm9yUmVsYXRpb25zaGlwOiBmdW5jdGlvbihuYW1lKSB7
CisgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldCh0aGlzLCAncmVsYXRpb25zaGlwc0J5TmFtZScp
LmdldChuYW1lKTsKKyAgICByZXR1cm4gcmVsYXRpb25zaGlwICYmIHJlbGF0aW9uc2hpcC50eXBl
OworICB9LAorCisgIC8qKgorICAgIFRoZSBtb2RlbCdzIHJlbGF0aW9uc2hpcHMgYXMgYSBtYXAs
IGtleWVkIG9uIHRoZSB0eXBlIG9mIHRoZQorICAgIHJlbGF0aW9uc2hpcC4gVGhlIHZhbHVlIG9m
IGVhY2ggZW50cnkgaXMgYW4gYXJyYXkgY29udGFpbmluZyBhIGRlc2NyaXB0b3IKKyAgICBmb3Ig
ZWFjaCByZWxhdGlvbnNoaXAgd2l0aCB0aGF0IHR5cGUsIGRlc2NyaWJpbmcgdGhlIG5hbWUgb2Yg
dGhlIHJlbGF0aW9uc2hpcAorICAgIGFzIHdlbGwgYXMgdGhlIHR5cGUuCisKKyAgICBGb3IgZXhh
bXBsZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBtb2RlbCBkZWZpbml0aW9uOgorCisgICAgICAgIEFw
cC5CbG9nID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgICAgICB1c2VyczogRFMuaGFzTWFueShB
cHAuVXNlciksCisgICAgICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbyhBcHAuVXNlciksCisgICAg
ICAgICAgcG9zdHM6IERTLmhhc01hbnkoQXBwLlBvc3QpCisgICAgICAgIH0pOworCisgICAgVGhp
cyBjb21wdXRlZCBwcm9wZXJ0eSB3b3VsZCByZXR1cm4gYSBtYXAgZGVzY3JpYmluZyB0aGVzZQor
ICAgIHJlbGF0aW9uc2hpcHMsIGxpa2UgdGhpczoKKworICAgICAgICB2YXIgcmVsYXRpb25zaGlw
cyA9IEVtYmVyLmdldChBcHAuQmxvZywgJ3JlbGF0aW9uc2hpcHMnKTsKKyAgICAgICAgYXNzb2Np
YXRvbnMuZ2V0KEFwcC5Vc2VyKTsKKyAgICAgICAgLy89PiBbIHsgbmFtZTogJ3VzZXJzJywga2lu
ZDogJ2hhc01hbnknIH0sCisgICAgICAgIC8vICAgICB7IG5hbWU6ICdvd25lcicsIGtpbmQ6ICdi
ZWxvbmdzVG8nIH0gXQorICAgICAgICByZWxhdGlvbnNoaXBzLmdldChBcHAuUG9zdCk7CisgICAg
ICAgIC8vPT4gWyB7IG5hbWU6ICdwb3N0cycsIGtpbmQ6ICdoYXNNYW55JyB9IF0KKworICAgIEB0
eXBlIEVtYmVyLk1hcAorICAgIEByZWFkT25seQorICAqLworICByZWxhdGlvbnNoaXBzOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICB2YXIgbWFwID0gbmV3IEVtYmVyLk1hcFdpdGhE
ZWZhdWx0KHsKKyAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfQor
ICAgIH0pOworCisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY29tcHV0ZWQgcHJvcGVydHkgb24g
dGhlIGNsYXNzCisgICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBt
ZXRhKSB7CisKKyAgICAgIC8vIElmIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBpcyBhIHJlbGF0aW9u
c2hpcCwgYWRkCisgICAgICAvLyBpdCB0byB0aGUgbWFwLgorICAgICAgaWYgKG1ldGEuaXNSZWxh
dGlvbnNoaXApIHsKKyAgICAgICAgaWYgKHR5cGVvZiBtZXRhLnR5cGUgPT09ICdzdHJpbmcnKSB7
CisgICAgICAgICAgbWV0YS50eXBlID0gRW1iZXIuZ2V0KEVtYmVyLmxvb2t1cCwgbWV0YS50eXBl
KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZWxhdGlvbnNoaXBzRm9yVHlwZSA9IG1hcC5n
ZXQobWV0YS50eXBlKTsKKworICAgICAgICByZWxhdGlvbnNoaXBzRm9yVHlwZS5wdXNoKHsgbmFt
ZTogbmFtZSwga2luZDogbWV0YS5raW5kIH0pOworICAgICAgfQorICAgIH0pOworCisgICAgcmV0
dXJuIG1hcDsKKyAgfSksCisKKyAgLyoqCisgICAgQSBoYXNoIGNvbnRhaW5pbmcgbGlzdHMgb2Yg
dGhlIG1vZGVsJ3MgcmVsYXRpb25zaGlwcywgZ3JvdXBlZAorICAgIGJ5IHRoZSByZWxhdGlvbnNo
aXAga2luZC4gRm9yIGV4YW1wbGUsIGdpdmVuIGEgbW9kZWwgd2l0aCB0aGlzCisgICAgZGVmaW5p
dGlvbjoKKworICAgICAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgICAgICAg
dXNlcnM6IERTLmhhc01hbnkoQXBwLlVzZXIpLAorICAgICAgICAgIG93bmVyOiBEUy5iZWxvbmdz
VG8oQXBwLlVzZXIpLAorCisgICAgICAgICAgcG9zdHM6IERTLmhhc01hbnkoQXBwLlBvc3QpCisg
ICAgICAgIH0pOworCisgICAgVGhpcyBwcm9wZXJ0eSB3b3VsZCBjb250YWluIHRoZSBmb2xsb3dp
bmc6CisKKyAgICAgICB2YXIgcmVsYXRpb25zaGlwTmFtZXMgPSBFbWJlci5nZXQoQXBwLkJsb2cs
ICdyZWxhdGlvbnNoaXBOYW1lcycpOworICAgICAgIHJlbGF0aW9uc2hpcE5hbWVzLmhhc01hbnk7
CisgICAgICAgLy89PiBbJ3VzZXJzJywgJ3Bvc3RzJ10KKyAgICAgICByZWxhdGlvbnNoaXBOYW1l
cy5iZWxvbmdzVG87CisgICAgICAgLy89PiBbJ293bmVyJ10KKworICAgIEB0eXBlIE9iamVjdAor
ICAgIEByZWFkT25seQorICAqLworICByZWxhdGlvbnNoaXBOYW1lczogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7CisgICAgdmFyIG5hbWVzID0geyBoYXNNYW55OiBbXSwgYmVsb25nc1RvOiBb
XSB9OworCisgICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBtZXRh
KSB7CisgICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgeworICAgICAgICBuYW1lc1ttZXRh
LmtpbmRdLnB1c2gobmFtZSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICByZXR1cm4gbmFtZXM7
CisgIH0pLAorCisgIC8qKgorICAgIEFuIGFycmF5IG9mIHR5cGVzIGRpcmVjdGx5IHJlbGF0ZWQg
dG8gYSBtb2RlbC4gRWFjaCB0eXBlIHdpbGwgYmUKKyAgICBpbmNsdWRlZCBvbmNlLCByZWdhcmRs
ZXNzIG9mIHRoZSBudW1iZXIgb2YgcmVsYXRpb25zaGlwcyBpdCBoYXMgd2l0aAorICAgIHRoZSBt
b2RlbC4KKworICAgIEZvciBleGFtcGxlLCBnaXZlbiBhIG1vZGVsIHdpdGggdGhpcyBkZWZpbml0
aW9uOgorCisgICAgICAgIEFwcC5CbG9nID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgICAgICB1
c2VyczogRFMuaGFzTWFueShBcHAuVXNlciksCisgICAgICAgICAgb3duZXI6IERTLmJlbG9uZ3NU
byhBcHAuVXNlciksCisgICAgICAgICAgcG9zdHM6IERTLmhhc01hbnkoQXBwLlBvc3QpCisgICAg
ICAgIH0pOworCisgICAgVGhpcyBwcm9wZXJ0eSB3b3VsZCBjb250YWluIHRoZSBmb2xsb3dpbmc6
CisKKyAgICAgICB2YXIgcmVsYXRlZFR5cGVzID0gRW1iZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRl
ZFR5cGVzJyk7CisgICAgICAgLy89PiBbIEFwcC5Vc2VyLCBBcHAuUG9zdCBdCisKKyAgICBAdHlw
ZSBFbWJlci5BcnJheQorICAgIEByZWFkT25seQorICAqLworICByZWxhdGVkVHlwZXM6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciB0eXBlLAorICAgICAgICB0eXBlcyA9IEVt
YmVyLkEoW10pOworCisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY29tcHV0ZWQgcHJvcGVydHkg
b24gdGhlIGNsYXNzLAorICAgIC8vIGFuZCBjcmVhdGUgYW4gYXJyYXkgb2YgdGhlIHVuaXF1ZSB0
eXBlcyBpbnZvbHZlZAorICAgIC8vIGluIHJlbGF0aW9uc2hpcHMKKyAgICB0aGlzLmVhY2hDb21w
dXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKKyAgICAgIGlmIChtZXRhLmlzUmVs
YXRpb25zaGlwKSB7CisgICAgICAgIHR5cGUgPSBtZXRhLnR5cGU7CisKKyAgICAgICAgaWYgKHR5
cGVvZiB0eXBlID09PSAnc3RyaW5nJykgeworICAgICAgICAgIHR5cGUgPSBnZXQodGhpcywgdHlw
ZSwgZmFsc2UpIHx8IGdldChFbWJlci5sb29rdXAsIHR5cGUpOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCF0eXBlcy5jb250YWlucyh0eXBlKSkgeworICAgICAgICAgIHR5cGVzLnB1c2godHlw
ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiB0eXBlczsKKyAg
fSksCisKKyAgLyoqCisgICAgQSBtYXAgd2hvc2Uga2V5cyBhcmUgdGhlIHJlbGF0aW9uc2hpcHMg
b2YgYSBtb2RlbCBhbmQgd2hvc2UgdmFsdWVzIGFyZQorICAgIHJlbGF0aW9uc2hpcCBkZXNjcmlw
dG9ycy4KKworICAgIEZvciBleGFtcGxlLCBnaXZlbiBhIG1vZGVsIHdpdGggdGhpcworICAgIGRl
ZmluaXRpb246CisKKyAgICAgICAgQXBwLkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAg
ICAgIHVzZXJzOiBEUy5oYXNNYW55KEFwcC5Vc2VyKSwKKyAgICAgICAgICBvd25lcjogRFMuYmVs
b25nc1RvKEFwcC5Vc2VyKSwKKworICAgICAgICAgIHBvc3RzOiBEUy5oYXNNYW55KEFwcC5Qb3N0
KQorICAgICAgICB9KTsKKworICAgIFRoaXMgcHJvcGVydHkgd291bGQgY29udGFpbiB0aGUgZm9s
bG93aW5nOgorCisgICAgICAgdmFyIHJlbGF0aW9uc2hpcHNCeU5hbWUgPSBFbWJlci5nZXQoQXBw
LkJsb2csICdyZWxhdGlvbnNoaXBzQnlOYW1lJyk7CisgICAgICAgcmVsYXRpb25zaGlwc0J5TmFt
ZS5nZXQoJ3VzZXJzJyk7CisgICAgICAgLy89PiB7IGtleTogJ3VzZXJzJywga2luZDogJ2hhc01h
bnknLCB0eXBlOiBBcHAuVXNlciB9CisgICAgICAgcmVsYXRpb25zaGlwc0J5TmFtZS5nZXQoJ293
bmVyJyk7CisgICAgICAgLy89PiB7IGtleTogJ293bmVyJywga2luZDogJ2JlbG9uZ3NUbycsIHR5
cGU6IEFwcC5Vc2VyIH0KKworICAgIEB0eXBlIEVtYmVyLk1hcAorICAgIEByZWFkT25seQorICAq
LworICByZWxhdGlvbnNoaXBzQnlOYW1lOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAg
ICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgpLCB0eXBlOworCisgICAgdGhpcy5lYWNoQ29t
cHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBtZXRhKSB7CisgICAgICBpZiAobWV0YS5pc1Jl
bGF0aW9uc2hpcCkgeworICAgICAgICBtZXRhLmtleSA9IG5hbWU7CisgICAgICAgIHR5cGUgPSBt
ZXRhLnR5cGU7CisKKyAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgeworICAg
ICAgICAgIHR5cGUgPSBnZXQodGhpcywgdHlwZSwgZmFsc2UpIHx8IGdldChFbWJlci5sb29rdXAs
IHR5cGUpOworICAgICAgICAgIG1ldGEudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAg
ICBtYXAuc2V0KG5hbWUsIG1ldGEpOworICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIG1h
cDsKKyAgfSksCisKKyAgLyoqCisgICAgQSBtYXAgd2hvc2Uga2V5cyBhcmUgdGhlIGZpZWxkcyBv
ZiB0aGUgbW9kZWwgYW5kIHdob3NlIHZhbHVlcyBhcmUgc3RyaW5ncworICAgIGRlc2NyaWJpbmcg
dGhlIGtpbmQgb2YgdGhlIGZpZWxkLiBBIG1vZGVsJ3MgZmllbGRzIGFyZSB0aGUgdW5pb24gb2Yg
YWxsIG9mIGl0cworICAgIGF0dHJpYnV0ZXMgYW5kIHJlbGF0aW9uc2hpcHMuCisKKyAgICBGb3Ig
ZXhhbXBsZToKKworICAgICAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgICAg
ICAgdXNlcnM6IERTLmhhc01hbnkoQXBwLlVzZXIpLAorICAgICAgICAgIG93bmVyOiBEUy5iZWxv
bmdzVG8oQXBwLlVzZXIpLAorCisgICAgICAgICAgcG9zdHM6IERTLmhhc01hbnkoQXBwLlBvc3Qp
LAorCisgICAgICAgICAgdGl0bGU6IERTLmF0dHIoJ3N0cmluZycpCisgICAgICAgIH0pOworCisg
ICAgICAgIHZhciBmaWVsZHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdmaWVsZHMnKTsKKyAgICAg
ICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQsIGtpbmQpIHsKKyAgICAgICAgICBjb25z
b2xlLmxvZyhmaWVsZCwga2luZCk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIHByaW50czoK
KyAgICAgICAgLy8gdXNlcnMsIGhhc01hbnkKKyAgICAgICAgLy8gb3duZXIsIGJlbG9uZ3NUbwor
ICAgICAgICAvLyBwb3N0cywgaGFzTWFueQorICAgICAgICAvLyB0aXRsZSwgYXR0cmlidXRlCisK
KyAgICBAdHlwZSBFbWJlci5NYXAKKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgZmllbGRzOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgp
LCB0eXBlOworCisgICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBt
ZXRhKSB7CisgICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgeworICAgICAgICBtYXAuc2V0
KG5hbWUsIG1ldGEua2luZCk7CisgICAgICB9IGVsc2UgaWYgKG1ldGEuaXNBdHRyaWJ1dGUpIHsK
KyAgICAgICAgbWFwLnNldChuYW1lLCAnYXR0cmlidXRlJyk7CisgICAgICB9CisgICAgfSk7CisK
KyAgICByZXR1cm4gbWFwOworICB9KSwKKworICAvKioKKyAgICBHaXZlbiBhIGNhbGxiYWNrLCBp
dGVyYXRlcyBvdmVyIGVhY2ggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIG1vZGVsLAorICAg
IGludm9raW5nIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBuYW1lIG9mIGVhY2ggcmVsYXRpb25zaGlw
IGFuZCBpdHMgcmVsYXRpb25zaGlwCisgICAgZGVzY3JpcHRvci4KKworICAgIEBwYXJhbSB7RnVu
Y3Rpb259IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBpbnZva2UKKyAgICBAcGFyYW0ge2FueX0g
YmluZGluZyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIGNhbGxiYWNrJ3MgYHRoaXNgIHNob3VsZCBi
ZSBib3VuZAorICAqLworICBlYWNoUmVsYXRpb25zaGlwOiBmdW5jdGlvbihjYWxsYmFjaywgYmlu
ZGluZykgeworICAgIGdldCh0aGlzLCAncmVsYXRpb25zaGlwc0J5TmFtZScpLmZvckVhY2goZnVu
Y3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7CisgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcs
IG5hbWUsIHJlbGF0aW9uc2hpcCk7CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAgR2l2ZW4g
YSBjYWxsYmFjaywgaXRlcmF0ZXMgb3ZlciBlYWNoIG9mIHRoZSB0eXBlcyByZWxhdGVkIHRvIGEg
bW9kZWwsCisgICAgaW52b2tpbmcgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHJlbGF0ZWQgdHlwZSdz
IGNsYXNzLiBFYWNoIHR5cGUgd2lsbCBiZQorICAgIHJldHVybmVkIGp1c3Qgb25jZSwgcmVnYXJk
bGVzcyBvZiBob3cgbWFueSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBpdCBoYXMKKyAgICB3aXRo
IGEgbW9kZWwuCisKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgY2FsbGJhY2sg
dG8gaW52b2tlCisgICAgQHBhcmFtIHthbnl9IGJpbmRpbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRo
ZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUgYm91bmQKKyAgKi8KKyAgZWFjaFJlbGF0ZWRU
eXBlOiBmdW5jdGlvbihjYWxsYmFjaywgYmluZGluZykgeworICAgIGdldCh0aGlzLCAncmVsYXRl
ZFR5cGVzJykuZm9yRWFjaChmdW5jdGlvbih0eXBlKSB7CisgICAgICBjYWxsYmFjay5jYWxsKGJp
bmRpbmcsIHR5cGUpOworICAgIH0pOworICB9Cit9KTsKKworRFMuTW9kZWwucmVvcGVuKHsKKyAg
LyoqCisgICAgR2l2ZW4gYSBjYWxsYmFjaywgaXRlcmF0ZXMgb3ZlciBlYWNoIG9mIHRoZSByZWxh
dGlvbnNoaXBzIGluIHRoZSBtb2RlbCwKKyAgICBpbnZva2luZyB0aGUgY2FsbGJhY2sgd2l0aCB0
aGUgbmFtZSBvZiBlYWNoIHJlbGF0aW9uc2hpcCBhbmQgaXRzIHJlbGF0aW9uc2hpcAorICAgIGRl
c2NyaXB0b3IuCisKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgY2FsbGJhY2sg
dG8gaW52b2tlCisgICAgQHBhcmFtIHthbnl9IGJpbmRpbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRo
ZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUgYm91bmQKKyAgKi8KKyAgZWFjaFJlbGF0aW9u
c2hpcDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICB0aGlzLmNvbnN0cnVjdG9y
LmVhY2hSZWxhdGlvbnNoaXAoY2FsbGJhY2ssIGJpbmRpbmcpOworICB9Cit9KTsKKworLyoqCisg
IEBwcml2YXRlCisKKyAgSGVscGVyIG1ldGhvZCB0byBsb29rIHVwIHRoZSBuYW1lIG9mIHRoZSBp
bnZlcnNlIG9mIGEgcmVsYXRpb25zaGlwLgorCisgIEluIGEgaGFzLW1hbnkgcmVsYXRpb25zaGlw
LCB0aGVyZSBhcmUgYWx3YXlzIHR3byBzaWRlczogdGhlIGBiZWxvbmdzVG9gIHNpZGUKKyAgYW5k
IHRoZSBgaGFzTWFueWAgc2lkZS4gV2hlbiBvbmUgc2lkZSBjaGFuZ2VzLCB0aGUgb3RoZXIgc2lk
ZSBzaG91bGQgYmUgdXBkYXRlZAorICBhdXRvbWF0aWNhbGx5LgorCisgIEdpdmVuIGEgbW9kZWws
IHRoZSBtb2RlbCBvZiB0aGUgaW52ZXJzZSwgYW5kIHRoZSBraW5kIG9mIHRoZSByZWxhdGlvbnNo
aXAsIHRoaXMKKyAgaGVscGVyIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCBv
biB0aGUgaW52ZXJzZS4KKworICBGb3IgZXhhbXBsZSwgaW1hZ2luZSB0aGUgZm9sbG93aW5nIHR3
byBhc3NvY2lhdGVkIG1vZGVsczoKKworICAgICAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQo
eworICAgICAgICBjb21tZW50czogRFMuaGFzTWFueSgnQXBwLkNvbW1lbnQnKQorICAgICAgfSk7
CisKKyAgICAgIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgICAgcG9zdDog
RFMuYmVsb25nc1RvKCdBcHAuUG9zdCcpCisgICAgICB9KTsKKworICBJZiB0aGUgYHBvc3RgIHBy
b3BlcnR5IG9mIGEgYENvbW1lbnRgIHdhcyBtb2RpZmllZCwgRW1iZXIgRGF0YSB3b3VsZCBpbnZv
a2UKKyAgdGhpcyBoZWxwZXIgbGlrZSB0aGlzOgorCisgICAgICBEUy5faW52ZXJzZU5hbWVGb3Io
QXBwLkNvbW1lbnQsIEFwcC5Qb3N0LCAnaGFzTWFueScpOworICAgICAgLy89PiAnY29tbWVudHMn
CisKKyAgRW1iZXIgRGF0YSB1c2VzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgcmV0dXJu
ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlZAorICByZWxhdGlvbnNoaXAgb24gdGhlIG90aGVyIHNp
ZGUuCisqLworRFMuX2ludmVyc2VSZWxhdGlvbnNoaXBGb3IgPSBmdW5jdGlvbihtb2RlbFR5cGUs
IGludmVyc2VNb2RlbFR5cGUpIHsKKyAgdmFyIHJlbGF0aW9uc2hpcE1hcCA9IGdldChtb2RlbFR5
cGUsICdyZWxhdGlvbnNoaXBzJyksCisgICAgICBwb3NzaWJsZVJlbGF0aW9uc2hpcHMgPSByZWxh
dGlvbnNoaXBNYXAuZ2V0KGludmVyc2VNb2RlbFR5cGUpLAorICAgICAgcG9zc2libGUsIGFjdHVh
bCwgb2xkVmFsdWU7CisKKyAgaWYgKCFwb3NzaWJsZVJlbGF0aW9uc2hpcHMpIHsgcmV0dXJuOyB9
CisgIGlmIChwb3NzaWJsZVJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMSkgeyByZXR1cm47IH0KKyAg
cmV0dXJuIHBvc3NpYmxlUmVsYXRpb25zaGlwc1swXTsKK307CisKKy8qKgorICBAcHJpdmF0ZQor
CisgIEdpdmVuIGEgbW9kZWwgYW5kIGEgcmVsYXRpb25zaGlwIG5hbWUsIHJldHVybnMgdGhlIG1v
ZGVsIHR5cGUgb2YKKyAgdGhlIG5hbWVkIHJlbGF0aW9uc2hpcC4KKworICAgICAgQXBwLlBvc3Qg
PSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAgICBjb21tZW50czogRFMuaGFzTWFueSgnQXBwLkNv
bW1lbnQnKQorICAgICAgfSk7CisKKyAgICAgIERTLl9pbnZlcnNlVHlwZUZvcihBcHAuUG9zdCwg
J2NvbW1lbnRzJyk7CisgICAgICAvLz0+IEFwcC5Db21tZW50CisgIEBwYXJhbSB7RFMuTW9kZWwg
Y2xhc3N9IG1vZGVsVHlwZQorICBAcGFyYW0ge1N0cmluZ30gcmVsYXRpb25zaGlwTmFtZQorICBA
cmV0dXJuIHtEUy5Nb2RlbCBjbGFzc30KKyovCitEUy5faW52ZXJzZVR5cGVGb3IgPSBmdW5jdGlv
bihtb2RlbFR5cGUsIHJlbGF0aW9uc2hpcE5hbWUpIHsKKyAgdmFyIHJlbGF0aW9uc2hpcHMgPSBn
ZXQobW9kZWxUeXBlLCAncmVsYXRpb25zaGlwc0J5TmFtZScpLAorICAgICAgcmVsYXRpb25zaGlw
ID0gcmVsYXRpb25zaGlwcy5nZXQocmVsYXRpb25zaGlwTmFtZSk7CisKKyAgaWYgKHJlbGF0aW9u
c2hpcCkgeyByZXR1cm4gcmVsYXRpb25zaGlwLnR5cGU7IH0KK307CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Cit2YXIg
Zm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOworCitEUy5SZWxhdGlvbnNo
aXBDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgIHRoaXMucGFyZW50UmVmZXJlbmNlID0g
b3B0aW9ucy5wYXJlbnRSZWZlcmVuY2U7CisgIHRoaXMuY2hpbGRSZWZlcmVuY2UgPSBvcHRpb25z
LmNoaWxkUmVmZXJlbmNlOworICB0aGlzLmZpcnN0UmVjb3JkUmVmZXJlbmNlID0gb3B0aW9ucy5m
aXJzdFJlY29yZFJlZmVyZW5jZTsKKyAgdGhpcy5maXJzdFJlY29yZEtpbmQgPSBvcHRpb25zLmZp
cnN0UmVjb3JkS2luZDsKKyAgdGhpcy5maXJzdFJlY29yZE5hbWUgPSBvcHRpb25zLmZpcnN0UmVj
b3JkTmFtZTsKKyAgdGhpcy5zZWNvbmRSZWNvcmRSZWZlcmVuY2UgPSBvcHRpb25zLnNlY29uZFJl
Y29yZFJlZmVyZW5jZTsKKyAgdGhpcy5zZWNvbmRSZWNvcmRLaW5kID0gb3B0aW9ucy5zZWNvbmRS
ZWNvcmRLaW5kOworICB0aGlzLnNlY29uZFJlY29yZE5hbWUgPSBvcHRpb25zLnNlY29uZFJlY29y
ZE5hbWU7CisgIHRoaXMuc3RvcmUgPSBvcHRpb25zLnN0b3JlOworICB0aGlzLmNvbW1pdHRlZCA9
IHt9OworICB0aGlzLmNoYW5nZVR5cGUgPSBvcHRpb25zLmNoYW5nZVR5cGU7Cit9OworCitEUy5S
ZWxhdGlvbnNoaXBDaGFuZ2VBZGQgPSBmdW5jdGlvbihvcHRpb25zKXsKKyAgRFMuUmVsYXRpb25z
aGlwQ2hhbmdlLmNhbGwodGhpcywgb3B0aW9ucyk7Cit9OworCitEUy5SZWxhdGlvbnNoaXBDaGFu
Z2VSZW1vdmUgPSBmdW5jdGlvbihvcHRpb25zKXsKKyAgRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNh
bGwodGhpcywgb3B0aW9ucyk7Cit9OworCisvKiogQHByaXZhdGUgKi8KK0RTLlJlbGF0aW9uc2hp
cENoYW5nZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgIHJldHVybiBuZXcgRFMuUmVs
YXRpb25zaGlwQ2hhbmdlKG9wdGlvbnMpOworfTsKKworLyoqIEBwcml2YXRlICovCitEUy5SZWxh
dGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgeworICByZXR1cm4g
bmV3IERTLlJlbGF0aW9uc2hpcENoYW5nZUFkZChvcHRpb25zKTsKK307CisKKy8qKiBAcHJpdmF0
ZSAqLworRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlv
bnMpIHsKKyAgcmV0dXJuIG5ldyBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmUob3B0aW9ucyk7
Cit9OworCitEUy5PbmVUb01hbnlDaGFuZ2UgPSB7fTsKK0RTLk9uZVRvTm9uZUNoYW5nZSA9IHt9
OworRFMuTWFueVRvTm9uZUNoYW5nZSA9IHt9OworRFMuT25lVG9PbmVDaGFuZ2UgPSB7fTsKK0RT
Lk1hbnlUb01hbnlDaGFuZ2UgPSB7fTsKKworRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVD
aGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKXsKKyAgaWYob3B0aW9ucy5jaGFuZ2VUeXBlID09PSAi
YWRkIil7CisgICAgcmV0dXJuIERTLlJlbGF0aW9uc2hpcENoYW5nZUFkZC5jcmVhdGUob3B0aW9u
cyk7CisgIH0KKyAgaWYob3B0aW9ucy5jaGFuZ2VUeXBlID09PSAicmVtb3ZlIil7CisgICAgcmV0
dXJuIERTLlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5jcmVhdGUob3B0aW9ucyk7CisgIH0KK307
CisKKworRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmRldGVybWluZVJlbGF0aW9uc2hpcFR5cGUgPSBm
dW5jdGlvbihyZWNvcmRUeXBlLCBrbm93blNpZGUpeworICB2YXIga25vd25LZXkgPSBrbm93blNp
ZGUua2V5LCBrZXksIHR5cGUsIG90aGVyQ29udGFpbmVyVHlwZSxhc3NvYzsKKyAgdmFyIGtub3du
Q29udGFpbmVyVHlwZSA9IGtub3duU2lkZS5raW5kOworICB2YXIgb3B0aW9ucyA9IHJlY29yZFR5
cGUubWV0YUZvclByb3BlcnR5KGtub3duS2V5KS5vcHRpb25zOworICB2YXIgb3RoZXJUeXBlID0g
RFMuX2ludmVyc2VUeXBlRm9yKHJlY29yZFR5cGUsIGtub3duS2V5KTsKKworICBpZihvcHRpb25z
LmludmVyc2UpeworICAgIGtleSA9IG9wdGlvbnMuaW52ZXJzZTsKKyAgICBvdGhlckNvbnRhaW5l
clR5cGUgPSBnZXQob3RoZXJUeXBlLCAncmVsYXRpb25zaGlwc0J5TmFtZScpLmdldChrZXkpLmtp
bmQ7IAorICB9IAorICBlbHNlIGlmKGFzc29jID0gRFMuX2ludmVyc2VSZWxhdGlvbnNoaXBGb3Io
b3RoZXJUeXBlLCByZWNvcmRUeXBlKSl7CisgICAga2V5ID0gYXNzb2MubmFtZTsKKyAgICBvdGhl
ckNvbnRhaW5lclR5cGUgPSBhc3NvYy5raW5kOworICB9IAorICBpZigha2V5KXsKKyAgICByZXR1
cm4ga25vd25Db250YWluZXJUeXBlID09PSAiYmVsb25nc1RvIiA/ICJvbmVUb05vbmUiIDogIm1h
bnlUb05vbmUiOworICB9CisgIGVsc2V7CisgICAgaWYob3RoZXJDb250YWluZXJUeXBlID09PSAi
YmVsb25nc1RvIil7CisgICAgICByZXR1cm4ga25vd25Db250YWluZXJUeXBlID09PSAiYmVsb25n
c1RvIiA/ICJvbmVUb09uZSIgOiAibWFueVRvT25lIjsKKyAgICB9CisgICAgZWxzZXsKKyAgICAg
IHJldHVybiBrbm93bkNvbnRhaW5lclR5cGUgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvTWFueSIg
OiAibWFueVRvTWFueSI7CisgICAgfQorICB9IAorIAorfTsKKworRFMuUmVsYXRpb25zaGlwQ2hh
bmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGZpcnN0UmVjb3JkUmVmZXJlbmNlLCBzZWNvbmRS
ZWNvcmRSZWZlcmVuY2UsIHN0b3JlLCBvcHRpb25zKXsKKyAgLy8gR2V0IHRoZSB0eXBlIG9mIHRo
ZSBjaGlsZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQgSUQKKyAgdmFyIGZpcnN0UmVjb3Jk
VHlwZSA9IGZpcnN0UmVjb3JkUmVmZXJlbmNlLnR5cGUsIGtleSwgY2hhbmdlVHlwZTsKKyAgY2hh
bmdlVHlwZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBl
KGZpcnN0UmVjb3JkVHlwZSwgb3B0aW9ucyk7CisgIGlmIChjaGFuZ2VUeXBlID09PSAib25lVG9N
YW55Iil7CisgICAgcmV0dXJuIERTLk9uZVRvTWFueUNoYW5nZS5jcmVhdGVDaGFuZ2UoZmlyc3RS
ZWNvcmRSZWZlcmVuY2UsIHNlY29uZFJlY29yZFJlZmVyZW5jZSwgc3RvcmUsIG9wdGlvbnMpOwor
ICB9CisgIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICJtYW55VG9PbmUiKXsKKyAgICByZXR1cm4g
RFMuT25lVG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShzZWNvbmRSZWNvcmRSZWZlcmVuY2UsIGZp
cnN0UmVjb3JkUmVmZXJlbmNlLCBzdG9yZSwgb3B0aW9ucyk7CisgIH0KKyAgZWxzZSBpZiAoY2hh
bmdlVHlwZSA9PT0gIm9uZVRvTm9uZSIpeworICAgIHJldHVybiBEUy5PbmVUb05vbmVDaGFuZ2Uu
Y3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkUmVmZXJlbmNlLCBzZWNvbmRSZWNvcmRSZWZlcmVuY2Us
IHN0b3JlLCBvcHRpb25zKTsKKyAgfQorICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAibWFueVRv
Tm9uZSIpeworICAgIHJldHVybiBEUy5NYW55VG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJz
dFJlY29yZFJlZmVyZW5jZSwgc2Vjb25kUmVjb3JkUmVmZXJlbmNlLCBzdG9yZSwgb3B0aW9ucyk7
CisgIH0KKyAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gIm9uZVRvT25lIil7CisgICAgcmV0dXJu
IERTLk9uZVRvT25lQ2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZFJlZmVyZW5jZSwgc2Vj
b25kUmVjb3JkUmVmZXJlbmNlLCBzdG9yZSwgb3B0aW9ucyk7CisgIH0KKyAgZWxzZSBpZiAoY2hh
bmdlVHlwZSA9PT0gIm1hbnlUb01hbnkiKXsKKyAgICByZXR1cm4gRFMuTWFueVRvTWFueUNoYW5n
ZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmRSZWZlcmVuY2UsIHNlY29uZFJlY29yZFJlZmVyZW5j
ZSwgc3RvcmUsIG9wdGlvbnMpOworICB9Cit9OworCisvKiogQHByaXZhdGUgKi8KK0RTLk9uZVRv
Tm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihjaGlsZFJlZmVyZW5jZSwgcGFyZW50
UmVmZXJlbmNlLCBzdG9yZSwgb3B0aW9ucykgeworICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7Cisg
IHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5nZSh7CisgICAg
ICBwYXJlbnRSZWZlcmVuY2U6IHBhcmVudFJlZmVyZW5jZSwKKyAgICAgIGNoaWxkUmVmZXJlbmNl
OiBjaGlsZFJlZmVyZW5jZSwKKyAgICAgIGZpcnN0UmVjb3JkUmVmZXJlbmNlOiBjaGlsZFJlZmVy
ZW5jZSwKKyAgICAgIHN0b3JlOiBzdG9yZSwKKyAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hh
bmdlVHlwZSwKKyAgICAgIGZpcnN0UmVjb3JkTmFtZToga2V5LAorICAgICAgZmlyc3RSZWNvcmRL
aW5kOiAiYmVsb25nc1RvIgorICB9KTsKKworICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VG
b3IoY2hpbGRSZWZlcmVuY2UsIGtleSwgcGFyZW50UmVmZXJlbmNlLCBudWxsLCBjaGFuZ2UpOwor
CisgIHJldHVybiBjaGFuZ2U7Cit9OworCisvKiogQHByaXZhdGUgKi8KK0RTLk1hbnlUb05vbmVD
aGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWZlcmVuY2UsIHBhcmVudFJlZmVy
ZW5jZSwgc3RvcmUsIG9wdGlvbnMpIHsKKyAgdmFyIGtleSA9IG9wdGlvbnMua2V5OworICB2YXIg
Y2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoeworICAgICAgcGFy
ZW50UmVmZXJlbmNlOiBjaGlsZFJlZmVyZW5jZSwKKyAgICAgIGNoaWxkUmVmZXJlbmNlOiBwYXJl
bnRSZWZlcmVuY2UsCisgICAgICBzZWNvbmRSZWNvcmRSZWZlcmVuY2U6IGNoaWxkUmVmZXJlbmNl
LAorICAgICAgc3RvcmU6IHN0b3JlLAorICAgICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VU
eXBlLAorICAgICAgc2Vjb25kUmVjb3JkTmFtZTogb3B0aW9ucy5rZXksCisgICAgICBzZWNvbmRS
ZWNvcmRLaW5kOiAiaGFzTWFueSIKKyAgfSk7CisKKyAgc3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hh
bmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBrZXksIHBhcmVudFJlZmVyZW5jZSwgbnVsbCwgY2hhbmdl
KTsKKyAgcmV0dXJuIGNoYW5nZTsKK307CisKKworLyoqIEBwcml2YXRlICovCitEUy5NYW55VG9N
YW55Q2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGNoaWxkUmVmZXJlbmNlLCBwYXJlbnRS
ZWZlcmVuY2UsIHN0b3JlLCBvcHRpb25zKSB7CisgIC8vIEdldCB0aGUgdHlwZSBvZiB0aGUgY2hp
bGQgYmFzZWQgb24gdGhlIGNoaWxkJ3MgY2xpZW50IElECisgIHZhciBjaGlsZFR5cGUgPSBjaGls
ZFJlZmVyZW5jZS50eXBlLCBrZXk7CisKKyAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NU
byBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgc3BlY2lmaWVkLAorICAvLyB1c2UgdGhhdAor
ICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgcGFyZW50IGlzIHNwZWNpZmllZCwgbG9vayBpdCB1cCBv
biB0aGUgY2hpbGQncyB0eXBlCisgIC8vIGRlZmluaXRpb24uCisgIGtleSA9IG9wdGlvbnMua2V5
OworCisgIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5nZSh7
CisgICAgICBwYXJlbnRSZWZlcmVuY2U6IHBhcmVudFJlZmVyZW5jZSwKKyAgICAgIGNoaWxkUmVm
ZXJlbmNlOiBjaGlsZFJlZmVyZW5jZSwKKyAgICAgIGZpcnN0UmVjb3JkUmVmZXJlbmNlOiBjaGls
ZFJlZmVyZW5jZSwKKyAgICAgIHNlY29uZFJlY29yZFJlZmVyZW5jZTogcGFyZW50UmVmZXJlbmNl
LAorICAgICAgZmlyc3RSZWNvcmRLaW5kOiAiaGFzTWFueSIsCisgICAgICBzZWNvbmRSZWNvcmRL
aW5kOiAiaGFzTWFueSIsCisgICAgICBzdG9yZTogc3RvcmUsCisgICAgICBjaGFuZ2VUeXBlOiBv
cHRpb25zLmNoYW5nZVR5cGUsCisgICAgICBmaXJzdFJlY29yZE5hbWU6ICBrZXkKKyAgfSk7CisK
KyAgc3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBrZXksIHBh
cmVudFJlZmVyZW5jZSwgbnVsbCwgY2hhbmdlKTsKKworCisgIHJldHVybiBjaGFuZ2U7Cit9Owor
CisvKiogQHByaXZhdGUgKi8KK0RTLk9uZVRvT25lQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0
aW9uKGNoaWxkUmVmZXJlbmNlLCBwYXJlbnRSZWZlcmVuY2UsIHN0b3JlLCBvcHRpb25zKSB7Cisg
IC8vIEdldCB0aGUgdHlwZSBvZiB0aGUgY2hpbGQgYmFzZWQgb24gdGhlIGNoaWxkJ3MgY2xpZW50
IElECisgIHZhciBjaGlsZFR5cGUgPSBjaGlsZFJlZmVyZW5jZS50eXBlLCBrZXk7CisKKyAgLy8g
SWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NUbyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMg
c3BlY2lmaWVkLAorICAvLyB1c2UgdGhhdAorICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgcGFyZW50
IGlzIHNwZWNpZmllZCwgbG9vayBpdCB1cCBvbiB0aGUgY2hpbGQncyB0eXBlCisgIC8vIGRlZmlu
aXRpb24uCisgIGlmIChvcHRpb25zLnBhcmVudFR5cGUpIHsKKyAgICBrZXkgPSBpbnZlcnNlQmVs
b25nc1RvTmFtZShvcHRpb25zLnBhcmVudFR5cGUsIGNoaWxkVHlwZSwgb3B0aW9ucy5rZXkpOwor
ICAgIC8vRFMuT25lVG9PbmVDaGFuZ2UubWFpbnRhaW5JbnZhcmlhbnQoIG9wdGlvbnMsIHN0b3Jl
LCBjaGlsZFJlZmVyZW5jZSwga2V5ICk7CisgIH0gZWxzZSBpZiAob3B0aW9ucy5rZXkpIHsKKyAg
ICBrZXkgPSBvcHRpb25zLmtleTsKKyAgfSBlbHNlIHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBt
dXN0IHBhc3MgZWl0aGVyIGEgcGFyZW50VHlwZSBvciBiZWxvbmdzVG9OYW1lIG9wdGlvbiB0byBP
bmVUb01hbnlDaGFuZ2UuZm9yQ2hpbGRBbmRQYXJlbnQiLCBmYWxzZSk7CisgIH0KKworICB2YXIg
Y2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoeworICAgICAgcGFy
ZW50UmVmZXJlbmNlOiBwYXJlbnRSZWZlcmVuY2UsCisgICAgICBjaGlsZFJlZmVyZW5jZTogY2hp
bGRSZWZlcmVuY2UsCisgICAgICBmaXJzdFJlY29yZFJlZmVyZW5jZTogY2hpbGRSZWZlcmVuY2Us
CisgICAgICBzZWNvbmRSZWNvcmRSZWZlcmVuY2U6IHBhcmVudFJlZmVyZW5jZSwKKyAgICAgIGZp
cnN0UmVjb3JkS2luZDogImJlbG9uZ3NUbyIsCisgICAgICBzZWNvbmRSZWNvcmRLaW5kOiAiYmVs
b25nc1RvIiwKKyAgICAgIHN0b3JlOiBzdG9yZSwKKyAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMu
Y2hhbmdlVHlwZSwKKyAgICAgIGZpcnN0UmVjb3JkTmFtZTogIGtleQorICB9KTsKKworICBzdG9y
ZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWZlcmVuY2UsIGtleSwgcGFyZW50UmVm
ZXJlbmNlLCBudWxsLCBjaGFuZ2UpOworCisKKyAgcmV0dXJuIGNoYW5nZTsKK307CisKK0RTLk9u
ZVRvT25lQ2hhbmdlLm1haW50YWluSW52YXJpYW50ID0gZnVuY3Rpb24ob3B0aW9ucywgc3RvcmUs
IGNoaWxkUmVmZXJlbmNlLCBrZXkpeworICBpZiAob3B0aW9ucy5jaGFuZ2VUeXBlID09PSAiYWRk
IiAmJiBzdG9yZS5yZWNvcmRJc01hdGVyaWFsaXplZChjaGlsZFJlZmVyZW5jZSkpIHsKKyAgICB2
YXIgY2hpbGQgPSBzdG9yZS5yZWNvcmRGb3JSZWZlcmVuY2UoY2hpbGRSZWZlcmVuY2UpOworICAg
IHZhciBvbGRQYXJlbnQgPSBnZXQoY2hpbGQsIGtleSk7CisgICAgaWYgKG9sZFBhcmVudCl7Cisg
ICAgICB2YXIgY29ycmVzcG9uZGluZ0NoYW5nZSA9IERTLk9uZVRvT25lQ2hhbmdlLmNyZWF0ZUNo
YW5nZShjaGlsZFJlZmVyZW5jZSwgb2xkUGFyZW50LmdldCgnX3JlZmVyZW5jZScpLCBzdG9yZSwg
eworICAgICAgICAgIHBhcmVudFR5cGU6IG9wdGlvbnMucGFyZW50VHlwZSwKKyAgICAgICAgICBo
YXNNYW55TmFtZTogb3B0aW9ucy5oYXNNYW55TmFtZSwKKyAgICAgICAgICBjaGFuZ2VUeXBlOiAi
cmVtb3ZlIiwKKyAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5CisgICAgICAgIH0pOworICAgICAg
c3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBrZXksIG9wdGlv
bnMucGFyZW50UmVmZXJlbmNlICwgbnVsbCwgY29ycmVzcG9uZGluZ0NoYW5nZSk7CisgICAgIGNv
cnJlc3BvbmRpbmdDaGFuZ2Uuc3luYygpOworICAgIH0KKyAgfQorfTsKKworLyoqIEBwcml2YXRl
ICovCitEUy5PbmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWZl
cmVuY2UsIHBhcmVudFJlZmVyZW5jZSwgc3RvcmUsIG9wdGlvbnMpIHsKKyAgLy8gR2V0IHRoZSB0
eXBlIG9mIHRoZSBjaGlsZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQgSUQKKyAgdmFyIGNo
aWxkVHlwZSA9IGNoaWxkUmVmZXJlbmNlLnR5cGUsIGtleTsKKworICAvLyBJZiB0aGUgbmFtZSBv
ZiB0aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVjaWZpZWQsCisg
IC8vIHVzZSB0aGF0CisgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMgc3BlY2lmaWVk
LCBsb29rIGl0IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKKyAgLy8gZGVmaW5pdGlvbi4KKyAgaWYg
KG9wdGlvbnMucGFyZW50VHlwZSkgeworICAgIGtleSA9IGludmVyc2VCZWxvbmdzVG9OYW1lKG9w
dGlvbnMucGFyZW50VHlwZSwgY2hpbGRUeXBlLCBvcHRpb25zLmtleSk7CisgICAgRFMuT25lVG9N
YW55Q2hhbmdlLm1haW50YWluSW52YXJpYW50KCBvcHRpb25zLCBzdG9yZSwgY2hpbGRSZWZlcmVu
Y2UsIGtleSApOworICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5KSB7CisgICAga2V5ID0gb3B0aW9u
cy5rZXk7CisgIH0gZWxzZSB7CisgICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGVpdGhl
ciBhIHBhcmVudFR5cGUgb3IgYmVsb25nc1RvTmFtZSBvcHRpb24gdG8gT25lVG9NYW55Q2hhbmdl
LmZvckNoaWxkQW5kUGFyZW50IiwgZmFsc2UpOworICB9CisKKyAgdmFyIGNoYW5nZSA9IERTLlJl
bGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKKyAgICAgIHBhcmVudFJlZmVyZW5jZTog
cGFyZW50UmVmZXJlbmNlLAorICAgICAgY2hpbGRSZWZlcmVuY2U6IGNoaWxkUmVmZXJlbmNlLAor
ICAgICAgZmlyc3RSZWNvcmRSZWZlcmVuY2U6IGNoaWxkUmVmZXJlbmNlLAorICAgICAgc2Vjb25k
UmVjb3JkUmVmZXJlbmNlOiBwYXJlbnRSZWZlcmVuY2UsCisgICAgICBmaXJzdFJlY29yZEtpbmQ6
ICJiZWxvbmdzVG8iLAorICAgICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiLAorICAgICAg
c3RvcmU6IHN0b3JlLAorICAgICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAorICAg
ICAgZmlyc3RSZWNvcmROYW1lOiAga2V5CisgIH0pOworCisgIHN0b3JlLmFkZFJlbGF0aW9uc2hp
cENoYW5nZUZvcihjaGlsZFJlZmVyZW5jZSwga2V5LCBwYXJlbnRSZWZlcmVuY2UsIG51bGwsIGNo
YW5nZSk7CisKKworICByZXR1cm4gY2hhbmdlOworfTsKKworCitEUy5PbmVUb01hbnlDaGFuZ2Uu
bWFpbnRhaW5JbnZhcmlhbnQgPSBmdW5jdGlvbihvcHRpb25zLCBzdG9yZSwgY2hpbGRSZWZlcmVu
Y2UsIGtleSl7CisgIGlmIChvcHRpb25zLmNoYW5nZVR5cGUgPT09ICJhZGQiICYmIHN0b3JlLnJl
Y29yZElzTWF0ZXJpYWxpemVkKGNoaWxkUmVmZXJlbmNlKSkgeworICAgIHZhciBjaGlsZCA9IHN0
b3JlLnJlY29yZEZvclJlZmVyZW5jZShjaGlsZFJlZmVyZW5jZSk7CisgICAgdmFyIG9sZFBhcmVu
dCA9IGdldChjaGlsZCwga2V5KTsKKyAgICBpZiAob2xkUGFyZW50KXsKKyAgICAgIHZhciBjb3Jy
ZXNwb25kaW5nQ2hhbmdlID0gRFMuT25lVG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShjaGlsZFJl
ZmVyZW5jZSwgb2xkUGFyZW50LmdldCgnX3JlZmVyZW5jZScpLCBzdG9yZSwgeworICAgICAgICAg
IHBhcmVudFR5cGU6IG9wdGlvbnMucGFyZW50VHlwZSwKKyAgICAgICAgICBoYXNNYW55TmFtZTog
b3B0aW9ucy5oYXNNYW55TmFtZSwKKyAgICAgICAgICBjaGFuZ2VUeXBlOiAicmVtb3ZlIiwKKyAg
ICAgICAgICBrZXk6IG9wdGlvbnMua2V5CisgICAgICAgIH0pOworICAgICAgc3RvcmUuYWRkUmVs
YXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBrZXksIG9wdGlvbnMucGFyZW50UmVm
ZXJlbmNlICwgbnVsbCwgY29ycmVzcG9uZGluZ0NoYW5nZSk7CisgICAgICBjb3JyZXNwb25kaW5n
Q2hhbmdlLnN5bmMoKTsKKyAgICB9CisgIH0KK307CisKK0RTLk9uZVRvTWFueUNoYW5nZS5lbnN1
cmVTYW1lVHJhbnNhY3Rpb24gPSBmdW5jdGlvbihjaGFuZ2VzLCBzdG9yZSl7CisgIHZhciByZWNv
cmRzID0gRW1iZXIuQSgpOworICBmb3JFYWNoKGNoYW5nZXMsIGZ1bmN0aW9uKGNoYW5nZSl7Cisg
ICAgcmVjb3Jkcy5hZGRPYmplY3QoY2hhbmdlLmdldFNlY29uZFJlY29yZCgpKTsKKyAgICByZWNv
cmRzLmFkZE9iamVjdChjaGFuZ2UuZ2V0Rmlyc3RSZWNvcmQoKSk7CisgIH0pOworICB2YXIgdHJh
bnNhY3Rpb24gPSBzdG9yZS5lbnN1cmVTYW1lVHJhbnNhY3Rpb24ocmVjb3Jkcyk7CisgIGZvckVh
Y2goY2hhbmdlcywgZnVuY3Rpb24oY2hhbmdlKXsKKyAgICBjaGFuZ2UudHJhbnNhY3Rpb24gPSB0
cmFuc2FjdGlvbjsKKyB9KTsKK307CisKK0RTLlJlbGF0aW9uc2hpcENoYW5nZS5wcm90b3R5cGUg
PSB7CisKKyAgZ2V0U2Vjb25kUmVjb3JkTmFtZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIG5hbWUg
PSB0aGlzLnNlY29uZFJlY29yZE5hbWUsIHN0b3JlID0gdGhpcy5zdG9yZSwgcGFyZW50OworCisg
ICAgaWYgKCFuYW1lKSB7CisgICAgICBwYXJlbnQgPSB0aGlzLnNlY29uZFJlY29yZFJlZmVyZW5j
ZTsKKyAgICAgIGlmICghcGFyZW50KSB7IHJldHVybjsgfQorCisgICAgICB2YXIgY2hpbGRUeXBl
ID0gdGhpcy5maXJzdFJlY29yZFJlZmVyZW5jZS50eXBlOworICAgICAgdmFyIGludmVyc2VUeXBl
ID0gRFMuX2ludmVyc2VUeXBlRm9yKGNoaWxkVHlwZSwgdGhpcy5maXJzdFJlY29yZE5hbWUpOwor
ICAgICAgbmFtZSA9IGludmVyc2VIYXNNYW55TmFtZShpbnZlcnNlVHlwZSwgY2hpbGRUeXBlLCB0
aGlzLmZpcnN0UmVjb3JkTmFtZSk7CisgICAgICB0aGlzLnNlY29uZFJlY29yZE5hbWUgPSBuYW1l
OworICAgIH0KKworICAgIHJldHVybiBuYW1lOworICB9LAorCisgIC8qKgorICAgIEdldCB0aGUg
bmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIG9uIHRoZSBiZWxvbmdzVG8gc2lkZS4KKworICAgIEBy
ZXR1cm5zIHtTdHJpbmd9CisgICovCisgIGdldEZpcnN0UmVjb3JkTmFtZTogZnVuY3Rpb24oKSB7
CisgICAgdmFyIG5hbWUgPSB0aGlzLmZpcnN0UmVjb3JkTmFtZSwgc3RvcmUgPSB0aGlzLnN0b3Jl
LCBwYXJlbnQsIGNoaWxkOworCisgICAgaWYgKCFuYW1lKSB7CisgICAgICBwYXJlbnQgPSB0aGlz
LnNlY29uZFJlY29yZFJlZmVyZW5jZTsKKyAgICAgIGNoaWxkID0gdGhpcy5maXJzdFJlY29yZFJl
ZmVyZW5jZTsKKyAgICAgIGlmICghKGNoaWxkICYmIHBhcmVudCkpIHsgcmV0dXJuOyB9CisKKyAg
ICAgIG5hbWUgPSBEUy5faW52ZXJzZVJlbGF0aW9uc2hpcEZvcihjaGlsZC50eXBlLCBwYXJlbnQu
dHlwZSkubmFtZTsKKworICAgICAgdGhpcy5maXJzdFJlY29yZE5hbWUgPSBuYW1lOworICAgIH0K
KworICAgIHJldHVybiBuYW1lOworICB9LAorCisgIC8qKiBAcHJpdmF0ZSAqLworICBkZXN0cm95
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgY2hpbGRSZWZlcmVuY2UgPSB0aGlzLmNoaWxkUmVmZXJl
bmNlLAorICAgICAgICBiZWxvbmdzVG9OYW1lID0gdGhpcy5nZXRGaXJzdFJlY29yZE5hbWUoKSwK
KyAgICAgICAgaGFzTWFueU5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29yZE5hbWUoKSwKKyAgICAg
ICAgc3RvcmUgPSB0aGlzLnN0b3JlLAorICAgICAgICBjaGlsZCwgb2xkUGFyZW50LCBuZXdQYXJl
bnQsIGxhc3RQYXJlbnQsIHRyYW5zYWN0aW9uOworCisgICAgc3RvcmUucmVtb3ZlUmVsYXRpb25z
aGlwQ2hhbmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBiZWxvbmdzVG9OYW1lLCB0aGlzLnBhcmVudFJl
ZmVyZW5jZSwgaGFzTWFueU5hbWUsIHRoaXMuY2hhbmdlVHlwZSk7CisKKyAgICBpZiAodHJhbnNh
Y3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uKSB7CisgICAgICB0cmFuc2FjdGlvbi5yZWxhdGlvbnNo
aXBCZWNhbWVDbGVhbih0aGlzKTsKKyAgICB9CisgIH0sCisKKyAgLyoqIEBwcml2YXRlICovCisg
IGdldEJ5UmVmZXJlbmNlOiBmdW5jdGlvbihyZWZlcmVuY2UpIHsKKyAgICB2YXIgc3RvcmUgPSB0
aGlzLnN0b3JlOworCisgICAgLy8gcmV0dXJuIG51bGwgb3IgdW5kZWZpbmVkIGlmIHRoZSBvcmln
aW5hbCByZWZlcmVuY2Ugd2FzIG51bGwgb3IgdW5kZWZpbmVkCisgICAgaWYgKCFyZWZlcmVuY2Up
IHsgcmV0dXJuIHJlZmVyZW5jZTsgfQorCisgICAgaWYgKHN0b3JlLnJlY29yZElzTWF0ZXJpYWxp
emVkKHJlZmVyZW5jZSkpIHsKKyAgICAgIHJldHVybiBzdG9yZS5yZWNvcmRGb3JSZWZlcmVuY2Uo
cmVmZXJlbmNlKTsKKyAgICB9CisgIH0sCisKKyAgZ2V0U2Vjb25kUmVjb3JkOiBmdW5jdGlvbigp
eworICAgIHJldHVybiB0aGlzLmdldEJ5UmVmZXJlbmNlKHRoaXMuc2Vjb25kUmVjb3JkUmVmZXJl
bmNlKTsKKyAgfSwKKworICAvKiogQHByaXZhdGUgKi8KKyAgZ2V0Rmlyc3RSZWNvcmQ6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiB0aGlzLmdldEJ5UmVmZXJlbmNlKHRoaXMuZmlyc3RSZWNvcmRS
ZWZlcmVuY2UpOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBNYWtlIHN1cmUg
dGhhdCBhbGwgdGhyZWUgcGFydHMgb2YgdGhlIHJlbGF0aW9uc2hpcCBjaGFuZ2UgYXJlIHBhcnQg
b2YKKyAgICB0aGUgc2FtZSB0cmFuc2FjdGlvbi4gSWYgYW55IG9mIHRoZSB0aHJlZSByZWNvcmRz
IGlzIGNsZWFuIGFuZCBpbiB0aGUKKyAgICBkZWZhdWx0IHRyYW5zYWN0aW9uLCBhbmQgdGhlIHJl
c3QgYXJlIGluIGEgZGlmZmVyZW50IHRyYW5zYWN0aW9uLCBtb3ZlCisgICAgdGhlbSBhbGwgaW50
byB0aGF0IHRyYW5zYWN0aW9uLgorICAqLworICBlbnN1cmVTYW1lVHJhbnNhY3Rpb246IGZ1bmN0
aW9uKCkgeworICAgIHZhciBjaGlsZCA9IHRoaXMuZ2V0Rmlyc3RSZWNvcmQoKSwKKyAgICAgIHBh
cmVudFJlY29yZCA9IHRoaXMuZ2V0U2Vjb25kUmVjb3JkKCk7CisKKyAgICB2YXIgdHJhbnNhY3Rp
b24gPSB0aGlzLnN0b3JlLmVuc3VyZVNhbWVUcmFuc2FjdGlvbihbY2hpbGQsIHBhcmVudFJlY29y
ZF0pOworCisgICAgdGhpcy50cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworICAgIHJldHVybiB0
cmFuc2FjdGlvbjsKKyAgfSwKKworICBjYWxsQ2hhbmdlRXZlbnRzOiBmdW5jdGlvbigpeworICAg
IHZhciBoYXNNYW55TmFtZSA9IHRoaXMuZ2V0U2Vjb25kUmVjb3JkTmFtZSgpLAorICAgICAgICBi
ZWxvbmdzVG9OYW1lID0gdGhpcy5nZXRGaXJzdFJlY29yZE5hbWUoKSwKKyAgICAgICAgY2hpbGQg
PSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCisgICAgICAgIHBhcmVudFJlY29yZCA9IHRoaXMuZ2V0
U2Vjb25kUmVjb3JkKCk7CisKKyAgICB2YXIgZGlydHlTZXQgPSBuZXcgRW1iZXIuT3JkZXJlZFNl
dCgpOworCisgICAgLy8gVE9ETzogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYXVzZXMgYSByYWNlIGNv
bmRpdGlvbiBpbiBrZXktdmFsdWUKKyAgICAvLyBzdG9yZXMuIFRoZSBmaXggaW52b2x2ZXMgYnVm
ZmVyaW5nIGNoYW5nZXMgdGhhdCBoYXBwZW4gd2hpbGUKKyAgICAvLyBhIHJlY29yZCBpcyBsb2Fk
aW5nLiBBIHNpbWlsYXIgZml4IGlzIHJlcXVpcmVkIGZvciBvdGhlciBwYXJ0cworICAgIC8vIG9m
IGVtYmVyLWRhdGEsIGFuZCBzaG91bGQgYmUgZG9uZSBhcyBuZXcgaW5mcmFzdHJ1Y3R1cmUsIG5v
dAorICAgIC8vIGEgb25lLW9mZiBoYWNrLiBbdG9taHVkYV0KKyAgICBpZiAocGFyZW50UmVjb3Jk
ICYmIGdldChwYXJlbnRSZWNvcmQsICdpc0xvYWRlZCcpKSB7CisgICAgICB0aGlzLnN0b3JlLnJl
Y29yZEhhc01hbnlEaWRDaGFuZ2UoZGlydHlTZXQsIHBhcmVudFJlY29yZCwgdGhpcyk7CisgICAg
fQorCisgICAgaWYgKGNoaWxkKSB7CisgICAgICB0aGlzLnN0b3JlLnJlY29yZEJlbG9uZ3NUb0Rp
ZENoYW5nZShkaXJ0eVNldCwgY2hpbGQsIHRoaXMpOworICAgIH0KKworICAgIGRpcnR5U2V0LmZv
ckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICByZWNvcmQuYWRhcHRlckRpZERpcnR5KCk7
CisgICAgfSk7CisgIH0sCisKKyAgY29hbGVzY2U6IGZ1bmN0aW9uKCl7CisgICAgdmFyIHJlbGF0
aW9uc2hpcFBhaXJzID0gdGhpcy5zdG9yZS5yZWxhdGlvbnNoaXBDaGFuZ2VQYWlyc0Zvcih0aGlz
LmZpcnN0UmVjb3JkUmVmZXJlbmNlKTsKKyAgICBmb3JFYWNoKHJlbGF0aW9uc2hpcFBhaXJzLCBm
dW5jdGlvbihwYWlyKXsKKyAgICAgIHZhciBhZGRlZENoYW5nZSA9IHBhaXJbImFkZCJdOworICAg
ICAgdmFyIHJlbW92ZWRDaGFuZ2UgPSBwYWlyWyJyZW1vdmUiXTsKKyAgICAgIGlmKGFkZGVkQ2hh
bmdlICYmIHJlbW92ZWRDaGFuZ2UpIHsKKyAgICAgICAgYWRkZWRDaGFuZ2UuZGVzdHJveSgpOwor
ICAgICAgICByZW1vdmVkQ2hhbmdlLmRlc3Ryb3koKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQor
fTsKKworRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRkLnByb3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShE
Uy5SZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlKHt9KSk7CitEUy5SZWxhdGlvbnNoaXBDaGFuZ2VS
ZW1vdmUucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKERTLlJlbGF0aW9uc2hpcENoYW5nZS5jcmVh
dGUoe30pKTsKKworRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRkLnByb3RvdHlwZS5jaGFuZ2VUeXBl
ID0gImFkZCI7CitEUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQucHJvdG90eXBlLnN5bmMgPSBmdW5j
dGlvbigpIHsKKyAgdmFyIHNlY29uZFJlY29yZE5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29yZE5h
bWUoKSwKKyAgICAgIGZpcnN0UmVjb3JkTmFtZSA9IHRoaXMuZ2V0Rmlyc3RSZWNvcmROYW1lKCks
CisgICAgICBmaXJzdFJlY29yZCA9IHRoaXMuZ2V0Rmlyc3RSZWNvcmQoKSwKKyAgICAgIHNlY29u
ZFJlY29yZCA9IHRoaXMuZ2V0U2Vjb25kUmVjb3JkKCk7CisKKyAgLy9FbWJlci5hc3NlcnQoIllv
dSBzcGVjaWZpZWQgYSBoYXNNYW55ICgiICsgaGFzTWFueU5hbWUgKyAiKSBvbiAiICsgKCFiZWxv
bmdzVG9OYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudCku
Y29uc3RydWN0b3IpICsgIiBidXQgZGlkIG5vdCBzcGVjaWZ5IGFuIGludmVyc2UgYmVsb25nc1Rv
IG9uICIgKyBjaGlsZC5jb25zdHJ1Y3RvciwgYmVsb25nc1RvTmFtZSk7CisgIC8vRW1iZXIuYXNz
ZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgYmVsb25nc1RvICgiICsgYmVsb25nc1RvTmFtZSArICIpIG9u
ICIgKyBjaGlsZC5jb25zdHJ1Y3RvciArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNl
IGhhc01hbnkgb24gIiArICghaGFzTWFueU5hbWUgJiYgKG5ld1BhcmVudCB8fCBvbGRQYXJlbnQg
fHwgdGhpcy5sYXN0UGFyZW50UmVjb3JkKS5jb25zdHJ1Y3RvciksIGhhc01hbnlOYW1lKTsKKwor
ICB2YXIgdHJhbnNhY3Rpb24gPSB0aGlzLmVuc3VyZVNhbWVUcmFuc2FjdGlvbigpOworICB0cmFu
c2FjdGlvbi5yZWxhdGlvbnNoaXBCZWNhbWVEaXJ0eSh0aGlzKTsKKworICB0aGlzLmNhbGxDaGFu
Z2VFdmVudHMoKTsKKworICBpZiAoc2Vjb25kUmVjb3JkICYmIGZpcnN0UmVjb3JkKSB7CisgICAg
aWYodGhpcy5zZWNvbmRSZWNvcmRLaW5kID09PSAiYmVsb25nc1RvIil7CisgICAgICBzZWNvbmRS
ZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpeworICAgICAgICBz
ZXQoc2Vjb25kUmVjb3JkLCBzZWNvbmRSZWNvcmROYW1lLCBmaXJzdFJlY29yZCk7CisgICAgICB9
KTsKKworICAgICB9CisgICAgIGVsc2UgaWYodGhpcy5zZWNvbmRSZWNvcmRLaW5kID09PSAiaGFz
TWFueSIpeworICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMo
ZnVuY3Rpb24oKXsKKyAgICAgICAgZ2V0KHNlY29uZFJlY29yZCwgc2Vjb25kUmVjb3JkTmFtZSku
YWRkT2JqZWN0KGZpcnN0UmVjb3JkKTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGlmIChm
aXJzdFJlY29yZCAmJiBzZWNvbmRSZWNvcmQgJiYgZ2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29y
ZE5hbWUpICE9PSBzZWNvbmRSZWNvcmQpIHsKKyAgICBpZih0aGlzLmZpcnN0UmVjb3JkS2luZCA9
PT0gImJlbG9uZ3NUbyIpeworICAgICAgZmlyc3RSZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9i
c2VydmVycyhmdW5jdGlvbigpeworICAgICAgICBzZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3Jk
TmFtZSwgc2Vjb25kUmVjb3JkKTsKKyAgICAgIH0pOworICAgIH0KKyAgICBlbHNlIGlmKHRoaXMu
Zmlyc3RkUmVjb3JkS2luZCA9PT0gImhhc01hbnkiKXsKKyAgICAgIGZpcnN0UmVjb3JkLnN1c3Bl
bmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKKyAgICAgICAgZ2V0KGZpcnN0UmVj
b3JkLCBmaXJzdFJlY29yZE5hbWUpLmFkZE9iamVjdChzZWNvbmRSZWNvcmQpOworICAgICAgfSk7
CisgICAgfQorICB9CisKKyAgdGhpcy5jb2FsZXNjZSgpOworfTsKKworRFMuUmVsYXRpb25zaGlw
Q2hhbmdlUmVtb3ZlLnByb3RvdHlwZS5jaGFuZ2VUeXBlID0gInJlbW92ZSI7CitEUy5SZWxhdGlv
bnNoaXBDaGFuZ2VSZW1vdmUucHJvdG90eXBlLnN5bmMgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNl
Y29uZFJlY29yZE5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29yZE5hbWUoKSwKKyAgICAgIGZpcnN0
UmVjb3JkTmFtZSA9IHRoaXMuZ2V0Rmlyc3RSZWNvcmROYW1lKCksCisgICAgICBmaXJzdFJlY29y
ZCA9IHRoaXMuZ2V0Rmlyc3RSZWNvcmQoKSwKKyAgICAgIHNlY29uZFJlY29yZCA9IHRoaXMuZ2V0
U2Vjb25kUmVjb3JkKCk7CisKKyAgLy9FbWJlci5hc3NlcnQoIllvdSBzcGVjaWZpZWQgYSBoYXNN
YW55ICgiICsgaGFzTWFueU5hbWUgKyAiKSBvbiAiICsgKCFiZWxvbmdzVG9OYW1lICYmIChuZXdQ
YXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudCkuY29uc3RydWN0b3IpICsgIiBi
dXQgZGlkIG5vdCBzcGVjaWZ5IGFuIGludmVyc2UgYmVsb25nc1RvIG9uICIgKyBjaGlsZC5jb25z
dHJ1Y3RvciwgYmVsb25nc1RvTmFtZSk7CisgIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVk
IGEgYmVsb25nc1RvICgiICsgYmVsb25nc1RvTmFtZSArICIpIG9uICIgKyBjaGlsZC5jb25zdHJ1
Y3RvciArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGhhc01hbnkgb24gIiArICgh
aGFzTWFueU5hbWUgJiYgKG5ld1BhcmVudCB8fCBvbGRQYXJlbnQgfHwgdGhpcy5sYXN0UGFyZW50
UmVjb3JkKS5jb25zdHJ1Y3RvciksIGhhc01hbnlOYW1lKTsKKworICB2YXIgdHJhbnNhY3Rpb24g
PSB0aGlzLmVuc3VyZVNhbWVUcmFuc2FjdGlvbihmaXJzdFJlY29yZCwgc2Vjb25kUmVjb3JkLCBz
ZWNvbmRSZWNvcmROYW1lLCBmaXJzdFJlY29yZE5hbWUpOworICB0cmFuc2FjdGlvbi5yZWxhdGlv
bnNoaXBCZWNhbWVEaXJ0eSh0aGlzKTsKKworICB0aGlzLmNhbGxDaGFuZ2VFdmVudHMoKTsKKwor
ICBpZiAoc2Vjb25kUmVjb3JkICYmIGZpcnN0UmVjb3JkKSB7CisgICAgaWYodGhpcy5zZWNvbmRS
ZWNvcmRLaW5kID09PSAiYmVsb25nc1RvIil7CisgICAgICBzZWNvbmRSZWNvcmQuc3VzcGVuZFJl
bGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpeworICAgICAgICBzZXQoc2Vjb25kUmVjb3Jk
LCBzZWNvbmRSZWNvcmROYW1lLCBudWxsKTsKKyAgICAgIH0pOworICAgICB9CisgICAgIGVsc2Ug
aWYodGhpcy5zZWNvbmRSZWNvcmRLaW5kID09PSAiaGFzTWFueSIpeworICAgICAgIHNlY29uZFJl
Y29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7CisgICAgICAgIGdl
dChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUpLnJlbW92ZU9iamVjdChmaXJzdFJlY29y
ZCk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBpZiAoZmlyc3RSZWNvcmQgJiYgZ2V0KGZp
cnN0UmVjb3JkLCBmaXJzdFJlY29yZE5hbWUpKSB7CisgICAgaWYodGhpcy5maXJzdFJlY29yZEtp
bmQgPT09ICJiZWxvbmdzVG8iKXsKKyAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNo
aXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKKyAgICAgICAgc2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJl
Y29yZE5hbWUsIG51bGwpOworICAgICAgfSk7CisgICAgIH0KKyAgICAgZWxzZSBpZih0aGlzLmZp
cnN0ZFJlY29yZEtpbmQgPT09ICJoYXNNYW55Iil7CisgICAgICAgZmlyc3RSZWNvcmQuc3VzcGVu
ZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpeworICAgICAgICBnZXQoZmlyc3RSZWNv
cmQsIGZpcnN0UmVjb3JkTmFtZSkucmVtb3ZlT2JqZWN0KHNlY29uZFJlY29yZCk7CisgICAgICB9
KTsKKyAgICB9CisgIH0KKworICB0aGlzLmNvYWxlc2NlKCk7Cit9OworCitmdW5jdGlvbiBpbnZl
cnNlQmVsb25nc1RvTmFtZShwYXJlbnRUeXBlLCBjaGlsZFR5cGUsIGhhc01hbnlOYW1lKSB7Cisg
IC8vIEdldCB0aGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHBhcmVudCdzIERTLmhhc01hbnkoKQor
ICB2YXIgb3B0aW9ucyA9IHBhcmVudFR5cGUubWV0YUZvclByb3BlcnR5KGhhc01hbnlOYW1lKS5v
cHRpb25zOworICB2YXIgYmVsb25nc1RvTmFtZTsKKworICBpZiAoYmVsb25nc1RvTmFtZSA9IG9w
dGlvbnMuaW52ZXJzZSkgeworICAgIHJldHVybiBiZWxvbmdzVG9OYW1lOworICB9CisKKyAgcmV0
dXJuIERTLl9pbnZlcnNlUmVsYXRpb25zaGlwRm9yKGNoaWxkVHlwZSwgcGFyZW50VHlwZSkubmFt
ZTsKK30KKworZnVuY3Rpb24gaW52ZXJzZUhhc01hbnlOYW1lKHBhcmVudFR5cGUsIGNoaWxkVHlw
ZSwgYmVsb25nc1RvTmFtZSkgeworICB2YXIgb3B0aW9ucyA9IGNoaWxkVHlwZS5tZXRhRm9yUHJv
cGVydHkoYmVsb25nc1RvTmFtZSkub3B0aW9uczsKKyAgdmFyIGhhc01hbnlOYW1lOworCisgIGlm
IChoYXNNYW55TmFtZSA9IG9wdGlvbnMuaW52ZXJzZSkgeworICAgIHJldHVybiBoYXNNYW55TmFt
ZTsKKyAgfQorCisgIHJldHVybiBEUy5faW52ZXJzZVJlbGF0aW9uc2hpcEZvcihwYXJlbnRUeXBl
LCBjaGlsZFR5cGUpLm5hbWU7Cit9CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKK30p
KCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAg
VGhpcyBjb2RlIHJlZ2lzdGVycyBhbiBpbmplY3Rpb24gZm9yIEVtYmVyLkFwcGxpY2F0aW9uLgor
CisgIElmIGFuIEVtYmVyLmpzIGRldmVsb3BlciBkZWZpbmVzIGEgc3ViY2xhc3Mgb2YgRFMuU3Rv
cmUgb24gdGhlaXIgYXBwbGljYXRpb24sCisgIHRoaXMgY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkg
aW5zdGFudGlhdGUgaXQgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIG9uIHRoZQorICByb3V0ZXIuCisK
KyAgQWRkaXRpb25hbGx5LCBhZnRlciBhbiBhcHBsaWNhdGlvbidzIGNvbnRyb2xsZXJzIGhhdmUg
YmVlbiBpbmplY3RlZCwgdGhleSB3aWxsCisgIGVhY2ggaGF2ZSB0aGUgc3RvcmUgbWFkZSBhdmFp
bGFibGUgdG8gdGhlbS4KKworICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhbiBFbWJlci5qcyBhcHBs
aWNhdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKKworICBBcHAuU3RvcmUgPSBEUy5T
dG9yZS5leHRlbmQoeworICAgIGFkYXB0ZXI6ICdBcHAuTXlDdXN0b21BZGFwdGVyJworICB9KTsK
KworICBBcHAuUG9zdHNDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7
CisgICAgLy8gLi4uCisgIH0pOworCisgIFdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxp
emVkLCBgQXBwLlN0b3JlYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKKyAgaW5zdGFudGlhdGVkLCBh
bmQgdGhlIGluc3RhbmNlIG9mIGBBcHAuUG9zdHNDb250cm9sbGVyYCB3aWxsIGhhdmUgaXRzIGBz
dG9yZWAKKyAgcHJvcGVydHkgc2V0IHRvIHRoYXQgaW5zdGFuY2UuCisKKyAgTm90ZSB0aGF0IHRo
aXMgY29kZSB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBgZW1iZXItYXBwbGljYXRpb25gIHBhY2th
Z2UgaXMKKyAgbG9hZGVkLiBJZiBFbWJlciBEYXRhIGlzIGJlaW5nIHVzZWQgaW4gYW4gZW52aXJv
bm1lbnQgb3RoZXIgdGhhbiBhCisgIHR5cGljYWwgYXBwbGljYXRpb24gKGUuZy4sIG5vZGUuanMg
d2hlcmUgb25seSBgZW1iZXItcnVudGltZWAgaXMgYXZhaWxhYmxlKSwKKyAgdGhpcyBjb2RlIHdp
bGwgYmUgaWdub3JlZC4KKyovCisKK0VtYmVyLm9uTG9hZCgnRW1iZXIuQXBwbGljYXRpb24nLCBm
dW5jdGlvbihBcHBsaWNhdGlvbikgeworICBpZiAoQXBwbGljYXRpb24ucmVnaXN0ZXJJbmplY3Rp
b24pIHsKKyAgICBBcHBsaWNhdGlvbi5yZWdpc3RlckluamVjdGlvbih7CisgICAgICBuYW1lOiAi
c3RvcmUiLAorICAgICAgYmVmb3JlOiAiY29udHJvbGxlcnMiLAorCisgICAgICAvLyBJZiBhIHN0
b3JlIHN1YmNsYXNzIGlzIGRlZmluZWQsIGxpa2UgQXBwLlN0b3JlLAorICAgICAgLy8gaW5zdGFu
dGlhdGUgaXQgYW5kIGluamVjdCBpdCBpbnRvIHRoZSByb3V0ZXIuCisgICAgICBpbmplY3Rpb246
IGZ1bmN0aW9uKGFwcCwgc3RhdGVNYW5hZ2VyLCBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoIXN0
YXRlTWFuYWdlcikgeyByZXR1cm47IH0KKyAgICAgICAgaWYgKHByb3BlcnR5ID09PSAnU3RvcmUn
KSB7CisgICAgICAgICAgc2V0KHN0YXRlTWFuYWdlciwgJ3N0b3JlJywgYXBwW3Byb3BlcnR5XS5j
cmVhdGUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICAgIEFwcGxpY2F0aW9u
LnJlZ2lzdGVySW5qZWN0aW9uKHsKKyAgICAgIG5hbWU6ICJnaXZlU3RvcmVUb0NvbnRyb2xsZXJz
IiwKKyAgICAgIGFmdGVyOiBbJ3N0b3JlJywnY29udHJvbGxlcnMnXSwKKworICAgICAgLy8gRm9y
IGVhY2ggY29udHJvbGxlciwgc2V0IGl0cyBgc3RvcmVgIHByb3BlcnR5CisgICAgICAvLyB0byB0
aGUgRFMuU3RvcmUgaW5zdGFuY2Ugd2UgY3JlYXRlZCBhYm92ZS4KKyAgICAgIGluamVjdGlvbjog
ZnVuY3Rpb24oYXBwLCBzdGF0ZU1hbmFnZXIsIHByb3BlcnR5KSB7CisgICAgICAgIGlmICghc3Rh
dGVNYW5hZ2VyKSB7IHJldHVybjsgfQorICAgICAgICBpZiAoL15bQS1aXS4qQ29udHJvbGxlciQv
LnRlc3QocHJvcGVydHkpKSB7CisgICAgICAgICAgdmFyIGNvbnRyb2xsZXJOYW1lID0gcHJvcGVy
dHkuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHIoMSk7CisgICAgICAg
ICAgdmFyIHN0b3JlID0gc3RhdGVNYW5hZ2VyLmdldCgnc3RvcmUnKTsKKyAgICAgICAgICB2YXIg
Y29udHJvbGxlciA9IHN0YXRlTWFuYWdlci5nZXQoY29udHJvbGxlck5hbWUpOworICAgICAgICAg
IGlmKCFjb250cm9sbGVyKSB7IHJldHVybjsgfQorCisgICAgICAgICAgY29udHJvbGxlci5zZXQo
J3N0b3JlJywgc3RvcmUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgIH0gZWxzZSBp
ZiAoQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIpIHsKKyAgICBBcHBsaWNhdGlvbi5pbml0aWFsaXpl
cih7CisgICAgICBuYW1lOiAic3RvcmUiLAorCisgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihj
b250YWluZXIsIGFwcGxpY2F0aW9uKSB7CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcignc3Rv
cmUnLCAnbWFpbicsIGFwcGxpY2F0aW9uLlN0b3JlKTsKKworICAgICAgICAvLyBFYWdlcmx5IGdl
bmVyYXRlIHRoZSBzdG9yZSBzbyBkZWZhdWx0U3RvcmUgaXMgcG9wdWxhdGVkLgorICAgICAgICAv
LyBUT0RPOiBEbyB0aGlzIGluIGEgZmluaXNoZXIgaG9vaworICAgICAgICBjb250YWluZXIubG9v
a3VwKCdzdG9yZTptYWluJyk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBBcHBsaWNhdGlvbi5p
bml0aWFsaXplcih7CisgICAgICBuYW1lOiAiaW5qZWN0U3RvcmUiLAorCisgICAgICBpbml0aWFs
aXplOiBmdW5jdGlvbihjb250YWluZXIpIHsKKyAgICAgICAgY29udGFpbmVyLnR5cGVJbmplY3Rp
b24oJ2NvbnRyb2xsZXInLCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOworICAgICAgICBjb250YWlu
ZXIudHlwZUluamVjdGlvbigncm91dGUnLCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOworICAgICAg
fQorICAgIH0pOworICB9Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgbWFwID0gRW1iZXIuQXJyYXlQb2x5Zmls
bHMubWFwLCBpc05vbmUgPSBFbWJlci5pc05vbmU7CisKK2Z1bmN0aW9uIG11c3RJbXBsZW1lbnQo
bmFtZSkgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9y
KCJZb3VyIHNlcmlhbGl6ZXIgIiArIHRoaXMudG9TdHJpbmcoKSArICIgZG9lcyBub3QgaW1wbGVt
ZW50IHRoZSByZXF1aXJlZCBtZXRob2QgIiArIG5hbWUpOworICB9OworfQorCisvKioKKyAgQSBz
ZXJpYWxpemVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemlu
ZyBhIGdyb3VwIG9mCisgIHJlY29yZHMuCisKKyAgYERTLlNlcmlhbGl6ZXJgIGlzIGFuIGFic3Ry
YWN0IGJhc2UgY2xhc3MgZGVzaWduZWQgdG8gaGVscCB5b3UgYnVpbGQgYQorICBzZXJpYWxpemVy
IHRoYXQgY2FuIHJlYWQgdG8gYW5kIHdyaXRlIGZyb20gYW55IHNlcmlhbGl6ZWQgZm9ybS4gIFdo
aWxlIG1vc3QKKyAgYXBwbGljYXRpb25zIHdpbGwgdXNlIGBEUy5KU09OU2VyaWFsaXplcmAsIHdo
aWNoIHJlYWRzIGFuZCB3cml0ZXMgSlNPTiwgdGhlCisgIHNlcmlhbGl6ZXIgYXJjaGl0ZWN0dXJl
IGFsbG93cyB5b3VyIGFkYXB0ZXIgdG8gdHJhbnNtaXQgdGhpbmdzIGxpa2UgWE1MLAorICBzdHJp
bmdzLCBvciBjdXN0b20gYmluYXJ5IGRhdGEuCisKKyAgVHlwaWNhbGx5LCB5b3VyIGFwcGxpY2F0
aW9uJ3MgYERTLkFkYXB0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBib3RoIGNyZWF0aW5nIGEKKyAg
c2VyaWFsaXplciBhcyB3ZWxsIGFzIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZHMgd2hl
biBpdCBuZWVkcyB0bworICBtYXRlcmlhbGl6ZSBkYXRhIG9yIHNlcmlhbGl6ZSBhIHJlY29yZC4K
KworICBUaGUgc2VyaWFsaXplciBBUEkgaXMgZGVzaWduZWQgYXMgYSBzZXJpZXMgb2YgbGF5ZXJl
ZCBob29rcyB0aGF0IHlvdSBjYW4KKyAgb3ZlcnJpZGUgdG8gY3VzdG9taXplIGFueSBvZiB0aGUg
aW5kaXZpZHVhbCBzdGVwcyBvZiBzZXJpYWxpemF0aW9uIGFuZAorICBkZXNlcmlhbGl6YXRpb24u
CisKKyAgVGhlIGhvb2tzIGFyZSBvcmdhbml6ZWQgYnkgdGhlIHRocmVlIHJlc3BvbnNpYmlsaXRp
ZXMgb2YgdGhlIHNlcmlhbGl6ZXI6CisKKyAgMS4gRGV0ZXJtaW5pbmcgbmFtaW5nIGNvbnZlbnRp
b25zCisgIDIuIFNlcmlhbGl6aW5nIHJlY29yZHMgaW50byBhIHNlcmlhbGl6ZWQgZm9ybQorICAz
LiBEZXNlcmlhbGl6aW5nIHJlY29yZHMgZnJvbSBhIHNlcmlhbGl6ZWQgZm9ybQorCisgIEJlY2F1
c2UgRW1iZXIgRGF0YSBsYXppbHkgbWF0ZXJpYWxpemVzIHJlY29yZHMsIHRoZSBkZXNlcmlhbGl6
YXRpb24KKyAgc3RlcCwgYW5kIHRoZXJlZm9yZSB0aGUgaG9va3MgeW91IGltcGxlbWVudCwgYXJl
IHNwbGl0IGludG8gdHdvIHBoYXNlczoKKworICAxLiBFeHRyYWN0aW9uLCB3aGVyZSB0aGUgc2Vy
aWFsaXplZCBmb3JtcyBmb3IgbXVsdGlwbGUgcmVjb3JkcyBhcmUKKyAgICAgZXh0cmFjdGVkIGZy
b20gYSBzaW5nbGUgcGF5bG9hZC4gVGhlIElEcyBvZiBlYWNoIHJlY29yZCBhcmUgYWxzbworICAg
ICBleHRyYWN0ZWQgZm9yIGluZGV4aW5nLgorICAyLiBNYXRlcmlhbGl6YXRpb24sIHdoZXJlIGEg
bmV3bHktY3JlYXRlZCByZWNvcmQgaGFzIGl0cyBhdHRyaWJ1dGVzCisgICAgIGFuZCByZWxhdGlv
bnNoaXBzIGluaXRpYWxpemVkIGJhc2VkIG9uIHRoZSBzZXJpYWxpemVkIGZvcm0gbG9hZGVkCisg
ICAgIGJ5IHRoZSBhZGFwdGVyLgorCisgIEFkZGl0aW9uYWxseSwgYSBzZXJpYWxpemVyIGNhbiBj
b252ZXJ0IHZhbHVlcyBmcm9tIHRoZWlyIEphdmFTY3JpcHQKKyAgdmVyc2lvbnMgaW50byB0aGVp
ciBzZXJpYWxpemVkIHZlcnNpb25zIHZpYSBhIGRlY2xhcmF0aXZlIEFQSS4KKworICAjIyBOYW1p
bmcgQ29udmVudGlvbnMKKworICBPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHVzZXMgb2YgdGhlIHNl
cmlhbGl6ZXIgaXMgdG8gbWFwIGF0dHJpYnV0ZSBuYW1lcworICBmcm9tIHRoZSBzZXJpYWxpemVk
IGZvcm0gdG8geW91ciBgRFMuTW9kZWxgLiBGb3IgZXhhbXBsZSwgaW4geW91ciBtb2RlbCwKKyAg
eW91IG1heSBoYXZlIGFuIGF0dHJpYnV0ZSBjYWxsZWQgYGZpcnN0TmFtZWA6CisKKyAgYGBgamF2
YXNjcmlwdAorICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBmaXJzdE5hbWU6
IERTLmF0dHIoJ3N0cmluZycpCisgIH0pOworICBgYGAKKworICBIb3dldmVyLCBiZWNhdXNlIHRo
ZSB3ZWIgQVBJIHlvdXIgYWRhcHRlciBpcyBjb21tdW5pY2F0aW5nIHdpdGggaXMKKyAgbGVnYWN5
LCBpdCBjYWxscyB0aGlzIGF0dHJpYnV0ZSBgRklSU1RfTkFNRWAuCisKKyAgWW91IGNhbiBkZXRl
cm1pbmUgdGhlIGF0dHJpYnV0ZSBuYW1lIHVzZWQgaW4gdGhlIHNlcmlhbGl6ZWQgZm9ybQorICBi
eSBpbXBsZW1lbnRpbmcgYGtleUZvckF0dHJpYnV0ZU5hbWVgOgorCisgIGBgYGphdmFzY3JpcHQK
KyAgICBrZXlGb3JBdHRyaWJ1dGVOYW1lOiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7CisgICAgICBy
ZXR1cm4gbmFtZS51bmRlcnNjb3JlLnRvVXBwZXJDYXNlKCk7CisgICAgfQorICBgYGAKKworICBJ
ZiB5b3VyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbm90IHByZWRpY3RhYmxlLCB5b3UgY2FuIHJlLW1h
cCB0aGVtCisgIG9uZS1ieS1vbmUgdXNpbmcgdGhlIGBtYXBgIEFQSToKKworICBgYGBqYXZhc2Ny
aXB0CisgIEFwcC5QZXJzb24ubWFwKCdBcHAuUGVyc29uJywgeworICAgIGZpcnN0TmFtZTogeyBr
ZXk6ICcqQVBJX1VTRVJfRklSU1RfTkFNRSonIH0KKyAgfSk7CisgIGBgYAorCisgICMjIFNlcmlh
bGl6YXRpb24KKworICBEdXJpbmcgdGhlIHNlcmlhbGl6YXRpb24gcHJvY2VzcywgYSByZWNvcmQg
b3IgcmVjb3JkcyBhcmUgY29udmVydGVkCisgIGZyb20gRW1iZXIuanMgb2JqZWN0cyBpbnRvIHRo
ZWlyIHNlcmlhbGl6ZWQgZm9ybS4KKworICBUaGVzZSBtZXRob2RzIGFyZSBkZXNpZ25lZCBpbiBs
YXllcnMsIGxpa2UgYSBkZWxpY2lvdXMgNy1sYXllcgorICBjYWtlIChidXQgd2l0aCBmZXdlciBs
YXllcnMpLgorCisgIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBzZXJpYWxpemF0aW9uIGlzIHRo
ZSBgc2VyaWFsaXplYAorICBtZXRob2QsIHdoaWNoIHRha2VzIHRoZSByZWNvcmQgYW5kIG9wdGlv
bnMuCisKKyAgVGhlIGBzZXJpYWxpemVgIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3I6CisKKyAg
KiB0dXJuaW5nIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzIChgRFMuYXR0cmApIGludG8KKyAgICBh
dHRyaWJ1dGVzIG9uIHRoZSBKU09OIG9iamVjdC4KKyAgKiBvcHRpb25hbGx5IGFkZGluZyB0aGUg
cmVjb3JkJ3MgSUQgb250byB0aGUgaGFzaAorICAqIGFkZGluZyByZWxhdGlvbnNoaXBzIChgRFMu
aGFzTWFueWAgYW5kIGBEUy5iZWxvbmdzVG9gKQorICAgIHRvIHRoZSBKU09OIG9iamVjdC4KKwor
ICBEZXBlbmRpbmcgb24gdGhlIGJhY2tlbmQsIHRoZSBzZXJpYWxpemVyIGNhbiBjaG9vc2UKKyAg
d2hldGhlciB0byBpbmNsdWRlIHRoZSBgaGFzTWFueWAgb3IgYGJlbG9uZ3NUb2AKKyAgcmVsYXRp
b25zaGlwcyBvbiB0aGUgSlNPTiBoYXNoLgorCisgIEZvciB2ZXJ5IGN1c3RvbSBzZXJpYWxpemF0
aW9uLCB5b3UgY2FuIGltcGxlbWVudCB5b3VyCisgIG93biBgc2VyaWFsaXplYCBtZXRob2QuIElu
IGdlbmVyYWwsIGhvd2V2ZXIsIHlvdSB3aWxsIHdhbnQKKyAgdG8gb3ZlcnJpZGUgdGhlIGhvb2tz
IGRlc2NyaWJlZCBiZWxvdy4KKworICAjIyMgQWRkaW5nIHRoZSBJRAorCisgIFRoZSBkZWZhdWx0
IGBzZXJpYWxpemVgIHdpbGwgb3B0aW9uYWxseSBjYWxsIHlvdXIgc2VyaWFsaXplcidzCisgIGBh
ZGRJZGAgbWV0aG9kIHdpdGggdGhlIEpTT04gaGFzaCBpdCBpcyBjcmVhdGluZywgdGhlCisgIHJl
Y29yZCdzIHR5cGUsIGFuZCB0aGUgcmVjb3JkJ3MgSUQuIFRoZSBgc2VyaWFsaXplYCBtZXRob2QK
KyAgd2lsbCBub3QgY2FsbCBgYWRkSWRgIGlmIHRoZSByZWNvcmQncyBJRCBpcyB1bmRlZmluZWQu
CisKKyAgWW91ciBhZGFwdGVyIG11c3Qgc3BlY2lmaWNhbGx5IHJlcXVlc3QgSUQgaW5jbHVzaW9u
IGJ5CisgIHBhc3NpbmcgYHsgaW5jbHVkZUlkOiB0cnVlIH1gIGFzIGFuIG9wdGlvbiB0byBgc2Vy
aWFsaXplYC4KKworICBOT1RFOiBZb3UgbWF5IG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlIElEIHdo
ZW4gdXBkYXRpbmcgYW4KKyAgZXhpc3RpbmcgcmVjb3JkLCBiZWNhdXNlIHlvdXIgc2VydmVyIHdp
bGwgbGlrZWx5IGRpc2FsbG93CisgIGNoYW5naW5nIGFuIElEIGFmdGVyIGl0IGlzIGNyZWF0ZWQs
IGFuZCB0aGUgUFVUIHJlcXVlc3QKKyAgaXRzZWxmIHdpbGwgaW5jbHVkZSB0aGUgcmVjb3JkJ3Mg
aWRlbnRpZmljYXRpb24uCisKKyAgQnkgZGVmYXVsdCwgYGFkZElkYCB3aWxsOgorCisgIDEuIEdl
dCB0aGUgcHJpbWFyeSBrZXkgbmFtZSBmb3IgdGhlIHJlY29yZCBieSBjYWxsaW5nCisgICAgIHRo
ZSBzZXJpYWxpemVyJ3MgYHByaW1hcnlLZXlgIHdpdGggdGhlIHJlY29yZCdzIHR5cGUuCisgICAg
IFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlIGBwcmltYXJ5S2V5YCBtZXRob2QsIHRoaXMKKyAgICAg
d2lsbCBiZSBgJ2lkJ2AuCisgIDIuIEFzc2lnbiB0aGUgcmVjb3JkJ3MgSUQgdG8gdGhlIHByaW1h
cnkga2V5IGluIHRoZQorICAgICBKU09OIGhhc2ggYmVpbmcgYnVpbHQuCisKKyAgSWYgeW91ciBi
YWNrZW5kIGV4cGVjdHMgYSBKU09OIG9iamVjdCB3aXRoIHRoZSBwcmltYXJ5CisgIGtleSBhdCB0
aGUgcm9vdCwgeW91IGNhbiBqdXN0IG92ZXJyaWRlIHRoZSBgcHJpbWFyeUtleWAKKyAgbWV0aG9k
IG9uIHlvdXIgc2VyaWFsaXplciBzdWJjbGFzcy4KKworICBPdGhlcndpc2UsIHlvdSBjYW4gb3Zl
cnJpZGUgdGhlIGBhZGRJZGAgbWV0aG9kIGZvcgorICBtb3JlIHNwZWNpYWxpemVkIGhhbmRsaW5n
LgorCisgICMjIyBBZGRpbmcgQXR0cmlidXRlcworCisgIEJ5IGRlZmF1bHQsIHRoZSBzZXJpYWxp
emVyJ3MgYHNlcmlhbGl6ZWAgbWV0aG9kIHdpbGwgY2FsbAorICBgYWRkQXR0cmlidXRlc2Agd2l0
aCB0aGUgSlNPTiBvYmplY3QgaXQgaXMgY3JlYXRpbmcKKyAgYW5kIHRoZSByZWNvcmQgdG8gc2Vy
aWFsaXplLgorCisgIFRoZSBgYWRkQXR0cmlidXRlc2AgbWV0aG9kIHdpbGwgdGhlbiBjYWxsIGBh
ZGRBdHRyaWJ1dGVgCisgIGluIHR1cm4sIHdpdGggdGhlIEpTT04gb2JqZWN0LCB0aGUgcmVjb3Jk
IHRvIHNlcmlhbGl6ZSwKKyAgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgYW5kIGl0cyB0eXBlLgorCisg
IEZpbmFsbHksIHRoZSBgYWRkQXR0cmlidXRlYCBtZXRob2Qgd2lsbCBzZXJpYWxpemUgdGhlCisg
IGF0dHJpYnV0ZToKKworICAxLiBJdCB3aWxsIGNhbGwgYGtleUZvckF0dHJpYnV0ZU5hbWVgIHRv
IGRldGVybWluZQorICAgICB0aGUga2V5IHRvIHVzZSBpbiB0aGUgSlNPTiBoYXNoLgorICAyLiBJ
dCB3aWxsIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgcmVjb3JkLgorICAzLiBJdCB3aWxsIGNhbGwg
YHNlcmlhbGl6ZVZhbHVlYCB3aXRoIHRoZSBhdHRyaWJ1dGUncworICAgICB2YWx1ZSBhbmQgYXR0
cmlidXRlIHR5cGUgdG8gY29udmVydCBpdCBpbnRvIGEKKyAgICAgSlNPTi1jb21wYXRpYmxlIHZh
bHVlLiBGb3IgZXhhbXBsZSwgaXQgd2lsbCBjb252ZXJ0IGEKKyAgICAgRGF0ZSBpbnRvIGEgU3Ry
aW5nLgorCisgIElmIHlvdXIgYmFja2VuZCBleHBlY3RzIGEgSlNPTiBvYmplY3Qgd2l0aCBhdHRy
aWJ1dGVzIGFzCisgIGtleXMgYXQgdGhlIHJvb3QsIHlvdSBjYW4ganVzdCBvdmVycmlkZSB0aGUg
YHNlcmlhbGl6ZVZhbHVlYAorICBhbmQgYGtleUZvckF0dHJpYnV0ZU5hbWVgIG1ldGhvZHMgaW4g
eW91ciBzZXJpYWxpemVyCisgIHN1YmNsYXNzIGFuZCBsZXQgdGhlIGJhc2UgY2xhc3MgZG8gdGhl
IGhlYXZ5IGxpZnRpbmcuCisKKyAgSWYgeW91IG5lZWQgc29tZXRoaW5nIG1vcmUgc3BlY2lhbGl6
ZWQsIHlvdSBjYW4gcHJvYmFibHkKKyAgb3ZlcnJpZGUgYGFkZEF0dHJpYnV0ZWAgYW5kIGxldCB0
aGUgZGVmYXVsdCBgYWRkQXR0cmlidXRlc2AKKyAgaGFuZGxlIHRoZSBuaXR0eSBncml0dHkuCisK
KyAgIyMjIEFkZGluZyBSZWxhdGlvbnNoaXBzCisKKyAgQnkgZGVmYXVsdCwgYHNlcmlhbGl6ZWAg
d2lsbCBjYWxsIHlvdXIgc2VyaWFsaXplcidzCisgIGBhZGRSZWxhdGlvbnNoaXBzYCBtZXRob2Qg
d2l0aCB0aGUgSlNPTiBvYmplY3QgdGhhdCBpcworICBiZWluZyBidWlsdCBhbmQgdGhlIHJlY29y
ZCBiZWluZyBzZXJpYWxpemVkLiBUaGUgZGVmYXVsdAorICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlz
IG1ldGhvZCBpcyB0byBsb29wIG92ZXIgYWxsIG9mIHRoZQorICByZWxhdGlvbnNoaXBzIGRlZmlu
ZWQgb24geW91ciByZWNvcmQgdHlwZSBhbmQ6CisKKyAgKiBJZiB0aGUgcmVsYXRpb25zaGlwIGlz
IGEgYERTLmhhc01hbnlgIHJlbGF0aW9uc2hpcCwKKyAgICBjYWxsIGBhZGRIYXNNYW55YCB3aXRo
IHRoZSBKU09OIG9iamVjdCwgdGhlIHJlY29yZAorICAgIGFuZCBhIGRlc2NyaXB0aW9uIG9mIHRo
ZSByZWxhdGlvbnNoaXAuCisgICogSWYgdGhlIHJlbGF0aW9uc2hpcCBpcyBhIGBEUy5iZWxvbmdz
VG9gIHJlbGF0aW9uc2hpcCwKKyAgICBjYWxsIGBhZGRCZWxvbmdzVG9gIHdpdGggdGhlIEpTT04g
b2JqZWN0LCB0aGUgcmVjb3JkCisgICAgYW5kIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJlbGF0aW9u
c2hpcC4KKworICBUaGUgcmVsYXRpb25zaGlwIGRlc2NyaXB0aW9uIGhhcyB0aGUgZm9sbG93aW5n
IGtleXM6CisKKyAgKiBgdHlwZWA6IHRoZSBjbGFzcyBvZiB0aGUgYXNzb2NpYXRlZCBpbmZvcm1h
dGlvbiAodGhlCisgICAgZmlyc3QgcGFyYW1ldGVyIHRvIGBEUy5oYXNNYW55YCBvciBgRFMuYmVs
b25nc1RvYCkKKyAgKiBga2luZGA6IGVpdGhlciBgaGFzTWFueWAgb3IgYGJlbG9uZ3NUb2AKKwor
ICBUaGUgcmVsYXRpb25zaGlwIGRlc2NyaXB0aW9uIG1heSBnZXQgYWRkaXRpb25hbAorICBpbmZv
cm1hdGlvbiBpbiB0aGUgZnV0dXJlIGlmIG1vcmUgY2FwYWJpbGl0aWVzIG9yCisgIHJlbGF0aW9u
c2hpcCB0eXBlcyBhcmUgYWRkZWQuIEhvd2V2ZXIsIGl0IHdpbGwKKyAgcmVtYWluIGJhY2t3YXJk
cy1jb21wYXRpYmxlLCBzbyB0aGUgbWVyZSBleGlzdGVuY2UKKyAgb2YgbmV3IGZlYXR1cmVzIHNo
b3VsZCBub3QgYnJlYWsgZXhpc3RpbmcgYWRhcHRlcnMuCisqLworRFMuU2VyaWFsaXplciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoeworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLm1hcHBp
bmdzID0gRW1iZXIuTWFwLmNyZWF0ZSgpOworICAgIHRoaXMuY29uZmlndXJhdGlvbnMgPSBFbWJl
ci5NYXAuY3JlYXRlKCk7CisgICAgdGhpcy5nbG9iYWxDb25maWd1cmF0aW9ucyA9IHt9OworICB9
LAorCisgIGV4dHJhY3Q6IG11c3RJbXBsZW1lbnQoJ2V4dHJhY3QnKSwKKyAgZXh0cmFjdE1hbnk6
IG11c3RJbXBsZW1lbnQoJ2V4dHJhY3RNYW55JyksCisKKyAgZXh0cmFjdFJlY29yZFJlcHJlc2Vu
dGF0aW9uOiBmdW5jdGlvbihsb2FkZXIsIHR5cGUsIGpzb24sIHNob3VsZFNpZGVsb2FkKSB7Cisg
ICAgdmFyIG1hcHBpbmcgPSB0aGlzLm1hcHBpbmdGb3JUeXBlKHR5cGUpOworICAgIHZhciBlbWJl
ZGRlZERhdGEsIHByZW1hdGVyaWFsaXplZCA9IHt9LCByZWZlcmVuY2U7CisKKyAgICBpZiAoc2hv
dWxkU2lkZWxvYWQpIHsKKyAgICAgIHJlZmVyZW5jZSA9IGxvYWRlci5zaWRlbG9hZCh0eXBlLCBq
c29uKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVmZXJlbmNlID0gbG9hZGVyLmxvYWQodHlwZSwg
anNvbik7CisgICAgfQorCisgICAgdGhpcy5lYWNoRW1iZWRkZWRIYXNNYW55KHR5cGUsIGZ1bmN0
aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgeworICAgICAgdmFyIGVtYmVkZGVkRGF0YSA9IGpzb25b
dGhpcy5rZXlGb3IocmVsYXRpb25zaGlwKV07CisgICAgICBpZiAoIWlzTm9uZShlbWJlZGRlZERh
dGEpKSB7CisgICAgICAgIHRoaXMuZXh0cmFjdEVtYmVkZGVkSGFzTWFueShsb2FkZXIsIHJlbGF0
aW9uc2hpcCwgZW1iZWRkZWREYXRhLCByZWZlcmVuY2UsIHByZW1hdGVyaWFsaXplZCk7CisgICAg
ICB9CisgICAgfSwgdGhpcyk7CisKKyAgICB0aGlzLmVhY2hFbWJlZGRlZEJlbG9uZ3NUbyh0eXBl
LCBmdW5jdGlvbihuYW1lLCByZWxhdGlvbnNoaXApIHsKKyAgICAgIHZhciBlbWJlZGRlZERhdGEg
PSBqc29uW3RoaXMua2V5Rm9yKHJlbGF0aW9uc2hpcCldOworICAgICAgaWYgKCFpc05vbmUoZW1i
ZWRkZWREYXRhKSkgeworICAgICAgICB0aGlzLmV4dHJhY3RFbWJlZGRlZEJlbG9uZ3NUbyhsb2Fk
ZXIsIHJlbGF0aW9uc2hpcCwgZW1iZWRkZWREYXRhLCByZWZlcmVuY2UsIHByZW1hdGVyaWFsaXpl
ZCk7CisgICAgICB9CisgICAgfSwgdGhpcyk7CisKKyAgICBsb2FkZXIucHJlbWF0ZXJpYWxpemUo
cmVmZXJlbmNlLCBwcmVtYXRlcmlhbGl6ZWQpOworCisgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAg
fSwKKworICBleHRyYWN0RW1iZWRkZWRIYXNNYW55OiBmdW5jdGlvbihsb2FkZXIsIHJlbGF0aW9u
c2hpcCwgYXJyYXksIHBhcmVudCwgcHJlbWF0ZXJpYWxpemVkKSB7CisgICAgdmFyIHJlZmVyZW5j
ZXMgPSBtYXAuY2FsbChhcnJheSwgZnVuY3Rpb24oaXRlbSkgeworICAgICAgaWYgKCFpdGVtKSB7
IHJldHVybjsgfQorCisgICAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy5leHRyYWN0UmVjb3JkUmVw
cmVzZW50YXRpb24obG9hZGVyLCByZWxhdGlvbnNoaXAudHlwZSwgaXRlbSwgdHJ1ZSk7CisKKyAg
ICAgIC8vIElmIHRoZSBlbWJlZGRlZCByZWNvcmQgc2hvdWxkIGFsc28gYmUgc2F2ZWQgYmFjayB3
aGVuIHNlcmlhbGl6aW5nIHRoZSBwYXJlbnQsCisgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IGl0
cyBwYXJlbnQgc2luY2UgaXQgd2lsbCBub3QgaGF2ZSBhbiBJRC4KKyAgICAgIHZhciBlbWJlZGRl
ZFR5cGUgPSB0aGlzLmVtYmVkZGVkVHlwZShwYXJlbnQudHlwZSwgcmVsYXRpb25zaGlwLmtleSk7
CisgICAgICBpZiAoZW1iZWRkZWRUeXBlID09PSAnYWx3YXlzJykgeworICAgICAgICByZWZlcmVu
Y2UucGFyZW50ID0gcGFyZW50OworICAgICAgfQorCisgICAgICByZXR1cm4gcmVmZXJlbmNlOwor
ICAgIH0sIHRoaXMpOworCisgICAgcHJlbWF0ZXJpYWxpemVkW3JlbGF0aW9uc2hpcC5rZXldID0g
cmVmZXJlbmNlczsKKyAgfSwKKworICBleHRyYWN0RW1iZWRkZWRCZWxvbmdzVG86IGZ1bmN0aW9u
KGxvYWRlciwgcmVsYXRpb25zaGlwLCBkYXRhLCBwYXJlbnQsIHByZW1hdGVyaWFsaXplZCkgewor
ICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLmV4dHJhY3RSZWNvcmRSZXByZXNlbnRhdGlvbihsb2Fk
ZXIsIHJlbGF0aW9uc2hpcC50eXBlLCBkYXRhLCB0cnVlKTsKKyAgICBwcmVtYXRlcmlhbGl6ZWRb
cmVsYXRpb25zaGlwLmtleV0gPSByZWZlcmVuY2U7CisKKyAgICAvLyBJZiB0aGUgZW1iZWRkZWQg
cmVjb3JkIHNob3VsZCBhbHNvIGJlIHNhdmVkIGJhY2sgd2hlbiBzZXJpYWxpemluZyB0aGUgcGFy
ZW50LAorICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZXQgaXRzIHBhcmVudCBzaW5jZSBpdCB3aWxsIG5v
dCBoYXZlIGFuIElELgorICAgIHZhciBlbWJlZGRlZFR5cGUgPSB0aGlzLmVtYmVkZGVkVHlwZShw
YXJlbnQudHlwZSwgcmVsYXRpb25zaGlwLmtleSk7CisgICAgaWYgKGVtYmVkZGVkVHlwZSA9PT0g
J2Fsd2F5cycpIHsKKyAgICAgIHJlZmVyZW5jZS5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorICB9
LAorCisgIC8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgLy8uIFNFUklBTElaQVRJT04gSE9P
S1MKKyAgLy8uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisgIC8qKgorICAgIFRoZSBtYWluIGVu
dHJ5IHBvaW50IGZvciBzZXJpYWxpemluZyBhIHJlY29yZC4gV2hpbGUgeW91IGNhbiBjb25zaWRl
ciB0aGlzCisgICAgYSBob29rIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gaW4geW91ciBzZXJpYWxp
emVyLCB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5CisgICAgaGFuZGxlIHNlcmlhbGl6YXRpb24u
IEZvciBtb3N0IGNhc2VzLCB0aGVyZSBhcmUgbW9yZSBncmFudWxhciBob29rcyB0aGF0IHlvdQor
ICAgIGNhbiBvdmVycmlkZS4KKworICAgIElmIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIHRoZXNl
IGFyZSB0aGUgcmVzcG9uc2liaWxpdGllcyB0aGF0IHlvdSB3aWxsIG5lZWQKKyAgICB0byBpbXBs
ZW1lbnQgeW91cnNlbGY6CisKKyAgICAqIElmIHRoZSBvcHRpb24gaGFzaCBjb250YWlucyBgaW5j
bHVkZUlkYCwgYWRkIHRoZSByZWNvcmQncyBJRCB0byB0aGUgc2VyaWFsaXplZCBmb3JtLgorICAg
ICAgQnkgZGVmYXVsdCwgYHNlcmlhbGl6ZWAgY2FsbHMgYGFkZElkYCBpZiBhcHByb3ByaWF0ZS4K
KyAgICAqIEFkZCB0aGUgcmVjb3JkJ3MgYXR0cmlidXRlcyB0byB0aGUgc2VyaWFsaXplZCBmb3Jt
LiBCeSBkZWZhdWx0LCBgc2VyaWFsaXplYCBjYWxscworICAgICAgYGFkZEF0dHJpYnV0ZXNgLgor
ICAgICogQWRkIHRoZSByZWNvcmQncyByZWxhdGlvbnNoaXBzIHRvIHRoZSBzZXJpYWxpemVkIGZv
cm0uIEJ5IGRlZmF1bHQsIGBzZXJpYWxpemVgIGNhbGxzCisgICAgICBgYWRkUmVsYXRpb25zaGlw
c2AuCisKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxp
emUKKyAgICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIGEgaGFzaCBvZiBvcHRpb25zCisgICAg
QHJldHVybnMge2FueX0gdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiB0aGUgcmVjb3JkCisgICovCisg
IHNlcmlhbGl6ZTogZnVuY3Rpb24ocmVjb3JkLCBvcHRpb25zKSB7CisgICAgb3B0aW9ucyA9IG9w
dGlvbnMgfHwge307CisKKyAgICB2YXIgc2VyaWFsaXplZCA9IHRoaXMuY3JlYXRlU2VyaWFsaXpl
ZEZvcm0oKSwgaWQ7CisKKyAgICBpZiAob3B0aW9ucy5pbmNsdWRlSWQpIHsKKyAgICAgIGlmIChp
ZCA9IGdldChyZWNvcmQsICdpZCcpKSB7CisgICAgICAgIHRoaXMuX2FkZElkKHNlcmlhbGl6ZWQs
IHJlY29yZC5jb25zdHJ1Y3RvciwgaWQpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMuYWRk
QXR0cmlidXRlcyhzZXJpYWxpemVkLCByZWNvcmQpOworICAgIHRoaXMuYWRkUmVsYXRpb25zaGlw
cyhzZXJpYWxpemVkLCByZWNvcmQpOworCisgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7CisgIH0sCisK
KyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIEdpdmVuIGFuIGF0dHJpYnV0ZSB0eXBlIGFuZCB2
YWx1ZSwgY29udmVydCB0aGUgdmFsdWUgaW50byB0aGUKKyAgICBzZXJpYWxpemVkIGZvcm0gdXNp
bmcgdGhlIHRyYW5zZm9ybSByZWdpc3RlcmVkIGZvciB0aGF0IHR5cGUuCisKKyAgICBAcGFyYW0g
e2FueX0gdmFsdWUgdGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gdGhlIHNlcmlhbGl6ZWQgZm9ybQor
ICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGVUeXBlIHRoZSByZWdpc3RlcmVkIHR5cGUgKGUu
Zy4gYHN0cmluZ2AKKyAgICAgIG9yIGBib29sZWFuYCkKKyAgICBAcmV0dXJucyB7YW55fSB0aGUg
c2VyaWFsaXplZCBmb3JtIG9mIHRoZSB2YWx1ZQorICAqLworICBzZXJpYWxpemVWYWx1ZTogZnVu
Y3Rpb24odmFsdWUsIGF0dHJpYnV0ZVR5cGUpIHsKKyAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy50
cmFuc2Zvcm1zID8gdGhpcy50cmFuc2Zvcm1zW2F0dHJpYnV0ZVR5cGVdIDogbnVsbDsKKworICAg
IEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHVzZSBhbiBhdHRyaWJ1dGUgdHlwZSAoIiArIGF0
dHJpYnV0ZVR5cGUgKyAiKSB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIiwgdHJhbnNmb3Jt
KTsKKyAgICByZXR1cm4gdHJhbnNmb3JtLnNlcmlhbGl6ZSh2YWx1ZSk7CisgIH0sCisKKyAgLyoq
CisgICAgQSBob29rIHlvdSBjYW4gdXNlIHRvIG5vcm1hbGl6ZSBJRHMgYmVmb3JlIGFkZGluZyB0
aGVtIHRvIHRoZQorICAgIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uCisKKyAgICBCZWNhdXNl
IHRoZSBzdG9yZSBjb2VyY2VzIGFsbCBJRHMgdG8gc3RyaW5ncyBmb3IgY29uc2lzdGVuY3ksCisg
ICAgdGhpcyBpcyB0aGUgb3Bwb3J0dW5pdHkgZm9yIHRoZSBzZXJpYWxpemVyIHRvLCBmb3IgZXhh
bXBsZSwKKyAgICBjb252ZXJ0IG51bWVyaWNhbCBJRHMgYmFjayBpbnRvIG51bWJlciBmb3JtLgor
CisgICAgQHBhcmFtIHtTdHJpbmd9IGlkIHRoZSBpZCBmcm9tIHRoZSByZWNvcmQKKyAgICBAcmV0
dXJucyB7YW55fSB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWQKKyAgKi8K
KyAgc2VyaWFsaXplSWQ6IGZ1bmN0aW9uKGlkKSB7CisgICAgaWYgKGlzTmFOKGlkKSkgeyByZXR1
cm4gaWQ7IH0KKyAgICByZXR1cm4gK2lkOworICB9LAorCisgIC8qKgorICAgIEEgaG9vayB5b3Ug
Y2FuIHVzZSB0byBjaGFuZ2UgaG93IGF0dHJpYnV0ZXMgYXJlIGFkZGVkIHRvIHRoZSBzZXJpYWxp
emVkCisgICAgcmVwcmVzZW50YXRpb24gb2YgYSByZWNvcmQuCisKKyAgICBCeSBkZWZhdWx0LCBg
YWRkQXR0cmlidXRlc2Agc2ltcGx5IGxvb3BzIG92ZXIgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9m
IHRoZQorICAgIHBhc3NlZCByZWNvcmQsIG1hcHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBr
ZXkgZm9yIHRoZSBzZXJpYWxpemVkIGZvcm0sCisgICAgYW5kIGludm9rZXMgYW55IHJlZ2lzdGVy
ZWQgdHJhbnNmb3JtcyBvbiB0aGUgdmFsdWUuIEl0IHRoZW4gaW52b2tlcyB0aGUKKyAgICBtb3Jl
IGdyYW51bGFyIGBhZGRBdHRyaWJ1dGVgIHdpdGggdGhlIGtleSBhbmQgdHJhbnNmb3JtZWQgdmFs
dWUuCisKKyAgICBTaW5jZSB5b3UgY2FuIG92ZXJyaWRlIGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCwg
YGFkZEF0dHJpYnV0ZWAsIGFuZCByZWdpc3RlcgorICAgIGN1c3RvbSB0cmFuZm9ybXMsIHlvdSBz
aG91bGQgcmFyZWx5IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBob29rLgorCisgICAgQHBhcmFtIHth
bnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBiZWluZyBidWls
dAorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQor
ICAqLworICBhZGRBdHRyaWJ1dGVzOiBmdW5jdGlvbihkYXRhLCByZWNvcmQpIHsKKyAgICByZWNv
cmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGUpIHsKKyAgICAgIHRoaXMu
X2FkZEF0dHJpYnV0ZShkYXRhLCByZWNvcmQsIG5hbWUsIGF0dHJpYnV0ZS50eXBlKTsKKyAgICB9
LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAgICBBIGhvb2sgeW91IGNhbiB1c2UgdG8gY3VzdG9t
aXplIGhvdyB0aGUga2V5L3ZhbHVlIHBhaXIgaXMgYWRkZWQgdG8KKyAgICB0aGUgc2VyaWFsaXpl
ZCBkYXRhLgorCisgICAgQHBhcmFtIHthbnl9IHNlcmlhbGl6ZWQgdGhlIHNlcmlhbGl6ZWQgZm9y
bSBiZWluZyBidWlsdAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSB0byBhZGQgdG8g
dGhlIHNlcmlhbGl6ZWQgZGF0YQorICAgIEBwYXJhbSB7YW55fSB2YWx1ZSB0aGUgdmFsdWUgdG8g
YWRkIHRvIHRoZSBzZXJpYWxpemVkIGRhdGEKKyAgKi8KKyAgYWRkQXR0cmlidXRlOiBFbWJlci5L
LAorCisgIC8qKgorICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byBjdXN0b21pemUgaG93IHRoZSBy
ZWNvcmQncyBpZCBpcyBhZGRlZCB0bworICAgIHRoZSBzZXJpYWxpemVkIGRhdGEuCisKKyAgICBU
aGUgYGFkZElkYCBob29rIGlzIGNhbGxlZCB3aXRoOgorCisgICAgKiB0aGUgc2VyaWFsaXplZCBy
ZXByZXNlbnRhdGlvbiBiZWluZyBidWlsdAorICAgICogdGhlIHJlc29sdmVkIHByaW1hcnkga2V5
ICh0YWtpbmcgY29uZmlndXJhdGlvbnMgYW5kIHRoZQorICAgICAgYHByaW1hcnlLZXlgIGhvb2sg
aW50byBjb25zaWRlcmF0aW9uKQorICAgICogdGhlIHNlcmlhbGl6ZWQgaWQgKGFmdGVyIGNhbGxp
bmcgdGhlIGBzZXJpYWxpemVJZGAgaG9vaykKKworICAgIEBwYXJhbSB7YW55fSBkYXRhIHRoZSBz
ZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYmVpbmcgYnVpbHQKKyAgICBAcGFyYW0g
e1N0cmluZ30ga2V5IHRoZSByZXNvbHZlZCBwcmltYXJ5IGtleQorICAgIEBwYXJhbSB7aWR9IGlk
IHRoZSBzZXJpYWxpemVkIGlkCisgICovCisgIGFkZElkOiBFbWJlci5LLAorCisgIC8qKgorICAg
IEEgaG9vayB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgaG93IHJlbGF0aW9uc2hpcHMgYXJlIGFkZGVk
IHRvIHRoZSBzZXJpYWxpemVkCisgICAgcmVwcmVzZW50YXRpb24gb2YgYSByZWNvcmQuCisKKyAg
ICBCeSBkZWZhdWx0LCBgYWRkQXR0cmlidXRlc2AgbG9vcHMgb3ZlciBhbGwgb2YgdGhlIHJlbGF0
aW9uc2hpcHMgb2YgdGhlCisgICAgcGFzc2VkIHJlY29yZCwgbWFwcyB0aGUgcmVsYXRpb25zaGlw
IG5hbWVzIHRvIHRoZSBrZXkgZm9yIHRoZSBzZXJpYWxpemVkIGZvcm0sCisgICAgYW5kIHRoZW4g
aW52b2tlcyB0aGUgcHVibGljIGBhZGRCZWxvbmdzVG9gIGFuZCBgYWRkSGFzTWFueWAgaG9va3Mu
CisKKyAgICBTaW5jZSB5b3UgY2FuIG92ZXJyaWRlIGBrZXlGb3JCZWxvbmdzVG9gLCBga2V5Rm9y
SGFzTWFueWAsIGBhZGRCZWxvbmdzVG9gLAorICAgIGBhZGRIYXNNYW55YCwgYW5kIHJlZ2lzdGVy
IG1hcHBpbmdzLCB5b3Ugc2hvdWxkIHJhcmVseSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMKKyAgICBo
b29rLgorCisgICAgQHBhcmFtIHthbnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRp
b24gdGhhdCBpcyBiZWluZyBidWlsdAorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUg
cmVjb3JkIHRvIHNlcmlhbGl6ZQorICAqLworICBhZGRSZWxhdGlvbnNoaXBzOiBmdW5jdGlvbihk
YXRhLCByZWNvcmQpIHsKKyAgICByZWNvcmQuZWFjaFJlbGF0aW9uc2hpcChmdW5jdGlvbihuYW1l
LCByZWxhdGlvbnNoaXApIHsKKyAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCA9PT0gJ2JlbG9u
Z3NUbycpIHsKKyAgICAgICAgdGhpcy5fYWRkQmVsb25nc1RvKGRhdGEsIHJlY29yZCwgbmFtZSwg
cmVsYXRpb25zaGlwKTsKKyAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdo
YXNNYW55JykgeworICAgICAgICB0aGlzLl9hZGRIYXNNYW55KGRhdGEsIHJlY29yZCwgbmFtZSwg
cmVsYXRpb25zaGlwKTsKKyAgICAgIH0KKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAg
ICBBIGhvb2sgeW91IGNhbiB1c2UgdG8gYWRkIGEgYGJlbG9uZ3NUb2AgcmVsYXRpb25zaGlwIHRv
IHRoZQorICAgIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uCisKKyAgICBUaGUgc3BlY2lmaWNz
IG9mIHRoaXMgaG9vayBhcmUgdmVyeSBhZGFwdGVyLXNwZWNpZmljLCBzbyB0aGVyZQorICAgIGlz
IG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uIFlvdSBjYW4gc2VlIGBEUy5KU09OU2VyaWFsaXpl
cmAKKyAgICBmb3IgYW4gZXhhbXBsZSBvZiBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGFkZEJl
bG9uZ3NUb2AgaG9vay4KKworICAgIFRoZSBgYmVsb25nc1RvYCByZWxhdGlvbnNoaXAgb2JqZWN0
IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisKKyAgICAqICoqdHlwZSoqIGEgc3ViY2xh
c3Mgb2YgRFMuTW9kZWwgdGhhdCBpcyB0aGUgdHlwZSBvZiB0aGUKKyAgICAgIHJlbGF0aW9uc2hp
cC4gVGhpcyBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIERTLmJlbG9uZ3NUbworICAgICogKipv
cHRpb25zKiogdGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBjYWxsIHRvIERTLmJlbG9uZ3NUbwor
ICAgICogKipraW5kKiogYWx3YXlzIGBiZWxvbmdzVG9gCisKKyAgICBBZGRpdGlvbmFsIHByb3Bl
cnRpZXMgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuCisKKyAgICBAcGFyYW0ge2FueX0gZGF0
YSB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiB0aGF0IGlzIGJlaW5nIGJ1aWx0CisgICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRoZSByZWNvcmQgdG8gc2VyaWFsaXplCisgICAgQHBh
cmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IGZvciB0aGUgc2VyaWFsaXplZCBvYmplY3QKKyAgICBA
cGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJl
bGF0aW9uc2hpcAorICAqLworICBhZGRCZWxvbmdzVG86IEVtYmVyLkssCisKKyAgLyoqCisgICAg
QSBob29rIHlvdSBjYW4gdXNlIHRvIGFkZCBhIGBoYXNNYW55YCByZWxhdGlvbnNoaXAgdG8gdGhl
CisgICAgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi4KKworICAgIFRoZSBzcGVjaWZpY3Mgb2Yg
dGhpcyBob29rIGFyZSB2ZXJ5IGFkYXB0ZXItc3BlY2lmaWMsIHNvIHRoZXJlCisgICAgaXMgbm8g
ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gWW91IG1heSBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhp
cywKKyAgICBmb3IgZXhhbXBsZSwgaWYgeW91ciBiYWNrZW5kIG9ubHkgZXhwZWN0cyByZWxhdGlv
bnNoaXBzIG9uIHRoZQorICAgIGNoaWxkIG9mIGEgb25lIHRvIG1hbnkgcmVsYXRpb25zaGlwLgor
CisgICAgVGhlIGBoYXNNYW55YCByZWxhdGlvbnNoaXAgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5n
IHByb3BlcnRpZXM6CisKKyAgICAqICoqdHlwZSoqIGEgc3ViY2xhc3Mgb2YgRFMuTW9kZWwgdGhh
dCBpcyB0aGUgdHlwZSBvZiB0aGUKKyAgICAgIHJlbGF0aW9uc2hpcC4gVGhpcyBpcyB0aGUgZmly
c3QgcGFyYW1ldGVyIHRvIERTLmhhc01hbnkKKyAgICAqICoqb3B0aW9ucyoqIHRoZSBvcHRpb25z
IHBhc3NlZCB0byB0aGUgY2FsbCB0byBEUy5oYXNNYW55CisgICAgKiAqKmtpbmQqKiBhbHdheXMg
YGhhc01hbnlgCisKKyAgICBBZGRpdGlvbmFsIHByb3BlcnRpZXMgbWF5IGJlIGFkZGVkIGluIHRo
ZSBmdXR1cmUuCisKKyAgICBAcGFyYW0ge2FueX0gZGF0YSB0aGUgc2VyaWFsaXplZCByZXByZXNl
bnRhdGlvbiB0aGF0IGlzIGJlaW5nIGJ1aWx0CisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk
IHRoZSByZWNvcmQgdG8gc2VyaWFsaXplCisgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5
IGZvciB0aGUgc2VyaWFsaXplZCBvYmplY3QKKyAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25z
aGlwIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbGF0aW9uc2hpcAorICAqLworICBhZGRI
YXNNYW55OiBFbWJlci5LLAorCisgIC8qKgorICAgIE5BTUlORyBDT05WRU5USU9OUworCisgICAg
VGhlIG1vc3QgY29tbW9ubHkgb3ZlcnJpZGRlbiBBUElzIG9mIHRoZSBzZXJpYWxpemVyIGFyZQor
ICAgIHRoZSBuYW1pbmcgY29udmVudGlvbiBtZXRob2RzOgorCisgICAgKiBga2V5Rm9yQXR0cmli
dXRlTmFtZWA6IGNvbnZlcnRzIGEgY2FtZWxpemVkIGF0dHJpYnV0ZSBuYW1lCisgICAgICBpbnRv
IGEga2V5IGluIHRoZSBhZGFwdGVyLXByb3ZpZGVkIGRhdGEgaGFzaC4gRm9yIGV4YW1wbGUsCisg
ICAgICBpZiB0aGUgbW9kZWwncyBhdHRyaWJ1dGUgbmFtZSB3YXMgYGZpcnN0TmFtZWAsIGFuZCB0
aGUKKyAgICAgIHNlcnZlciB1c2VkIHVuZGVyc2NvcmVkIG5hbWVzLCB5b3Ugd291bGQgcmV0dXJu
IGBmaXJzdF9uYW1lYC4KKyAgICAqIGBwcmltYXJ5S2V5YDogcmV0dXJucyB0aGUga2V5IHRoYXQg
c2hvdWxkIGJlIHVzZWQgdG8KKyAgICAgIGV4dHJhY3QgdGhlIGlkIGZyb20gdGhlIGFkYXB0ZXIt
cHJvdmlkZWQgZGF0YSBoYXNoLiBJdCBpcworICAgICAgYWxzbyB1c2VkIHdoZW4gc2VyaWFsaXpp
bmcgYSByZWNvcmQuCisgICovCisKKyAgLyoqCisgICAgQSBob29rIHlvdSBjYW4gdXNlIGluIHlv
dXIgc2VyaWFsaXplciBzdWJjbGFzcyB0byBjdXN0b21pemUKKyAgICBob3cgYW4gdW5tYXBwZWQg
YXR0cmlidXRlIG5hbWUgaXMgY29udmVydGVkIGludG8gYSBrZXkuCisKKyAgICBCeSBkZWZhdWx0
LCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBgbmFtZWAgcGFyYW1ldGVyLgorCisgICAgRm9yIGV4
YW1wbGUsIGlmIHRoZSBhdHRyaWJ1dGUgbmFtZXMgaW4geW91ciBKU09OIGFyZSB1bmRlcnNjb3Jl
ZCwKKyAgICB5b3Ugd2lsbCB3YW50IHRvIGNvbnZlcnQgdGhlbSBpbnRvIEphdmFTY3JpcHQgY29u
dmVudGlvbmFsCisgICAgY2FtZWxjYXNlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5N
eVNlcmlhbGl6ZXIgPSBEUy5TZXJpYWxpemVyLmV4dGVuZCh7CisgICAgICAvLyAuLi4KKworICAg
ICAga2V5Rm9yQXR0cmlidXRlTmFtZTogZnVuY3Rpb24odHlwZSwgbmFtZSkgeworICAgICAgICBy
ZXR1cm4gbmFtZS5jYW1lbGl6ZSgpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisgICAg
QHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkIHdp
dGgKKyAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZSBgbmFtZWAKKyAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSB0aGUgYXR0cmlidXRlIG5hbWUgdG8gY29udmVydCBpbnRvIGEga2V5CisKKyAgICBAcmV0
dXJucyB7U3RyaW5nfSB0aGUga2V5CisgICovCisgIGtleUZvckF0dHJpYnV0ZU5hbWU6IGZ1bmN0
aW9uKHR5cGUsIG5hbWUpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfSwKKworICAvKioKKyAgICBB
IGhvb2sgeW91IGNhbiB1c2UgaW4geW91ciBzZXJpYWxpemVyIHRvIHNwZWNpZnkgYSBjb252ZW50
aW9uYWwKKyAgICBwcmltYXJ5IGtleS4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHdp
bGwgcmV0dXJuIHRoZSBzdHJpbmcgYGlkYC4KKworICAgIEluIGdlbmVyYWwsIHlvdSBzaG91bGQg
bm90IG92ZXJyaWRlIHRoaXMgaG9vayB0byBzcGVjaWZ5IGEgc3BlY2lhbAorICAgIHByaW1hcnkg
a2V5IGZvciBhbiBpbmRpdmlkdWFsIHR5cGU7IHVzZSBgY29uZmlndXJlYCBpbnN0ZWFkLgorCisg
ICAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgcHJpbWFyeSBrZXkgaXMgYWx3YXlzIGBfX2lkX19gOgor
CisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5NeVNlcmlhbGl6ZXIgPSBEUy5TZXJpYWxpemVy
LmV4dGVuZCh7CisgICAgICAvLyAuLi4KKyAgICAgIHByaW1hcnlLZXk6IGZ1bmN0aW9uKHR5cGUp
IHsKKyAgICAgICAgcmV0dXJuICdfX2lkX18nOworICAgICAgfQorICAgIH0pOworICAgIGBgYAor
CisgICAgSW4gYW5vdGhlciBleGFtcGxlLCBpZiB0aGUgcHJpbWFyeSBrZXkgYWx3YXlzIGluY2x1
ZGVzIHRoZQorICAgIHVuZGVyc2NvcmVkIHZlcnNpb24gb2YgdGhlIHR5cGUgYmVmb3JlIHRoZSBz
dHJpbmcgYGlkYDoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuTXlTZXJpYWxpemVyID0g
RFMuU2VyaWFsaXplci5leHRlbmQoeworICAgICAgLy8gLi4uCisgICAgICBwcmltYXJ5S2V5OiBm
dW5jdGlvbih0eXBlKSB7CisgICAgICAgIC8vIElmIHRoZSB0eXBlIGlzIGBCbG9nUG9zdGAsIHRo
aXMgd2lsbCByZXR1cm4KKyAgICAgICAgLy8gYGJsb2dfcG9zdF9pZGAuCisgICAgICAgIHZhciB0
eXBlU3RyaW5nID0gdHlwZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV0udW5kZXJzY29yZSgpOwor
ICAgICAgICByZXR1cm4gdHlwZVN0cmluZyArICJfaWQiOworICAgICAgfQorICAgIH0pOworICAg
IGBgYAorCisgICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZQorICAgIEByZXR1cm5z
IHtTdHJpbmd9IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIHR5cGUKKyAgKi8KKyAgcHJpbWFyeUtl
eTogZnVuY3Rpb24odHlwZSkgeworICAgIHJldHVybiAiaWQiOworICB9LAorCisgIC8qKgorICAg
IEEgaG9vayB5b3UgY2FuIHVzZSBpbiB5b3VyIHNlcmlhbGl6ZXIgc3ViY2xhc3MgdG8gY3VzdG9t
aXplCisgICAgaG93IGFuIHVubWFwcGVkIGBiZWxvbmdzVG9gIHJlbGF0aW9uc2hpcCBpcyBjb252
ZXJ0ZWQgaW50bworICAgIGEga2V5LgorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgY2Fs
bHMgYGtleUZvckF0dHJpYnV0ZU5hbWVgLCBzbyBpZgorICAgIHlvdXIgbmFtaW5nIGNvbnZlbnRp
b24gaXMgdW5pZm9ybSBhY3Jvc3MgYXR0cmlidXRlcyBhbmQKKyAgICByZWxhdGlvbnNoaXBzLCB5
b3UgY2FuIHVzZSB0aGUgZGVmYXVsdCBoZXJlIGFuZCBvdmVycmlkZQorICAgIGp1c3QgYGtleUZv
ckF0dHJpYnV0ZU5hbWVgIGFzIG5lZWRlZC4KKworICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYGJl
bG9uZ3NUb2AgbmFtZXMgaW4geW91ciBKU09OIGFsd2F5cworICAgIGJlZ2luIHdpdGggYEJUX2Ag
KGUuZy4gYEJUX3Bvc3RzYCksIHlvdSBjYW4gc3RyaXAgb3V0IHRoZQorICAgIGBCVF9gIHByZWZp
eDoiCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLk15U2VyaWFsaXplciA9IERTLlNlcmlh
bGl6ZXIuZXh0ZW5kKHsKKyAgICAgIC8vIC4uLgorICAgICAga2V5Rm9yQmVsb25nc1RvOiBmdW5j
dGlvbih0eXBlLCBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLm1hdGNoKC9eQlRfKC4qKSQv
KVsxXS5jYW1lbGl6ZSgpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisgICAgQHBhcmFt
IHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkIHdpdGgKKyAg
ICAgIHRoZSBgYmVsb25nc1RvYCByZWxhdGlvbnNoaXAuCisgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgdGhlIHJlbGF0aW9uc2hpcCBuYW1lIHRvIGNvbnZlcnQgaW50byBhIGtleQorCisgICAgQHJl
dHVybnMge1N0cmluZ30gdGhlIGtleQorICAqLworICBrZXlGb3JCZWxvbmdzVG86IGZ1bmN0aW9u
KHR5cGUsIG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5rZXlGb3JBdHRyaWJ1dGVOYW1lKHR5cGUs
IG5hbWUpOworICB9LAorCisgIC8qKgorICAgIEEgaG9vayB5b3UgY2FuIHVzZSBpbiB5b3VyIHNl
cmlhbGl6ZXIgc3ViY2xhc3MgdG8gY3VzdG9taXplCisgICAgaG93IGFuIHVubWFwcGVkIGBoYXNN
YW55YCByZWxhdGlvbnNoaXAgaXMgY29udmVydGVkIGludG8KKyAgICBhIGtleS4KKworICAgIEJ5
IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGNhbGxzIGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCwgc28gaWYK
KyAgICB5b3VyIG5hbWluZyBjb252ZW50aW9uIGlzIHVuaWZvcm0gYWNyb3NzIGF0dHJpYnV0ZXMg
YW5kCisgICAgcmVsYXRpb25zaGlwcywgeW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgaGVyZSBhbmQg
b3ZlcnJpZGUKKyAgICBqdXN0IGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCBhcyBuZWVkZWQuCisKKyAg
ICBGb3IgZXhhbXBsZSwgaWYgdGhlIGBoYXNNYW55YCBuYW1lcyBpbiB5b3VyIEpTT04gYWx3YXlz
CisgICAgYmVnaW4gd2l0aCB0aGUgInRhYmxlIG5hbWUiIGZvciB0aGUgY3VycmVudCB0eXBlIChl
LmcuCisgICAgYHBvc3RfY29tbWVudHNgKSwgeW91IGNhbiBzdHJpcCBvdXQgdGhlIHByZWZpeDoi
CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLk15U2VyaWFsaXplciA9IERTLlNlcmlhbGl6
ZXIuZXh0ZW5kKHsKKyAgICAgIC8vIC4uLgorICAgICAga2V5Rm9ySGFzTWFueTogZnVuY3Rpb24o
dHlwZSwgbmFtZSkgeworICAgICAgICAvLyBpZiB5b3VyIEFwcC5CbG9nUG9zdCBoYXMgbWFueSBB
cHAuQmxvZ0NvbW1lbnQsIHRoZSBrZXkgZnJvbQorICAgICAgICAvLyB0aGUgc2VydmVyIHdvdWxk
IGxvb2sgbGlrZTogYGJsb2dfcG9zdF9ibG9nX2NvbW1lbnRzYAorICAgICAgICAvLworICAgICAg
ICAvLyAxLiBDb252ZXJ0IHRoZSB0eXBlIGludG8gYSBzdHJpbmcgYW5kIHVuZGVyc2NvcmUgdGhl
CisgICAgICAgIC8vICAgIHNlY29uZCBwYXJ0IChBcHAuQmxvZ1Bvc3QgLT4gYmxvZ19wb3N0KQor
ICAgICAgICAvLyAyLiBFeHRyYWN0IHRoZSBwYXJ0IGFmdGVyIGBibG9nX3Bvc3RfYCAoYGJsb2df
Y29tbWVudHNgKQorICAgICAgICAvLyAzLiBVbmRlcnNjb3JlIGl0LCB0byBiZWNvbWUgYGJsb2dD
b21tZW50c2AKKyAgICAgICAgdmFyIHR5cGVTdHJpbmcgPSB0eXBlLnRvU3RyaW5nKCkuc3BsaXQo
Ii4iKVsxXS51bmRlcnNjb3JlKCk7CisgICAgICAgIHJldHVybiBuYW1lLm1hdGNoKG5ldyBSZWdF
eHAoIl4iICsgdHlwZVN0cmluZyArICJfKC4qKSQiKSlbMV0uY2FtZWxpemUoKTsKKyAgICAgIH0K
KyAgICB9KTsKKyAgICBgYGAKKworICAgIEBwYXJhbSB7RFMuTW9kZWwgc3ViY2xhc3N9IHR5cGUg
dGhlIHR5cGUgb2YgdGhlIHJlY29yZCB3aXRoCisgICAgICB0aGUgYGJlbG9uZ3NUb2AgcmVsYXRp
b25zaGlwLgorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGlvbnNoaXAgbmFtZSB0
byBjb252ZXJ0IGludG8gYSBrZXkKKworICAgIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBrZXkKKyAg
Ki8KKyAga2V5Rm9ySGFzTWFueTogZnVuY3Rpb24odHlwZSwgbmFtZSkgeworICAgIHJldHVybiB0
aGlzLmtleUZvckF0dHJpYnV0ZU5hbWUodHlwZSwgbmFtZSk7CisgIH0sCisKKyAgLy8uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCisgIC8vLiBNQVRFUklBTElaQVRJT04gSE9PS1MKKyAgLy8uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKyAgbWF0ZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwg
c2VyaWFsaXplZCwgcHJlbWF0ZXJpYWxpemVkKSB7CisgICAgdmFyIGlkOworICAgIGlmIChFbWJl
ci5pc05vbmUoZ2V0KHJlY29yZCwgJ2lkJykpKSB7CisgICAgICBpZiAocHJlbWF0ZXJpYWxpemVk
ICYmIHByZW1hdGVyaWFsaXplZC5oYXNPd25Qcm9wZXJ0eSgnaWQnKSkgeworICAgICAgICBpZCA9
IHByZW1hdGVyaWFsaXplZC5pZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlkID0gdGhpcy5l
eHRyYWN0SWQocmVjb3JkLmNvbnN0cnVjdG9yLCBzZXJpYWxpemVkKTsKKyAgICAgIH0KKyAgICAg
IHJlY29yZC5tYXRlcmlhbGl6ZUlkKGlkKTsKKyAgICB9CisKKyAgICB0aGlzLm1hdGVyaWFsaXpl
QXR0cmlidXRlcyhyZWNvcmQsIHNlcmlhbGl6ZWQsIHByZW1hdGVyaWFsaXplZCk7CisgICAgdGhp
cy5tYXRlcmlhbGl6ZVJlbGF0aW9uc2hpcHMocmVjb3JkLCBzZXJpYWxpemVkLCBwcmVtYXRlcmlh
bGl6ZWQpOworICB9LAorCisgIGRlc2VyaWFsaXplVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBhdHRy
aWJ1dGVUeXBlKSB7CisgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtcyA/IHRoaXMu
dHJhbnNmb3Jtc1thdHRyaWJ1dGVUeXBlXSA6IG51bGw7CisKKyAgICBFbWJlci5hc3NlcnQoIllv
dSB0cmllZCB0byB1c2UgYSBhdHRyaWJ1dGUgdHlwZSAoIiArIGF0dHJpYnV0ZVR5cGUgKyAiKSB0
aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIiwgdHJhbnNmb3JtKTsKKyAgICByZXR1cm4gdHJh
bnNmb3JtLmRlc2VyaWFsaXplKHZhbHVlKTsKKyAgfSwKKworICBtYXRlcmlhbGl6ZUF0dHJpYnV0
ZXM6IGZ1bmN0aW9uKHJlY29yZCwgc2VyaWFsaXplZCwgcHJlbWF0ZXJpYWxpemVkKSB7CisgICAg
cmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlKSB7CisgICAgICBp
ZiAocHJlbWF0ZXJpYWxpemVkICYmIHByZW1hdGVyaWFsaXplZC5oYXNPd25Qcm9wZXJ0eShuYW1l
KSkgeworICAgICAgICByZWNvcmQubWF0ZXJpYWxpemVBdHRyaWJ1dGUobmFtZSwgcHJlbWF0ZXJp
YWxpemVkW25hbWVdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMubWF0ZXJpYWxpemVB
dHRyaWJ1dGUocmVjb3JkLCBzZXJpYWxpemVkLCBuYW1lLCBhdHRyaWJ1dGUudHlwZSk7CisgICAg
ICB9CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgbWF0ZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0
aW9uKHJlY29yZCwgc2VyaWFsaXplZCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVHlwZSkgewor
ICAgIHZhciB2YWx1ZSA9IHRoaXMuZXh0cmFjdEF0dHJpYnV0ZShyZWNvcmQuY29uc3RydWN0b3Is
IHNlcmlhbGl6ZWQsIGF0dHJpYnV0ZU5hbWUpOworICAgIHZhbHVlID0gdGhpcy5kZXNlcmlhbGl6
ZVZhbHVlKHZhbHVlLCBhdHRyaWJ1dGVUeXBlKTsKKworICAgIHJlY29yZC5tYXRlcmlhbGl6ZUF0
dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7CisgIH0sCisKKyAgbWF0ZXJpYWxpemVSZWxh
dGlvbnNoaXBzOiBmdW5jdGlvbihyZWNvcmQsIGhhc2gsIHByZW1hdGVyaWFsaXplZCkgeworICAg
IHJlY29yZC5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewor
ICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKKyAgICAgICAgaWYg
KHByZW1hdGVyaWFsaXplZCAmJiBwcmVtYXRlcmlhbGl6ZWQuaGFzT3duUHJvcGVydHkobmFtZSkp
IHsKKyAgICAgICAgICByZWNvcmQubWF0ZXJpYWxpemVIYXNNYW55KG5hbWUsIHByZW1hdGVyaWFs
aXplZFtuYW1lXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5tYXRlcmlhbGl6
ZUhhc01hbnkobmFtZSwgcmVjb3JkLCBoYXNoLCByZWxhdGlvbnNoaXAsIHByZW1hdGVyaWFsaXpl
ZCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdi
ZWxvbmdzVG8nKSB7CisgICAgICAgIGlmIChwcmVtYXRlcmlhbGl6ZWQgJiYgcHJlbWF0ZXJpYWxp
emVkLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgICAgcmVjb3JkLm1hdGVyaWFsaXpl
QmVsb25nc1RvKG5hbWUsIHByZW1hdGVyaWFsaXplZFtuYW1lXSk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgdGhpcy5tYXRlcmlhbGl6ZUJlbG9uZ3NUbyhuYW1lLCByZWNvcmQsIGhhc2gs
IHJlbGF0aW9uc2hpcCwgcHJlbWF0ZXJpYWxpemVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAg
IH0sIHRoaXMpOworICB9LAorCisgIG1hdGVyaWFsaXplSGFzTWFueTogZnVuY3Rpb24obmFtZSwg
cmVjb3JkLCBoYXNoLCByZWxhdGlvbnNoaXApIHsKKyAgICB2YXIga2V5ID0gdGhpcy5fa2V5Rm9y
SGFzTWFueShyZWNvcmQuY29uc3RydWN0b3IsIHJlbGF0aW9uc2hpcC5rZXkpOworICAgIHJlY29y
ZC5tYXRlcmlhbGl6ZUhhc01hbnkobmFtZSwgdGhpcy5leHRyYWN0SGFzTWFueShyZWNvcmQuY29u
c3RydWN0b3IsIGhhc2gsIGtleSkpOworICB9LAorCisgIG1hdGVyaWFsaXplQmVsb25nc1RvOiBm
dW5jdGlvbihuYW1lLCByZWNvcmQsIGhhc2gsIHJlbGF0aW9uc2hpcCkgeworICAgIHZhciBrZXkg
PSB0aGlzLl9rZXlGb3JCZWxvbmdzVG8ocmVjb3JkLmNvbnN0cnVjdG9yLCByZWxhdGlvbnNoaXAu
a2V5KTsKKyAgICByZWNvcmQubWF0ZXJpYWxpemVCZWxvbmdzVG8obmFtZSwgdGhpcy5leHRyYWN0
QmVsb25nc1RvKHJlY29yZC5jb25zdHJ1Y3RvciwgaGFzaCwga2V5KSk7CisgIH0sCisKKyAgX2V4
dHJhY3RFbWJlZGRlZFJlbGF0aW9uc2hpcDogZnVuY3Rpb24odHlwZSwgaGFzaCwgbmFtZSwgcmVs
YXRpb25zaGlwVHlwZSkgeworICAgIHZhciBrZXkgPSB0aGlzWydfa2V5Rm9yJyArIHJlbGF0aW9u
c2hpcFR5cGVdKHR5cGUsIG5hbWUpOworCisgICAgaWYgKHRoaXMuZW1iZWRkZWRUeXBlKHR5cGUs
IG5hbWUpKSB7CisgICAgICByZXR1cm4gdGhpc1snZXh0cmFjdEVtYmVkZGVkJyArIHJlbGF0aW9u
c2hpcFR5cGVdKHR5cGUsIGhhc2gsIGtleSk7CisgICAgfQorICB9LAorCisgIF9leHRyYWN0RW1i
ZWRkZWRCZWxvbmdzVG86IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIG5hbWUpIHsKKyAgICByZXR1cm4g
dGhpcy5fZXh0cmFjdEVtYmVkZGVkUmVsYXRpb25zaGlwKHR5cGUsIGhhc2gsIG5hbWUsICdCZWxv
bmdzVG8nKTsKKyAgfSwKKworICBfZXh0cmFjdEVtYmVkZGVkSGFzTWFueTogZnVuY3Rpb24odHlw
ZSwgaGFzaCwgbmFtZSkgeworICAgIHJldHVybiB0aGlzLl9leHRyYWN0RW1iZWRkZWRSZWxhdGlv
bnNoaXAodHlwZSwgaGFzaCwgbmFtZSwgJ0hhc01hbnknKTsKKyAgfSwKKworICAvKioKKyAgICBA
cHJpdmF0ZQorCisgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGdldCB0aGUgcHJpbWFyeSBr
ZXkgZm9yIGEgZ2l2ZW4KKyAgICB0eXBlLgorCisgICAgSWYgYSBwcmltYXJ5IGtleSBjb25maWd1
cmF0aW9uIGV4aXN0cyBmb3IgdGhpcyB0eXBlLCB0aGlzCisgICAgbWV0aG9kIHdpbGwgcmV0dXJu
IHRoZSBjb25maWd1cmVkIHZhbHVlLiBPdGhlcndpc2UsIGl0IHdpbGwKKyAgICBjYWxsIHRoZSBw
dWJsaWMgYHByaW1hcnlLZXlgIGhvb2suCisKKyAgICBAcGFyYW0ge0RTLk1vZGVsIHN1YmNsYXNz
fSB0eXBlCisgICAgQHJldHVybnMge1N0cmluZ30gdGhlIHByaW1hcnkga2V5IGZvciB0aGUgdHlw
ZQorICAqLworICBfcHJpbWFyeUtleTogZnVuY3Rpb24odHlwZSkgeworICAgIHZhciBjb25maWcg
PSB0aGlzLmNvbmZpZ3VyYXRpb25Gb3JUeXBlKHR5cGUpLAorICAgICAgICBwcmltYXJ5S2V5ID0g
Y29uZmlnICYmIGNvbmZpZy5wcmltYXJ5S2V5OworCisgICAgaWYgKHByaW1hcnlLZXkpIHsKKyAg
ICAgIHJldHVybiBwcmltYXJ5S2V5OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdGhpcy5w
cmltYXJ5S2V5KHR5cGUpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisg
ICAgVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIGtleSBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lIGFu
ZCB0cmFuc2Zvcm1zIHRoZQorICAgIGF0dHJpYnV0ZSdzIHZhbHVlIHVzaW5nIHJlZ2lzdGVyZWQg
dHJhbnNmb3Jtcy4KKworICAgIFNwZWNpZmljYWxseToKKworICAgIDEuIExvb2sgdXAgdGhlIGtl
eSBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lLiBJZiBhdmFpbGFibGUsIHRoaXMgd2lsbCB1c2UKKyAg
ICAgICBhbnkgcmVnaXN0ZXJlZCBtYXBwaW5ncy4gT3RoZXJ3aXNlLCBpdCB3aWxsIGludm9rZSB0
aGUgcHVibGljCisgICAgICAgYGtleUZvckF0dHJpYnV0ZU5hbWVgIGhvb2suCisgICAgMi4gR2V0
IHRoZSB2YWx1ZSBmcm9tIHRoZSByZWNvcmQgdXNpbmcgdGhlIGBhdHRyaWJ1dGVOYW1lYC4KKyAg
ICAzLiBUcmFuc2Zvcm0gdGhlIHZhbHVlIHVzaW5nIHJlZ2lzdGVyZWQgdHJhbnNmb3JtcyBmb3Ig
dGhlIGBhdHRyaWJ1dGVUeXBlYC4KKyAgICA0LiBJbnZva2UgdGhlIHB1YmxpYyBgYWRkQXR0cmli
dXRlYCBob29rIHdpdGggdGhlIGhhc2gsIGtleSwgYW5kCisgICAgICAgdHJhbnNmb3JtZWQgdmFs
dWUuCisKKyAgICBAcGFyYW0ge2FueX0gZGF0YSB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlv
biBiZWluZyBidWlsdAorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUgcmVjb3JkIHRv
IHNlcmlhbGl6ZQorICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9m
IHRoZSBhdHRyaWJ1dGUgb24gdGhlIHJlY29yZAorICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1
dGVUeXBlIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgKGUuZy4gYHN0cmluZ2AKKyAgICAgIG9y
IGBib29sZWFuYCkKKyAgKi8KKyAgX2FkZEF0dHJpYnV0ZTogZnVuY3Rpb24oZGF0YSwgcmVjb3Jk
LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlKSB7CisgICAgdmFyIGtleSA9IHRoaXMuX2tl
eUZvckF0dHJpYnV0ZU5hbWUocmVjb3JkLmNvbnN0cnVjdG9yLCBhdHRyaWJ1dGVOYW1lKTsKKyAg
ICB2YXIgdmFsdWUgPSBnZXQocmVjb3JkLCBhdHRyaWJ1dGVOYW1lKTsKKworICAgIHRoaXMuYWRk
QXR0cmlidXRlKGRhdGEsIGtleSwgdGhpcy5zZXJpYWxpemVWYWx1ZSh2YWx1ZSwgYXR0cmlidXRl
VHlwZSkpOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCBs
b29rcyB1cCB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBgdHlwZWAgYW5kIGludm9rZXMKKyAgICBg
c2VyaWFsaXplSWRgIG9uIHRoZSBgaWRgLgorCisgICAgSXQgdGhlbiBpbnZva2VzIHRoZSBwdWJs
aWMgYGFkZElkYCBob29rIHdpdGggdGhlIHByaW1hcnkga2V5IGFuZAorICAgIHRoZSBzZXJpYWxp
emVkIGlkLgorCisgICAgQHBhcmFtIHthbnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50
YXRpb24gdGhhdCBpcyBiZWluZyBidWlsdAorICAgIEBwYXJhbSB7RW1iZXIuTW9kZWwgc3ViY2xh
c3N9IHR5cGUKKyAgICBAcGFyYW0ge2FueX0gaWQgdGhlIG1hdGVyaWFsaXplZCBpZCBmcm9tIHRo
ZSByZWNvcmQKKyAgKi8KKyAgX2FkZElkOiBmdW5jdGlvbihoYXNoLCB0eXBlLCBpZCkgeworICAg
IHZhciBwcmltYXJ5S2V5ID0gdGhpcy5fcHJpbWFyeUtleSh0eXBlKTsKKworICAgIHRoaXMuYWRk
SWQoaGFzaCwgcHJpbWFyeUtleSwgdGhpcy5zZXJpYWxpemVJZChpZCkpOworICB9LAorCisgIC8q
KgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZ2V0IGEga2V5
IHVzZWQgaW4gdGhlIGRhdGEgZnJvbQorICAgIGFuIGF0dHJpYnV0ZSBuYW1lLiBJdCBmaXJzdCBj
aGVja3MgZm9yIGFueSBtYXBwaW5ncyBiZWZvcmUKKyAgICBjYWxsaW5nIHRoZSBwdWJsaWMgaG9v
ayBga2V5Rm9yQXR0cmlidXRlTmFtZWAuCisKKyAgICBAcGFyYW0ge0RTLk1vZGVsIHN1YmNsYXNz
fSB0eXBlIHRoZSB0eXBlIG9mIHRoZSByZWNvcmQgd2l0aAorICAgICAgdGhlIGF0dHJpYnV0ZSBu
YW1lIGBuYW1lYAorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZSB0
byBjb252ZXJ0IGludG8gYSBrZXkKKworICAgIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBrZXkKKyAg
Ki8KKyAgX2tleUZvckF0dHJpYnV0ZU5hbWU6IGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHsKKyAgICBy
ZXR1cm4gdGhpcy5fa2V5RnJvbU1hcHBpbmdPckhvb2soJ2tleUZvckF0dHJpYnV0ZU5hbWUnLCB0
eXBlLCBuYW1lKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgVGhpcyBtZXRo
b2QgaXMgY2FsbGVkIHRvIGdldCBhIGtleSB1c2VkIGluIHRoZSBkYXRhIGZyb20KKyAgICBhIGJl
bG9uZ3NUbyByZWxhdGlvbnNoaXAuIEl0IGZpcnN0IGNoZWNrcyBmb3IgYW55IG1hcHBpbmdzIGJl
Zm9yZQorICAgIGNhbGxpbmcgdGhlIHB1YmxpYyBob29rIGBrZXlGb3JCZWxvbmdzVG9gLgorCisg
ICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVjb3Jk
IHdpdGgKKyAgICAgIHRoZSBgYmVsb25nc1RvYCByZWxhdGlvbnNoaXAuCisgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgdGhlIHJlbGF0aW9uc2hpcCBuYW1lIHRvIGNvbnZlcnQgaW50byBhIGtleQor
CisgICAgQHJldHVybnMge1N0cmluZ30gdGhlIGtleQorICAqLworICBfa2V5Rm9yQmVsb25nc1Rv
OiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7CisgICAgcmV0dXJuIHRoaXMuX2tleUZyb21NYXBwaW5n
T3JIb29rKCdrZXlGb3JCZWxvbmdzVG8nLCB0eXBlLCBuYW1lKTsKKyAgfSwKKworICBrZXlGb3I6
IGZ1bmN0aW9uKGRlc2NyaXB0aW9uKSB7CisgICAgdmFyIHR5cGUgPSBkZXNjcmlwdGlvbi5wYXJl
bnRUeXBlLAorICAgICAgICBuYW1lID0gZGVzY3JpcHRpb24ua2V5OworCisgICAgc3dpdGNoIChk
ZXNjcmlwdGlvbi5raW5kKSB7CisgICAgICBjYXNlICdiZWxvbmdzVG8nOgorICAgICAgICByZXR1
cm4gdGhpcy5fa2V5Rm9yQmVsb25nc1RvKHR5cGUsIG5hbWUpOworICAgICAgY2FzZSAnaGFzTWFu
eSc6CisgICAgICAgIHJldHVybiB0aGlzLl9rZXlGb3JIYXNNYW55KHR5cGUsIG5hbWUpOworICAg
IH0KKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgVGhpcyBtZXRob2QgaXMgY2Fs
bGVkIHRvIGdldCBhIGtleSB1c2VkIGluIHRoZSBkYXRhIGZyb20KKyAgICBhIGhhc01hbnkgcmVs
YXRpb25zaGlwLiBJdCBmaXJzdCBjaGVja3MgZm9yIGFueSBtYXBwaW5ncyBiZWZvcmUKKyAgICBj
YWxsaW5nIHRoZSBwdWJsaWMgaG9vayBga2V5Rm9ySGFzTWFueWAuCisKKyAgICBAcGFyYW0ge0RT
Lk1vZGVsIHN1YmNsYXNzfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSByZWNvcmQgd2l0aAorICAgICAg
dGhlIGBoYXNNYW55YCByZWxhdGlvbnNoaXAuCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhl
IHJlbGF0aW9uc2hpcCBuYW1lIHRvIGNvbnZlcnQgaW50byBhIGtleQorCisgICAgQHJldHVybnMg
e1N0cmluZ30gdGhlIGtleQorICAqLworICBfa2V5Rm9ySGFzTWFueTogZnVuY3Rpb24odHlwZSwg
bmFtZSkgeworICAgIHJldHVybiB0aGlzLl9rZXlGcm9tTWFwcGluZ09ySG9vaygna2V5Rm9ySGFz
TWFueScsIHR5cGUsIG5hbWUpOworICB9LAorICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgVGhp
cyBtZXRob2QgY29udmVydHMgdGhlIHJlbGF0aW9uc2hpcCBuYW1lIHRvIGEga2V5IGZvciBzZXJp
YWxpemF0aW9uLAorICAgIGFuZCB0aGVuIGludm9rZXMgdGhlIHB1YmxpYyBgYWRkQmVsb25nc1Rv
YCBob29rLgorCisgICAgQHBhcmFtIHthbnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50
YXRpb24gdGhhdCBpcyBiZWluZyBidWlsdAorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0
aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxh
dGlvbnNoaXAgbmFtZQorICAgIEBwYXJhbSB7T2JqZWN0fSByZWxhdGlvbnNoaXAgYW4gb2JqZWN0
IHJlcHJlc2VudGluZyB0aGUgcmVsYXRpb25zaGlwCisgICovCisgIF9hZGRCZWxvbmdzVG86IGZ1
bmN0aW9uKGRhdGEsIHJlY29yZCwgbmFtZSwgcmVsYXRpb25zaGlwKSB7CisgICAgdmFyIGtleSA9
IHRoaXMuX2tleUZvckJlbG9uZ3NUbyhyZWNvcmQuY29uc3RydWN0b3IsIG5hbWUpOworICAgIHRo
aXMuYWRkQmVsb25nc1RvKGRhdGEsIHJlY29yZCwga2V5LCByZWxhdGlvbnNoaXApOworICB9LAor
CisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBUaGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgcmVs
YXRpb25zaGlwIG5hbWUgdG8gYSBrZXkgZm9yIHNlcmlhbGl6YXRpb24sCisgICAgYW5kIHRoZW4g
aW52b2tlcyB0aGUgcHVibGljIGBhZGRIYXNNYW55YCBob29rLgorCisgICAgQHBhcmFtIHthbnl9
IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBiZWluZyBidWlsdAor
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQorICAg
IEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGlvbnNoaXAgbmFtZQorICAgIEBwYXJhbSB7
T2JqZWN0fSByZWxhdGlvbnNoaXAgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVsYXRpb25z
aGlwCisgICovCisgIF9hZGRIYXNNYW55OiBmdW5jdGlvbihkYXRhLCByZWNvcmQsIG5hbWUsIHJl
bGF0aW9uc2hpcCkgeworICAgIHZhciBrZXkgPSB0aGlzLl9rZXlGb3JIYXNNYW55KHJlY29yZC5j
b25zdHJ1Y3RvciwgbmFtZSk7CisgICAgdGhpcy5hZGRIYXNNYW55KGRhdGEsIHJlY29yZCwga2V5
LCByZWxhdGlvbnNoaXApOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBBbiBp
bnRlcm5hbCBtZXRob2QgdGhhdCBoYW5kbGVzIGNoZWNraW5nIHdoZXRoZXIgYSBtYXBwaW5nCisg
ICAgZXhpc3RzIGZvciBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIG9yIHJlbGF0aW9uc2hpcCBuYW1l
IGJlZm9yZQorICAgIGNhbGxpbmcgdGhlIHB1YmxpYyBob29rcy4KKworICAgIElmIGEgbWFwcGlu
ZyBpcyBmb3VuZCwgYW5kIHRoZSBtYXBwaW5nIGhhcyBhIGtleSBkZWZpbmVkLAorICAgIHVzZSB0
aGF0IGluc3RlYWQgb2YgaW52b2tpbmcgdGhlIGhvb2suCisKKyAgICBAcGFyYW0ge1N0cmluZ30g
cHVibGljTWV0aG9kIHRoZSBwdWJsaWMgaG9vayB0byBpbnZva2UgaWYKKyAgICAgIGEgbWFwcGlu
ZyBpcyBub3QgZm91bmQgKGUuZy4gYGtleUZvckF0dHJpYnV0ZU5hbWVgKQorICAgIEBwYXJhbSB7
RFMuTW9kZWwgc3ViY2xhc3N9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlY29yZCB3aXRoCisgICAg
ICB0aGUgYXR0cmlidXRlIG9yIHJlbGF0aW9uc2hpcCBuYW1lLgorICAgIEBwYXJhbSB7U3RyaW5n
fSBuYW1lIHRoZSBhdHRyaWJ1dGUgb3IgcmVsYXRpb25zaGlwIG5hbWUgdG8KKyAgICAgIGNvbnZl
cnQgaW50byBhIGtleQorICAqLworICBfa2V5RnJvbU1hcHBpbmdPckhvb2s6IGZ1bmN0aW9uKHB1
YmxpY01ldGhvZCwgdHlwZSwgbmFtZSkgeworICAgIHZhciBrZXkgPSB0aGlzLm1hcHBpbmdPcHRp
b24odHlwZSwgbmFtZSwgJ2tleScpOworCisgICAgaWYgKGtleSkgeworICAgICAgcmV0dXJuIGtl
eTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXNbcHVibGljTWV0aG9kXSh0eXBlLCBu
YW1lKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgVFJBTlNGT1JNUworICAqLworCisgIHJl
Z2lzdGVyVHJhbnNmb3JtOiBmdW5jdGlvbih0eXBlLCB0cmFuc2Zvcm0pIHsKKyAgICB0aGlzLnRy
YW5zZm9ybXNbdHlwZV0gPSB0cmFuc2Zvcm07CisgIH0sCisKKyAgcmVnaXN0ZXJFbnVtVHJhbnNm
b3JtOiBmdW5jdGlvbih0eXBlLCBvYmplY3RzKSB7CisgICAgdmFyIHRyYW5zZm9ybSA9IHsKKyAg
ICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbihkZXNlcmlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJu
IEVtYmVyLkEob2JqZWN0cykub2JqZWN0QXQoZGVzZXJpYWxpemVkKTsKKyAgICAgIH0sCisgICAg
ICBzZXJpYWxpemU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuIEVtYmVy
LkVudW1lcmFibGVVdGlscy5pbmRleE9mKG9iamVjdHMsIHNlcmlhbGl6ZWQpOworICAgICAgfSwK
KyAgICAgIHZhbHVlczogb2JqZWN0cworICAgIH07CisgICAgdGhpcy5yZWdpc3RlclRyYW5zZm9y
bSh0eXBlLCB0cmFuc2Zvcm0pOworICB9LAorCisgIC8qKgorICAgIE1BUFBJTkcgQ09OVkVOSUVO
Q0UKKyAgKi8KKworICBtYXA6IGZ1bmN0aW9uKHR5cGUsIG1hcHBpbmdzKSB7CisgICAgdGhpcy5t
YXBwaW5ncy5zZXQodHlwZSwgbWFwcGluZ3MpOworICB9LAorCisgIGNvbmZpZ3VyZTogZnVuY3Rp
b24odHlwZSwgY29uZmlndXJhdGlvbikgeworICAgIGlmICh0eXBlICYmICFjb25maWd1cmF0aW9u
KSB7CisgICAgICBFbWJlci5tZXJnZSh0aGlzLmdsb2JhbENvbmZpZ3VyYXRpb25zLCB0eXBlKTsK
KyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgY29uZmlnID0gRW1iZXIuY3JlYXRlKHRo
aXMuZ2xvYmFsQ29uZmlndXJhdGlvbnMpOworICAgIEVtYmVyLm1lcmdlKGNvbmZpZywgY29uZmln
dXJhdGlvbik7CisKKyAgICB0aGlzLmNvbmZpZ3VyYXRpb25zLnNldCh0eXBlLCBjb25maWcpOwor
ICB9LAorCisgIG1hcHBpbmdGb3JUeXBlOiBmdW5jdGlvbih0eXBlKSB7CisgICAgdGhpcy5fcmVp
ZnlNYXBwaW5ncygpOworICAgIHJldHVybiB0aGlzLm1hcHBpbmdzLmdldCh0eXBlKSB8fCB7fTsK
KyAgfSwKKworICBjb25maWd1cmF0aW9uRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgeworICAgIHRo
aXMuX3JlaWZ5Q29uZmlndXJhdGlvbnMoKTsKKyAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9u
cy5nZXQodHlwZSkgfHwgdGhpcy5nbG9iYWxDb25maWd1cmF0aW9uczsKKyAgfSwKKworICBfcmVp
ZnlNYXBwaW5nczogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX2RpZFJlaWZ5TWFwcGluZ3Mp
IHsgcmV0dXJuOyB9CisKKyAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLm1hcHBpbmdzLAorICAgICAg
ICByZWlmaWVkTWFwcGluZ3MgPSBFbWJlci5NYXAuY3JlYXRlKCk7CisKKyAgICBtYXBwaW5ncy5m
b3JFYWNoKGZ1bmN0aW9uKGtleSwgbWFwcGluZykgeworICAgICAgaWYgKHR5cGVvZiBrZXkgPT09
ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciB0eXBlID0gRW1iZXIuZ2V0KEVtYmVyLmxvb2t1cCwg
a2V5KTsKKyAgICAgICAgRW1iZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmluZCBtb2RlbCBhdCBwYXRo
ICIgKyBrZXksIHR5cGUpOworCisgICAgICAgIHJlaWZpZWRNYXBwaW5ncy5zZXQodHlwZSwgbWFw
cGluZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWlmaWVkTWFwcGluZ3Muc2V0KGtleSwg
bWFwcGluZyk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0aGlzLm1hcHBpbmdzID0gcmVpZmll
ZE1hcHBpbmdzOworCisgICAgdGhpcy5fZGlkUmVpZnlNYXBwaW5ncyA9IHRydWU7CisgIH0sCisK
KyAgX3JlaWZ5Q29uZmlndXJhdGlvbnM6IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLl9kaWRS
ZWlmeUNvbmZpZ3VyYXRpb25zKSB7IHJldHVybjsgfQorCisgICAgdmFyIGNvbmZpZ3VyYXRpb25z
ID0gdGhpcy5jb25maWd1cmF0aW9ucywKKyAgICAgICAgcmVpZmllZENvbmZpZ3VyYXRpb25zID0g
RW1iZXIuTWFwLmNyZWF0ZSgpOworCisgICAgY29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlv
bihrZXksIG1hcHBpbmcpIHsKKyAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBr
ZXkgIT09ICdwbHVyYWxzJykgeworICAgICAgICB2YXIgdHlwZSA9IEVtYmVyLmdldChFbWJlci5s
b29rdXAsIGtleSk7CisgICAgICAgIEVtYmVyLmFzc2VydCgiQ291bGQgbm90IGZpbmQgbW9kZWwg
YXQgcGF0aCAiICsga2V5LCB0eXBlKTsKKworICAgICAgICByZWlmaWVkQ29uZmlndXJhdGlvbnMu
c2V0KHR5cGUsIG1hcHBpbmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVpZmllZENvbmZp
Z3VyYXRpb25zLnNldChrZXksIG1hcHBpbmcpOworICAgICAgfQorICAgIH0pOworCisgICAgdGhp
cy5jb25maWd1cmF0aW9ucyA9IHJlaWZpZWRDb25maWd1cmF0aW9uczsKKworICAgIHRoaXMuX2Rp
ZFJlaWZ5Q29uZmlndXJhdGlvbnMgPSB0cnVlOworICB9LAorCisgIG1hcHBpbmdPcHRpb246IGZ1
bmN0aW9uKHR5cGUsIG5hbWUsIG9wdGlvbikgeworICAgIHZhciBtYXBwaW5nID0gdGhpcy5tYXBw
aW5nRm9yVHlwZSh0eXBlKVtuYW1lXTsKKworICAgIHJldHVybiBtYXBwaW5nICYmIG1hcHBpbmdb
b3B0aW9uXTsKKyAgfSwKKworICBjb25maWdPcHRpb246IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbikg
eworICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb25Gb3JUeXBlKHR5cGUpOworCisg
ICAgcmV0dXJuIGNvbmZpZ1tvcHRpb25dOworICB9LAorCisgIC8vIEVNQkVEREVEIEhFTFBFUlMK
KworICBlbWJlZGRlZFR5cGU6IGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHsKKyAgICByZXR1cm4gdGhp
cy5tYXBwaW5nT3B0aW9uKHR5cGUsIG5hbWUsICdlbWJlZGRlZCcpOworICB9LAorCisgIGVhY2hF
bWJlZGRlZFJlY29yZDogZnVuY3Rpb24ocmVjb3JkLCBjYWxsYmFjaywgYmluZGluZykgeworICAg
IHRoaXMuZWFjaEVtYmVkZGVkQmVsb25nc1RvUmVjb3JkKHJlY29yZCwgY2FsbGJhY2ssIGJpbmRp
bmcpOworICAgIHRoaXMuZWFjaEVtYmVkZGVkSGFzTWFueVJlY29yZChyZWNvcmQsIGNhbGxiYWNr
LCBiaW5kaW5nKTsKKyAgfSwKKworICBlYWNoRW1iZWRkZWRCZWxvbmdzVG9SZWNvcmQ6IGZ1bmN0
aW9uKHJlY29yZCwgY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICB2YXIgdHlwZSA9IHJlY29yZC5j
b25zdHJ1Y3RvcjsKKworICAgIHRoaXMuZWFjaEVtYmVkZGVkQmVsb25nc1RvKHJlY29yZC5jb25z
dHJ1Y3RvciwgZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwLCBlbWJlZGRlZFR5cGUpIHsKKyAg
ICAgIHZhciBlbWJlZGRlZFJlY29yZCA9IGdldChyZWNvcmQsIG5hbWUpOworICAgICAgaWYgKGVt
YmVkZGVkUmVjb3JkKSB7IGNhbGxiYWNrLmNhbGwoYmluZGluZywgZW1iZWRkZWRSZWNvcmQsIGVt
YmVkZGVkVHlwZSk7IH0KKyAgICB9KTsKKyAgfSwKKworICBlYWNoRW1iZWRkZWRIYXNNYW55UmVj
b3JkOiBmdW5jdGlvbihyZWNvcmQsIGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgdmFyIHR5cGUg
PSByZWNvcmQuY29uc3RydWN0b3I7CisKKyAgICB0aGlzLmVhY2hFbWJlZGRlZEhhc01hbnkocmVj
b3JkLmNvbnN0cnVjdG9yLCBmdW5jdGlvbihuYW1lLCByZWxhdGlvbnNoaXAsIGVtYmVkZGVkVHlw
ZSkgeworICAgICAgdmFyIGFycmF5ID0gZ2V0KHJlY29yZCwgbmFtZSk7CisgICAgICBmb3IgKHZh
ciBpPTAsIGw9Z2V0KGFycmF5LCAnbGVuZ3RoJyk7IGk8bDsgaSsrKSB7CisgICAgICAgIGNhbGxi
YWNrLmNhbGwoYmluZGluZywgYXJyYXkub2JqZWN0QXQoaSksIGVtYmVkZGVkVHlwZSk7CisgICAg
ICB9CisgICAgfSk7CisgIH0sCisKKyAgZWFjaEVtYmVkZGVkSGFzTWFueTogZnVuY3Rpb24odHlw
ZSwgY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICB0aGlzLmVhY2hFbWJlZGRlZFJlbGF0aW9uc2hp
cCh0eXBlLCAnaGFzTWFueScsIGNhbGxiYWNrLCBiaW5kaW5nKTsKKyAgfSwKKworICBlYWNoRW1i
ZWRkZWRCZWxvbmdzVG86IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAg
dGhpcy5lYWNoRW1iZWRkZWRSZWxhdGlvbnNoaXAodHlwZSwgJ2JlbG9uZ3NUbycsIGNhbGxiYWNr
LCBiaW5kaW5nKTsKKyAgfSwKKworICBlYWNoRW1iZWRkZWRSZWxhdGlvbnNoaXA6IGZ1bmN0aW9u
KHR5cGUsIGtpbmQsIGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgdHlwZS5lYWNoUmVsYXRpb25z
aGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgeworICAgICAgdmFyIGVtYmVkZGVkVHlw
ZSA9IHRoaXMuZW1iZWRkZWRUeXBlKHR5cGUsIG5hbWUpOworCisgICAgICBpZiAoZW1iZWRkZWRU
eXBlKSB7CisgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCA9PT0ga2luZCkgeworICAgICAg
ICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgcmVsYXRpb25zaGlwLCBlbWJlZGRlZFR5
cGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwgdGhpcyk7CisgIH0KK30pOworCisKK30p
KCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgbm9uZSA9IEVtYmVyLmlzTm9uZTsKKworLyoq
CisgIERTLlRyYW5zZm9ybXMgaXMgYSBoYXNoIG9mIHRyYW5zZm9ybXMgdXNlZCBieSBEUy5TZXJp
YWxpemVyLgorKi8KK0RTLkpTT05UcmFuc2Zvcm1zID0geworICBzdHJpbmc6IHsKKyAgICBkZXNl
cmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXplZCkgeworICAgICAgcmV0dXJuIG5vbmUoc2VyaWFs
aXplZCkgPyBudWxsIDogU3RyaW5nKHNlcmlhbGl6ZWQpOworICAgIH0sCisKKyAgICBzZXJpYWxp
emU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgeworICAgICAgcmV0dXJuIG5vbmUoZGVzZXJpYWxp
emVkKSA/IG51bGwgOiBTdHJpbmcoZGVzZXJpYWxpemVkKTsKKyAgICB9CisgIH0sCisKKyAgbnVt
YmVyOiB7CisgICAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsKKyAgICAgIHJl
dHVybiBub25lKHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJpYWxpemVkKTsKKyAgICB9
LAorCisgICAgc2VyaWFsaXplOiBmdW5jdGlvbihkZXNlcmlhbGl6ZWQpIHsKKyAgICAgIHJldHVy
biBub25lKGRlc2VyaWFsaXplZCkgPyBudWxsIDogTnVtYmVyKGRlc2VyaWFsaXplZCk7CisgICAg
fQorICB9LAorCisgIC8vIEhhbmRsZXMgdGhlIGZvbGxvd2luZyBib29sZWFuIGlucHV0czoKKyAg
Ly8gIlRyVWUiLCAidCIsICJmIiwgIkZBTFNFIiwgMCwgKG5vbi16ZXJvKSwgb3IgYm9vbGVhbiB0
cnVlL2ZhbHNlCisgICdib29sZWFuJzogeworICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJp
YWxpemVkKSB7CisgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOworCisgICAgICBp
ZiAodHlwZSA9PT0gImJvb2xlYW4iKSB7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVkOworICAg
ICAgfSBlbHNlIGlmICh0eXBlID09PSAic3RyaW5nIikgeworICAgICAgICByZXR1cm4gc2VyaWFs
aXplZC5tYXRjaCgvXnRydWUkfF50JHxeMSQvaSkgIT09IG51bGw7CisgICAgICB9IGVsc2UgaWYg
KHR5cGUgPT09ICJudW1iZXIiKSB7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVkID09PSAxOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0sCisK
KyAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgeworICAgICAgcmV0dXJuIEJv
b2xlYW4oZGVzZXJpYWxpemVkKTsKKyAgICB9CisgIH0sCisKKyAgZGF0ZTogeworICAgIGRlc2Vy
aWFsaXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7CisgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBz
ZXJpYWxpemVkOworICAgICAgdmFyIGRhdGUgPSBudWxsOworCisgICAgICBpZiAodHlwZSA9PT0g
InN0cmluZyIgfHwgdHlwZSA9PT0gIm51bWJlciIpIHsKKyAgICAgICAgLy8gdGhpcyBpcyBhIGZp
eCBmb3IgU2FmYXJpIDUuMS41IG9uIE1hYyB3aGljaCBkb2VzIG5vdCBhY2NlcHQgdGltZXN0YW1w
cyBhcyB5eXl5LW1tLWRkCisgICAgICAgIGlmICh0eXBlID09PSAic3RyaW5nIiAmJiBzZXJpYWxp
emVkLnNlYXJjaCgvXlxkezR9LVxkezJ9LVxkezJ9JC8pICE9PSAtMSkgeworICAgICAgICAgIHNl
cmlhbGl6ZWQgKz0gIlQwMDowMDowMFoiOworICAgICAgICB9CisKKyAgICAgICAgZGF0ZSA9IG5l
dyBEYXRlKHNlcmlhbGl6ZWQpOworCisgICAgICAgIC8vIHRoaXMgaXMgYSBmaXggZm9yIElFOCB3
aGljaCBkb2VzIG5vdCBhY2NlcHQgdGltZXN0YW1wcyBpbiBJU08gODYwMSBmb3JtYXQKKyAgICAg
ICAgaWYgKHR5cGUgPT09ICJzdHJpbmciICYmIGlzTmFOKGRhdGUpKSB7CisgICAgICAgICAgZGF0
ZSA9IG5ldyBEYXRlKERhdGUucGFyc2Uoc2VyaWFsaXplZC5yZXBsYWNlKC9cLS9pZywgJy8nKS5y
ZXBsYWNlKC9aJC8sICcnKS5zcGxpdCgnLicpWzBdKSk7CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gZGF0ZTsKKyAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCB8fCBzZXJp
YWxpemVkID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBw
cmVzZW50IGluIHRoZSBkYXRhLAorICAgICAgICAvLyByZXR1cm4gdW5kZWZpbmVkLCBub3QgbnVs
bC4KKyAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc2VyaWFsaXplOiBmdW5jdGlvbihk
YXRlKSB7CisgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgdmFyIGRh
eXMgPSBbIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJdOwor
ICAgICAgICB2YXIgbW9udGhzID0gWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5Iiwg
Ikp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdOworCisgICAg
ICAgIHZhciBwYWQgPSBmdW5jdGlvbihudW0pIHsKKyAgICAgICAgICByZXR1cm4gbnVtIDwgMTAg
PyAiMCIrbnVtIDogIiIrbnVtOworICAgICAgICB9OworCisgICAgICAgIHZhciB1dGNZZWFyID0g
ZGF0ZS5nZXRVVENGdWxsWWVhcigpLAorICAgICAgICAgICAgdXRjTW9udGggPSBkYXRlLmdldFVU
Q01vbnRoKCksCisgICAgICAgICAgICB1dGNEYXlPZk1vbnRoID0gZGF0ZS5nZXRVVENEYXRlKCks
CisgICAgICAgICAgICB1dGNEYXkgPSBkYXRlLmdldFVUQ0RheSgpLAorICAgICAgICAgICAgdXRj
SG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCksCisgICAgICAgICAgICB1dGNNaW51dGVzID0gZGF0
ZS5nZXRVVENNaW51dGVzKCksCisgICAgICAgICAgICB1dGNTZWNvbmRzID0gZGF0ZS5nZXRVVENT
ZWNvbmRzKCk7CisKKworICAgICAgICB2YXIgZGF5T2ZXZWVrID0gZGF5c1t1dGNEYXldOworICAg
ICAgICB2YXIgZGF5T2ZNb250aCA9IHBhZCh1dGNEYXlPZk1vbnRoKTsKKyAgICAgICAgdmFyIG1v
bnRoID0gbW9udGhzW3V0Y01vbnRoXTsKKworICAgICAgICByZXR1cm4gZGF5T2ZXZWVrICsgIiwg
IiArIGRheU9mTW9udGggKyAiICIgKyBtb250aCArICIgIiArIHV0Y1llYXIgKyAiICIgKworICAg
ICAgICAgICAgICAgcGFkKHV0Y0hvdXJzKSArICI6IiArIHBhZCh1dGNNaW51dGVzKSArICI6IiAr
IHBhZCh1dGNTZWNvbmRzKSArICIgR01UIjsKKyAgICAgIH0gZWxzZSBpZiAoZGF0ZSA9PT0gdW5k
ZWZpbmVkKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgICB9IGVsc2UgeworICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisK
K3ZhciBnZW5lcmF0ZWRJZCA9IDA7CisKK0RTLkpTT05TZXJpYWxpemVyID0gRFMuU2VyaWFsaXpl
ci5leHRlbmQoeworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBlcigpOworCisg
ICAgaWYgKCFnZXQodGhpcywgJ3RyYW5zZm9ybXMnKSkgeworICAgICAgdGhpcy5zZXQoJ3RyYW5z
Zm9ybXMnLCBEUy5KU09OVHJhbnNmb3Jtcyk7CisgICAgfQorCisgICAgdGhpcy5zaWRlbG9hZE1h
cHBpbmcgPSBFbWJlci5NYXAuY3JlYXRlKCk7CisKKyAgICB0aGlzLmNvbmZpZ3VyZSh7CisgICAg
ICBtZXRhOiAnbWV0YScsCisgICAgICBzaW5jZTogJ3NpbmNlJworICAgIH0pOworICB9LAorCisg
IGNvbmZpZ3VyZTogZnVuY3Rpb24odHlwZSwgY29uZmlndXJhdGlvbikgeworICAgIGlmICh0eXBl
ICYmICFjb25maWd1cmF0aW9uKSB7CisgICAgICByZXR1cm4gdGhpcy5fc3VwZXIodHlwZSk7Cisg
ICAgfQorCisgICAgdmFyIHNpZGVsb2FkQXMgPSBjb25maWd1cmF0aW9uLnNpZGVsb2FkQXM7CisK
KyAgICBpZiAoc2lkZWxvYWRBcykgeworICAgICAgdGhpcy5zaWRlbG9hZE1hcHBpbmcuc2V0KHNp
ZGVsb2FkQXMsIHR5cGUpOworCisgICAgICAvLyBTZXQgYSBmbGFnIGluZGljYXRpbmcgdGhhdCBt
YXBwaW5ncyBtYXkgbmVlZCB0byBiZSBub3JtYWxpemVkCisgICAgICAvLyAoaS5lLiBjb252ZXJ0
ZWQgZnJvbSBzdHJpbmdzIC0+IHR5cGVzKSBiZWZvcmUgc2lkZWxvYWRpbmcuCisgICAgICAvLyBX
ZSBjYW4ndCBkbyB0aGlzIGNvbnZlcnNpb24gaW1tZWRpYXRlbHkgaGVyZSwgYmVjYXVzZSBgY29u
ZmlndXJlYAorICAgICAgLy8gbWF5IGJlIGNhbGxlZCBiZWZvcmUgY2VydGFpbiB0eXBlcyBoYXZl
IGJlZW4gZGVmaW5lZC4KKyAgICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLm5vcm1hbGl6ZWQgPSBm
YWxzZTsKKworICAgICAgZGVsZXRlIGNvbmZpZ3VyYXRpb24uc2lkZWxvYWRBczsKKyAgICB9CisK
KyAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9LAorCisgIGFkZElk
OiBmdW5jdGlvbihkYXRhLCBrZXksIGlkKSB7CisgICAgZGF0YVtrZXldID0gaWQ7CisgIH0sCisK
KyAgLyoqCisgICAgQSBob29rIHlvdSBjYW4gdXNlIHRvIGN1c3RvbWl6ZSBob3cgdGhlIGtleS92
YWx1ZSBwYWlyIGlzIGFkZGVkIHRvCisgICAgdGhlIHNlcmlhbGl6ZWQgZGF0YS4KKworICAgIEBw
YXJhbSB7YW55fSBoYXNoIHRoZSBKU09OIGhhc2ggYmVpbmcgYnVpbHQKKyAgICBAcGFyYW0ge1N0
cmluZ30ga2V5IHRoZSBrZXkgdG8gYWRkIHRvIHRoZSBzZXJpYWxpemVkIGRhdGEKKyAgICBAcGFy
YW0ge2FueX0gdmFsdWUgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2VyaWFsaXplZCBkYXRhCisg
ICovCisgIGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24oaGFzaCwga2V5LCB2YWx1ZSkgeworICAgIGhh
c2hba2V5XSA9IHZhbHVlOworICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBDcmVh
dGVzIGFuIGVtcHR5IGhhc2ggdGhhdCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgaG9va3MgY2Fs
bGVkIGZyb20gdGhlCisgICAgYHNlcmlhbGl6ZSgpYCBtZXRob2QuCisKKyAgICBAcmV0dXJuIHtP
YmplY3R9CisgICovCisgIGNyZWF0ZVNlcmlhbGl6ZWRGb3JtOiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4ge307CisgIH0sCisKKyAgZXh0cmFjdEF0dHJpYnV0ZTogZnVuY3Rpb24odHlwZSwgaGFz
aCwgYXR0cmlidXRlTmFtZSkgeworICAgIHZhciBrZXkgPSB0aGlzLl9rZXlGb3JBdHRyaWJ1dGVO
YW1lKHR5cGUsIGF0dHJpYnV0ZU5hbWUpOworICAgIHJldHVybiBoYXNoW2tleV07CisgIH0sCisK
KyAgZXh0cmFjdElkOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CisgICAgdmFyIHByaW1hcnlLZXkg
PSB0aGlzLl9wcmltYXJ5S2V5KHR5cGUpOworCisgICAgaWYgKGhhc2guaGFzT3duUHJvcGVydHko
cHJpbWFyeUtleSkpIHsKKyAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNvZXJjZSBJRHMgdG8gc3Ry
aW5ncyBzbyB0aGF0IHJlY29yZAorICAgICAgLy8gSURzIHJlbWFpbiBjb25zaXN0ZW50IGJldHdl
ZW4gYXBwbGljYXRpb24gcnVuczsgZXNwZWNpYWxseQorICAgICAgLy8gaWYgdGhlIElEIGlzIHNl
cmlhbGl6ZWQgYW5kIGxhdGVyIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBVUkwsCisgICAgICAvLyB3
aGVuIHR5cGUgaW5mb3JtYXRpb24gd2lsbCBoYXZlIGJlZW4gbG9zdC4KKyAgICAgIHJldHVybiBo
YXNoW3ByaW1hcnlLZXldKycnOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAg
ICB9CisgIH0sCisKKyAgZXh0cmFjdEhhc01hbnk6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIGtleSkg
eworICAgIHJldHVybiBoYXNoW2tleV07CisgIH0sCisKKyAgZXh0cmFjdEJlbG9uZ3NUbzogZnVu
Y3Rpb24odHlwZSwgaGFzaCwga2V5KSB7CisgICAgcmV0dXJuIGhhc2hba2V5XTsKKyAgfSwKKwor
ICBhZGRCZWxvbmdzVG86IGZ1bmN0aW9uKGhhc2gsIHJlY29yZCwga2V5LCByZWxhdGlvbnNoaXAp
IHsKKyAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKKyAgICAgICAgbmFtZSA9IHJl
bGF0aW9uc2hpcC5rZXksCisgICAgICAgIHZhbHVlID0gbnVsbCwKKyAgICAgICAgZW1iZWRkZWRD
aGlsZDsKKworICAgIGlmICh0aGlzLmVtYmVkZGVkVHlwZSh0eXBlLCBuYW1lKSkgeworICAgICAg
aWYgKGVtYmVkZGVkQ2hpbGQgPSBnZXQocmVjb3JkLCBuYW1lKSkgeworICAgICAgICB2YWx1ZSA9
IHRoaXMuc2VyaWFsaXplKGVtYmVkZGVkQ2hpbGQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pOworICAg
ICAgfQorCisgICAgICBoYXNoW2tleV0gPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgdmFy
IGlkID0gZ2V0KHJlY29yZCwgcmVsYXRpb25zaGlwLmtleSsnLmlkJyk7CisgICAgICBpZiAoIUVt
YmVyLmlzTm9uZShpZCkpIHsgaGFzaFtrZXldID0gaWQ7IH0KKyAgICB9CisgIH0sCisKKyAgLyoq
CisgICAgQWRkcyBhIGhhcy1tYW55IHJlbGF0aW9uc2hpcCB0byB0aGUgSlNPTiBoYXNoIGJlaW5n
IGJ1aWx0LgorCisgICAgVGhlIGRlZmF1bHQgUkVTVCBzZW1hbnRpY3MgYXJlIHRvIG9ubHkgYWRk
IGEgaGFzLW1hbnkgcmVsYXRpb25zaGlwIGlmIGl0CisgICAgaXMgZW1iZWRkZWQuIElmIHRoZSBy
ZWxhdGlvbnNoaXAgd2FzIGluaXRpYWxseSBsb2FkZWQgYnkgSUQsIHdlIGFzc3VtZSB0aGF0Cisg
ICAgdGhhdCB3YXMgZG9uZSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgYW5kIHRoYXQg
Y2hhbmdlcyB0byB0aGUKKyAgICBoYXMtbWFueSBzaG91bGQgYmUgc2F2ZWQgYXMgZm9yZWlnbiBr
ZXkgY2hhbmdlcyBvbiB0aGUgY2hpbGQncyBiZWxvbmdzLXRvCisgICAgcmVsYXRpb25zaGlwLgor
CisgICAgQHBhcmFtIHtPYmplY3R9IGhhc2ggdGhlIEpTT04gYmVpbmcgYnVpbHQKKyAgICBAcGFy
YW0ge0RTLk1vZGVsfSByZWNvcmQgdGhlIHJlY29yZCBiZWluZyBzZXJpYWxpemVkCisgICAgQHBh
cmFtIHtTdHJpbmd9IGtleSB0aGUgSlNPTiBrZXkgaW50byB3aGljaCB0aGUgc2VyaWFsaXplZCBy
ZWxhdGlvbnNoaXAKKyAgICAgIHNob3VsZCBiZSBzYXZlZAorICAgIEBwYXJhbSB7T2JqZWN0fSBy
ZWxhdGlvbnNoaXAgbWV0YWRhdGEgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyBzZXJpYWxp
emVkCisgICovCisgIGFkZEhhc01hbnk6IGZ1bmN0aW9uKGhhc2gsIHJlY29yZCwga2V5LCByZWxh
dGlvbnNoaXApIHsKKyAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKKyAgICAgICAg
bmFtZSA9IHJlbGF0aW9uc2hpcC5rZXksCisgICAgICAgIHNlcmlhbGl6ZWRIYXNNYW55ID0gW10s
CisgICAgICAgIG1hbnlBcnJheSwgZW1iZWRkZWRUeXBlOworCisgICAgLy8gSWYgdGhlIGhhcy1t
YW55IGlzIG5vdCBlbWJlZGRlZCwgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAgICBlbWJlZGRl
ZFR5cGUgPSB0aGlzLmVtYmVkZGVkVHlwZSh0eXBlLCBuYW1lKTsKKyAgICBpZiAoZW1iZWRkZWRU
eXBlICE9PSAnYWx3YXlzJykgeyByZXR1cm47IH0KKworICAgIC8vIEdldCB0aGUgRFMuTWFueUFy
cmF5IGZvciB0aGUgcmVsYXRpb25zaGlwIG9mZiB0aGUgcmVjb3JkCisgICAgbWFueUFycmF5ID0g
Z2V0KHJlY29yZCwgbmFtZSk7CisKKyAgICAvLyBCdWlsZCB1cCB0aGUgYXJyYXkgb2Ygc2VyaWFs
aXplZCByZWNvcmRzCisgICAgbWFueUFycmF5LmZvckVhY2goZnVuY3Rpb24gKHJlY29yZCkgewor
ICAgICAgc2VyaWFsaXplZEhhc01hbnkucHVzaCh0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIHsgaW5j
bHVkZUlkOiB0cnVlIH0pKTsKKyAgICB9LCB0aGlzKTsKKworICAgIC8vIFNldCB0aGUgYXBwcm9w
cmlhdGUgcHJvcGVydHkgb2YgdGhlIHNlcmlhbGl6ZWQgSlNPTiB0byB0aGUKKyAgICAvLyBhcnJh
eSBvZiBzZXJpYWxpemVkIGVtYmVkZGVkIHJlY29yZHMKKyAgICBoYXNoW2tleV0gPSBzZXJpYWxp
emVkSGFzTWFueTsKKyAgfSwKKworICAvLyBFWFRSQUNUSU9OCisKKyAgZXh0cmFjdDogZnVuY3Rp
b24obG9hZGVyLCBqc29uLCB0eXBlLCByZWNvcmQpIHsKKyAgICB2YXIgcm9vdCA9IHRoaXMucm9v
dEZvclR5cGUodHlwZSk7CisKKyAgICB0aGlzLnNpZGVsb2FkKGxvYWRlciwgdHlwZSwganNvbiwg
cm9vdCk7CisgICAgdGhpcy5leHRyYWN0TWV0YShsb2FkZXIsIHR5cGUsIGpzb24pOworCisgICAg
aWYgKGpzb25bcm9vdF0pIHsKKyAgICAgIGlmIChyZWNvcmQpIHsgbG9hZGVyLnVwZGF0ZUlkKHJl
Y29yZCwganNvbltyb290XSk7IH0KKyAgICAgIHRoaXMuZXh0cmFjdFJlY29yZFJlcHJlc2VudGF0
aW9uKGxvYWRlciwgdHlwZSwganNvbltyb290XSk7CisgICAgfQorICB9LAorCisgIGV4dHJhY3RN
YW55OiBmdW5jdGlvbihsb2FkZXIsIGpzb24sIHR5cGUsIHJlY29yZHMpIHsKKyAgICB2YXIgcm9v
dCA9IHRoaXMucm9vdEZvclR5cGUodHlwZSk7CisgICAgcm9vdCA9IHRoaXMucGx1cmFsaXplKHJv
b3QpOworCisgICAgdGhpcy5zaWRlbG9hZChsb2FkZXIsIHR5cGUsIGpzb24sIHJvb3QpOworICAg
IHRoaXMuZXh0cmFjdE1ldGEobG9hZGVyLCB0eXBlLCBqc29uKTsKKworICAgIGlmIChqc29uW3Jv
b3RdKSB7CisgICAgICB2YXIgb2JqZWN0cyA9IGpzb25bcm9vdF0sIHJlZmVyZW5jZXMgPSBbXTsK
KyAgICAgIGlmIChyZWNvcmRzKSB7IHJlY29yZHMgPSByZWNvcmRzLnRvQXJyYXkoKTsgfQorCisg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAg
aWYgKHJlY29yZHMpIHsgbG9hZGVyLnVwZGF0ZUlkKHJlY29yZHNbaV0sIG9iamVjdHNbaV0pOyB9
CisgICAgICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLmV4dHJhY3RSZWNvcmRSZXByZXNlbnRhdGlv
bihsb2FkZXIsIHR5cGUsIG9iamVjdHNbaV0pOworICAgICAgICByZWZlcmVuY2VzLnB1c2gocmVm
ZXJlbmNlKTsKKyAgICAgIH0KKworICAgICAgbG9hZGVyLnBvcHVsYXRlQXJyYXkocmVmZXJlbmNl
cyk7CisgICAgfQorICB9LAorCisgIGV4dHJhY3RNZXRhOiBmdW5jdGlvbihsb2FkZXIsIHR5cGUs
IGpzb24pIHsKKyAgICB2YXIgbWV0YSA9IGpzb25bdGhpcy5jb25maWdPcHRpb24odHlwZSwgJ21l
dGEnKV0sIHNpbmNlOworICAgIGlmICghbWV0YSkgeyByZXR1cm47IH0KKworICAgIGlmIChzaW5j
ZSA9IG1ldGFbdGhpcy5jb25maWdPcHRpb24odHlwZSwgJ3NpbmNlJyldKSB7CisgICAgICBsb2Fk
ZXIuc2luY2VGb3JUeXBlKHR5cGUsIHNpbmNlKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAg
QHByaXZhdGUKKworICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBqc29uYCBwYXlsb2FkIGFuZCBhdHRl
bXB0cyB0byBsb2FkIGFueSBkYXRhCisgICAgaW5jbHVkZWQgYWxvbmdzaWRlIGByb290YC4KKwor
ICAgIFRoZSBrZXlzIGV4cGVjdGVkIGZvciBzaWRlbG9hZGVkIGRhdGEgYXJlIGJhc2VkIHVwb24g
dGhlIHR5cGVzIHJlbGF0ZWQKKyAgICB0byB0aGUgcm9vdCBtb2RlbC4gUmVjdXJzaW9uIGlzIHVz
ZWQgdG8gZW5zdXJlIHRoYXQgdHlwZXMgcmVsYXRlZCB0bworICAgIHJlbGF0ZWQgdHlwZXMgY2Fu
IGJlIGxvYWRlZCBhcyB3ZWxsLiBBbnkgY3VzdG9tIGtleXMgc3BlY2lmaWVkIGJ5CisgICAgYHNp
ZGVsb2FkQXNgIG1hcHBpbmdzIHdpbGwgYWxzbyBiZSByZXNwZWN0ZWQuCisKKyAgICBAcGFyYW0g
e0RTLlN0b3JlIHN1YmNsYXNzfSBsb2FkZXIKKyAgICBAcGFyYW0ge0RTLk1vZGVsIHN1YmNsYXNz
fSB0eXBlCisgICAgQHBhcmFtIHtPYmplY3R9IGpzb24KKyAgICBAcGFyYW0ge1N0cmluZ30gcm9v
dAorICAqLworICBzaWRlbG9hZDogZnVuY3Rpb24obG9hZGVyLCB0eXBlLCBqc29uLCByb290KSB7
CisgICAgdmFyIHNpZGVsb2FkZWRUeXBlOworCisgICAgdGhpcy5ub3JtYWxpemVTaWRlbG9hZE1h
cHBpbmdzKCk7CisgICAgdGhpcy5jb25maWd1cmVTaWRlbG9hZE1hcHBpbmdGb3JUeXBlKHR5cGUp
OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBqc29uKSB7CisgICAgICBpZiAoIWpzb24uaGFzT3du
UHJvcGVydHkocHJvcCkgfHwKKyAgICAgICAgICBwcm9wID09PSByb290IHx8CisgICAgICAgICAg
cHJvcCA9PT0gdGhpcy5jb25maWdPcHRpb24odHlwZSwgJ21ldGEnKSkgeworICAgICAgICBjb250
aW51ZTsKKyAgICAgIH0KKworICAgICAgc2lkZWxvYWRlZFR5cGUgPSB0aGlzLnNpZGVsb2FkTWFw
cGluZy5nZXQocHJvcCk7CisgICAgICBFbWJlci5hc3NlcnQoIllvdXIgc2VydmVyIHJldHVybmVk
IGEgaGFzaCB3aXRoIHRoZSBrZXkgIiArIHByb3AgKworICAgICAgICAgICAgICAgICAgICIgYnV0
IHlvdSBoYXZlIG5vIG1hcHBpbmcgZm9yIGl0IiwKKyAgICAgICAgICAgICAgICAgICAhIXNpZGVs
b2FkZWRUeXBlKTsKKworICAgICAgdGhpcy5sb2FkVmFsdWUobG9hZGVyLCBzaWRlbG9hZGVkVHlw
ZSwganNvbltwcm9wXSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAg
ICBJdGVyYXRlcyBvdmVyIGFsbCB0aGUgYHNpZGVsb2FkQXNgIG1hcHBpbmdzIGFuZCBjb252ZXJ0
cyBhbnkgdGhhdCBhcmUKKyAgICBzdHJpbmdzIHRvIHRoZWlyIGVxdWl2YWxlbnQgdHlwZXMuCisK
KyAgICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB1c2VkIHRvIGF2b2lkIHBlcmZvcm1pbmcgbG9v
a3VwcyBmb3IgZXZlcnkKKyAgICBjYWxsIHRvIGBzaWRlbG9hZGAuCisgICovCisgIG5vcm1hbGl6
ZVNpZGVsb2FkTWFwcGluZ3M6IGZ1bmN0aW9uKCkgeworICAgIGlmICghIHRoaXMuc2lkZWxvYWRN
YXBwaW5nLm5vcm1hbGl6ZWQpIHsKKyAgICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLmZvckVhY2go
ZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3Ry
aW5nJykgeworICAgICAgICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLnNldChrZXksIGdldChFbWJl
ci5sb29rdXAsIHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgIH0sIHRoaXMpOworICAgICAgdGhp
cy5zaWRlbG9hZE1hcHBpbmcubm9ybWFsaXplZCA9IHRydWU7CisgICAgfQorICB9LAorCisgIC8q
KgorICAgIEBwcml2YXRlCisKKyAgICBDb25maWd1cmVzIHBvc3NpYmxlIHNpZGVsb2FkIG1hcHBp
bmdzIGZvciB0aGUgdHlwZXMgcmVsYXRlZCB0byBhCisgICAgcGFydGljdWxhciBtb2RlbC4gVGhp
cyByZWN1cnNpdmUgbWV0aG9kIGVuc3VyZXMgdGhhdCBzaWRlbG9hZGluZworICAgIHdvcmtzIGZv
ciByZWxhdGVkIG1vZGVscyBhcyB3ZWxsLgorCisgICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFz
c30gdHlwZQorICAgIEBwYXJhbSB7RW1iZXIuQX0gY29uZmlndXJlZCBhbiBhcnJheSBvZiB0eXBl
cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQKKyAgKi8KKyAgY29uZmlndXJlU2lk
ZWxvYWRNYXBwaW5nRm9yVHlwZTogZnVuY3Rpb24odHlwZSwgY29uZmlndXJlZCkgeworICAgIGlm
ICghY29uZmlndXJlZCkge2NvbmZpZ3VyZWQgPSBFbWJlci5BKFtdKTt9CisgICAgY29uZmlndXJl
ZC5wdXNoT2JqZWN0KHR5cGUpOworCisgICAgdHlwZS5lYWNoUmVsYXRlZFR5cGUoZnVuY3Rpb24o
cmVsYXRlZFR5cGUpIHsKKyAgICAgIGlmICghY29uZmlndXJlZC5jb250YWlucyhyZWxhdGVkVHlw
ZSkpIHsKKyAgICAgICAgdmFyIHJvb3QgPSB0aGlzLnNpZGVsb2FkTWFwcGluZ0ZvclR5cGUocmVs
YXRlZFR5cGUpOworICAgICAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgICByb290ID0gdGhpcy5k
ZWZhdWx0U2lkZWxvYWRSb290Rm9yVHlwZShyZWxhdGVkVHlwZSk7CisgICAgICAgICAgdGhpcy5z
aWRlbG9hZE1hcHBpbmcuc2V0KHJvb3QsIHJlbGF0ZWRUeXBlKTsKKyAgICAgICAgfQorICAgICAg
ICB0aGlzLmNvbmZpZ3VyZVNpZGVsb2FkTWFwcGluZ0ZvclR5cGUocmVsYXRlZFR5cGUsIGNvbmZp
Z3VyZWQpOworICAgICAgfQorICAgIH0sIHRoaXMpOworICB9LAorCisgIGxvYWRWYWx1ZTogZnVu
Y3Rpb24obG9hZGVyLCB0eXBlLCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFy
cmF5KSB7CisgICAgICBmb3IgKHZhciBpPTA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgeworICAg
ICAgICBsb2FkZXIuc2lkZWxvYWQodHlwZSwgdmFsdWVbaV0pOworICAgICAgfQorICAgIH0gZWxz
ZSB7CisgICAgICBsb2FkZXIuc2lkZWxvYWQodHlwZSwgdmFsdWUpOworICAgIH0KKyAgfSwKKwor
ICAvLyBIRUxQRVJTCisKKyAgLy8gZGVmaW5lIGEgcGx1cmFscyBoYXNoIGluIHlvdXIgc3ViY2xh
c3MgdG8gZGVmaW5lCisgIC8vIHNwZWNpYWwtY2FzZSBwbHVyYWxpemF0aW9uCisgIHBsdXJhbGl6
ZTogZnVuY3Rpb24obmFtZSkgeworICAgIHZhciBwbHVyYWxzID0gdGhpcy5jb25maWd1cmF0aW9u
cy5nZXQoJ3BsdXJhbHMnKTsKKyAgICByZXR1cm4gKHBsdXJhbHMgJiYgcGx1cmFsc1tuYW1lXSkg
fHwgbmFtZSArICJzIjsKKyAgfSwKKworICAvLyB1c2UgdGhlIHNhbWUgcGx1cmFscyBoYXNoIHRv
IGRldGVybWluZQorICAvLyBzcGVjaWFsLWNhc2Ugc2luZ3VsYXJpemF0aW9uCisgIHNpbmd1bGFy
aXplOiBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIHBsdXJhbHMgPSB0aGlzLmNvbmZpZ3VyYXRp
b25zLmdldCgncGx1cmFscycpOworICAgIGlmIChwbHVyYWxzKSB7CisgICAgICBmb3IgKHZhciBp
IGluIHBsdXJhbHMpIHsKKyAgICAgICAgaWYgKHBsdXJhbHNbaV0gPT09IG5hbWUpIHsKKyAgICAg
ICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobmFtZS5s
YXN0SW5kZXhPZigncycpID09PSBuYW1lLmxlbmd0aCAtIDEpIHsKKyAgICAgIHJldHVybiBuYW1l
LnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1
cm4gbmFtZTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUKKworICAgIERldGVy
bWluZXMgdGhlIHNpbmd1bGFyIHJvb3QgbmFtZSBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCisKKyAg
ICBUaGlzIGlzIGFuIHVuZGVyc2NvcmVkLCBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgbW9kZWwg
bmFtZS4KKyAgICBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgYEFwcC5Vc2VyR3JvdXBgIHdpbGwgaGF2
ZSB0aGUgcm9vdAorICAgIGB1c2VyX2dyb3VwYC4KKworICAgIEBwYXJhbSB7RFMuTW9kZWwgc3Vi
Y2xhc3N9IHR5cGUKKyAgICBAcmV0dXJucyB7U3RyaW5nfSBuYW1lIG9mIHRoZSByb290IGVsZW1l
bnQKKyAgKi8KKyAgcm9vdEZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICB2YXIgdHlwZVN0
cmluZyA9IHR5cGUudG9TdHJpbmcoKTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91ciBtb2RlbCBt
dXN0IG5vdCBiZSBhbm9ueW1vdXMuIEl0IHdhcyAiICsgdHlwZSwgdHlwZVN0cmluZy5jaGFyQXQo
MCkgIT09ICcoJyk7CisKKyAgICAvLyB1c2UgdGhlIGxhc3QgcGFydCBvZiB0aGUgbmFtZSBhcyB0
aGUgVVJMCisgICAgdmFyIHBhcnRzID0gdHlwZVN0cmluZy5zcGxpdCgiLiIpOworICAgIHZhciBu
YW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CisgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgv
KFtBLVpdKS9nLCAnXyQxJykudG9Mb3dlckNhc2UoKS5zbGljZSgxKTsKKyAgfSwKKworICAvKioK
KyAgICBAcHJpdmF0ZQorCisgICAgRGV0ZXJtaW5lcyB0aGUgcm9vdCBuYW1lIG1hcHBlZCB0byBh
IHBhcnRpY3VsYXIgc2lkZWxvYWRlZCB0eXBlLgorCisgICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJj
bGFzc30gdHlwZQorICAgIEByZXR1cm5zIHtTdHJpbmd9IG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVu
dCwgaWYgYW55IGlzIHJlZ2lzdGVyZWQKKyAgKi8KKyAgc2lkZWxvYWRNYXBwaW5nRm9yVHlwZTog
ZnVuY3Rpb24odHlwZSkgeworICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLmZvckVhY2goZnVuY3Rp
b24oa2V5LCB2YWx1ZSkgeworICAgICAgaWYgKHR5cGUgPT09IHZhbHVlKSB7CisgICAgICAgIHJl
dHVybiBrZXk7CisgICAgICB9CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUK
KworICAgIFRoZSBkZWZhdWx0IHJvb3QgbmFtZSBmb3IgYSBwYXJ0aWN1bGFyIHNpZGVsb2FkZWQg
dHlwZS4KKworICAgIEBwYXJhbSB7RFMuTW9kZWwgc3ViY2xhc3N9IHR5cGUKKyAgICBAcmV0dXJu
cyB7U3RyaW5nfSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQKKyAgKi8KKyAgZGVmYXVsdFNpZGVs
b2FkUm9vdEZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICByZXR1cm4gdGhpcy5wbHVyYWxp
emUodGhpcy5yb290Rm9yVHlwZSh0eXBlKSk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1
bmN0aW9uKCkgeworZnVuY3Rpb24gbG9hZGVyRm9yKHN0b3JlKSB7CisgIHJldHVybiB7CisgICAg
bG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSwgcHJlbWF0ZXJpYWxpemVkKSB7CisgICAgICByZXR1
cm4gc3RvcmUubG9hZCh0eXBlLCBkYXRhLCBwcmVtYXRlcmlhbGl6ZWQpOworICAgIH0sCisKKyAg
ICBsb2FkTWFueTogZnVuY3Rpb24odHlwZSwgYXJyYXkpIHsKKyAgICAgIHJldHVybiBzdG9yZS5s
b2FkTWFueSh0eXBlLCBhcnJheSk7CisgICAgfSwKKworICAgIHVwZGF0ZUlkOiBmdW5jdGlvbihy
ZWNvcmQsIGRhdGEpIHsKKyAgICAgIHJldHVybiBzdG9yZS51cGRhdGVJZChyZWNvcmQsIGRhdGEp
OworICAgIH0sCisKKyAgICBwb3B1bGF0ZUFycmF5OiBFbWJlci5LLAorCisgICAgc2lkZWxvYWQ6
IGZ1bmN0aW9uKHR5cGUsIGRhdGEpIHsKKyAgICAgIHJldHVybiBzdG9yZS5sb2FkKHR5cGUsIGRh
dGEpOworICAgIH0sCisKKyAgICBzaWRlbG9hZE1hbnk6IGZ1bmN0aW9uKHR5cGUsIGFycmF5KSB7
CisgICAgICByZXR1cm4gc3RvcmUubG9hZE1hbnkodHlwZSwgYXJyYXkpOworICAgIH0sCisKKyAg
ICBwcmVtYXRlcmlhbGl6ZTogZnVuY3Rpb24ocmVmZXJlbmNlLCBwcmVtYXRlcmlhbGl6ZWQpIHsK
KyAgICAgIHN0b3JlLnByZW1hdGVyaWFsaXplKHJlZmVyZW5jZSwgcHJlbWF0ZXJpYWxpemVkKTsK
KyAgICB9LAorCisgICAgc2luY2VGb3JUeXBlOiBmdW5jdGlvbih0eXBlLCBzaW5jZSkgeworICAg
ICAgc3RvcmUuc2luY2VGb3JUeXBlKHR5cGUsIHNpbmNlKTsKKyAgICB9CisgIH07Cit9CisKK0RT
LmxvYWRlckZvciA9IGxvYWRlckZvcjsKKworLyoqCisgIEFuIGFkYXB0ZXIgaXMgYW4gb2JqZWN0
IHRoYXQgcmVjZWl2ZXMgcmVxdWVzdHMgZnJvbSBhIHN0b3JlIGFuZAorICB0cmFuc2xhdGVzIHRo
ZW0gaW50byB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UgYWdhaW5zdCB5b3VyCisgIHBl
cnNpc3RlbmNlIGxheWVyLiBUaGUgcGVyc2lzdGVuY2UgbGF5ZXIgaXMgdXN1YWxseSBhbiBIVFRQ
IEFQSSwgYnV0IG1heQorICBiZSBhbnl0aGluZywgc3VjaCBhcyB0aGUgYnJvd3NlcidzIGxvY2Fs
IHN0b3JhZ2UuCisKKyAgIyMjIENyZWF0aW5nIGFuIEFkYXB0ZXIKKworICBGaXJzdCwgY3JlYXRl
IGEgbmV3IHN1YmNsYXNzIG9mIGBEUy5BZGFwdGVyYDoKKworICAgICAgQXBwLk15QWRhcHRlciA9
IERTLkFkYXB0ZXIuZXh0ZW5kKHsKKyAgICAgICAgLy8gLi4ueW91ciBjb2RlIGhlcmUKKyAgICAg
IH0pOworCisgIFRvIHRlbGwgeW91ciBzdG9yZSB3aGljaCBhZGFwdGVyIHRvIHVzZSwgc2V0IGl0
cyBgYWRhcHRlcmAgcHJvcGVydHk6CisKKyAgICAgIEFwcC5zdG9yZSA9IERTLlN0b3JlLmNyZWF0
ZSh7CisgICAgICAgIHJldmlzaW9uOiAzLAorICAgICAgICBhZGFwdGVyOiBBcHAuTXlBZGFwdGVy
LmNyZWF0ZSgpCisgICAgICB9KTsKKworICBgRFMuQWRhcHRlcmAgaXMgYW4gYWJzdHJhY3QgYmFz
ZSBjbGFzcyB0aGF0IHlvdSBzaG91bGQgb3ZlcnJpZGUgaW4geW91cgorICBhcHBsaWNhdGlvbiB0
byBjdXN0b21pemUgaXQgZm9yIHlvdXIgYmFja2VuZC4gVGhlIG1pbmltdW0gc2V0IG9mIG1ldGhv
ZHMKKyAgdGhhdCB5b3Ugc2hvdWxkIGltcGxlbWVudCBpczoKKworICAgICogYGZpbmQoKWAKKyAg
ICAqIGBjcmVhdGVSZWNvcmQoKWAKKyAgICAqIGB1cGRhdGVSZWNvcmQoKWAKKyAgICAqIGBkZWxl
dGVSZWNvcmQoKWAKKworICAgVG8gaW1wcm92ZSB0aGUgbmV0d29yayBwZXJmb3JtYW5jZSBvZiB5
b3VyIGFwcGxpY2F0aW9uLCB5b3UgY2FuIG9wdGltaXplCisgICB5b3VyIGFkYXB0ZXIgYnkgb3Zl
cnJpZGluZyB0aGVzZSBsb3dlci1sZXZlbCBtZXRob2RzOgorCisgICAgKiBgZmluZE1hbnkoKWAK
KyAgICAqIGBjcmVhdGVSZWNvcmRzKClgCisgICAgKiBgdXBkYXRlUmVjb3JkcygpYAorICAgICog
YGRlbGV0ZVJlY29yZHMoKWAKKyAgICAqIGBjb21taXQoKWAKKyovCisKK3ZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldCwgbWVyZ2UgPSBFbWJlci5tZXJnZTsKKworRFMuQWRhcHRl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoRFMuX01hcHBhYmxlLCB7CisKKyAgaW5pdDogZnVuY3Rp
b24oKSB7CisgICAgdmFyIHNlcmlhbGl6ZXIgPSBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKTsKKwor
ICAgIGlmIChFbWJlci5PYmplY3QuZGV0ZWN0KHNlcmlhbGl6ZXIpKSB7CisgICAgICBzZXJpYWxp
emVyID0gc2VyaWFsaXplci5jcmVhdGUoKTsKKyAgICAgIHNldCh0aGlzLCAnc2VyaWFsaXplcics
IHNlcmlhbGl6ZXIpOworICAgIH0KKworICAgIHRoaXMuX2F0dHJpYnV0ZXNNYXAgPSB0aGlzLmNy
ZWF0ZUluc3RhbmNlTWFwRm9yKCdhdHRyaWJ1dGVzJyk7CisgICAgdGhpcy5fY29uZmlndXJhdGlv
bnNNYXAgPSB0aGlzLmNyZWF0ZUluc3RhbmNlTWFwRm9yKCdjb25maWd1cmF0aW9ucycpOworCisg
ICAgdGhpcy5fb3V0c3RhbmRpbmdPcGVyYXRpb25zID0gbmV3IEVtYmVyLk1hcFdpdGhEZWZhdWx0
KHsKKyAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9CisgICAgfSk7
CisKKyAgICB0aGlzLl9kZXBlbmRlbmNpZXMgPSBuZXcgRW1iZXIuTWFwV2l0aERlZmF1bHQoewor
ICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBFbWJlci5PcmRlcmVk
U2V0KCk7IH0KKyAgICB9KTsKKworICAgIHRoaXMucmVnaXN0ZXJTZXJpYWxpemVyVHJhbnNmb3Jt
cyh0aGlzLmNvbnN0cnVjdG9yLCBzZXJpYWxpemVyLCB7fSk7CisgICAgdGhpcy5yZWdpc3RlclNl
cmlhbGl6ZXJNYXBwaW5ncyhzZXJpYWxpemVyKTsKKyAgfSwKKworICAvKioKKyAgICBMb2FkcyBh
IHBheWxvYWQgZm9yIGEgcmVjb3JkIGludG8gdGhlIHN0b3JlLgorCisgICAgVGhpcyBtZXRob2Qg
YXNrcyB0aGUgc2VyaWFsaXplciB0byBicmVhayB0aGUgcGF5bG9hZCBpbnRvCisgICAgY29uc3Rp
dHVlbnQgcGFydHMsIGFuZCB0aGVuIGxvYWRzIHRoZW0gaW50byB0aGUgc3RvcmUuIEZvciBleGFt
cGxlLAorICAgIGlmIHlvdSBoYXZlIGEgcGF5bG9hZCB0aGF0IGNvbnRhaW5zIGVtYmVkZGVkIHJl
Y29yZHMsIHRoZXkgd2lsbCBiZQorICAgIGV4dHJhY3RlZCBieSB0aGUgc2VyaWFsaXplciBhbmQg
bG9hZGVkIGludG8gdGhlIHN0b3JlLgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBhZGFwdGVyLmxvYWQoc3RvcmUsIEFwcC5QZXJzb24sIHsKKyAgICAgICAg
aWQ6IDEyMywKKyAgICAgICAgZmlyc3ROYW1lOiAiWWVodWRhIiwKKyAgICAgICAgbGFzdE5hbWU6
ICJLYXR6IiwKKyAgICAgICAgb2NjdXBhdGlvbnM6IFt7CisgICAgICAgICAgaWQ6IDM0NSwKKyAg
ICAgICAgICB0aXRsZTogIlRyaWN5Y2xlIE1lY2hhbmljIgorICAgICAgICB9XSAgICAKKyAgICAg
IH0pOworICAgIGBgYAorCisgICAgVGhpcyB3aWxsIGxvYWQgdGhlIHBheWxvYWQgZm9yIHRoZSBg
QXBwLlBlcnNvbmAgd2l0aCBJRCBgMTIzYCBhbmQKKyAgICB0aGUgZW1iZWRkZWQgYEFwcC5PY2N1
cGF0aW9uYCB3aXRoIElEIGAzNDVgLgorCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAg
ICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHthbnl9IHBh
eWxvYWQKKyAgKi8KKyAgbG9hZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKKyAg
ICB2YXIgbG9hZGVyID0gbG9hZGVyRm9yKHN0b3JlKTsKKyAgICBnZXQodGhpcywgJ3NlcmlhbGl6
ZXInKS5leHRyYWN0UmVjb3JkUmVwcmVzZW50YXRpb24obG9hZGVyLCB0eXBlLCBwYXlsb2FkKTsK
KyAgfSwKKworICAvKioKKyAgICBBY2tub3dsZWRnZXMgdGhhdCB0aGUgYWRhcHRlciBoYXMgZmlu
aXNoZWQgY3JlYXRpbmcgYSByZWNvcmQuCisKKyAgICBZb3VyIGFkYXB0ZXIgc2hvdWxkIGNhbGwg
dGhpcyBtZXRob2QgZnJvbSBgY3JlYXRlUmVjb3JkYCB3aGVuCisgICAgaXQgaGFzIHNhdmVkIGEg
bmV3IHJlY29yZCB0byBpdHMgcGVyc2lzdGVudCBzdG9yYWdlIGFuZCByZWNlaXZlZAorICAgIGFu
IGFja25vd2xlZGdlbWVudC4KKworICAgIElmIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgcmV0dXJu
cyBhIG5ldyBwYXlsb2FkIGluIHJlc3BvbnNlIHRvIHRoZQorICAgIGNyZWF0aW9uLCBhbmQgeW91
IHdhbnQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyByZWNvcmQgd2l0aCB0aGUKKyAgICBuZXcgaW5m
b3JtYXRpb24sIHBhc3MgdGhlIHBheWxvYWQgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuCisKKyAg
ICBGb3IgZXhhbXBsZSwgdGhlIGBSRVNUQWRhcHRlcmAgc2F2ZXMgbmV3bHkgY3JlYXRlZCByZWNv
cmRzIGJ5CisgICAgbWFraW5nIGFuIEFqYXggcmVxdWVzdC4gV2hlbiB0aGUgc2VydmVyIHJldHVy
bnMsIHRoZSBhZGFwdGVyCisgICAgY2FsbHMgZGlkQ3JlYXRlUmVjb3JkLiBJZiB0aGUgc2VydmVy
IHJldHVybnMgYSByZXNwb25zZSBib2R5LAorICAgIGl0IGlzIHBhc3NlZCBhcyB0aGUgcGF5bG9h
ZC4gCisKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mg
b2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgICBAcGFy
YW0ge2FueX0gcGF5bG9hZCAKKyAgKi8KKyAgZGlkQ3JlYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9y
ZSwgdHlwZSwgcmVjb3JkLCBwYXlsb2FkKSB7CisgICAgc3RvcmUuZGlkU2F2ZVJlY29yZChyZWNv
cmQpOworCisgICAgaWYgKHBheWxvYWQpIHsKKyAgICAgIHZhciBsb2FkZXIgPSBEUy5sb2FkZXJG
b3Ioc3RvcmUpOworCisgICAgICBsb2FkZXIubG9hZCA9IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIHBy
ZW1hdGVyaWFsaXplZCkgeworICAgICAgICBzdG9yZS51cGRhdGVJZChyZWNvcmQsIGRhdGEpOwor
ICAgICAgICByZXR1cm4gc3RvcmUubG9hZCh0eXBlLCBkYXRhLCBwcmVtYXRlcmlhbGl6ZWQpOwor
ICAgICAgfTsKKworICAgICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJykuZXh0cmFjdChsb2FkZXIs
IHBheWxvYWQsIHR5cGUpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBBY2tub3dsZWRnZXMg
dGhhdCB0aGUgYWRhcHRlciBoYXMgZmluaXNoZWQgY3JlYXRpbmcgc2V2ZXJhbCByZWNvcmRzLgor
CisgICAgWW91ciBhZGFwdGVyIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYGNyZWF0ZVJl
Y29yZHNgIHdoZW4gaXQKKyAgICBoYXMgc2F2ZWQgbXVsdGlwbGUgY3JlYXRlZCByZWNvcmRzIHRv
IGl0cyBwZXJzaXN0ZW50IHN0b3JhZ2UgCisgICAgcmVjZWl2ZWQgYW4gYWNrbm93bGVkZ2VtZW50
LgorCisgICAgSWYgdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSByZXR1cm5zIGEgbmV3IHBheWxvYWQg
aW4gcmVzcG9uc2UgdG8gdGhlCisgICAgY3JlYXRpb24sIGFuZCB5b3Ugd2FudCB0byB1cGRhdGUg
dGhlIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZQorICAgIG5ldyBpbmZvcm1hdGlvbiwgcGFzcyB0
aGUgcGF5bG9hZCBhcyB0aGUgZm91cnRoIHBhcmFtZXRlci4KKworICAgIEBwYXJhbSB7RFMuU3Rv
cmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBw
YXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkIAorICAqLwor
ICBkaWRDcmVhdGVSZWNvcmRzOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcywgcGF5bG9h
ZCkgeworICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIHN0b3Jl
LmRpZFNhdmVSZWNvcmQocmVjb3JkKTsKKyAgICB9LCB0aGlzKTsKKworICAgIGlmIChwYXlsb2Fk
KSB7CisgICAgICB2YXIgbG9hZGVyID0gRFMubG9hZGVyRm9yKHN0b3JlKTsKKyAgICAgIGdldCh0
aGlzLCAnc2VyaWFsaXplcicpLmV4dHJhY3RNYW55KGxvYWRlciwgcGF5bG9hZCwgdHlwZSwgcmVj
b3Jkcyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIEBwcml2YXRlCisKKyAgICBBY2tub3ds
ZWRnZXMgdGhhdCB0aGUgYWRhcHRlciBoYXMgZmluaXNoZWQgdXBkYXRpbmcgb3IgZGVsZXRpbmcg
YSByZWNvcmQuCisKKyAgICBZb3VyIGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgZnJv
bSBgdXBkYXRlUmVjb3JkYCBvciBgZGVsZXRlUmVjb3JkYAorICAgIHdoZW4gaXQgaGFzIHVwZGF0
ZWQgb3IgZGVsZXRlZCBhIHJlY29yZCB0byBpdHMgcGVyc2lzdGVudCBzdG9yYWdlIGFuZAorICAg
IHJlY2VpdmVkIGFuIGFja25vd2xlZGdlbWVudC4KKworICAgIElmIHRoZSBwZXJzaXN0ZW50IHN0
b3JhZ2UgcmV0dXJucyBhIG5ldyBwYXlsb2FkIGluIHJlc3BvbnNlIHRvIHRoZQorICAgIHVwZGF0
ZSBvciBkZWxldGUsIGFuZCB5b3Ugd2FudCB0byB1cGRhdGUgdGhlIGV4aXN0aW5nIHJlY29yZCB3
aXRoIHRoZQorICAgIG5ldyBpbmZvcm1hdGlvbiwgcGFzcyB0aGUgcGF5bG9hZCBhcyB0aGUgZm91
cnRoIHBhcmFtZXRlci4KKworICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29y
ZAorICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkIAorICAqLworICBkaWRTYXZlUmVjb3JkOiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkLCBwYXlsb2FkKSB7CisgICAgc3RvcmUuZGlkU2F2ZVJl
Y29yZChyZWNvcmQpOworCisgICAgdmFyIHNlcmlhbGl6ZXIgPSBnZXQodGhpcywgJ3NlcmlhbGl6
ZXInKSwKKyAgICAgICAgbWFwcGluZ3MgPSBzZXJpYWxpemVyLm1hcHBpbmdGb3JUeXBlKHR5cGUp
OworCisgICAgc2VyaWFsaXplci5lYWNoRW1iZWRkZWRSZWNvcmQocmVjb3JkLCBmdW5jdGlvbihl
bWJlZGRlZFJlY29yZCwgZW1iZWRkZWRUeXBlKSB7CisgICAgICBpZiAoZW1iZWRkZWRUeXBlID09
PSAnbG9hZCcpIHsgcmV0dXJuOyB9CisKKyAgICAgIHRoaXMuZGlkU2F2ZVJlY29yZChzdG9yZSwg
ZW1iZWRkZWRSZWNvcmQuY29uc3RydWN0b3IsIGVtYmVkZGVkUmVjb3JkKTsKKyAgICB9LCB0aGlz
KTsKKworICAgIGlmIChwYXlsb2FkKSB7CisgICAgICB2YXIgbG9hZGVyID0gRFMubG9hZGVyRm9y
KHN0b3JlKTsKKyAgICAgIHNlcmlhbGl6ZXIuZXh0cmFjdChsb2FkZXIsIHBheWxvYWQsIHR5cGUp
OworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBBY2tub3dsZWRnZXMgdGhhdCB0aGUgYWRhcHRl
ciBoYXMgZmluaXNoZWQgdXBkYXRpbmcgYSByZWNvcmQuCisKKyAgICBZb3VyIGFkYXB0ZXIgc2hv
dWxkIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBgdXBkYXRlUmVjb3JkYCB3aGVuIGl0CisgICAgaGFz
IHVwZGF0ZWQgYSByZWNvcmQgdG8gaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQgcmVjZWl2ZWQg
YW4KKyAgICBhY2tub3dsZWRnZW1lbnQuCisKKyAgICBJZiB0aGUgcGVyc2lzdGVudCBzdG9yYWdl
IHJldHVybnMgYSBuZXcgcGF5bG9hZCBpbiByZXNwb25zZSB0byB0aGUKKyAgICB1cGRhdGUsIHBh
c3MgdGhlIHBheWxvYWQgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuCisKKyAgICBAcGFyYW0ge0RT
LlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAg
ICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgICBAcGFyYW0ge2FueX0gcGF5bG9hZCAKKyAg
Ki8KKyAgZGlkVXBkYXRlUmVjb3JkOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmRpZFNhdmVSZWNv
cmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfSwKKworICAvKioKKyAgICBBY2tub3dsZWRn
ZXMgdGhhdCB0aGUgYWRhcHRlciBoYXMgZmluaXNoZWQgZGVsZXRpbmcgYSByZWNvcmQuCisKKyAg
ICBZb3VyIGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBgZGVsZXRlUmVjb3Jk
YCB3aGVuIGl0CisgICAgaGFzIGRlbGV0ZWQgYSByZWNvcmQgZnJvbSBpdHMgcGVyc2lzdGVudCBz
dG9yYWdlIGFuZCByZWNlaXZlZCBhbgorICAgIGFja25vd2xlZGdlbWVudC4KKworICAgIElmIHRo
ZSBwZXJzaXN0ZW50IHN0b3JhZ2UgcmV0dXJucyBhIG5ldyBwYXlsb2FkIGluIHJlc3BvbnNlIHRv
IHRoZQorICAgIGRlbGV0aW9uLCBwYXNzIHRoZSBwYXlsb2FkIGFzIHRoZSBmb3VydGggcGFyYW1l
dGVyLgorCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge3N1YmNsYXNz
IG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHBh
cmFtIHthbnl9IHBheWxvYWQgCisgICovCisgIGRpZERlbGV0ZVJlY29yZDogZnVuY3Rpb24oKSB7
CisgICAgdGhpcy5kaWRTYXZlUmVjb3JkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0sCisK
KyAgLyoqCisgICAgQWNrbm93bGVkZ2VzIHRoYXQgdGhlIGFkYXB0ZXIgaGFzIGZpbmlzaGVkIHVw
ZGF0aW5nIG9yIGRlbGV0aW5nIAorICAgIG11bHRpcGxlIHJlY29yZHMuCisKKyAgICBZb3VyIGFk
YXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBpdHMgYHVwZGF0ZVJlY29yZHNgIG9y
CisgICAgYGRlbGV0ZVJlY29yZHNgIHdoZW4gaXQgaGFzIHVwZGF0ZWQgb3IgZGVsZXRlZCBtdWx0
aXBsZSByZWNvcmRzCisgICAgdG8gaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQgcmVjZWl2ZWQg
YW4gYWNrbm93bGVkZ2VtZW50LgorCisgICAgSWYgdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSByZXR1
cm5zIGEgbmV3IHBheWxvYWQgaW4gcmVzcG9uc2UgdG8gdGhlCisgICAgY3JlYXRpb24sIHBhc3Mg
dGhlIHBheWxvYWQgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuCisKKyAgICBAcGFyYW0ge0RTLlN0
b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBA
cGFyYW0ge0RTLk1vZGVsfSByZWNvcmRzCisgICAgQHBhcmFtIHthbnl9IHBheWxvYWQgCisgICov
CisgIGRpZFNhdmVSZWNvcmRzOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcywgcGF5bG9h
ZCkgeworICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIHN0b3Jl
LmRpZFNhdmVSZWNvcmQocmVjb3JkKTsKKyAgICB9LCB0aGlzKTsKKworICAgIGlmIChwYXlsb2Fk
KSB7CisgICAgICB2YXIgbG9hZGVyID0gRFMubG9hZGVyRm9yKHN0b3JlKTsKKyAgICAgIGdldCh0
aGlzLCAnc2VyaWFsaXplcicpLmV4dHJhY3RNYW55KGxvYWRlciwgcGF5bG9hZCwgdHlwZSk7Cisg
ICAgfQorICB9LAorCisgIC8qKgorICAgIEFja25vd2xlZGdlcyB0aGF0IHRoZSBhZGFwdGVyIGhh
cyBmaW5pc2hlZCB1cGRhdGluZyBtdWx0aXBsZSByZWNvcmRzLgorCisgICAgWW91ciBhZGFwdGVy
IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gaXRzIGB1cGRhdGVSZWNvcmRzYCB3aGVuCisg
ICAgaXQgaGFzIHVwZGF0ZWQgbXVsdGlwbGUgcmVjb3JkcyB0byBpdHMgcGVyc2lzdGVudCBzdG9y
YWdlIGFuZAorICAgIHJlY2VpdmVkIGFuIGFja25vd2xlZGdlbWVudC4KKworICAgIElmIHRoZSBw
ZXJzaXN0ZW50IHN0b3JhZ2UgcmV0dXJucyBhIG5ldyBwYXlsb2FkIGluIHJlc3BvbnNlIHRvIHRo
ZQorICAgIHVwZGF0ZSwgcGFzcyB0aGUgcGF5bG9hZCBhcyB0aGUgZm91cnRoIHBhcmFtZXRlci4K
KworICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBE
Uy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZHMKKyAgICBAcGFyYW0g
e2FueX0gcGF5bG9hZCAKKyAgKi8KKyAgZGlkVXBkYXRlUmVjb3JkczogZnVuY3Rpb24oKSB7Cisg
ICAgdGhpcy5kaWRTYXZlUmVjb3Jkcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9LAorCisg
IC8qKgorICAgIEFja25vd2xlZGdlcyB0aGF0IHRoZSBhZGFwdGVyIGhhcyBmaW5pc2hlZCB1cGRh
dGluZyBtdWx0aXBsZSByZWNvcmRzLgorCisgICAgWW91ciBhZGFwdGVyIHNob3VsZCBjYWxsIHRo
aXMgbWV0aG9kIGZyb20gaXRzIGBkZWxldGVSZWNvcmRzYCB3aGVuCisgICAgaXQgaGFzIGRlbGV0
ZWQgbXVsdGlwbGUgcmVjb3JkcyB0byBpdHMgcGVyc2lzdGVudCBzdG9yYWdlIGFuZAorICAgIHJl
Y2VpdmVkIGFuIGFja25vd2xlZGdlbWVudC4KKworICAgIElmIHRoZSBwZXJzaXN0ZW50IHN0b3Jh
Z2UgcmV0dXJucyBhIG5ldyBwYXlsb2FkIGluIHJlc3BvbnNlIHRvIHRoZQorICAgIGRlbGV0aW9u
LCBwYXNzIHRoZSBwYXlsb2FkIGFzIHRoZSBmb3VydGggcGFyYW1ldGVyLgorCisgICAgQHBhcmFt
IHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
CisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkcworICAgIEBwYXJhbSB7YW55fSBwYXlsb2Fk
IAorICAqLworICBkaWREZWxldGVSZWNvcmRzOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmRpZFNh
dmVSZWNvcmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0sCisKKyAgLyoqCisgICAgTG9h
ZHMgdGhlIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBmb3IgYSByZWNvcmQgYnkgSUQuCisKKyAgICBZ
b3VyIGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBpdHMgYGZpbmRgIG1ldGhv
ZAorICAgIHdpdGggdGhlIHJlc3BvbnNlIGZyb20gdGhlIGJhY2tlbmQuCisKKyAgICBZb3Ugc2hv
dWxkIHBhc3MgdGhlIHNhbWUgSUQgdG8gdGhpcyBtZXRob2QgdGhhdCB3YXMgZ2l2ZW4KKyAgICB0
byB5b3VyIGZpbmQgbWV0aG9kIHNvIHRoYXQgdGhlIHN0b3JlIGtub3dzIHdoaWNoIHJlY29yZAor
ICAgIHRvIGFzc29jaWF0ZSB0aGUgbmV3IGRhdGEgd2l0aC4KKworICAgIEBwYXJhbSB7RFMuU3Rv
cmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBw
YXJhbSB7YW55fSBwYXlsb2FkIAorICAgIEBwYXJhbSB7U3RyaW5nfSBpZAorICAqLworICBkaWRG
aW5kUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCwgaWQpIHsKKyAgICB2YXIg
bG9hZGVyID0gRFMubG9hZGVyRm9yKHN0b3JlKTsKKworICAgIGxvYWRlci5sb2FkID0gZnVuY3Rp
b24odHlwZSwgZGF0YSwgcHJlbWF0ZXJpYWxpemVkKSB7CisgICAgICBwcmVtYXRlcmlhbGl6ZWQg
PSBwcmVtYXRlcmlhbGl6ZWQgfHwge307CisgICAgICBwcmVtYXRlcmlhbGl6ZWQuaWQgPSBpZDsK
KworICAgICAgcmV0dXJuIHN0b3JlLmxvYWQodHlwZSwgZGF0YSwgcHJlbWF0ZXJpYWxpemVkKTsK
KyAgICB9OworCisgICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJykuZXh0cmFjdChsb2FkZXIsIHBh
eWxvYWQsIHR5cGUpOworICB9LAorCisgIC8qKgorICAgIExvYWRzIHRoZSByZXNwb25zZSB0byBh
IHJlcXVlc3QgZm9yIGFsbCByZWNvcmRzIGJ5IHR5cGUuCisKKyAgICBZb3UgYWRhcHRlciBzaG91
bGQgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGl0cyBgZmluZEFsbGAKKyAgICBtZXRob2Qgd2l0aCB0
aGUgcmVzcG9uc2UgZnJvbSB0aGUgYmFja2VuZC4KKworICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0
b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7
YW55fSBwYXlsb2FkIAorICAqLworICBkaWRGaW5kQWxsOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwg
cGF5bG9hZCkgeworICAgIHZhciBsb2FkZXIgPSBEUy5sb2FkZXJGb3Ioc3RvcmUpLAorICAgICAg
ICBzZXJpYWxpemVyID0gZ2V0KHRoaXMsICdzZXJpYWxpemVyJyk7CisKKyAgICBzdG9yZS5kaWRV
cGRhdGVBbGwodHlwZSk7CisKKyAgICBzZXJpYWxpemVyLmV4dHJhY3RNYW55KGxvYWRlciwgcGF5
bG9hZCwgdHlwZSk7CisgIH0sCisKKyAgLyoqCisgICAgTG9hZHMgdGhlIHJlc3BvbnNlIHRvIGEg
cmVxdWVzdCBmb3IgcmVjb3JkcyBieSBxdWVyeS4KKworICAgIFlvdXIgYWRhcHRlciBzaG91bGQg
Y2FsbCB0aGlzIG1ldGhvZCBmcm9tIGl0cyBgZmluZFF1ZXJ5YAorICAgIG1ldGhvZCB3aXRoIHRo
ZSByZXNwb25zZSBmcm9tIHRoZSBiYWNrZW5kLgorCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3Rv
cmUKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHth
bnl9IHBheWxvYWQgCisgICAgQHBhcmFtIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXl9
IHJlY29yZEFycmF5CisgICovCisgIGRpZEZpbmRRdWVyeTogZnVuY3Rpb24oc3RvcmUsIHR5cGUs
IHBheWxvYWQsIHJlY29yZEFycmF5KSB7CisgICAgdmFyIGxvYWRlciA9IERTLmxvYWRlckZvcihz
dG9yZSk7CisKKyAgICBsb2FkZXIucG9wdWxhdGVBcnJheSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAg
ICAgIHJlY29yZEFycmF5LmxvYWQoZGF0YSk7CisgICAgfTsKKworICAgIGdldCh0aGlzLCAnc2Vy
aWFsaXplcicpLmV4dHJhY3RNYW55KGxvYWRlciwgcGF5bG9hZCwgdHlwZSk7CisgIH0sCisKKyAg
LyoqCisgICAgTG9hZHMgdGhlIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBmb3IgbWFueSByZWNvcmRz
IGJ5IElELgorCisgICAgWW91IGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBp
dHMgYGZpbmRNYW55YAorICAgIG1ldGhvZCB3aXRoIHRoZSByZXNwb25zZSBmcm9tIHRoZSBiYWNr
ZW5kLgorCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge3N1YmNsYXNz
IG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHthbnl9IHBheWxvYWQgCisgICovCisgIGRp
ZEZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeworICAgIHZhciBsb2Fk
ZXIgPSBEUy5sb2FkZXJGb3Ioc3RvcmUpOworCisgICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJyku
ZXh0cmFjdE1hbnkobG9hZGVyLCBwYXlsb2FkLCB0eXBlKTsKKyAgfSwKKworICAvKioKKyAgICBO
b3RpZmllcyB0aGUgc3RvcmUgdGhhdCBhIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQgcmV0dXJuZWQK
KyAgICBhbiBlcnJvci4KKworICAgIFlvdXIgYWRhcHRlciBzaG91bGQgY2FsbCB0aGlzIG1ldGhv
ZCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICAgIGJhY2tlbmQgcmV0dXJuZWQgYW4gZXJyb3IgZm9y
IGEgcmVxdWVzdC4KKworICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtz
dWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAor
ICAqLworICBkaWRFcnJvcjogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgeworICAgIHN0
b3JlLnJlY29yZFdhc0Vycm9yKHJlY29yZCk7CisgIH0sCisKKyAgZGlydHlSZWNvcmRzRm9yQXR0
cmlidXRlQ2hhbmdlOiBmdW5jdGlvbihkaXJ0eVNldCwgcmVjb3JkLCBhdHRyaWJ1dGVOYW1lLCBu
ZXdWYWx1ZSwgb2xkVmFsdWUpIHsKKyAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7Cisg
ICAgICAvLyBJZiB0aGlzIHJlY29yZCBpcyBlbWJlZGRlZCwgYWRkIGl0cyBwYXJlbnQKKyAgICAg
IC8vIHRvIHRoZSBkaXJ0eSBzZXQuCisgICAgICB0aGlzLmRpcnR5UmVjb3Jkc0ZvclJlY29yZENo
YW5nZShkaXJ0eVNldCwgcmVjb3JkKTsKKyAgICB9CisgIH0sCisKKyAgZGlydHlSZWNvcmRzRm9y
UmVjb3JkQ2hhbmdlOiBmdW5jdGlvbihkaXJ0eVNldCwgcmVjb3JkKSB7CisgICAgZGlydHlTZXQu
YWRkKHJlY29yZCk7CisgIH0sCisKKyAgZGlydHlSZWNvcmRzRm9yQmVsb25nc1RvQ2hhbmdlOiBm
dW5jdGlvbihkaXJ0eVNldCwgY2hpbGQpIHsKKyAgICB0aGlzLmRpcnR5UmVjb3Jkc0ZvclJlY29y
ZENoYW5nZShkaXJ0eVNldCwgY2hpbGQpOworICB9LAorCisgIGRpcnR5UmVjb3Jkc0Zvckhhc01h
bnlDaGFuZ2U6IGZ1bmN0aW9uKGRpcnR5U2V0LCBwYXJlbnQpIHsKKyAgICB0aGlzLmRpcnR5UmVj
b3Jkc0ZvclJlY29yZENoYW5nZShkaXJ0eVNldCwgcGFyZW50KTsKKyAgfSwKKworICAvKioKKyAg
ICBAcHJpdmF0ZQorCisgICAgVGhpcyBtZXRob2QgcmVjdXJzaXZlbHkgY2xpbWJzIHRoZSBzdXBl
cmNsYXNzIGhpZXJhcmNoeSBhbmQKKyAgICByZWdpc3RlcnMgYW55IGNsYXNzLXJlZ2lzdGVyZWQg
dHJhbnNmb3JtcyBvbiB0aGUgYWRhcHRlcidzCisgICAgc2VyaWFsaXplci4KKworICAgIE9uY2Ug
aXQgcmVnaXN0ZXJzIGEgdHJhbnNmb3JtIGZvciBhIGdpdmVuIHR5cGUsIGl0IGlnbm9yZXMKKyAg
ICBzdWJzZXF1ZW50IHRyYW5zZm9ybXMgZm9yIHRoZSBzYW1lIGF0dHJpYnV0ZSB0eXBlLgorCisg
ICAgQHBhcmFtIHtDbGFzc30ga2xhc3MgdGhlIERTLkFkYXB0ZXIgc3ViY2xhc3MgdG8gZXh0cmFj
dCB0aGUKKyAgICAgIHRyYW5zZm9ybXMgZnJvbQorICAgIEBwYXJhbSB7RFMuU2VyaWFsaXplcn0g
c2VyaWFsaXplciB0aGUgc2VyaWFsaXplciB0byByZWdpc3RlcgorICAgICAgdGhlIHRyYW5zZm9y
bXMgb250bworICAgIEBwYXJhbSB7T2JqZWN0fSBzZWVuIGEgaGFzaCBvZiBhdHRyaWJ1dGVzIGFs
cmVhZHkgc2VlbgorICAqLworICByZWdpc3RlclNlcmlhbGl6ZXJUcmFuc2Zvcm1zOiBmdW5jdGlv
bihrbGFzcywgc2VyaWFsaXplciwgc2VlbikgeworICAgIHZhciB0cmFuc2Zvcm1zID0ga2xhc3Mu
X3JlZ2lzdGVyZWRUcmFuc2Zvcm1zLCBzdXBlcmNsYXNzLCBwcm9wOworCisgICAgZm9yIChwcm9w
IGluIHRyYW5zZm9ybXMpIHsKKyAgICAgIGlmICghdHJhbnNmb3Jtcy5oYXNPd25Qcm9wZXJ0eShw
cm9wKSB8fCBwcm9wIGluIHNlZW4pIHsgY29udGludWU7IH0KKyAgICAgIHNlZW5bcHJvcF0gPSB0
cnVlOworCisgICAgICBzZXJpYWxpemVyLnJlZ2lzdGVyVHJhbnNmb3JtKHByb3AsIHRyYW5zZm9y
bXNbcHJvcF0pOworICAgIH0KKworICAgIGlmIChzdXBlcmNsYXNzID0ga2xhc3Muc3VwZXJjbGFz
cykgeworICAgICAgdGhpcy5yZWdpc3RlclNlcmlhbGl6ZXJUcmFuc2Zvcm1zKHN1cGVyY2xhc3Ms
IHNlcmlhbGl6ZXIsIHNlZW4pOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQor
CisgICAgVGhpcyBtZXRob2QgcmVjdXJzaXZlbHkgY2xpbWJzIHRoZSBzdXBlcmNsYXNzIGhpZXJh
cmNoeSBhbmQKKyAgICByZWdpc3RlcnMgYW55IGNsYXNzLXJlZ2lzdGVyZWQgbWFwcGluZ3Mgb24g
dGhlIGFkYXB0ZXIncworICAgIHNlcmlhbGl6ZXIuCisKKyAgICBAcGFyYW0ge0NsYXNzfSBrbGFz
cyB0aGUgRFMuQWRhcHRlciBzdWJjbGFzcyB0byBleHRyYWN0IHRoZQorICAgICAgdHJhbnNmb3Jt
cyBmcm9tCisgICAgQHBhcmFtIHtEUy5TZXJpYWxpemVyfSBzZXJpYWxpemVyIHRoZSBzZXJpYWxp
emVyIHRvIHJlZ2lzdGVyIHRoZQorICAgICAgbWFwcGluZ3Mgb250bworICAqLworICByZWdpc3Rl
clNlcmlhbGl6ZXJNYXBwaW5nczogZnVuY3Rpb24oc2VyaWFsaXplcikgeworICAgIHZhciBtYXBw
aW5ncyA9IHRoaXMuX2F0dHJpYnV0ZXNNYXAsCisgICAgICAgIGNvbmZpZ3VyYXRpb25zID0gdGhp
cy5fY29uZmlndXJhdGlvbnNNYXA7CisKKyAgICBtYXBwaW5ncy5mb3JFYWNoKHNlcmlhbGl6ZXIu
bWFwLCBzZXJpYWxpemVyKTsKKyAgICBjb25maWd1cmF0aW9ucy5mb3JFYWNoKHNlcmlhbGl6ZXIu
Y29uZmlndXJlLCBzZXJpYWxpemVyKTsKKyAgfSwKKworICAvKioKKyAgICBUaGUgYGZpbmQoKWAg
bWV0aG9kIGlzIGludm9rZWQgd2hlbiB0aGUgc3RvcmUgaXMgYXNrZWQgZm9yIGEgcmVjb3JkIHRo
YXQKKyAgICBoYXMgbm90IHByZXZpb3VzbHkgYmVlbiBsb2FkZWQuIEluIHJlc3BvbnNlIHRvIGBm
aW5kKClgIGJlaW5nIGNhbGxlZCwgeW91CisgICAgc2hvdWxkIHF1ZXJ5IHlvdXIgcGVyc2lzdGVu
Y2UgbGF5ZXIgZm9yIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElELiBPbmNlCisgICAgZm91bmQs
IHlvdSBjYW4gYXN5bmNocm9ub3VzbHkgY2FsbCB0aGUgc3RvcmUncyBgbG9hZCgpYCBtZXRob2Qg
dG8gbG9hZAorICAgIHRoZSByZWNvcmQuCisKKyAgICBIZXJlIGlzIGFuIGV4YW1wbGUgYGZpbmRg
IGltcGxlbWVudGF0aW9uOgorCisgICAgICBmaW5kOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWQp
IHsKKyAgICAgICAgdmFyIHVybCA9IHR5cGUudXJsOworICAgICAgICB1cmwgPSB1cmwuZm10KGlk
KTsKKworICAgICAgICBqUXVlcnkuZ2V0SlNPTih1cmwsIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAg
ICAgICAgIC8vIGRhdGEgaXMgYSBoYXNoIG9mIGtleS92YWx1ZSBwYWlycy4gSWYgeW91ciBzZXJ2
ZXIgcmV0dXJucyBhCisgICAgICAgICAgICAvLyByb290LCBzaW1wbHkgZG8gc29tZXRoaW5nIGxp
a2U6CisgICAgICAgICAgICAvLyBzdG9yZS5sb2FkKHR5cGUsIGlkLCBkYXRhLnBlcnNvbikKKyAg
ICAgICAgICAgIHN0b3JlLmxvYWQodHlwZSwgaWQsIGRhdGEpOworICAgICAgICB9KTsKKyAgICAg
IH0KKyAgKi8KKyAgZmluZDogbnVsbCwKKworICBzZXJpYWxpemVyOiBEUy5KU09OU2VyaWFsaXpl
ciwKKworICByZWdpc3RlclRyYW5zZm9ybTogZnVuY3Rpb24oYXR0cmlidXRlVHlwZSwgdHJhbnNm
b3JtKSB7CisgICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJykucmVnaXN0ZXJUcmFuc2Zvcm0oYXR0
cmlidXRlVHlwZSwgdHJhbnNmb3JtKTsKKyAgfSwKKworICAvKioKKyAgICBBIHB1YmxpYyBtZXRo
b2QgdGhhdCBhbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGFuIGVudW1lcmF0ZWQgCisgICAgdHlwZSBv
biB5b3VyIGFkYXB0ZXIuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1dGlsaXplCisg
ICAgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgdmFsdWUuCisKKyAgICBFZzog
U2F5IHlvdSB3YW50IHRvIHV0aWxpemUgImxvdyIsIm1lZGl1bSIsImhpZ2giIHRleHQgc3RyaW5n
cworICAgIGluIHlvdXIgYXBwLCBidXQgeW91IHdhbnQgdG8gcGVyc2lzdCB0aG9zZSBhcyAwLDEs
MiBpbiB5b3VyIGJhY2tlbmQuCisgICAgWW91IHdvdWxkIGZpcnN0IHJlZ2lzdGVyIHRoZSB0cmFu
c2Zvcm0gb24geW91ciBhZGFwdGVyIGluc3RhbmNlOgorCisgICAgYWRhcHRlci5yZWdpc3RlckVu
dW1UcmFuc2Zvcm0oJ3ByaW9yaXR5JywgWydsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnXSk7CisKKyAg
ICBZb3Ugd291bGQgdGhlbiByZWZlciB0byB0aGUgJ3ByaW9yaXR5JyBEUy5hdHRyIGluIHlvdXIg
bW9kZWw6CisgICAgQXBwLlRhc2sgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAgcHJpb3JpdHk6
IERTLmF0dHIoJ3ByaW9yaXR5JykgCisgICAgfSk7CisKKyAgICBBbmQgbGFzdGx5LCB5b3Ugd291
bGQgc2V0L2dldCB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvbiB5b3VyIG1vZGVsIGluc3RhbmNl
LAorICAgIGJ1dCB0aGUgdHJhbnNmb3JtZWQgcmVzdWx0IHdpbGwgYmUgdGhlIGluZGV4IG51bWJl
ciBvZiB0aGUgdHlwZS4KKworICAgIEFwcDogICBteVRhc2suZ2V0KCdwcmlvcml0eScpID0+ICds
b3cnCisgICAgU2VydmVyIFJlc3BvbnNlIC8gTG9hZDogIHsgbXlUYXNrOiB7cHJpb3JpdHk6IDB9
IH0KKworICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIG9mIHRoZSB0cmFuc2Zvcm0KKyAgICBAcGFy
YW0ge0FycmF5fSBhcnJheSBvZiBTdHJpbmcgb2JqZWN0cyB0byB1c2UgZm9yIHRoZSBlbnVtZXJh
dGVkIHZhbHVlcy4gIAorICAgICAgVGhpcyBpcyBhbiBvcmRlcmVkIGxpc3QgYW5kIHRoZSBpbmRl
eCB2YWx1ZXMgd2lsbCBiZSB1c2VkIGZvciB0aGUgdHJhbnNmb3JtLgorICAqLworICByZWdpc3Rl
ckVudW1UcmFuc2Zvcm06IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUsIG9iamVjdHMpIHsKKyAgICBn
ZXQodGhpcywgJ3NlcmlhbGl6ZXInKS5yZWdpc3RlckVudW1UcmFuc2Zvcm0oYXR0cmlidXRlVHlw
ZSwgb2JqZWN0cyk7CisgIH0sCisKKyAgLyoqCisgICAgSWYgdGhlIGdsb2JhbGx5IHVuaXF1ZSBJ
RHMgZm9yIHlvdXIgcmVjb3JkcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9uIHRoZSBjbGllbnQsCisg
ICAgaW1wbGVtZW50IHRoZSBgZ2VuZXJhdGVJZEZvclJlY29yZCgpYCBtZXRob2QuIFRoaXMgbWV0
aG9kIHdpbGwgYmUgaW52b2tlZAorICAgIGVhY2ggdGltZSB5b3UgY3JlYXRlIGEgbmV3IHJlY29y
ZCwgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGl0IHdpbGwgYmUKKyAgICBhc3NpZ25lZCB0
byB0aGUgcmVjb3JkJ3MgYHByaW1hcnlLZXlgLgorCisgICAgTW9zdCB0cmFkaXRpb25hbCBSRVNU
LWxpa2UgSFRUUCBBUElzIHdpbGwgbm90IHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCwgdGhlIElE
CisgICAgb2YgdGhlIHJlY29yZCB3aWxsIGJlIHNldCBieSB0aGUgc2VydmVyLCBhbmQgeW91ciBh
ZGFwdGVyIHdpbGwgdXBkYXRlIHRoZSBzdG9yZQorICAgIHdpdGggdGhlIG5ldyBJRCB3aGVuIGl0
IGNhbGxzIGBkaWRDcmVhdGVSZWNvcmQoKWAuIE9ubHkgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlm
CisgICAgeW91IGludGVuZCB0byBnZW5lcmF0ZSByZWNvcmQgSURzIG9uIHRoZSBjbGllbnQtc2lk
ZS4KKworICAgIFRoZSBgZ2VuZXJhdGVJZEZvclJlY29yZCgpYCBtZXRob2Qgd2lsbCBiZSBpbnZv
a2VkIHdpdGggdGhlIHJlcXVlc3Rpbmcgc3RvcmUgYXMKKyAgICB0aGUgZmlyc3QgcGFyYW1ldGVy
IGFuZCB0aGUgbmV3bHkgY3JlYXRlZCByZWNvcmQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXI6CisK
KyAgICAgICAgZ2VuZXJhdGVJZEZvclJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCkgewor
ICAgICAgICAgIHZhciB1dWlkID0gQXBwLmdlbmVyYXRlVVVJRFdpdGhTdGF0aXN0aWNhbGx5TG93
T2Rkc09mQ29sbGlzaW9uKCk7CisgICAgICAgICAgcmV0dXJuIHV1aWQ7CisgICAgICAgIH0KKyAg
Ki8KKyAgZ2VuZXJhdGVJZEZvclJlY29yZDogbnVsbCwKKworICBtYXRlcmlhbGl6ZTogZnVuY3Rp
b24ocmVjb3JkLCBkYXRhLCBwcmVtYXRlcmlhbGl6ZWQpIHsKKyAgICBnZXQodGhpcywgJ3Nlcmlh
bGl6ZXInKS5tYXRlcmlhbGl6ZShyZWNvcmQsIGRhdGEsIHByZW1hdGVyaWFsaXplZCk7CisgIH0s
CisKKyAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKKyAgICByZXR1cm4g
Z2V0KHRoaXMsICdzZXJpYWxpemVyJykuc2VyaWFsaXplKHJlY29yZCwgb3B0aW9ucyk7CisgIH0s
CisKKyAgZXh0cmFjdElkOiBmdW5jdGlvbih0eXBlLCBkYXRhKSB7CisgICAgcmV0dXJuIGdldCh0
aGlzLCAnc2VyaWFsaXplcicpLmV4dHJhY3RJZCh0eXBlLCBkYXRhKTsKKyAgfSwKKworICBncm91
cEJ5VHlwZTogZnVuY3Rpb24oZW51bWVyYWJsZSkgeworICAgIHZhciBtYXAgPSBFbWJlci5NYXBX
aXRoRGVmYXVsdC5jcmVhdGUoeworICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0
dXJuIEVtYmVyLk9yZGVyZWRTZXQuY3JlYXRlKCk7IH0KKyAgICB9KTsKKworICAgIGVudW1lcmFi
bGUuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CisgICAgICBtYXAuZ2V0KGl0ZW0uY29uc3RydWN0
b3IpLmFkZChpdGVtKTsKKyAgICB9KTsKKworICAgIHJldHVybiBtYXA7CisgIH0sCisKKyAgY29t
bWl0OiBmdW5jdGlvbihzdG9yZSwgY29tbWl0RGV0YWlscykgeworICAgIHRoaXMuc2F2ZShzdG9y
ZSwgY29tbWl0RGV0YWlscyk7CisgIH0sCisKKyAgc2F2ZTogZnVuY3Rpb24oc3RvcmUsIGNvbW1p
dERldGFpbHMpIHsKKyAgICB2YXIgYWRhcHRlciA9IHRoaXM7CisKKyAgICBmdW5jdGlvbiBmaWx0
ZXIocmVjb3JkcykgeworICAgICAgdmFyIGZpbHRlcmVkU2V0ID0gRW1iZXIuT3JkZXJlZFNldC5j
cmVhdGUoKTsKKworICAgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgeworICAg
ICAgICBpZiAoYWRhcHRlci5zaG91bGRTYXZlKHJlY29yZCkpIHsKKyAgICAgICAgICBmaWx0ZXJl
ZFNldC5hZGQocmVjb3JkKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiBm
aWx0ZXJlZFNldDsKKyAgICB9CisKKyAgICB0aGlzLmdyb3VwQnlUeXBlKGNvbW1pdERldGFpbHMu
Y3JlYXRlZCkuZm9yRWFjaChmdW5jdGlvbih0eXBlLCBzZXQpIHsKKyAgICAgIHRoaXMuY3JlYXRl
UmVjb3JkcyhzdG9yZSwgdHlwZSwgZmlsdGVyKHNldCkpOworICAgIH0sIHRoaXMpOworCisgICAg
dGhpcy5ncm91cEJ5VHlwZShjb21taXREZXRhaWxzLnVwZGF0ZWQpLmZvckVhY2goZnVuY3Rpb24o
dHlwZSwgc2V0KSB7CisgICAgICB0aGlzLnVwZGF0ZVJlY29yZHMoc3RvcmUsIHR5cGUsIGZpbHRl
cihzZXQpKTsKKyAgICB9LCB0aGlzKTsKKworICAgIHRoaXMuZ3JvdXBCeVR5cGUoY29tbWl0RGV0
YWlscy5kZWxldGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUsIHNldCkgeworICAgICAgdGhpcy5k
ZWxldGVSZWNvcmRzKHN0b3JlLCB0eXBlLCBmaWx0ZXIoc2V0KSk7CisgICAgfSwgdGhpcyk7Cisg
IH0sCisKKyAgc2hvdWxkU2F2ZTogRW1iZXIuSywKKworICBjcmVhdGVSZWNvcmRzOiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgcmVjb3JkcykgeworICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihy
ZWNvcmQpIHsKKyAgICAgIHRoaXMuY3JlYXRlUmVjb3JkKHN0b3JlLCB0eXBlLCByZWNvcmQpOwor
ICAgIH0sIHRoaXMpOworICB9LAorCisgIHVwZGF0ZVJlY29yZHM6IGZ1bmN0aW9uKHN0b3JlLCB0
eXBlLCByZWNvcmRzKSB7CisgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgewor
ICAgICAgdGhpcy51cGRhdGVSZWNvcmQoc3RvcmUsIHR5cGUsIHJlY29yZCk7CisgICAgfSwgdGhp
cyk7CisgIH0sCisKKyAgZGVsZXRlUmVjb3JkczogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29y
ZHMpIHsKKyAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICB0aGlz
LmRlbGV0ZVJlY29yZChzdG9yZSwgdHlwZSwgcmVjb3JkKTsKKyAgICB9LCB0aGlzKTsKKyAgfSwK
KworICBmaW5kTWFueTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlkcykgeworICAgIGlkcy5mb3JF
YWNoKGZ1bmN0aW9uKGlkKSB7CisgICAgICB0aGlzLmZpbmQoc3RvcmUsIHR5cGUsIGlkKTsKKyAg
ICB9LCB0aGlzKTsKKyAgfQorfSk7CisKK0RTLkFkYXB0ZXIucmVvcGVuQ2xhc3MoeworICByZWdp
c3RlclRyYW5zZm9ybTogZnVuY3Rpb24oYXR0cmlidXRlVHlwZSwgdHJhbnNmb3JtKSB7CisgICAg
dmFyIHJlZ2lzdGVyZWRUcmFuc2Zvcm1zID0gdGhpcy5fcmVnaXN0ZXJlZFRyYW5zZm9ybXMgfHwg
e307CisKKyAgICByZWdpc3RlcmVkVHJhbnNmb3Jtc1thdHRyaWJ1dGVUeXBlXSA9IHRyYW5zZm9y
bTsKKworICAgIHRoaXMuX3JlZ2lzdGVyZWRUcmFuc2Zvcm1zID0gcmVnaXN0ZXJlZFRyYW5zZm9y
bXM7CisgIH0sCisKKyAgbWFwOiBEUy5fTWFwcGFibGUuZ2VuZXJhdGVNYXBGdW5jdGlvbkZvcign
YXR0cmlidXRlcycsIGZ1bmN0aW9uKGtleSwgbmV3VmFsdWUsIG1hcCkgeworICAgIHZhciBleGlz
dGluZ1ZhbHVlID0gbWFwLmdldChrZXkpOworCisgICAgbWVyZ2UoZXhpc3RpbmdWYWx1ZSwgbmV3
VmFsdWUpOworICB9KSwKKworICBjb25maWd1cmU6IERTLl9NYXBwYWJsZS5nZW5lcmF0ZU1hcEZ1
bmN0aW9uRm9yKCdjb25maWd1cmF0aW9ucycsIGZ1bmN0aW9uKGtleSwgbmV3VmFsdWUsIG1hcCkg
eworICAgIHZhciBleGlzdGluZ1ZhbHVlID0gbWFwLmdldChrZXkpOworCisgICAgLy8gSWYgYSBt
YXBwaW5nIGNvbmZpZ3VyYXRpb24gaXMgcHJvdmlkZWQsIHBlZWwgaXQgb2ZmIGFuZCBhcHBseSBp
dAorICAgIC8vIHVzaW5nIHRoZSBEUy5BZGFwdGVyLm1hcCBBUEkuCisgICAgdmFyIG1hcHBpbmdz
ID0gbmV3VmFsdWUgJiYgbmV3VmFsdWUubWFwcGluZ3M7CisgICAgaWYgKG1hcHBpbmdzKSB7Cisg
ICAgICB0aGlzLm1hcChrZXksIG1hcHBpbmdzKTsKKyAgICAgIGRlbGV0ZSBuZXdWYWx1ZS5tYXBw
aW5nczsKKyAgICB9CisKKyAgICBtZXJnZShleGlzdGluZ1ZhbHVlLCBuZXdWYWx1ZSk7CisgIH0p
LAorCisgIHJlc29sdmVNYXBDb25mbGljdDogZnVuY3Rpb24ob2xkVmFsdWUsIG5ld1ZhbHVlLCBt
YXBwaW5nc0tleSkgeworICAgIG1lcmdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7CisKKyAgICByZXR1
cm4gbmV3VmFsdWU7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFy
IGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworCitEUy5GaXh0dXJlU2VyaWFsaXpl
ciA9IERTLlNlcmlhbGl6ZXIuZXh0ZW5kKHsKKyAgZGVzZXJpYWxpemVWYWx1ZTogZnVuY3Rpb24o
dmFsdWUsIGF0dHJpYnV0ZVR5cGUpIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0sCisKKyAgc2Vy
aWFsaXplVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyaWJ1dGVUeXBlKSB7CisgICAgcmV0dXJu
IHZhbHVlOworICB9LAorCisgIGFkZElkOiBmdW5jdGlvbihkYXRhLCBrZXksIGlkKSB7CisgICAg
ZGF0YVtrZXldID0gaWQ7CisgIH0sCisKKyAgYWRkQXR0cmlidXRlOiBmdW5jdGlvbihoYXNoLCBr
ZXksIHZhbHVlKSB7CisgICAgaGFzaFtrZXldID0gdmFsdWU7CisgIH0sCisKKyAgYWRkQmVsb25n
c1RvOiBmdW5jdGlvbihoYXNoLCByZWNvcmQsIGtleSwgcmVsYXRpb25zaGlwKSB7CisgICAgdmFy
IGlkID0gZ2V0KHJlY29yZCwgcmVsYXRpb25zaGlwLmtleSsnLmlkJyk7CisgICAgaWYgKCFFbWJl
ci5pc05vbmUoaWQpKSB7IGhhc2hba2V5XSA9IGlkOyB9CisgIH0sCisKKyAgYWRkSGFzTWFueTog
ZnVuY3Rpb24oaGFzaCwgcmVjb3JkLCBrZXksIHJlbGF0aW9uc2hpcCkgeworICAgIHZhciBpZHMg
PSBnZXQocmVjb3JkLCByZWxhdGlvbnNoaXAua2V5KS5tYXAoZnVuY3Rpb24oaXRlbSkgeworICAg
ICAgcmV0dXJuIGl0ZW0uZ2V0KCdpZCcpOworICAgIH0pOworCisgICAgaGFzaFtyZWxhdGlvbnNo
aXAua2V5XSA9IGlkczsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorCisgICAgQ3JlYXRl
cyBhbiBlbXB0eSBoYXNoIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGhvb2tzIGNhbGxl
ZCBmcm9tIHRoZQorICAgIGBzZXJpYWxpemUoKWAgbWV0aG9kLgorCisgICAgQHJldHVybiB7T2Jq
ZWN0fQorICAqLworICBjcmVhdGVTZXJpYWxpemVkRm9ybTogZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuIHt9OworICB9LAorCisgIGV4dHJhY3Q6IGZ1bmN0aW9uKGxvYWRlciwgZml4dHVyZSwgdHlw
ZSwgcmVjb3JkKSB7CisgICAgaWYgKHJlY29yZCkgeyBsb2FkZXIudXBkYXRlSWQocmVjb3JkLCBm
aXh0dXJlKTsgfQorICAgIHRoaXMuZXh0cmFjdFJlY29yZFJlcHJlc2VudGF0aW9uKGxvYWRlciwg
dHlwZSwgZml4dHVyZSk7CisgIH0sCisKKyAgZXh0cmFjdE1hbnk6IGZ1bmN0aW9uKGxvYWRlciwg
Zml4dHVyZXMsIHR5cGUsIHJlY29yZHMpIHsKKyAgICB2YXIgb2JqZWN0cyA9IGZpeHR1cmVzLCBy
ZWZlcmVuY2VzID0gW107CisgICAgaWYgKHJlY29yZHMpIHsgcmVjb3JkcyA9IHJlY29yZHMudG9B
cnJheSgpOyB9CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKysp
IHsKKyAgICAgIGlmIChyZWNvcmRzKSB7IGxvYWRlci51cGRhdGVJZChyZWNvcmRzW2ldLCBvYmpl
Y3RzW2ldKTsgfQorICAgICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMuZXh0cmFjdFJlY29yZFJlcHJl
c2VudGF0aW9uKGxvYWRlciwgdHlwZSwgb2JqZWN0c1tpXSk7CisgICAgICByZWZlcmVuY2VzLnB1
c2gocmVmZXJlbmNlKTsKKyAgICB9CisKKyAgICBsb2FkZXIucG9wdWxhdGVBcnJheShyZWZlcmVu
Y2VzKTsKKyAgfSwKKworICBleHRyYWN0SWQ6IGZ1bmN0aW9uKHR5cGUsIGhhc2gpIHsKKyAgICB2
YXIgcHJpbWFyeUtleSA9IHRoaXMuX3ByaW1hcnlLZXkodHlwZSk7CisKKyAgICBpZiAoaGFzaC5o
YXNPd25Qcm9wZXJ0eShwcmltYXJ5S2V5KSkgeworICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY29l
cmNlIElEcyB0byBzdHJpbmdzIHNvIHRoYXQgcmVjb3JkCisgICAgICAvLyBJRHMgcmVtYWluIGNv
bnNpc3RlbnQgYmV0d2VlbiBhcHBsaWNhdGlvbiBydW5zOyBlc3BlY2lhbGx5CisgICAgICAvLyBp
ZiB0aGUgSUQgaXMgc2VyaWFsaXplZCBhbmQgbGF0ZXIgZGVzZXJpYWxpemVkIGZyb20gdGhlIFVS
TCwKKyAgICAgIC8vIHdoZW4gdHlwZSBpbmZvcm1hdGlvbiB3aWxsIGhhdmUgYmVlbiBsb3N0Lgor
ICAgICAgcmV0dXJuIGhhc2hbcHJpbWFyeUtleV0rJyc7CisgICAgfSBlbHNlIHsKKyAgICAgIHJl
dHVybiBudWxsOworICAgIH0KKyAgfSwKKworICBleHRyYWN0QXR0cmlidXRlOiBmdW5jdGlvbih0
eXBlLCBoYXNoLCBhdHRyaWJ1dGVOYW1lKSB7CisgICAgdmFyIGtleSA9IHRoaXMuX2tleUZvckF0
dHJpYnV0ZU5hbWUodHlwZSwgYXR0cmlidXRlTmFtZSk7CisgICAgcmV0dXJuIGhhc2hba2V5XTsK
KyAgfSwKKworICBleHRyYWN0SGFzTWFueTogZnVuY3Rpb24odHlwZSwgaGFzaCwga2V5KSB7Cisg
ICAgcmV0dXJuIGhhc2hba2V5XTsKKyAgfSwKKworICBleHRyYWN0QmVsb25nc1RvOiBmdW5jdGlv
bih0eXBlLCBoYXNoLCBrZXkpIHsKKyAgICByZXR1cm4gaGFzaFtrZXldOworICB9Cit9KTsKKwor
fSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBnZXQgPSBFbWJlci5nZXQsIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQ7CisKKy8qKgorICBgRFMuRml4dHVyZUFkYXB0ZXJgIGlzIGFuIGFkYXB0
ZXIgdGhhdCBsb2FkcyByZWNvcmRzIGZyb20gbWVtb3J5LgorICBJdHMgcHJpbWFyaWx5IHVzZWQg
Zm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nLiBZb3UgY2FuIGFsc28gdXNlCisgIGBEUy5GaXh0
dXJlQWRhcHRlcmAgd2hpbGUgd29ya2luZyBvbiB0aGUgQVBJIGJ1dCBhcmUgbm90IHJlYWR5IHRv
CisgIGludGVncmF0ZSB5ZXQuIEl0IGlzIGEgZnVsbHkgZnVuY3Rpb25pbmcgYWRhcHRlci4gQWxs
IENSVUQgbWV0aG9kcworICBhcmUgaW1wbGVtZW50ZWQuIFlvdSBjYW4gYWxzbyBpbXBsZW1lbnQg
cXVlcnkgbG9naWMgdGhhdCBhIHJlbW90ZQorICBzeXN0ZW0gd291bGQgZG8uIEl0cyBwb3NzaWJs
ZSB0byBkbyBkZXZlbG9wIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uCisgIHdpdGggYERTLkZpeHR1
cmVBZGFwdGVyYC4KKworKi8KK0RTLkZpeHR1cmVBZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQo
eworCisgIHNpbXVsYXRlUmVtb3RlUmVzcG9uc2U6IHRydWUsCisKKyAgbGF0ZW5jeTogNTAsCisK
KyAgc2VyaWFsaXplcjogRFMuRml4dHVyZVNlcmlhbGl6ZXIsCisKKyAgLyoKKyAgICBJbXBsZW1l
bnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBh
IHR5cGUKKyAgKi8KKyAgZml4dHVyZXNGb3JUeXBlOiBmdW5jdGlvbih0eXBlKSB7CisgICAgaWYg
KHR5cGUuRklYVFVSRVMpIHsKKyAgICAgIHZhciBmaXh0dXJlcyA9IEVtYmVyLkEodHlwZS5GSVhU
VVJFUyk7CisgICAgICByZXR1cm4gZml4dHVyZXMubWFwKGZ1bmN0aW9uKGZpeHR1cmUpeworICAg
ICAgICBpZighZml4dHVyZS5pZCl7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZtdCgndGhl
IGlkIHByb3BlcnR5IG11c3QgYmUgZGVmaW5lZCBmb3IgZml4dHVyZSAlQCcsIFtmaXh0dXJlXSkp
OworICAgICAgICB9CisgICAgICAgIGZpeHR1cmUuaWQgPSBmaXh0dXJlLmlkICsgJyc7CisgICAg
ICAgIHJldHVybiBmaXh0dXJlOworICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiBudWxsOwor
ICB9LAorCisgIC8qCisgICAgSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHF1ZXJ5
IGZpeHR1cmVzIGRhdGEKKyAgKi8KKyAgcXVlcnlGaXh0dXJlczogZnVuY3Rpb24oZml4dHVyZXMs
IHF1ZXJ5LCB0eXBlKSB7CisgICAgRW1iZXIuYXNzZXJ0KCdOb3QgaW1wbGVtZW50ZWQ6IFlvdSBt
dXN0IG92ZXJyaWRlIHRoZSBEUy5GaXh0dXJlQWRhcHRlcjo6cXVlcnlGaXh0dXJlcyBtZXRob2Qg
dG8gc3VwcG9ydCBxdWVyeWluZyB0aGUgZml4dHVyZSBzdG9yZS4nKTsKKyAgfSwKKworICB1cGRh
dGVGaXh0dXJlczogZnVuY3Rpb24odHlwZSwgZml4dHVyZSkgeworICAgIGlmKCF0eXBlLkZJWFRV
UkVTKSB7CisgICAgICB0eXBlLkZJWFRVUkVTID0gW107CisgICAgfQorCisgICAgdmFyIGZpeHR1
cmVzID0gdHlwZS5GSVhUVVJFUzsKKworICAgIHRoaXMuZGVsZXRlTG9hZGVkRml4dHVyZSh0eXBl
LCBmaXh0dXJlKTsKKworICAgIGZpeHR1cmVzLnB1c2goZml4dHVyZSk7CisgIH0sCisKKyAgLyoK
KyAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBwcm92aWRlIGpz
b24gZm9yIENSVUQgbWV0aG9kcworICAqLworICBtb2NrSlNPTjogZnVuY3Rpb24odHlwZSwgcmVj
b3JkKSB7CisgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRy
dWUgfSk7CisgIH0sCisKKyAgLyoKKyAgICBBZGFwdGVyIG1ldGhvZHMKKyAgKi8KKyAgZ2VuZXJh
dGVJZEZvclJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCkgeworICAgIHJldHVybiBFbWJl
ci5ndWlkRm9yKHJlY29yZCk7CisgIH0sCisKKyAgZmluZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUs
IGlkKSB7CisgICAgdmFyIGZpeHR1cmVzID0gdGhpcy5maXh0dXJlc0ZvclR5cGUodHlwZSksCisg
ICAgICAgIGZpeHR1cmU7CisKKyAgICBFbWJlci53YXJuKCJVbmFibGUgdG8gZmluZCBmaXh0dXJl
cyBmb3IgbW9kZWwgdHlwZSAiICsgdHlwZS50b1N0cmluZygpLCBmaXh0dXJlcyk7CisKKyAgICBp
ZiAoZml4dHVyZXMpIHsKKyAgICAgIGZpeHR1cmUgPSBFbWJlci5BKGZpeHR1cmVzKS5maW5kUHJv
cGVydHkoJ2lkJywgaWQpOworICAgIH0KKworICAgIGlmIChmaXh0dXJlKSB7CisgICAgICB0aGlz
LnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5kaWRGaW5kUmVj
b3JkKHN0b3JlLCB0eXBlLCBmaXh0dXJlLCBpZCk7CisgICAgICB9LCB0aGlzKTsKKyAgICB9Cisg
IH0sCisKKyAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZHMpIHsKKyAgICB2YXIg
Zml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsKKworICAgIEVtYmVyLmFzc2Vy
dCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5n
KCksICEhZml4dHVyZXMpOworCisgICAgaWYgKGZpeHR1cmVzKSB7CisgICAgICBmaXh0dXJlcyA9
IGZpeHR1cmVzLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7CisgICAgICAgIHJldHVybiBpZHMuaW5k
ZXhPZihpdGVtLmlkKSAhPT0gLTE7CisgICAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoZml4dHVy
ZXMpIHsKKyAgICAgIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgeworICAgICAg
ICB0aGlzLmRpZEZpbmRNYW55KHN0b3JlLCB0eXBlLCBmaXh0dXJlcyk7CisgICAgICB9LCB0aGlz
KTsKKyAgICB9CisgIH0sCisKKyAgZmluZEFsbDogZnVuY3Rpb24oc3RvcmUsIHR5cGUpIHsKKyAg
ICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsKKworICAgIEVtYmVy
LmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRv
U3RyaW5nKCksICEhZml4dHVyZXMpOworCisgICAgdGhpcy5zaW11bGF0ZVJlbW90ZUNhbGwoZnVu
Y3Rpb24oKSB7CisgICAgICB0aGlzLmRpZEZpbmRBbGwoc3RvcmUsIHR5cGUsIGZpeHR1cmVzKTsK
KyAgICB9LCB0aGlzKTsKKyAgfSwKKworICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl
LCBxdWVyeSwgYXJyYXkpIHsKKyAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlw
ZSh0eXBlKTsKKworICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9y
IG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksICEhZml4dHVyZXMpOworCisgICAgZml4dHVy
ZXMgPSB0aGlzLnF1ZXJ5Rml4dHVyZXMoZml4dHVyZXMsIHF1ZXJ5LCB0eXBlKTsKKworICAgIGlm
IChmaXh0dXJlcykgeworICAgICAgdGhpcy5zaW11bGF0ZVJlbW90ZUNhbGwoZnVuY3Rpb24oKSB7
CisgICAgICAgIHRoaXMuZGlkRmluZFF1ZXJ5KHN0b3JlLCB0eXBlLCBmaXh0dXJlcywgYXJyYXkp
OworICAgICAgfSwgdGhpcyk7CisgICAgfQorICB9LAorCisgIGNyZWF0ZVJlY29yZDogZnVuY3Rp
b24oc3RvcmUsIHR5cGUsIHJlY29yZCkgeworICAgIHZhciBmaXh0dXJlID0gdGhpcy5tb2NrSlNP
Tih0eXBlLCByZWNvcmQpOworCisgICAgdGhpcy51cGRhdGVGaXh0dXJlcyh0eXBlLCBmaXh0dXJl
KTsKKworICAgIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgeworICAgICAgdGhp
cy5kaWRDcmVhdGVSZWNvcmQoc3RvcmUsIHR5cGUsIHJlY29yZCwgZml4dHVyZSk7CisgICAgfSwg
dGhpcyk7CisgIH0sCisKKyAgdXBkYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVj
b3JkKSB7CisgICAgdmFyIGZpeHR1cmUgPSB0aGlzLm1vY2tKU09OKHR5cGUsIHJlY29yZCk7CisK
KyAgICB0aGlzLnVwZGF0ZUZpeHR1cmVzKHR5cGUsIGZpeHR1cmUpOworCisgICAgdGhpcy5zaW11
bGF0ZVJlbW90ZUNhbGwoZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmRpZFVwZGF0ZVJlY29yZChz
dG9yZSwgdHlwZSwgcmVjb3JkLCBmaXh0dXJlKTsKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICBk
ZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKKyAgICB2YXIgZml4
dHVyZSA9IHRoaXMubW9ja0pTT04odHlwZSwgcmVjb3JkKTsKKworICAgIHRoaXMuZGVsZXRlTG9h
ZGVkRml4dHVyZSh0eXBlLCBmaXh0dXJlKTsKKworICAgIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxs
KGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5kaWREZWxldGVSZWNvcmQoc3RvcmUsIHR5cGUsIHJl
Y29yZCk7CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgLyoKKyAgICBAcHJpdmF0ZQorICAqLwor
IGRlbGV0ZUxvYWRlZEZpeHR1cmU6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkgeworICAgIHZhciBp
ZCA9IHRoaXMuZXh0cmFjdElkKHR5cGUsIHJlY29yZCk7CisKKyAgICB2YXIgZXhpc3RpbmdGaXh0
dXJlID0gdGhpcy5maW5kRXhpc3RpbmdGaXh0dXJlKHR5cGUsIHJlY29yZCk7CisKKyAgICBpZihl
eGlzdGluZ0ZpeHR1cmUpIHsKKyAgICAgIHZhciBpbmRleCA9IHR5cGUuRklYVFVSRVMuaW5kZXhP
ZihleGlzdGluZ0ZpeHR1cmUpOworICAgICAgdHlwZS5GSVhUVVJFUy5zcGxpY2UoaW5kZXgsIDEp
OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9LAorCisgIGZpbmRFeGlzdGluZ0ZpeHR1
cmU6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkgeworICAgIHZhciBmaXh0dXJlcyA9IHRoaXMuZml4
dHVyZXNGb3JUeXBlKHR5cGUpOworICAgIHZhciBpZCA9IHRoaXMuZXh0cmFjdElkKHR5cGUsIHJl
Y29yZCk7CisKKyAgICByZXR1cm4gdGhpcy5maW5kRml4dHVyZUJ5SWQoZml4dHVyZXMsIGlkKTsK
KyAgfSwKKworICBmaW5kRml4dHVyZUJ5SWQ6IGZ1bmN0aW9uKGZpeHR1cmVzLCBpZCkgeworICAg
IHZhciBhZGFwdGVyID0gdGhpczsKKworICAgIHJldHVybiBFbWJlci5BKGZpeHR1cmVzKS5maW5k
KGZ1bmN0aW9uKHIpIHsKKyAgICAgIGlmKCcnK2dldChyLCAnaWQnKSA9PT0gJycraWQpIHsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICB9CisgICAgfSk7CisgIH0sCisKKyAgc2ltdWxhdGVSZW1vdGVDYWxsOiBmdW5jdGlv
bihjYWxsYmFjaywgY29udGV4dCkgeworICAgIGlmIChnZXQodGhpcywgJ3NpbXVsYXRlUmVtb3Rl
UmVzcG9uc2UnKSkgeworICAgICAgLy8gU2NoZWR1bGUgd2l0aCBzZXRUaW1lb3V0CisgICAgICBF
bWJlci5ydW4ubGF0ZXIoY29udGV4dCwgY2FsbGJhY2ssIGdldCh0aGlzLCAnbGF0ZW5jeScpKTsK
KyAgICB9IGVsc2UgeworICAgICAgLy8gQXN5bmNocm9ub3VzLCBidXQgYXQgdGhlIG9mIHRoZSBy
dW5sb29wIHdpdGggemVybyBsYXRlbmN5CisgICAgICBFbWJlci5ydW4ub25jZShjb250ZXh0LCBj
YWxsYmFjayk7CisgICAgfQorICB9Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsK
K0RTLlJFU1RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKKyAga2V5Rm9y
QXR0cmlidXRlTmFtZTogZnVuY3Rpb24odHlwZSwgbmFtZSkgeworICAgIHJldHVybiBFbWJlci5T
dHJpbmcuZGVjYW1lbGl6ZShuYW1lKTsKKyAgfSwKKworICBrZXlGb3JCZWxvbmdzVG86IGZ1bmN0
aW9uKHR5cGUsIG5hbWUpIHsKKyAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGVOYW1l
KHR5cGUsIG5hbWUpOworCisgICAgaWYgKHRoaXMuZW1iZWRkZWRUeXBlKHR5cGUsIG5hbWUpKSB7
CisgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHJldHVybiBrZXkgKyAiX2lkIjsKKyAg
fSwKKworICBrZXlGb3JIYXNNYW55OiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7CisgICAgdmFyIGtl
eSA9IHRoaXMua2V5Rm9yQXR0cmlidXRlTmFtZSh0eXBlLCBuYW1lKTsKKworICAgIGlmICh0aGlz
LmVtYmVkZGVkVHlwZSh0eXBlLCBuYW1lKSkgeworICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisK
KyAgICByZXR1cm4gdGhpcy5zaW5ndWxhcml6ZShrZXkpICsgIl9pZHMiOworICB9Cit9KTsKKwor
fSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFsIGpRdWVyeSovCisKK3ZhciBnZXQg
PSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgbWVyZ2UgPSBFbWJlci5tZXJnZTsKKworLyoq
CisgIFRoZSBSRVNUIGFkYXB0ZXIgYWxsb3dzIHlvdXIgc3RvcmUgdG8gY29tbXVuaWNhdGUgd2l0
aCBhbiBIVFRQIHNlcnZlciBieQorICB0cmFuc21pdHRpbmcgSlNPTiB2aWEgWEhSLiBNb3N0IEVt
YmVyLmpzIGFwcHMgdGhhdCBjb25zdW1lIGEgSlNPTiBBUEkKKyAgc2hvdWxkIHVzZSB0aGUgUkVT
VCBhZGFwdGVyLgorCisgIFRoaXMgYWRhcHRlciBpcyBkZXNpZ25lZCBhcm91bmQgdGhlIGlkZWEg
dGhhdCB0aGUgSlNPTiBleGNoYW5nZWQgd2l0aAorICB0aGUgc2VydmVyIHNob3VsZCBiZSBjb252
ZW50aW9uYWwuCisKKyAgIyMgSlNPTiBTdHJ1Y3R1cmUKKworICBUaGUgUkVTVCBhZGFwdGVyIGV4
cGVjdHMgdGhlIEpTT04gcmV0dXJuZWQgZnJvbSB5b3VyIHNlcnZlciB0byBmb2xsb3cKKyAgdGhl
c2UgY29udmVudGlvbnMuCisKKyAgIyMjIE9iamVjdCBSb290CisKKyAgVGhlIEpTT04gcGF5bG9h
ZCBzaG91bGQgYmUgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlY29yZCBpbnNpZGUgYQor
ICByb290IHByb3BlcnR5LiBGb3IgZXhhbXBsZSwgaW4gcmVzcG9uc2UgdG8gYSBgR0VUYCByZXF1
ZXN0IGZvcgorICBgL3Bvc3RzLzFgLCB0aGUgSlNPTiBzaG91bGQgbG9vayBsaWtlIHRoaXM6CisK
KyAgYGBganMKKyAgeworICAgICJwb3N0IjogeworICAgICAgdGl0bGU6ICJJJ20gUnVubmluZyB0
byBSZWZvcm0gdGhlIFczQydzIFRhZyIsCisgICAgICBhdXRob3I6ICJZZWh1ZGEgS2F0eiIKKyAg
ICB9CisgIH0KKyAgYGBgCisKKyAgIyMjIENvbnZlbnRpb25hbCBOYW1lcworCisgIEF0dHJpYnV0
ZSBuYW1lcyBpbiB5b3VyIEpTT04gcGF5bG9hZCBzaG91bGQgYmUgdGhlIHVuZGVyc2NvcmVkIHZl
cnNpb25zIG9mCisgIHRoZSBhdHRyaWJ1dGVzIGluIHlvdXIgRW1iZXIuanMgbW9kZWxzLgorCisg
IEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGBQZXJzb25gIG1vZGVsOgorCisgIGBgYGpzCisg
IEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoeworICAgIGZpcnN0TmFtZTogRFMuYXR0cign
c3RyaW5nJyksCisgICAgbGFzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAorICAgIG9jY3VwYXRp
b246IERTLmF0dHIoJ3N0cmluZycpCisgIH0pOworICBgYGAKKworICBUaGUgSlNPTiByZXR1cm5l
ZCBzaG91bGQgbG9vayBsaWtlIHRoaXM6CisKKyAgYGBganMKKyAgeworICAgICJwZXJzb24iOiB7
CisgICAgICAiZmlyc3RfbmFtZSI6ICJCYXJhY2siLAorICAgICAgImxhc3RfbmFtZSI6ICJPYmFt
YSIsCisgICAgICAib2NjdXBhdGlvbiI6ICJQcmVzaWRlbnQiCisgICAgfQorICB9CisgIGBgYAor
Ki8KK0RTLlJFU1RBZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoeworICBidWxrQ29tbWl0OiBm
YWxzZSwKKyAgc2luY2U6ICdzaW5jZScsCisKKyAgc2VyaWFsaXplcjogRFMuUkVTVFNlcmlhbGl6
ZXIsCisKKyAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywg
YXJndW1lbnRzKTsKKyAgfSwKKworICBzaG91bGRTYXZlOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAg
ICB2YXIgcmVmZXJlbmNlID0gZ2V0KHJlY29yZCwgJ19yZWZlcmVuY2UnKTsKKworICAgIHJldHVy
biAhcmVmZXJlbmNlLnBhcmVudDsKKyAgfSwKKworICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCByZWNvcmQpIHsKKyAgICB2YXIgcm9vdCA9IHRoaXMucm9vdEZvclR5cGUodHlw
ZSk7CisKKyAgICB2YXIgZGF0YSA9IHt9OworICAgIGRhdGFbcm9vdF0gPSB0aGlzLnNlcmlhbGl6
ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pOworCisgICAgdGhpcy5hamF4KHRoaXMuYnVp
bGRVUkwocm9vdCksICJQT1NUIiwgeworICAgICAgZGF0YTogZGF0YSwKKyAgICAgIGNvbnRleHQ6
IHRoaXMsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uKSB7CisgICAgICAgIEVtYmVyLnJ1
bih0aGlzLCBmdW5jdGlvbigpeworICAgICAgICAgIHRoaXMuZGlkQ3JlYXRlUmVjb3JkKHN0b3Jl
LCB0eXBlLCByZWNvcmQsIGpzb24pOworICAgICAgICB9KTsKKyAgICAgIH0sCisgICAgICBlcnJv
cjogZnVuY3Rpb24oeGhyKSB7CisgICAgICAgIHRoaXMuZGlkRXJyb3Ioc3RvcmUsIHR5cGUsIHJl
Y29yZCwgeGhyKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSwKKworICBkaXJ0eVJlY29yZHNGb3JS
ZWNvcmRDaGFuZ2U6IGZ1bmN0aW9uKGRpcnR5U2V0LCByZWNvcmQpIHsKKyAgICB0aGlzLl9kaXJ0
eVRyZWUoZGlydHlTZXQsIHJlY29yZCk7CisgIH0sCisKKyAgZGlydHlSZWNvcmRzRm9ySGFzTWFu
eUNoYW5nZTogZnVuY3Rpb24oZGlydHlTZXQsIHJlY29yZCwgcmVsYXRpb25zaGlwKSB7CisgICAg
dmFyIGVtYmVkZGVkVHlwZSA9IGdldCh0aGlzLCAnc2VyaWFsaXplcicpLmVtYmVkZGVkVHlwZShy
ZWNvcmQuY29uc3RydWN0b3IsIHJlbGF0aW9uc2hpcC5zZWNvbmRSZWNvcmROYW1lKTsKKworICAg
IGlmIChlbWJlZGRlZFR5cGUgPT09ICdhbHdheXMnKSB7CisgICAgICByZWxhdGlvbnNoaXAuY2hp
bGRSZWZlcmVuY2UucGFyZW50ID0gcmVsYXRpb25zaGlwLnBhcmVudFJlZmVyZW5jZTsKKyAgICAg
IHRoaXMuX2RpcnR5VHJlZShkaXJ0eVNldCwgcmVjb3JkKTsKKyAgICB9CisgIH0sCisKKyAgX2Rp
cnR5VHJlZTogZnVuY3Rpb24oZGlydHlTZXQsIHJlY29yZCkgeworICAgIGRpcnR5U2V0LmFkZChy
ZWNvcmQpOworCisgICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJykuZWFjaEVtYmVkZGVkUmVjb3Jk
KHJlY29yZCwgZnVuY3Rpb24oZW1iZWRkZWRSZWNvcmQsIGVtYmVkZGVkVHlwZSkgeworICAgICAg
aWYgKGVtYmVkZGVkVHlwZSAhPT0gJ2Fsd2F5cycpIHsgcmV0dXJuOyB9CisgICAgICBpZiAoZGly
dHlTZXQuaGFzKGVtYmVkZGVkUmVjb3JkKSkgeyByZXR1cm47IH0KKyAgICAgIHRoaXMuX2RpcnR5
VHJlZShkaXJ0eVNldCwgZW1iZWRkZWRSZWNvcmQpOworICAgIH0sIHRoaXMpOworCisgICAgdmFy
IHJlZmVyZW5jZSA9IHJlY29yZC5nZXQoJ19yZWZlcmVuY2UnKTsKKworICAgIGlmIChyZWZlcmVu
Y2UucGFyZW50KSB7CisgICAgICB2YXIgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKKyAg
ICAgIHZhciBwYXJlbnQgPSBzdG9yZS5yZWNvcmRGb3JSZWZlcmVuY2UocmVmZXJlbmNlLnBhcmVu
dCk7CisgICAgICB0aGlzLl9kaXJ0eVRyZWUoZGlydHlTZXQsIHBhcmVudCk7CisgICAgfQorICB9
LAorCisgIGNyZWF0ZVJlY29yZHM6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmRzKSB7Cisg
ICAgaWYgKGdldCh0aGlzLCAnYnVsa0NvbW1pdCcpID09PSBmYWxzZSkgeworICAgICAgcmV0dXJu
IHRoaXMuX3N1cGVyKHN0b3JlLCB0eXBlLCByZWNvcmRzKTsKKyAgICB9CisKKyAgICB2YXIgcm9v
dCA9IHRoaXMucm9vdEZvclR5cGUodHlwZSksCisgICAgICAgIHBsdXJhbCA9IHRoaXMucGx1cmFs
aXplKHJvb3QpOworCisgICAgdmFyIGRhdGEgPSB7fTsKKyAgICBkYXRhW3BsdXJhbF0gPSBbXTsK
KyAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICBkYXRhW3BsdXJh
bF0ucHVzaCh0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pKTsKKyAg
ICB9LCB0aGlzKTsKKworICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHJvb3QpLCAiUE9TVCIs
IHsKKyAgICAgIGRhdGE6IGRhdGEsCisgICAgICBjb250ZXh0OiB0aGlzLAorICAgICAgc3VjY2Vz
czogZnVuY3Rpb24oanNvbikgeworICAgICAgICBFbWJlci5ydW4odGhpcywgZnVuY3Rpb24oKXsK
KyAgICAgICAgICB0aGlzLmRpZENyZWF0ZVJlY29yZHMoc3RvcmUsIHR5cGUsIHJlY29yZHMsIGpz
b24pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSwKKworICB1cGRhdGVSZWNv
cmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKKyAgICB2YXIgaWQgPSBnZXQocmVj
b3JkLCAnaWQnKTsKKyAgICB2YXIgcm9vdCA9IHRoaXMucm9vdEZvclR5cGUodHlwZSk7CisKKyAg
ICB2YXIgZGF0YSA9IHt9OworICAgIGRhdGFbcm9vdF0gPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQp
OworCisgICAgdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwocm9vdCwgaWQpLCAiUFVUIiwgeworICAg
ICAgZGF0YTogZGF0YSwKKyAgICAgIGNvbnRleHQ6IHRoaXMsCisgICAgICBzdWNjZXNzOiBmdW5j
dGlvbihqc29uKSB7CisgICAgICAgIEVtYmVyLnJ1bih0aGlzLCBmdW5jdGlvbigpeworICAgICAg
ICAgIHRoaXMuZGlkU2F2ZVJlY29yZChzdG9yZSwgdHlwZSwgcmVjb3JkLCBqc29uKTsKKyAgICAg
ICAgfSk7CisgICAgICB9LAorICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhocikgeworICAgICAgICB0
aGlzLmRpZEVycm9yKHN0b3JlLCB0eXBlLCByZWNvcmQsIHhocik7CisgICAgICB9CisgICAgfSk7
CisgIH0sCisKKyAgdXBkYXRlUmVjb3JkczogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZHMp
IHsKKyAgICBpZiAoZ2V0KHRoaXMsICdidWxrQ29tbWl0JykgPT09IGZhbHNlKSB7CisgICAgICBy
ZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHJlY29yZHMpOworICAgIH0KKworICAgIHZh
ciByb290ID0gdGhpcy5yb290Rm9yVHlwZSh0eXBlKSwKKyAgICAgICAgcGx1cmFsID0gdGhpcy5w
bHVyYWxpemUocm9vdCk7CisKKyAgICB2YXIgZGF0YSA9IHt9OworICAgIGRhdGFbcGx1cmFsXSA9
IFtdOworICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIGRhdGFb
cGx1cmFsXS5wdXNoKHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSkp
OworICAgIH0sIHRoaXMpOworCisgICAgdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwocm9vdCwgImJ1
bGsiKSwgIlBVVCIsIHsKKyAgICAgIGRhdGE6IGRhdGEsCisgICAgICBjb250ZXh0OiB0aGlzLAor
ICAgICAgc3VjY2VzczogZnVuY3Rpb24oanNvbikgeworICAgICAgICBFbWJlci5ydW4odGhpcywg
ZnVuY3Rpb24oKXsKKyAgICAgICAgICB0aGlzLmRpZFNhdmVSZWNvcmRzKHN0b3JlLCB0eXBlLCBy
ZWNvcmRzLCBqc29uKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisgIH0sCisKKyAg
ZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CisgICAgdmFyIGlk
ID0gZ2V0KHJlY29yZCwgJ2lkJyk7CisgICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBlKHR5
cGUpOworCisgICAgdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwocm9vdCwgaWQpLCAiREVMRVRFIiwg
eworICAgICAgY29udGV4dDogdGhpcywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsK
KyAgICAgICAgRW1iZXIucnVuKHRoaXMsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgdGhpcy5kaWRT
YXZlUmVjb3JkKHN0b3JlLCB0eXBlLCByZWNvcmQsIGpzb24pOworICAgICAgICB9KTsKKyAgICAg
IH0KKyAgICB9KTsKKyAgfSwKKworICBkZWxldGVSZWNvcmRzOiBmdW5jdGlvbihzdG9yZSwgdHlw
ZSwgcmVjb3JkcykgeworICAgIGlmIChnZXQodGhpcywgJ2J1bGtDb21taXQnKSA9PT0gZmFsc2Up
IHsKKyAgICAgIHJldHVybiB0aGlzLl9zdXBlcihzdG9yZSwgdHlwZSwgcmVjb3Jkcyk7CisgICAg
fQorCisgICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBlKHR5cGUpLAorICAgICAgICBwbHVy
YWwgPSB0aGlzLnBsdXJhbGl6ZShyb290KSwKKyAgICAgICAgc2VyaWFsaXplciA9IGdldCh0aGlz
LCAnc2VyaWFsaXplcicpOworCisgICAgdmFyIGRhdGEgPSB7fTsKKyAgICBkYXRhW3BsdXJhbF0g
PSBbXTsKKyAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICBkYXRh
W3BsdXJhbF0ucHVzaChzZXJpYWxpemVyLnNlcmlhbGl6ZUlkKCBnZXQocmVjb3JkLCAnaWQnKSAp
KTsKKyAgICB9KTsKKworICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHJvb3QsICdidWxrJyks
ICJERUxFVEUiLCB7CisgICAgICBkYXRhOiBkYXRhLAorICAgICAgY29udGV4dDogdGhpcywKKyAg
ICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsKKyAgICAgICAgRW1iZXIucnVuKHRoaXMsIGZ1
bmN0aW9uKCl7CisgICAgICAgICAgdGhpcy5kaWRTYXZlUmVjb3JkcyhzdG9yZSwgdHlwZSwgcmVj
b3JkcywganNvbik7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICB9LAorCisgIGZp
bmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgeworICAgIHZhciByb290ID0gdGhpcy5yb290
Rm9yVHlwZSh0eXBlKTsKKworICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHJvb3QsIGlkKSwg
IkdFVCIsIHsKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsKKyAgICAgICAgRW1iZXIu
cnVuKHRoaXMsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgdGhpcy5kaWRGaW5kUmVjb3JkKHN0b3Jl
LCB0eXBlLCBqc29uLCBpZCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICB9LAor
CisgIGZpbmRBbGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBzaW5jZSkgeworICAgIHZhciByb290
ID0gdGhpcy5yb290Rm9yVHlwZSh0eXBlKTsKKworICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJM
KHJvb3QpLCAiR0VUIiwgeworICAgICAgZGF0YTogdGhpcy5zaW5jZVF1ZXJ5KHNpbmNlKSwKKyAg
ICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsKKyAgICAgICAgRW1iZXIucnVuKHRoaXMsIGZ1
bmN0aW9uKCl7CisgICAgICAgICAgdGhpcy5kaWRGaW5kQWxsKHN0b3JlLCB0eXBlLCBqc29uKTsK
KyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisgIH0sCisKKyAgZmluZFF1ZXJ5OiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgcXVlcnksIHJlY29yZEFycmF5KSB7CisgICAgdmFyIHJvb3QgPSB0
aGlzLnJvb3RGb3JUeXBlKHR5cGUpOworCisgICAgdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwocm9v
dCksICJHRVQiLCB7CisgICAgICBkYXRhOiBxdWVyeSwKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9u
KGpzb24pIHsKKyAgICAgICAgRW1iZXIucnVuKHRoaXMsIGZ1bmN0aW9uKCl7CisgICAgICAgICAg
dGhpcy5kaWRGaW5kUXVlcnkoc3RvcmUsIHR5cGUsIGpzb24sIHJlY29yZEFycmF5KTsKKyAgICAg
ICAgfSk7CisgICAgICB9CisgICAgfSk7CisgIH0sCisKKyAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCBpZHMsIG93bmVyKSB7CisgICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBl
KHR5cGUpOworICAgIGlkcyA9IHRoaXMuc2VyaWFsaXplSWRzKGlkcyk7CisKKyAgICB0aGlzLmFq
YXgodGhpcy5idWlsZFVSTChyb290KSwgIkdFVCIsIHsKKyAgICAgIGRhdGE6IHtpZHM6IGlkc30s
CisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uKSB7CisgICAgICAgIEVtYmVyLnJ1bih0aGlz
LCBmdW5jdGlvbigpeworICAgICAgICAgIHRoaXMuZGlkRmluZE1hbnkoc3RvcmUsIHR5cGUsIGpz
b24pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBA
cHJpdmF0ZQorCisgICAgVGhpcyBtZXRob2Qgc2VyaWFsaXplcyBhIGxpc3Qgb2YgSURzIHVzaW5n
IGBzZXJpYWxpemVJZGAKKworICAgIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2Ygc2VyaWFs
aXplZCBJRHMKKyAgKi8KKyAgc2VyaWFsaXplSWRzOiBmdW5jdGlvbihpZHMpIHsKKyAgICB2YXIg
c2VyaWFsaXplciA9IGdldCh0aGlzLCAnc2VyaWFsaXplcicpOworCisgICAgcmV0dXJuIEVtYmVy
LkVudW1lcmFibGVVdGlscy5tYXAoaWRzLCBmdW5jdGlvbihpZCkgeworICAgICAgcmV0dXJuIHNl
cmlhbGl6ZXIuc2VyaWFsaXplSWQoaWQpOworICAgIH0pOworICB9LAorCisgIGRpZEVycm9yOiBm
dW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkLCB4aHIpIHsKKyAgICBpZiAoeGhyLnN0YXR1cyA9
PT0gNDIyKSB7CisgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7
CisgICAgICBzdG9yZS5yZWNvcmRXYXNJbnZhbGlkKHJlY29yZCwgZGF0YVsnZXJyb3JzJ10pOwor
ICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICAgIH0KKyAgfSwKKworICBhamF4OiBmdW5jdGlvbih1cmwsIHR5cGUsIGhhc2gpIHsKKyAgICBo
YXNoLnVybCA9IHVybDsKKyAgICBoYXNoLnR5cGUgPSB0eXBlOworICAgIGhhc2guZGF0YVR5cGUg
PSAnanNvbic7CisgICAgaGFzaC5jb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFy
c2V0PXV0Zi04JzsKKyAgICBoYXNoLmNvbnRleHQgPSB0aGlzOworCisgICAgaWYgKGhhc2guZGF0
YSAmJiB0eXBlICE9PSAnR0VUJykgeworICAgICAgaGFzaC5kYXRhID0gSlNPTi5zdHJpbmdpZnko
aGFzaC5kYXRhKTsKKyAgICB9CisKKyAgICBqUXVlcnkuYWpheChoYXNoKTsKKyAgfSwKKworICB1
cmw6ICIiLAorCisgIHJvb3RGb3JUeXBlOiBmdW5jdGlvbih0eXBlKSB7CisgICAgdmFyIHNlcmlh
bGl6ZXIgPSBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKTsKKyAgICByZXR1cm4gc2VyaWFsaXplci5y
b290Rm9yVHlwZSh0eXBlKTsKKyAgfSwKKworICBwbHVyYWxpemU6IGZ1bmN0aW9uKHN0cmluZykg
eworICAgIHZhciBzZXJpYWxpemVyID0gZ2V0KHRoaXMsICdzZXJpYWxpemVyJyk7CisgICAgcmV0
dXJuIHNlcmlhbGl6ZXIucGx1cmFsaXplKHN0cmluZyk7CisgIH0sCisKKyAgYnVpbGRVUkw6IGZ1
bmN0aW9uKHJlY29yZCwgc3VmZml4KSB7CisgICAgdmFyIHVybCA9IFt0aGlzLnVybF07CisKKyAg
ICBFbWJlci5hc3NlcnQoIk5hbWVzcGFjZSBVUkwgKCIgKyB0aGlzLm5hbWVzcGFjZSArICIpIG11
c3Qgbm90IHN0YXJ0IHdpdGggc2xhc2giLCAhdGhpcy5uYW1lc3BhY2UgfHwgdGhpcy5uYW1lc3Bh
Y2UudG9TdHJpbmcoKS5jaGFyQXQoMCkgIT09ICIvIik7CisgICAgRW1iZXIuYXNzZXJ0KCJSZWNv
cmQgVVJMICgiICsgcmVjb3JkICsgIikgbXVzdCBub3Qgc3RhcnQgd2l0aCBzbGFzaCIsICFyZWNv
cmQgfHwgcmVjb3JkLnRvU3RyaW5nKCkuY2hhckF0KDApICE9PSAiLyIpOworICAgIEVtYmVyLmFz
c2VydCgiVVJMIHN1ZmZpeCAoIiArIHN1ZmZpeCArICIpIG11c3Qgbm90IHN0YXJ0IHdpdGggc2xh
c2giLCAhc3VmZml4IHx8IHN1ZmZpeC50b1N0cmluZygpLmNoYXJBdCgwKSAhPT0gIi8iKTsKKwor
ICAgIGlmICh0aGlzLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB1cmwucHVzaCh0
aGlzLm5hbWVzcGFjZSk7CisgICAgfQorCisgICAgdXJsLnB1c2godGhpcy5wbHVyYWxpemUocmVj
b3JkKSk7CisgICAgaWYgKHN1ZmZpeCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB1cmwucHVzaChz
dWZmaXgpOworICAgIH0KKworICAgIHJldHVybiB1cmwuam9pbigiLyIpOworICB9LAorCisgIHNp
bmNlUXVlcnk6IGZ1bmN0aW9uKHNpbmNlKSB7CisgICAgdmFyIHF1ZXJ5ID0ge307CisgICAgcXVl
cnlbZ2V0KHRoaXMsICdzaW5jZScpXSA9IHNpbmNlOworICAgIHJldHVybiBzaW5jZSA/IHF1ZXJ5
IDogbnVsbDsKKyAgfQorfSk7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBj
YW1lbGl6ZSA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSwKKyAgICBnZXQgPSBFbWJlci5nZXQsCisg
ICAgcmVnaXN0ZXJlZFRyYW5zZm9ybXM7CisKK3ZhciBwYXNzdGhydVRyYW5zZm9ybSA9IHsKKyAg
c2VyaWFsaXplOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sCisgIGRlc2VyaWFs
aXplOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0KK307CisKK3ZhciBkZWZhdWx0
VHJhbnNmb3JtcyA9IHsKKyAgc3RyaW5nOiBwYXNzdGhydVRyYW5zZm9ybSwKKyAgYm9vbGVhbjog
cGFzc3RocnVUcmFuc2Zvcm0sCisgIG51bWJlcjogcGFzc3RocnVUcmFuc2Zvcm0KK307CisKK2Z1
bmN0aW9uIGNhbWVsaXplS2V5cyhqc29uKSB7CisgIHZhciB2YWx1ZTsKKworICBmb3IgKHZhciBw
cm9wIGluIGpzb24pIHsKKyAgICB2YWx1ZSA9IGpzb25bcHJvcF07CisgICAgZGVsZXRlIGpzb25b
cHJvcF07CisgICAganNvbltjYW1lbGl6ZShwcm9wKV0gPSB2YWx1ZTsKKyAgfQorfQorCitmdW5j
dGlvbiBtdW5nZShqc29uLCBjYWxsYmFjaykgeworICBjYWxsYmFjayhqc29uKTsKK30KKworZnVu
Y3Rpb24gYXBwbHlUcmFuc2Zvcm1zKGpzb24sIHR5cGUsIHRyYW5zZm9ybVR5cGUpIHsKKyAgdmFy
IHRyYW5zZm9ybXMgPSByZWdpc3RlcmVkVHJhbnNmb3Jtc1t0cmFuc2Zvcm1UeXBlXTsKKworICBF
bWJlci5hc3NlcnQoIllvdSBhcmUgdHJ5aW5nIHRvIGFwcGx5IHRoZSAnIiArIHRyYW5zZm9ybVR5
cGUgKyAiJyB0cmFuc2Zvcm1zLCBidXQgeW91IGRpZG4ndCByZWdpc3RlciBhbnkgdHJhbnNmb3Jt
cyB3aXRoIHRoYXQgbmFtZSIsIHRyYW5zZm9ybXMpOworCisgIGdldCh0eXBlLCAnYXR0cmlidXRl
cycpLmZvckVhY2goZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlKSB7CisgICAgdmFyIGF0dHJpYnV0
ZVR5cGUgPSBhdHRyaWJ1dGUudHlwZSwKKyAgICAgICAgdmFsdWUgPSBqc29uW25hbWVdOworCisg
ICAgdmFyIHRyYW5zZm9ybSA9IHRyYW5zZm9ybXNbYXR0cmlidXRlVHlwZV0gfHwgZGVmYXVsdFRy
YW5zZm9ybXNbYXR0cmlidXRlVHlwZV07CisKKyAgICBFbWJlci5hc3NlcnQoIllvdXIgbW9kZWwg
c3BlY2lmaWVkIHRoZSAnIiArIGF0dHJpYnV0ZVR5cGUgKyAiJyB0eXBlIGZvciB0aGUgJyIgKyBu
YW1lICsgIicgYXR0cmlidXRlLCBidXQgbm8gdHJhbnNmb3JtIGZvciB0aGF0IHR5cGUgd2FzIHJl
Z2lzdGVyZWQiLCB0cmFuc2Zvcm0pOworCisgICAganNvbltuYW1lXSA9IHRyYW5zZm9ybS5kZXNl
cmlhbGl6ZSh2YWx1ZSk7CisgIH0pOworfQorCitmdW5jdGlvbiBPYmplY3RQcm9jZXNzb3IoanNv
biwgdHlwZSwgc3RvcmUpIHsKKyAgdGhpcy5qc29uID0ganNvbjsKKyAgdGhpcy50eXBlID0gdHlw
ZTsKKyAgdGhpcy5zdG9yZSA9IHN0b3JlOworfQorCitPYmplY3RQcm9jZXNzb3IucHJvdG90eXBl
ID0geworICBsb2FkOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnN0b3JlLmxvYWQodGhpcy50eXBl
LCB7fSwgdGhpcy5qc29uKTsKKyAgfSwKKworICBjYW1lbGl6ZUtleXM6IGZ1bmN0aW9uKCkgewor
ICAgIGNhbWVsaXplS2V5cyh0aGlzLmpzb24pOworICAgIHJldHVybiB0aGlzOworICB9LAorCisg
IG11bmdlOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgIG11bmdlKHRoaXMuanNvbiwgY2FsbGJh
Y2spOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIGFwcGx5VHJhbnNmb3JtczogZnVuY3Rp
b24odHJhbnNmb3JtVHlwZSkgeworICAgIGFwcGx5VHJhbnNmb3Jtcyh0aGlzLmpzb24sIHRoaXMu
dHlwZSwgdHJhbnNmb3JtVHlwZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KK307CisKK2Z1bmN0
aW9uIHByb2Nlc3NvckZhY3Rvcnkoc3RvcmUsIHR5cGUpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGpz
b24pIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFByb2Nlc3Nvcihqc29uLCB0eXBlLCBzdG9yZSk7
CisgIH07Cit9CisKK2Z1bmN0aW9uIEFycmF5UHJvY2Vzc29yKGpzb24sIHR5cGUsIGFycmF5LCBz
dG9yZSkgeworICB0aGlzLmpzb24gPSBqc29uOworICB0aGlzLnR5cGUgPSB0eXBlOworICB0aGlz
LmFycmF5ID0gYXJyYXk7CisgIHRoaXMuc3RvcmUgPSBzdG9yZTsKK30KKworQXJyYXlQcm9jZXNz
b3IucHJvdG90eXBlID0geworICBsb2FkOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3RvcmUgPSB0
aGlzLnN0b3JlLAorICAgICAgICB0eXBlID0gdGhpcy50eXBlOworCisgICAgdmFyIHJlZmVyZW5j
ZXMgPSB0aGlzLmpzb24ubWFwKGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgcmV0dXJuIHN0b3Jl
LmxvYWQodHlwZSwge30sIG9iamVjdCk7CisgICAgfSk7CisKKyAgICB0aGlzLmFycmF5LmxvYWQo
cmVmZXJlbmNlcyk7CisgIH0sCisKKyAgY2FtZWxpemVLZXlzOiBmdW5jdGlvbigpIHsKKyAgICB0
aGlzLmpzb24uZm9yRWFjaChjYW1lbGl6ZUtleXMpOworICAgIHJldHVybiB0aGlzOworICB9LAor
CisgIG11bmdlOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgIHRoaXMuanNvbi5mb3JFYWNoKGZ1
bmN0aW9uKG9iamVjdCkgeworICAgICAgbXVuZ2Uob2JqZWN0LCBjYWxsYmFjayk7CisgICAgfSk7
CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgYXBwbHlUcmFuc2Zvcm1zOiBmdW5jdGlvbih0
cmFuc2Zvcm1UeXBlKSB7CisgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7CisKKyAgICB0aGlzLmpz
b24uZm9yRWFjaChmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIGFwcGx5VHJhbnNmb3JtcyhvYmpl
Y3QsIHR5cGUsIHRyYW5zZm9ybVR5cGUpOworICAgIH0pOworCisgICAgcmV0dXJuIHRoaXM7Cisg
IH0KK307CisKK2Z1bmN0aW9uIGFycmF5UHJvY2Vzc29yRmFjdG9yeShzdG9yZSwgdHlwZSwgYXJy
YXkpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGpzb24pIHsKKyAgICByZXR1cm4gbmV3IEFycmF5UHJv
Y2Vzc29yKGpzb24sIHR5cGUsIGFycmF5LCBzdG9yZSk7CisgIH07Cit9CisKK0RTLkJhc2ljQWRh
cHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKKyAgZmluZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUs
IGlkKSB7CisgICAgdmFyIHN5bmMgPSB0eXBlLnN5bmM7CisKKyAgICBFbWJlci5hc3NlcnQoIllv
dSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGUgQmFzaWNBZGFwdGVyIHRvIGZpbmQgaWQgJyIgKyBpZCAr
ICInIG9mICIgKyB0eXBlICsgIiBidXQgIiArIHR5cGUgKyAiLnN5bmMgd2FzIG5vdCBmb3VuZCIs
IHN5bmMpOworICAgIEVtYmVyLmFzc2VydCgiVGhlIHN5bmMgY29kZSBvbiAiICsgdHlwZSArICIg
ZG9lcyBub3QgaW1wbGVtZW50IGZpbmQoKSwgYnV0IHlvdSBhcmUgdHJ5aW5nIHRvIGZpbmQgaWQg
JyIgKyBpZCArICInLiIsIHN5bmMuZmluZCk7CisKKyAgICBzeW5jLmZpbmQoaWQsIHByb2Nlc3Nv
ckZhY3Rvcnkoc3RvcmUsIHR5cGUpKTsKKyAgfSwKKworICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCBxdWVyeSwgcmVjb3JkQXJyYXkpIHsKKyAgICB2YXIgc3luYyA9IHR5cGUuc3lu
YzsKKworICAgIEVtYmVyLmFzc2VydCgiWW91IGFyZSB0cnlpbmcgdG8gdXNlIHRoZSBCYXNpY0Fk
YXB0ZXIgdG8gcXVlcnkgIiArIHR5cGUgKyAiIGJ1dCAiICsgdHlwZSArICIuc3luYyB3YXMgbm90
IGZvdW5kIiwgc3luYyk7CisgICAgRW1iZXIuYXNzZXJ0KCJUaGUgc3luYyBjb2RlIG9uICIgKyB0
eXBlICsgIiBkb2VzIG5vdCBpbXBsZW1lbnQgcXVlcnkoKSwgYnV0IHlvdSBhcmUgdHJ5aW5nIHRv
IHF1ZXJ5ICIgKyB0eXBlICsgIi4iLCBzeW5jLnF1ZXJ5KTsKKworICAgIHN5bmMucXVlcnkocXVl
cnksIGFycmF5UHJvY2Vzc29yRmFjdG9yeShzdG9yZSwgdHlwZSwgcmVjb3JkQXJyYXkpKTsKKyAg
fQorfSk7CisKK0RTLnJlZ2lzdGVyVHJhbnNmb3JtcyA9IGZ1bmN0aW9uKGtpbmQsIG9iamVjdCkg
eworICByZWdpc3RlcmVkVHJhbnNmb3Jtc1traW5kXSA9IG9iamVjdDsKK307CisKK0RTLmNsZWFy
VHJhbnNmb3JtcyA9IGZ1bmN0aW9uKCkgeworICByZWdpc3RlcmVkVHJhbnNmb3JtcyA9IHt9Owor
fTsKKworRFMuY2xlYXJUcmFuc2Zvcm1zKCk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7
CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvL0NvcHlyaWdodCAoQykgMjAxMSBieSBM
aXZpbmcgU29jaWFsLCBJbmMuCisKKy8vUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl
ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorLy90aGlzIHNv
ZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUi
KSwgdG8gZGVhbCBpbgorLy90aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVk
aW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisvL3VzZSwgY29weSwgbW9kaWZ5
LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29w
aWVzCisvL29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhl
IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworLy9zbywgc3ViamVjdCB0byB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnM6CisKKy8vVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg
cGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisvL2NvcGllcyBvciBz
dWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKy8vVEhFIFNPRlRXQVJFIElT
IFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Mg
T1IKKy8vSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFksCisvL0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorLy9BVVRIT1JTIE9S
IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9U
SEVSCisvL0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQg
T1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisvL09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ
VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisvL1NP
RlRXQVJFLgorCit9KSgpOworCkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlV
bnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
anMvbW9kZWxzL3N0b3JlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29t
cGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9qcy9tb2RlbHMvc3RvcmUuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRl
c3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzL3N0b3JlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTEgQEAKKy8qZ2xvYmFsIFRvZG9zIERTICovCisndXNlIHN0cmljdCc7CisKK1RvZG9z
LlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKHsKKyAgICByZXZpc2lvbjogMTIsCisgICAgYWRhcHRl
cjogJ1RvZG9zLkxTQWRhcHRlcicKK30pOworCitUb2Rvcy5MU0FkYXB0ZXIgPSBEUy5MU0FkYXB0
ZXIuZXh0ZW5kKHsKKyAgICBuYW1lc3BhY2U6ICd0b2Rvcy1lbWJlcmpzJworfSk7CkluZGV4OiBQ
ZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzL3RvZG8uanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90b2RvLmpzCShy
ZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNE
T01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90
b2RvLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMgQEAKKy8qZ2xvYmFsIFRvZG9zIERT
IEVtYmVyICovCisndXNlIHN0cmljdCc7CisKK1RvZG9zLlRvZG8gPSBEUy5Nb2RlbC5leHRlbmQo
eworICAgIHRpdGxlOiBEUy5hdHRyKCdzdHJpbmcnKSwKKyAgICBpc0NvbXBsZXRlZDogRFMuYXR0
cignYm9vbGVhbicpLAorCisgICAgdG9kb0RpZENoYW5nZTogZnVuY3Rpb24gKCkgeworICAgIEVt
YmVyLnJ1bi5vbmNlKHRoaXMsIGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmdldCgnc3RvcmUnKS5j
b21taXQoKTsKKyAgICB9KTsKKyAgICB9Lm9ic2VydmVzKCdpc0NvbXBsZXRlZCcsICd0aXRsZScp
Cit9KTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9N
QmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3cy9lZGl0
X3RvZG9fdmlldy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRl
bHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvanMvdmlld3MvZWRpdF90b2RvX3ZpZXcuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5j
ZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvZWRpdF90b2RvX3ZpZXcuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwyOCBAQAorLypnbG9iYWwgVG9kb3MgRW1iZXIgKi8KKyd1c2Ugc3Ry
aWN0JzsKKworVG9kb3MuRWRpdFRvZG9WaWV3ID0gRW1iZXIuVGV4dEZpZWxkLmV4dGVuZCh7Cisg
ICAgY2xhc3NOYW1lczogWydlZGl0J10sCisKKyAgICB2YWx1ZUJpbmRpbmc6ICd0b2RvLnRpdGxl
JywKKworICAgIGNoYW5nZTogZnVuY3Rpb24gKCkgeworICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0
KCd2YWx1ZScpOworCisgICAgaWYgKEVtYmVyLmlzRW1wdHkodmFsdWUpKSB7CisgICAgdGhpcy5n
ZXQoJ2NvbnRyb2xsZXInKS5yZW1vdmVUb2RvKCk7CisgICAgfQorICAgIH0sCisKKyAgICBmb2N1
c091dDogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuc2V0KCdjb250cm9sbGVyLmlzRWRpdGluZycs
IGZhbHNlKTsKKyAgICB9LAorCisgICAgaW5zZXJ0TmV3bGluZTogZnVuY3Rpb24gKCkgeworICAg
IHRoaXMuc2V0KCdjb250cm9sbGVyLmlzRWRpdGluZycsIGZhbHNlKTsKKyAgICB9LAorCisgICAg
ZGlkSW5zZXJ0RWxlbWVudDogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuJCgpLmZvY3VzKCk7Cisg
ICAgfQorfSk7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9ib3dlci5qc29u
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyLmpzb24J
KHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9ib3dlci5qc29u
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOSBAQAoreworICAibmFtZSI6ICJ0b2RvbXZjLWpx
dWVyeSIsCisgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAi
anF1ZXJ5IjogIn4xLjkuMSIsCisgICAgImhhbmRsZWJhcnMiOiAifjEuMC4wLXJjLjMiLAorICAg
ICJ0b2RvbXZjLWNvbW1vbiI6ICJ+MC4xLjQiCisgIH0KK30KSW5kZXg6IFBlcmZvcm1hbmNlVGVz
dHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvanF1ZXJ5L2luZGV4Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0
cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9qcXVlcnkvaW5kZXguaHRtbAkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVz
dHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvanF1ZXJ5L2luZGV4Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MiBA
QAorPCFkb2N0eXBlIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiIgZGF0YS1mcmFtZXdvcms9ImpxdWVy
eSI+CisgICAgPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0
dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPHRpdGxl
PmpRdWVyeSDigKIgVG9kb01WQzwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzIj4KKyAgICA8bGlu
ayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9hcHAuY3NzIj4KKyAgICA8L2hlYWQ+CisgICAg
PGJvZHk+CisgICAgPHNlY3Rpb24gaWQ9InRvZG9hcHAiPgorICAgIDxoZWFkZXIgaWQ9ImhlYWRl
ciI+CisgICAgPGgxPnRvZG9zPC9oMT4KKyAgICA8aW5wdXQgaWQ9Im5ldy10b2RvIiBwbGFjZWhv
bGRlcj0iV2hhdCBuZWVkcyB0byBiZSBkb25lPyIgYXV0b2ZvY3VzPgorICAgIDwvaGVhZGVyPgor
ICAgIDxzZWN0aW9uIGlkPSJtYWluIj4KKyAgICA8aW5wdXQgaWQ9InRvZ2dsZS1hbGwiIHR5cGU9
ImNoZWNrYm94Ij4KKyAgICA8bGFiZWwgZm9yPSJ0b2dnbGUtYWxsIj5NYXJrIGFsbCBhcyBjb21w
bGV0ZTwvbGFiZWw+CisgICAgPHVsIGlkPSJ0b2RvLWxpc3QiPjwvdWw+CisgICAgPC9zZWN0aW9u
PgorICAgIDxmb290ZXIgaWQ9ImZvb3RlciI+CisgICAgPHNwYW4gaWQ9InRvZG8tY291bnQiPjxz
dHJvbmc+MDwvc3Ryb25nPiBpdGVtIGxlZnQ8L3NwYW4+CisgICAgPGJ1dHRvbiBpZD0iY2xlYXIt
Y29tcGxldGVkIj5DbGVhciBjb21wbGV0ZWQ8L2J1dHRvbj4KKyAgICA8L2Zvb3Rlcj4KKyAgICA8
L3NlY3Rpb24+CisgICAgPGZvb3RlciBpZD0iaW5mbyI+CisgICAgPHA+RG91YmxlLWNsaWNrIHRv
IGVkaXQgYSB0b2RvPC9wPgorICAgIDxwPkNyZWF0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL2dpdGh1
Yi5jb20vc2luZHJlc29yaHVzIj5TaW5kcmUgU29yaHVzPC9hPjwvcD4KKyAgICA8cD5QYXJ0IG9m
IDxhIGhyZWY9Imh0dHA6Ly90b2RvbXZjLmNvbSI+VG9kb01WQzwvYT48L3A+CisgICAgPC9mb290
ZXI+CisgICAgPHNjcmlwdCBpZD0idG9kby10ZW1wbGF0ZSIgdHlwZT0idGV4dC94LWhhbmRsZWJh
cnMtdGVtcGxhdGUiPgorICAgIHt7I3RoaXN9fQorICAgIDxsaSB7eyNpZiBjb21wbGV0ZWR9fWNs
YXNzPSJjb21wbGV0ZWQie3svaWZ9fSBkYXRhLWlkPSJ7e2lkfX0iPgorICAgIDxkaXYgY2xhc3M9
InZpZXciPgorICAgIDxpbnB1dCBjbGFzcz0idG9nZ2xlIiB0eXBlPSJjaGVja2JveCIge3sjaWYg
Y29tcGxldGVkfX1jaGVja2Vke3svaWZ9fT4KKyAgICA8bGFiZWw+e3t0aXRsZX19PC9sYWJlbD4K
KyAgICA8YnV0dG9uIGNsYXNzPSJkZXN0cm95Ij48L2J1dHRvbj4KKyAgICA8L2Rpdj4KKyAgICA8
aW5wdXQgY2xhc3M9ImVkaXQiIHZhbHVlPSJ7e3RpdGxlfX0iPgorICAgIDwvbGk+CisgICAge3sv
dGhpc319CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBpZD0iZm9vdGVyLXRlbXBsYXRlIiB0
eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZSI+CisgICAgPHNwYW4gaWQ9InRvZG8tY291
bnQiPjxzdHJvbmc+e3thY3RpdmVUb2RvQ291bnR9fTwvc3Ryb25nPiB7e2FjdGl2ZVRvZG9Xb3Jk
fX0gbGVmdDwvc3Bhbj4KKyAgICB7eyNpZiBjb21wbGV0ZWRUb2Rvc319PGJ1dHRvbiBpZD0iY2xl
YXItY29tcGxldGVkIj5DbGVhciBjb21wbGV0ZWQgKHt7Y29tcGxldGVkVG9kb3N9fSk8L2J1dHRv
bj57ey9pZn19CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVu
dHMvdG9kb212Yy1jb21tb24vYmFzZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJv
d2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9ImJvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0ianMvYXBwLmpzIj48L3NjcmlwdD4KKyAgICA8L2JvZHk+Cis8L2h0
bWw+CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJl
bmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9yZWFkbWUubWQKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvcmVhZG1lLm1kCShyZXZpc2lv
biAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvcmVhZG1lLm1kCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKyMgalF1ZXJ5IFRvZG9NVkMgRXhhbXBsZQorCis+IGpR
dWVyeSBpcyBhIGZhc3QsIHNtYWxsLCBhbmQgZmVhdHVyZS1yaWNoIEphdmFTY3JpcHQgbGlicmFy
eS4gSXQgbWFrZXMgdGhpbmdzIGxpa2UgSFRNTCBkb2N1bWVudCB0cmF2ZXJzYWwgYW5kIG1hbmlw
dWxhdGlvbiwgZXZlbnQgaGFuZGxpbmcsIGFuaW1hdGlvbiwgYW5kIEFqYXggbXVjaCBzaW1wbGVy
IHdpdGggYW4gZWFzeS10by11c2UgQVBJIHRoYXQgd29ya3MgYWNyb3NzIGEgbXVsdGl0dWRlIG9m
IGJyb3dzZXJzLiBXaXRoIGEgY29tYmluYXRpb24gb2YgdmVyc2F0aWxpdHkgYW5kIGV4dGVuc2li
aWxpdHksIGpRdWVyeSBoYXMgY2hhbmdlZCB0aGUgd2F5IHRoYXQgbWlsbGlvbnMgb2YgcGVvcGxl
IHdyaXRlIEphdmFTY3JpcHQuCisKKz4gX1tqUXVlcnkgLSBqcXVlcnkuY29tXShodHRwOi8vanF1
ZXJ5LmNvbSlfCisKKworIyMgTGVhcm5pbmcgalF1ZXJ5CisKK1RoZSBbalF1ZXJ5IHdlYnNpdGVd
KGh0dHA6Ly9qcXVlcnkuY29tKSBpcyBhIGdyZWF0IHJlc291cmNlIGZvciBnZXR0aW5nIHN0YXJ0
ZWQuCisKK0hlcmUgYXJlIHNvbWUgbGlua3MgeW91IG1heSBmaW5kIGhlbHBmdWw6CisKKyogW0hv
dyBqUXVlcnkgV29ya3NdKGh0dHA6Ly9sZWFybi5qcXVlcnkuY29tL2Fib3V0LWpxdWVyeS9ob3ct
anF1ZXJ5LXdvcmtzKQorKiBbQVBJIFJlZmVyZW5jZV0oaHR0cDovL2FwaS5qcXVlcnkuY29tKQor
KiBbUGx1Z2luc10oaHR0cDovL3BsdWdpbnMuanF1ZXJ5LmNvbSkKKyogW0Jyb3dlciBTdXBwb3J0
XShodHRwOi8vanF1ZXJ5LmNvbS9icm93c2VyLXN1cHBvcnQpCisqIFtCbG9nXShodHRwOi8vYmxv
Zy5qcXVlcnkuY29tKQorCitBcnRpY2xlcyBhbmQgZ3VpZGVzIGZyb20gdGhlIGNvbW11bml0eToK
KworKiBbVHJ5IGpRdWVyeV0oaHR0cDovL3RyeS5qcXVlcnkuY29tKQorKiBbalF1ZXJ5IEFubm90
YXRlZCBTb3VyY2VdKGh0dHA6Ly9naXRodWIuY29tL3JvYmZsYWhlcnR5L2pxdWVyeS1hbm5vdGF0
ZWQtc291cmNlKQorKiBbMTAgVGhpbmdzIEkgTGVhcm5lZCBGcm9tIHRoZSBqUXVlcnkgU291cmNl
XShodHRwOi8vcGF1bGlyaXNoLmNvbS8yMDEwLzEwLXRoaW5ncy1pLWxlYXJuZWQtZnJvbS10aGUt
anF1ZXJ5LXNvdXJjZSkKKworR2V0IGhlbHAgZnJvbSBvdGhlciBqUXVlcnkgdXNlcnM6CisKKyog
W2pRdWVyeSBvbiBTdGFja092ZXJmbG93XShodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rp
b25zL3RhZ2dlZC9qcXVlcnkpCisqIFtGb3J1bXNdKGh0dHA6Ly9mb3J1bS5qcXVlcnkuY29tKQor
KiBbalF1ZXJ5IG9uIFR3aXR0ZXJdKGh0dHA6Ly90d2l0dGVyLmNvbS9qcXVlcnkpCisqIFtqUXVl
cnkgb24gR29vZ2xlICtdKGh0dHBzOi8vcGx1cy5nb29nbGUuY29tLzEwMjgyODQ5MTg4NDY3MTAw
MzYwOC9wb3N0cykKKworX0lmIHlvdSBoYXZlIG90aGVyIGhlbHBmdWwgbGlua3MgdG8gc2hhcmUs
IG9yIGZpbmQgYW55IG9mIHRoZSBsaW5rcyBhYm92ZSBubyBsb25nZXIgd29yaywgcGxlYXNlIFts
ZXQgdXMga25vd10oaHR0cHM6Ly9naXRodWIuY29tL3Rhc3RlanMvdG9kb212Yy9pc3N1ZXMpLl8K
SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvaGFu
ZGxlYmFycy9oYW5kbGViYXJzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzCShyZXZp
c2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01C
ZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93ZXJfY29tcG9uZW50
cy9oYW5kbGViYXJzL2hhbmRsZWJhcnMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMjAx
IEBACisvKgorCitDb3B5cmlnaHQgKEMpIDIwMTEgYnkgWWVodWRhIEthdHoKKworUGVybWlzc2lv
biBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWlu
aW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u
IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0
IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3Rv
IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5z
ZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy
c29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0
IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp
Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBj
b3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09G
VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwg
RVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMg
T1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Ig
T1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQg
T1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRI
IFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdB
UkUuCisKKyovCisKKy8vIGxpYi9oYW5kbGViYXJzL2Jhc2UuanMKKworLypqc2hpbnQgZXFudWxs
OnRydWUqLwordGhpcy5IYW5kbGViYXJzID0ge307CisKKyhmdW5jdGlvbihIYW5kbGViYXJzKSB7
CisKK0hhbmRsZWJhcnMuVkVSU0lPTiA9ICIxLjAuMC1yYy4zIjsKK0hhbmRsZWJhcnMuQ09NUElM
RVJfUkVWSVNJT04gPSAyOworCitIYW5kbGViYXJzLlJFVklTSU9OX0NIQU5HRVMgPSB7CisgIDE6
ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3Qg
cmVwb3J0IGl0CisgIDI6ICc+PSAxLjAuMC1yYy4zJworfTsKKworSGFuZGxlYmFycy5oZWxwZXJz
ICA9IHt9OworSGFuZGxlYmFycy5wYXJ0aWFscyA9IHt9OworCitIYW5kbGViYXJzLnJlZ2lzdGVy
SGVscGVyID0gZnVuY3Rpb24obmFtZSwgZm4sIGludmVyc2UpIHsKKyAgaWYoaW52ZXJzZSkgeyBm
bi5ub3QgPSBpbnZlcnNlOyB9CisgIHRoaXMuaGVscGVyc1tuYW1lXSA9IGZuOworfTsKKworSGFu
ZGxlYmFycy5yZWdpc3RlclBhcnRpYWwgPSBmdW5jdGlvbihuYW1lLCBzdHIpIHsKKyAgdGhpcy5w
YXJ0aWFsc1tuYW1lXSA9IHN0cjsKK307CisKK0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2hl
bHBlck1pc3NpbmcnLCBmdW5jdGlvbihhcmcpIHsKKyAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PT0g
MikgeworICAgIHJldHVybiB1bmRlZmluZWQ7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVy
cm9yKCJDb3VsZCBub3QgZmluZCBwcm9wZXJ0eSAnIiArIGFyZyArICInIik7CisgIH0KK30pOwor
Cit2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCBmdW5jdGlvblR5cGUg
PSAiW29iamVjdCBGdW5jdGlvbl0iOworCitIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdibG9j
a0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CisgIHZhciBpbnZl
cnNlID0gb3B0aW9ucy5pbnZlcnNlIHx8IGZ1bmN0aW9uKCkge30sIGZuID0gb3B0aW9ucy5mbjsK
KworCisgIHZhciByZXQgPSAiIjsKKyAgdmFyIHR5cGUgPSB0b1N0cmluZy5jYWxsKGNvbnRleHQp
OworCisgIGlmKHR5cGUgPT09IGZ1bmN0aW9uVHlwZSkgeyBjb250ZXh0ID0gY29udGV4dC5jYWxs
KHRoaXMpOyB9CisKKyAgaWYoY29udGV4dCA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBmbih0aGlz
KTsKKyAgfSBlbHNlIGlmKGNvbnRleHQgPT09IGZhbHNlIHx8IGNvbnRleHQgPT0gbnVsbCkgewor
ICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOworICB9IGVsc2UgaWYodHlwZSA9PT0gIltvYmplY3Qg
QXJyYXldIikgeworICAgIGlmKGNvbnRleHQubGVuZ3RoID4gMCkgeworICAgICAgcmV0dXJuIEhh
bmRsZWJhcnMuaGVscGVycy5lYWNoKGNvbnRleHQsIG9wdGlvbnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJu
IGZuKGNvbnRleHQpOworICB9Cit9KTsKKworSGFuZGxlYmFycy5LID0gZnVuY3Rpb24oKSB7fTsK
KworSGFuZGxlYmFycy5jcmVhdGVGcmFtZSA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24ob2Jq
ZWN0KSB7CisgIEhhbmRsZWJhcnMuSy5wcm90b3R5cGUgPSBvYmplY3Q7CisgIHZhciBvYmogPSBu
ZXcgSGFuZGxlYmFycy5LKCk7CisgIEhhbmRsZWJhcnMuSy5wcm90b3R5cGUgPSBudWxsOworICBy
ZXR1cm4gb2JqOworfTsKKworSGFuZGxlYmFycy5sb2dnZXIgPSB7CisgIERFQlVHOiAwLCBJTkZP
OiAxLCBXQVJOOiAyLCBFUlJPUjogMywgbGV2ZWw6IDMsCisKKyAgbWV0aG9kTWFwOiB7MDogJ2Rl
YnVnJywgMTogJ2luZm8nLCAyOiAnd2FybicsIDM6ICdlcnJvcid9LAorCisgIC8vIGNhbiBiZSBv
dmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50CisgIGxvZzogZnVuY3Rpb24obGV2ZWws
IG9iaikgeworICAgIGlmIChIYW5kbGViYXJzLmxvZ2dlci5sZXZlbCA8PSBsZXZlbCkgeworICAg
ICAgdmFyIG1ldGhvZCA9IEhhbmRsZWJhcnMubG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07CisgICAg
ICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGVbbWV0aG9kXSkg
eworICAgICAgICBjb25zb2xlW21ldGhvZF0uY2FsbChjb25zb2xlLCBvYmopOworICAgICAgfQor
ICAgIH0KKyAgfQorfTsKKworSGFuZGxlYmFycy5sb2cgPSBmdW5jdGlvbihsZXZlbCwgb2JqKSB7
IEhhbmRsZWJhcnMubG9nZ2VyLmxvZyhsZXZlbCwgb2JqKTsgfTsKKworSGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgdmFyIGZu
ID0gb3B0aW9ucy5mbiwgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZTsKKyAgdmFyIGkgPSAwLCBy
ZXQgPSAiIiwgZGF0YTsKKworICBpZiAob3B0aW9ucy5kYXRhKSB7CisgICAgZGF0YSA9IEhhbmRs
ZWJhcnMuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTsKKyAgfQorCisgIGlmKGNvbnRleHQgJiYg
dHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7CisgICAgaWYoY29udGV4dCBpbnN0YW5jZW9m
IEFycmF5KXsKKyAgICAgIGZvcih2YXIgaiA9IGNvbnRleHQubGVuZ3RoOyBpPGo7IGkrKykgewor
ICAgICAgICBpZiAoZGF0YSkgeyBkYXRhLmluZGV4ID0gaTsgfQorICAgICAgICByZXQgPSByZXQg
KyBmbihjb250ZXh0W2ldLCB7IGRhdGE6IGRhdGEgfSk7CisgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgIGZvcih2YXIga2V5IGluIGNvbnRleHQpIHsKKyAgICAgICAgaWYoY29udGV4dC5oYXNP
d25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgaWYoZGF0YSkgeyBkYXRhLmtleSA9IGtleTsg
fQorICAgICAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRba2V5XSwge2RhdGE6IGRhdGF9KTsK
KyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihp
ID09PSAwKXsKKyAgICByZXQgPSBpbnZlcnNlKHRoaXMpOworICB9CisKKyAgcmV0dXJuIHJldDsK
K30pOworCitIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uKGNvbnRleHQs
IG9wdGlvbnMpIHsKKyAgdmFyIHR5cGUgPSB0b1N0cmluZy5jYWxsKGNvbnRleHQpOworICBpZih0
eXBlID09PSBmdW5jdGlvblR5cGUpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfQor
CisgIGlmKCFjb250ZXh0IHx8IEhhbmRsZWJhcnMuVXRpbHMuaXNFbXB0eShjb250ZXh0KSkgewor
ICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJu
IG9wdGlvbnMuZm4odGhpcyk7CisgIH0KK30pOworCitIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCd1bmxlc3MnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CisgIHZhciBmbiA9IG9wdGlv
bnMuZm4sIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7CisgIG9wdGlvbnMuZm4gPSBpbnZlcnNl
OworICBvcHRpb25zLmludmVyc2UgPSBmbjsKKworICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJz
WydpZiddLmNhbGwodGhpcywgY29udGV4dCwgb3B0aW9ucyk7Cit9KTsKKworSGFuZGxlYmFycy5y
ZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgcmV0
dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7Cit9KTsKKworSGFuZGxlYmFycy5yZWdpc3RlckhlbHBl
cignbG9nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgeworICB2YXIgbGV2ZWwgPSBvcHRp
b25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhLmxldmVsICE9IG51bGwgPyBwYXJzZUludChvcHRpb25z
LmRhdGEubGV2ZWwsIDEwKSA6IDE7CisgIEhhbmRsZWJhcnMubG9nKGxldmVsLCBjb250ZXh0KTsK
K30pOworCit9KHRoaXMuSGFuZGxlYmFycykpOworOworLy8gbGliL2hhbmRsZWJhcnMvY29tcGls
ZXIvcGFyc2VyLmpzCisvKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovCit2YXIgaGFuZGxlYmFy
cyA9IChmdW5jdGlvbigpewordmFyIHBhcnNlciA9IHt0cmFjZTogZnVuY3Rpb24gdHJhY2UoKSB7
IH0sCit5eToge30sCitzeW1ib2xzXzogeyJlcnJvciI6Miwicm9vdCI6MywicHJvZ3JhbSI6NCwi
RU9GIjo1LCJzaW1wbGVJbnZlcnNlIjo2LCJzdGF0ZW1lbnRzIjo3LCJzdGF0ZW1lbnQiOjgsIm9w
ZW5JbnZlcnNlIjo5LCJjbG9zZUJsb2NrIjoxMCwib3BlbkJsb2NrIjoxMSwibXVzdGFjaGUiOjEy
LCJwYXJ0aWFsIjoxMywiQ09OVEVOVCI6MTQsIkNPTU1FTlQiOjE1LCJPUEVOX0JMT0NLIjoxNiwi
aW5NdXN0YWNoZSI6MTcsIkNMT1NFIjoxOCwiT1BFTl9JTlZFUlNFIjoxOSwiT1BFTl9FTkRCTE9D
SyI6MjAsInBhdGgiOjIxLCJPUEVOIjoyMiwiT1BFTl9VTkVTQ0FQRUQiOjIzLCJPUEVOX1BBUlRJ
QUwiOjI0LCJwYXJ0aWFsTmFtZSI6MjUsInBhcmFtcyI6MjYsImhhc2giOjI3LCJEQVRBIjoyOCwi
cGFyYW0iOjI5LCJTVFJJTkciOjMwLCJJTlRFR0VSIjozMSwiQk9PTEVBTiI6MzIsImhhc2hTZWdt
ZW50cyI6MzMsImhhc2hTZWdtZW50IjozNCwiSUQiOjM1LCJFUVVBTFMiOjM2LCJQQVJUSUFMX05B
TUUiOjM3LCJwYXRoU2VnbWVudHMiOjM4LCJTRVAiOjM5LCIkYWNjZXB0IjowLCIkZW5kIjoxfSwK
K3Rlcm1pbmFsc186IHsyOiJlcnJvciIsNToiRU9GIiwxNDoiQ09OVEVOVCIsMTU6IkNPTU1FTlQi
LDE2OiJPUEVOX0JMT0NLIiwxODoiQ0xPU0UiLDE5OiJPUEVOX0lOVkVSU0UiLDIwOiJPUEVOX0VO
REJMT0NLIiwyMjoiT1BFTiIsMjM6Ik9QRU5fVU5FU0NBUEVEIiwyNDoiT1BFTl9QQVJUSUFMIiwy
ODoiREFUQSIsMzA6IlNUUklORyIsMzE6IklOVEVHRVIiLDMyOiJCT09MRUFOIiwzNToiSUQiLDM2
OiJFUVVBTFMiLDM3OiJQQVJUSUFMX05BTUUiLDM5OiJTRVAifSwKK3Byb2R1Y3Rpb25zXzogWzAs
WzMsMl0sWzQsMl0sWzQsM10sWzQsMl0sWzQsMV0sWzQsMV0sWzQsMF0sWzcsMV0sWzcsMl0sWzgs
M10sWzgsM10sWzgsMV0sWzgsMV0sWzgsMV0sWzgsMV0sWzExLDNdLFs5LDNdLFsxMCwzXSxbMTIs
M10sWzEyLDNdLFsxMywzXSxbMTMsNF0sWzYsMl0sWzE3LDNdLFsxNywyXSxbMTcsMl0sWzE3LDFd
LFsxNywxXSxbMjYsMl0sWzI2LDFdLFsyOSwxXSxbMjksMV0sWzI5LDFdLFsyOSwxXSxbMjksMV0s
WzI3LDFdLFszMywyXSxbMzMsMV0sWzM0LDNdLFszNCwzXSxbMzQsM10sWzM0LDNdLFszNCwzXSxb
MjUsMV0sWzIxLDFdLFszOCwzXSxbMzgsMV1dLAorcGVyZm9ybUFjdGlvbjogZnVuY3Rpb24gYW5v
bnltb3VzKHl5dGV4dCx5eWxlbmcseXlsaW5lbm8seXkseXlzdGF0ZSwkJCxfJCkgeworCit2YXIg
JDAgPSAkJC5sZW5ndGggLSAxOworc3dpdGNoICh5eXN0YXRlKSB7CitjYXNlIDE6IHJldHVybiAk
JFskMC0xXTsKK2JyZWFrOworY2FzZSAyOiB0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoW10s
ICQkWyQwXSk7CiticmVhazsKK2Nhc2UgMzogdGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKCQk
WyQwLTJdLCAkJFskMF0pOworYnJlYWs7CitjYXNlIDQ6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFt
Tm9kZSgkJFskMC0xXSwgW10pOworYnJlYWs7CitjYXNlIDU6IHRoaXMuJCA9IG5ldyB5eS5Qcm9n
cmFtTm9kZSgkJFskMF0pOworYnJlYWs7CitjYXNlIDY6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFt
Tm9kZShbXSwgW10pOworYnJlYWs7CitjYXNlIDc6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9k
ZShbXSk7CiticmVhazsKK2Nhc2UgODogdGhpcy4kID0gWyQkWyQwXV07CiticmVhazsKK2Nhc2Ug
OTogJCRbJDAtMV0ucHVzaCgkJFskMF0pOyB0aGlzLiQgPSAkJFskMC0xXTsKK2JyZWFrOworY2Fz
ZSAxMDogdGhpcy4kID0gbmV3IHl5LkJsb2NrTm9kZSgkJFskMC0yXSwgJCRbJDAtMV0uaW52ZXJz
ZSwgJCRbJDAtMV0sICQkWyQwXSk7CiticmVhazsKK2Nhc2UgMTE6IHRoaXMuJCA9IG5ldyB5eS5C
bG9ja05vZGUoJCRbJDAtMl0sICQkWyQwLTFdLCAkJFskMC0xXS5pbnZlcnNlLCAkJFskMF0pOwor
YnJlYWs7CitjYXNlIDEyOiB0aGlzLiQgPSAkJFskMF07CiticmVhazsKK2Nhc2UgMTM6IHRoaXMu
JCA9ICQkWyQwXTsKK2JyZWFrOworY2FzZSAxNDogdGhpcy4kID0gbmV3IHl5LkNvbnRlbnROb2Rl
KCQkWyQwXSk7CiticmVhazsKK2Nhc2UgMTU6IHRoaXMuJCA9IG5ldyB5eS5Db21tZW50Tm9kZSgk
JFskMF0pOworYnJlYWs7CitjYXNlIDE2OiB0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2RlKCQk
WyQwLTFdWzBdLCAkJFskMC0xXVsxXSk7CiticmVhazsKK2Nhc2UgMTc6IHRoaXMuJCA9IG5ldyB5
eS5NdXN0YWNoZU5vZGUoJCRbJDAtMV1bMF0sICQkWyQwLTFdWzFdKTsKK2JyZWFrOworY2FzZSAx
ODogdGhpcy4kID0gJCRbJDAtMV07CiticmVhazsKK2Nhc2UgMTk6IHRoaXMuJCA9IG5ldyB5eS5N
dXN0YWNoZU5vZGUoJCRbJDAtMV1bMF0sICQkWyQwLTFdWzFdKTsKK2JyZWFrOworY2FzZSAyMDog
dGhpcy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgkJFskMC0xXVswXSwgJCRbJDAtMV1bMV0sIHRy
dWUpOworYnJlYWs7CitjYXNlIDIxOiB0aGlzLiQgPSBuZXcgeXkuUGFydGlhbE5vZGUoJCRbJDAt
MV0pOworYnJlYWs7CitjYXNlIDIyOiB0aGlzLiQgPSBuZXcgeXkuUGFydGlhbE5vZGUoJCRbJDAt
Ml0sICQkWyQwLTFdKTsKK2JyZWFrOworY2FzZSAyMzoKK2JyZWFrOworY2FzZSAyNDogdGhpcy4k
ID0gW1skJFskMC0yXV0uY29uY2F0KCQkWyQwLTFdKSwgJCRbJDBdXTsKK2JyZWFrOworY2FzZSAy
NTogdGhpcy4kID0gW1skJFskMC0xXV0uY29uY2F0KCQkWyQwXSksIG51bGxdOworYnJlYWs7Citj
YXNlIDI2OiB0aGlzLiQgPSBbWyQkWyQwLTFdXSwgJCRbJDBdXTsKK2JyZWFrOworY2FzZSAyNzog
dGhpcy4kID0gW1skJFskMF1dLCBudWxsXTsKK2JyZWFrOworY2FzZSAyODogdGhpcy4kID0gW1tu
ZXcgeXkuRGF0YU5vZGUoJCRbJDBdKV0sIG51bGxdOworYnJlYWs7CitjYXNlIDI5OiAkJFskMC0x
XS5wdXNoKCQkWyQwXSk7IHRoaXMuJCA9ICQkWyQwLTFdOworYnJlYWs7CitjYXNlIDMwOiB0aGlz
LiQgPSBbJCRbJDBdXTsKK2JyZWFrOworY2FzZSAzMTogdGhpcy4kID0gJCRbJDBdOworYnJlYWs7
CitjYXNlIDMyOiB0aGlzLiQgPSBuZXcgeXkuU3RyaW5nTm9kZSgkJFskMF0pOworYnJlYWs7Citj
YXNlIDMzOiB0aGlzLiQgPSBuZXcgeXkuSW50ZWdlck5vZGUoJCRbJDBdKTsKK2JyZWFrOworY2Fz
ZSAzNDogdGhpcy4kID0gbmV3IHl5LkJvb2xlYW5Ob2RlKCQkWyQwXSk7CiticmVhazsKK2Nhc2Ug
MzU6IHRoaXMuJCA9IG5ldyB5eS5EYXRhTm9kZSgkJFskMF0pOworYnJlYWs7CitjYXNlIDM2OiB0
aGlzLiQgPSBuZXcgeXkuSGFzaE5vZGUoJCRbJDBdKTsKK2JyZWFrOworY2FzZSAzNzogJCRbJDAt
MV0ucHVzaCgkJFskMF0pOyB0aGlzLiQgPSAkJFskMC0xXTsKK2JyZWFrOworY2FzZSAzODogdGhp
cy4kID0gWyQkWyQwXV07CiticmVhazsKK2Nhc2UgMzk6IHRoaXMuJCA9IFskJFskMC0yXSwgJCRb
JDBdXTsKK2JyZWFrOworY2FzZSA0MDogdGhpcy4kID0gWyQkWyQwLTJdLCBuZXcgeXkuU3RyaW5n
Tm9kZSgkJFskMF0pXTsKK2JyZWFrOworY2FzZSA0MTogdGhpcy4kID0gWyQkWyQwLTJdLCBuZXcg
eXkuSW50ZWdlck5vZGUoJCRbJDBdKV07CiticmVhazsKK2Nhc2UgNDI6IHRoaXMuJCA9IFskJFsk
MC0yXSwgbmV3IHl5LkJvb2xlYW5Ob2RlKCQkWyQwXSldOworYnJlYWs7CitjYXNlIDQzOiB0aGlz
LiQgPSBbJCRbJDAtMl0sIG5ldyB5eS5EYXRhTm9kZSgkJFskMF0pXTsKK2JyZWFrOworY2FzZSA0
NDogdGhpcy4kID0gbmV3IHl5LlBhcnRpYWxOYW1lTm9kZSgkJFskMF0pOworYnJlYWs7CitjYXNl
IDQ1OiB0aGlzLiQgPSBuZXcgeXkuSWROb2RlKCQkWyQwXSk7CiticmVhazsKK2Nhc2UgNDY6ICQk
WyQwLTJdLnB1c2goJCRbJDBdKTsgdGhpcy4kID0gJCRbJDAtMl07CiticmVhazsKK2Nhc2UgNDc6
IHRoaXMuJCA9IFskJFskMF1dOworYnJlYWs7Cit9Cit9LAordGFibGU6IFt7MzoxLDQ6Miw1Olsy
LDddLDY6Myw3OjQsODo2LDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwx
NjpbMSwxM10sMTk6WzEsNV0sMjI6WzEsMTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHsxOlszXX0s
ezU6WzEsMTddfSx7NTpbMiw2XSw3OjE4LDg6Niw5OjcsMTE6OCwxMjo5LDEzOjEwLDE0OlsxLDEx
XSwxNTpbMSwxMl0sMTY6WzEsMTNdLDE5OlsxLDE5XSwyMDpbMiw2XSwyMjpbMSwxNF0sMjM6WzEs
MTVdLDI0OlsxLDE2XX0sezU6WzIsNV0sNjoyMCw4OjIxLDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6
WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsNV0sMjA6WzIsNV0sMjI6WzEsMTRdLDIz
OlsxLDE1XSwyNDpbMSwxNl19LHsxNzoyMywxODpbMSwyMl0sMjE6MjQsMjg6WzEsMjVdLDM1Olsx
LDI3XSwzODoyNn0sezU6WzIsOF0sMTQ6WzIsOF0sMTU6WzIsOF0sMTY6WzIsOF0sMTk6WzIsOF0s
MjA6WzIsOF0sMjI6WzIsOF0sMjM6WzIsOF0sMjQ6WzIsOF19LHs0OjI4LDY6Myw3OjQsODo2LDk6
NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsNV0s
MjA6WzIsN10sMjI6WzEsMTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHs0OjI5LDY6Myw3OjQsODo2
LDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEs
NV0sMjA6WzIsN10sMjI6WzEsMTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHs1OlsyLDEyXSwxNDpb
MiwxMl0sMTU6WzIsMTJdLDE2OlsyLDEyXSwxOTpbMiwxMl0sMjA6WzIsMTJdLDIyOlsyLDEyXSwy
MzpbMiwxMl0sMjQ6WzIsMTJdfSx7NTpbMiwxM10sMTQ6WzIsMTNdLDE1OlsyLDEzXSwxNjpbMiwx
M10sMTk6WzIsMTNdLDIwOlsyLDEzXSwyMjpbMiwxM10sMjM6WzIsMTNdLDI0OlsyLDEzXX0sezU6
WzIsMTRdLDE0OlsyLDE0XSwxNTpbMiwxNF0sMTY6WzIsMTRdLDE5OlsyLDE0XSwyMDpbMiwxNF0s
MjI6WzIsMTRdLDIzOlsyLDE0XSwyNDpbMiwxNF19LHs1OlsyLDE1XSwxNDpbMiwxNV0sMTU6WzIs
MTVdLDE2OlsyLDE1XSwxOTpbMiwxNV0sMjA6WzIsMTVdLDIyOlsyLDE1XSwyMzpbMiwxNV0sMjQ6
WzIsMTVdfSx7MTc6MzAsMjE6MjQsMjg6WzEsMjVdLDM1OlsxLDI3XSwzODoyNn0sezE3OjMxLDIx
OjI0LDI4OlsxLDI1XSwzNTpbMSwyN10sMzg6MjZ9LHsxNzozMiwyMToyNCwyODpbMSwyNV0sMzU6
WzEsMjddLDM4OjI2fSx7MjU6MzMsMzc6WzEsMzRdfSx7MTpbMiwxXX0sezU6WzIsMl0sODoyMSw5
OjcsMTE6OCwxMjo5LDEzOjEwLDE0OlsxLDExXSwxNTpbMSwxMl0sMTY6WzEsMTNdLDE5OlsxLDE5
XSwyMDpbMiwyXSwyMjpbMSwxNF0sMjM6WzEsMTVdLDI0OlsxLDE2XX0sezE3OjIzLDIxOjI0LDI4
OlsxLDI1XSwzNTpbMSwyN10sMzg6MjZ9LHs1OlsyLDRdLDc6MzUsODo2LDk6NywxMTo4LDEyOjks
MTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsMTldLDIwOlsyLDRdLDIy
OlsxLDE0XSwyMzpbMSwxNV0sMjQ6WzEsMTZdfSx7NTpbMiw5XSwxNDpbMiw5XSwxNTpbMiw5XSwx
NjpbMiw5XSwxOTpbMiw5XSwyMDpbMiw5XSwyMjpbMiw5XSwyMzpbMiw5XSwyNDpbMiw5XX0sezU6
WzIsMjNdLDE0OlsyLDIzXSwxNTpbMiwyM10sMTY6WzIsMjNdLDE5OlsyLDIzXSwyMDpbMiwyM10s
MjI6WzIsMjNdLDIzOlsyLDIzXSwyNDpbMiwyM119LHsxODpbMSwzNl19LHsxODpbMiwyN10sMjE6
NDEsMjY6MzcsMjc6MzgsMjg6WzEsNDVdLDI5OjM5LDMwOlsxLDQyXSwzMTpbMSw0M10sMzI6WzEs
NDRdLDMzOjQwLDM0OjQ2LDM1OlsxLDQ3XSwzODoyNn0sezE4OlsyLDI4XX0sezE4OlsyLDQ1XSwy
ODpbMiw0NV0sMzA6WzIsNDVdLDMxOlsyLDQ1XSwzMjpbMiw0NV0sMzU6WzIsNDVdLDM5OlsxLDQ4
XX0sezE4OlsyLDQ3XSwyODpbMiw0N10sMzA6WzIsNDddLDMxOlsyLDQ3XSwzMjpbMiw0N10sMzU6
WzIsNDddLDM5OlsyLDQ3XX0sezEwOjQ5LDIwOlsxLDUwXX0sezEwOjUxLDIwOlsxLDUwXX0sezE4
OlsxLDUyXX0sezE4OlsxLDUzXX0sezE4OlsxLDU0XX0sezE4OlsxLDU1XSwyMTo1NiwzNTpbMSwy
N10sMzg6MjZ9LHsxODpbMiw0NF0sMzU6WzIsNDRdfSx7NTpbMiwzXSw4OjIxLDk6NywxMTo4LDEy
OjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsMTldLDIwOlsyLDNd
LDIyOlsxLDE0XSwyMzpbMSwxNV0sMjQ6WzEsMTZdfSx7MTQ6WzIsMTddLDE1OlsyLDE3XSwxNjpb
MiwxN10sMTk6WzIsMTddLDIwOlsyLDE3XSwyMjpbMiwxN10sMjM6WzIsMTddLDI0OlsyLDE3XX0s
ezE4OlsyLDI1XSwyMTo0MSwyNzo1NywyODpbMSw0NV0sMjk6NTgsMzA6WzEsNDJdLDMxOlsxLDQz
XSwzMjpbMSw0NF0sMzM6NDAsMzQ6NDYsMzU6WzEsNDddLDM4OjI2fSx7MTg6WzIsMjZdfSx7MTg6
WzIsMzBdLDI4OlsyLDMwXSwzMDpbMiwzMF0sMzE6WzIsMzBdLDMyOlsyLDMwXSwzNTpbMiwzMF19
LHsxODpbMiwzNl0sMzQ6NTksMzU6WzEsNjBdfSx7MTg6WzIsMzFdLDI4OlsyLDMxXSwzMDpbMiwz
MV0sMzE6WzIsMzFdLDMyOlsyLDMxXSwzNTpbMiwzMV19LHsxODpbMiwzMl0sMjg6WzIsMzJdLDMw
OlsyLDMyXSwzMTpbMiwzMl0sMzI6WzIsMzJdLDM1OlsyLDMyXX0sezE4OlsyLDMzXSwyODpbMiwz
M10sMzA6WzIsMzNdLDMxOlsyLDMzXSwzMjpbMiwzM10sMzU6WzIsMzNdfSx7MTg6WzIsMzRdLDI4
OlsyLDM0XSwzMDpbMiwzNF0sMzE6WzIsMzRdLDMyOlsyLDM0XSwzNTpbMiwzNF19LHsxODpbMiwz
NV0sMjg6WzIsMzVdLDMwOlsyLDM1XSwzMTpbMiwzNV0sMzI6WzIsMzVdLDM1OlsyLDM1XX0sezE4
OlsyLDM4XSwzNTpbMiwzOF19LHsxODpbMiw0N10sMjg6WzIsNDddLDMwOlsyLDQ3XSwzMTpbMiw0
N10sMzI6WzIsNDddLDM1OlsyLDQ3XSwzNjpbMSw2MV0sMzk6WzIsNDddfSx7MzU6WzEsNjJdfSx7
NTpbMiwxMF0sMTQ6WzIsMTBdLDE1OlsyLDEwXSwxNjpbMiwxMF0sMTk6WzIsMTBdLDIwOlsyLDEw
XSwyMjpbMiwxMF0sMjM6WzIsMTBdLDI0OlsyLDEwXX0sezIxOjYzLDM1OlsxLDI3XSwzODoyNn0s
ezU6WzIsMTFdLDE0OlsyLDExXSwxNTpbMiwxMV0sMTY6WzIsMTFdLDE5OlsyLDExXSwyMDpbMiwx
MV0sMjI6WzIsMTFdLDIzOlsyLDExXSwyNDpbMiwxMV19LHsxNDpbMiwxNl0sMTU6WzIsMTZdLDE2
OlsyLDE2XSwxOTpbMiwxNl0sMjA6WzIsMTZdLDIyOlsyLDE2XSwyMzpbMiwxNl0sMjQ6WzIsMTZd
fSx7NTpbMiwxOV0sMTQ6WzIsMTldLDE1OlsyLDE5XSwxNjpbMiwxOV0sMTk6WzIsMTldLDIwOlsy
LDE5XSwyMjpbMiwxOV0sMjM6WzIsMTldLDI0OlsyLDE5XX0sezU6WzIsMjBdLDE0OlsyLDIwXSwx
NTpbMiwyMF0sMTY6WzIsMjBdLDE5OlsyLDIwXSwyMDpbMiwyMF0sMjI6WzIsMjBdLDIzOlsyLDIw
XSwyNDpbMiwyMF19LHs1OlsyLDIxXSwxNDpbMiwyMV0sMTU6WzIsMjFdLDE2OlsyLDIxXSwxOTpb
MiwyMV0sMjA6WzIsMjFdLDIyOlsyLDIxXSwyMzpbMiwyMV0sMjQ6WzIsMjFdfSx7MTg6WzEsNjRd
fSx7MTg6WzIsMjRdfSx7MTg6WzIsMjldLDI4OlsyLDI5XSwzMDpbMiwyOV0sMzE6WzIsMjldLDMy
OlsyLDI5XSwzNTpbMiwyOV19LHsxODpbMiwzN10sMzU6WzIsMzddfSx7MzY6WzEsNjFdfSx7MjE6
NjUsMjg6WzEsNjldLDMwOlsxLDY2XSwzMTpbMSw2N10sMzI6WzEsNjhdLDM1OlsxLDI3XSwzODoy
Nn0sezE4OlsyLDQ2XSwyODpbMiw0Nl0sMzA6WzIsNDZdLDMxOlsyLDQ2XSwzMjpbMiw0Nl0sMzU6
WzIsNDZdLDM5OlsyLDQ2XX0sezE4OlsxLDcwXX0sezU6WzIsMjJdLDE0OlsyLDIyXSwxNTpbMiwy
Ml0sMTY6WzIsMjJdLDE5OlsyLDIyXSwyMDpbMiwyMl0sMjI6WzIsMjJdLDIzOlsyLDIyXSwyNDpb
MiwyMl19LHsxODpbMiwzOV0sMzU6WzIsMzldfSx7MTg6WzIsNDBdLDM1OlsyLDQwXX0sezE4Olsy
LDQxXSwzNTpbMiw0MV19LHsxODpbMiw0Ml0sMzU6WzIsNDJdfSx7MTg6WzIsNDNdLDM1OlsyLDQz
XX0sezU6WzIsMThdLDE0OlsyLDE4XSwxNTpbMiwxOF0sMTY6WzIsMThdLDE5OlsyLDE4XSwyMDpb
MiwxOF0sMjI6WzIsMThdLDIzOlsyLDE4XSwyNDpbMiwxOF19XSwKK2RlZmF1bHRBY3Rpb25zOiB7
MTc6WzIsMV0sMjU6WzIsMjhdLDM4OlsyLDI2XSw1NzpbMiwyNF19LAorcGFyc2VFcnJvcjogZnVu
Y3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTsK
K30sCitwYXJzZTogZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXMs
IHN0YWNrID0gWzBdLCB2c3RhY2sgPSBbbnVsbF0sIGxzdGFjayA9IFtdLCB0YWJsZSA9IHRoaXMu
dGFibGUsIHl5dGV4dCA9ICIiLCB5eWxpbmVubyA9IDAsIHl5bGVuZyA9IDAsIHJlY292ZXJpbmcg
PSAwLCBURVJST1IgPSAyLCBFT0YgPSAxOworICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQp
OworICAgIHRoaXMubGV4ZXIueXkgPSB0aGlzLnl5OworICAgIHRoaXMueXkubGV4ZXIgPSB0aGlz
LmxleGVyOworICAgIHRoaXMueXkucGFyc2VyID0gdGhpczsKKyAgICBpZiAodHlwZW9mIHRoaXMu
bGV4ZXIueXlsbG9jID09ICJ1bmRlZmluZWQiKQorICAgICAgICB0aGlzLmxleGVyLnl5bGxvYyA9
IHt9OworICAgIHZhciB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOworICAgIGxzdGFjay5wdXNo
KHl5bG9jKTsKKyAgICB2YXIgcmFuZ2VzID0gdGhpcy5sZXhlci5vcHRpb25zICYmIHRoaXMubGV4
ZXIub3B0aW9ucy5yYW5nZXM7CisgICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09
ICJmdW5jdGlvbiIpCisgICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRoaXMueXkucGFyc2VFcnJv
cjsKKyAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7CisgICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0
YWNrLmxlbmd0aCAtIDIgKiBuOworICAgICAgICB2c3RhY2subGVuZ3RoID0gdnN0YWNrLmxlbmd0
aCAtIG47CisgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKKyAgICB9
CisgICAgZnVuY3Rpb24gbGV4KCkgeworICAgICAgICB2YXIgdG9rZW47CisgICAgICAgIHRva2Vu
ID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxOworICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAi
bnVtYmVyIikgeworICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0
b2tlbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorICAgIHZhciBz
eW1ib2wsIHByZUVycm9yU3ltYm9sLCBzdGF0ZSwgYWN0aW9uLCBhLCByLCB5eXZhbCA9IHt9LCBw
LCBsZW4sIG5ld1N0YXRlLCBleHBlY3RlZDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBz
dGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOworICAgICAgICBpZiAodGhpcy5kZWZhdWx0
QWN0aW9uc1tzdGF0ZV0pIHsKKyAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlv
bnNbc3RhdGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN5bWJvbCA9PT0g
bnVsbCB8fCB0eXBlb2Ygc3ltYm9sID09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgICAgICAg
c3ltYm9sID0gbGV4KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY3Rpb24gPSB0YWJs
ZVtzdGF0ZV0gJiYgdGFibGVbc3RhdGVdW3N5bWJvbF07CisgICAgICAgIH0KKyAgICAgICAgaWYg
KHR5cGVvZiBhY3Rpb24gPT09ICJ1bmRlZmluZWQiIHx8ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rp
b25bMF0pIHsKKyAgICAgICAgICAgIHZhciBlcnJTdHIgPSAiIjsKKyAgICAgICAgICAgIGlmICgh
cmVjb3ZlcmluZykgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gW107CisgICAgICAgICAg
ICAgICAgZm9yIChwIGluIHRhYmxlW3N0YXRlXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRo
aXMudGVybWluYWxzX1twXSAmJiBwID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhw
ZWN0ZWQucHVzaCgiJyIgKyB0aGlzLnRlcm1pbmFsc19bcF0gKyAiJyIpOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKSB7
CisgICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICJQYXJzZSBlcnJvciBvbiBsaW5lICIgKyAo
eXlsaW5lbm8gKyAxKSArICI6XG4iICsgdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKSArICJcbkV4
cGVjdGluZyAiICsgZXhwZWN0ZWQuam9pbigiLCAiKSArICIsIGdvdCAnIiArICh0aGlzLnRlcm1p
bmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgIiciOworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICJQYXJzZSBlcnJvciBvbiBsaW5lICIgKyAo
eXlsaW5lbm8gKyAxKSArICI6IFVuZXhwZWN0ZWQgIiArIChzeW1ib2wgPT0gMT8iZW5kIG9mIGlu
cHV0IjoiJyIgKyAodGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIik7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucGFyc2VFcnJvcihlcnJTdHIs
IHt0ZXh0OiB0aGlzLmxleGVyLm1hdGNoLCB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0g
fHwgc3ltYm9sLCBsaW5lOiB0aGlzLmxleGVyLnl5bGluZW5vLCBsb2M6IHl5bG9jLCBleHBlY3Rl
ZDogZXhwZWN0ZWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0
aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKKyAgICAgICAg
ICAgIHRocm93IG5ldyBFcnJvcigiUGFyc2UgRXJyb3I6IG11bHRpcGxlIGFjdGlvbnMgcG9zc2li
bGUgYXQgc3RhdGU6ICIgKyBzdGF0ZSArICIsIHRva2VuOiAiICsgc3ltYm9sKTsKKyAgICAgICAg
fQorICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAg
ICAgICBzdGFjay5wdXNoKHN5bWJvbCk7CisgICAgICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxl
eGVyLnl5dGV4dCk7CisgICAgICAgICAgICBsc3RhY2sucHVzaCh0aGlzLmxleGVyLnl5bGxvYyk7
CisgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7CisgICAgICAgICAgICBzeW1ib2wg
PSBudWxsOworICAgICAgICAgICAgaWYgKCFwcmVFcnJvclN5bWJvbCkgeworICAgICAgICAgICAg
ICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOworICAgICAgICAgICAgICAgIHl5dGV4dCA9
IHRoaXMubGV4ZXIueXl0ZXh0OworICAgICAgICAgICAgICAgIHl5bGluZW5vID0gdGhpcy5sZXhl
ci55eWxpbmVubzsKKyAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwor
ICAgICAgICAgICAgICAgIGlmIChyZWNvdmVyaW5nID4gMCkKKyAgICAgICAgICAgICAgICAgICAg
cmVjb3ZlcmluZy0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzeW1i
b2wgPSBwcmVFcnJvclN5bWJvbDsKKyAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCA9IG51
bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgor
ICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKKyAgICAg
ICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CisgICAgICAgICAg
ICB5eXZhbC5fJCA9IHtmaXJzdF9saW5lOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4gfHwg
MSldLmZpcnN0X2xpbmUsIGxhc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0
X2xpbmUsIGZpcnN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5m
aXJzdF9jb2x1bW4sIGxhc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIDFdLmxhc3Rf
Y29sdW1ufTsKKyAgICAgICAgICAgIGlmIChyYW5nZXMpIHsKKyAgICAgICAgICAgICAgICB5eXZh
bC5fJC5yYW5nZSA9IFtsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4gfHwgMSldLnJhbmdlWzBd
LCBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIDFdLnJhbmdlWzFdXTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIHIgPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh5eXZhbCwgeXl0ZXh0LCB5eWxl
bmcsIHl5bGluZW5vLCB0aGlzLnl5LCBhY3Rpb25bMV0sIHZzdGFjaywgbHN0YWNrKTsKKyAgICAg
ICAgICAgIGlmICh0eXBlb2YgciAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAg
ICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsIC0xICogbGVuICogMik7CisgICAgICAgICAg
ICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTsKKyAgICAgICAgICAgICAg
ICBsc3RhY2sgPSBsc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTsKKyAg
ICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpOworICAgICAgICAgICAgbHN0YWNrLnB1c2go
eXl2YWwuXyQpOworICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5n
dGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1dOworICAgICAgICAgICAgc3RhY2sucHVz
aChuZXdTdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9
Cit9OworLyogSmlzb24gZ2VuZXJhdGVkIGxleGVyICovCit2YXIgbGV4ZXIgPSAoZnVuY3Rpb24o
KXsKK3ZhciBsZXhlciA9ICh7RU9GOjEsCitwYXJzZUVycm9yOmZ1bmN0aW9uIHBhcnNlRXJyb3Io
c3RyLCBoYXNoKSB7CisgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgeworICAgICAgICAgICAg
dGhpcy55eS5wYXJzZXIucGFyc2VFcnJvcihzdHIsIGhhc2gpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7CisgICAgICAgIH0KKyAgICB9LAorc2V0
SW5wdXQ6ZnVuY3Rpb24gKGlucHV0KSB7CisgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7Cisg
ICAgICAgIHRoaXMuX21vcmUgPSB0aGlzLl9sZXNzID0gdGhpcy5kb25lID0gZmFsc2U7CisgICAg
ICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7CisgICAgICAgIHRoaXMueXl0ZXh0
ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOworICAgICAgICB0aGlzLmNvbmRpdGlv
blN0YWNrID0gWydJTklUSUFMJ107CisgICAgICAgIHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6
MSxmaXJzdF9jb2x1bW46MCxsYXN0X2xpbmU6MSxsYXN0X2NvbHVtbjowfTsKKyAgICAgICAgaWYg
KHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsMF07CisgICAgICAg
IHRoaXMub2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKK2lucHV0OmZ1
bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07CisgICAgICAgIHRo
aXMueXl0ZXh0ICs9IGNoOworICAgICAgICB0aGlzLnl5bGVuZysrOworICAgICAgICB0aGlzLm9m
ZnNldCsrOworICAgICAgICB0aGlzLm1hdGNoICs9IGNoOworICAgICAgICB0aGlzLm1hdGNoZWQg
Kz0gY2g7CisgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsK
KyAgICAgICAgaWYgKGxpbmVzKSB7CisgICAgICAgICAgICB0aGlzLnl5bGluZW5vKys7CisgICAg
ICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIHRoaXMueXlsbG9jLmxhc3RfY29sdW1uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlWzFdKys7CisKKyAgICAgICAg
dGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKKyAgICAgICAgcmV0dXJuIGNoOwor
ICAgIH0sCit1bnB1dDpmdW5jdGlvbiAoY2gpIHsKKyAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0
aDsKKyAgICAgICAgdmFyIGxpbmVzID0gY2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKKworICAg
ICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7CisgICAgICAgIHRoaXMueXl0ZXh0
ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxlbmd0aC1sZW4tMSk7CisgICAg
ICAgIC8vdGhpcy55eWxlbmcgLT0gbGVuOworICAgICAgICB0aGlzLm9mZnNldCAtPSBsZW47Cisg
ICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsK
KyAgICAgICAgdGhpcy5tYXRjaCA9IHRoaXMubWF0Y2guc3Vic3RyKDAsIHRoaXMubWF0Y2gubGVu
Z3RoLTEpOworICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vic3RyKDAsIHRo
aXMubWF0Y2hlZC5sZW5ndGgtMSk7CisKKyAgICAgICAgaWYgKGxpbmVzLmxlbmd0aC0xKSB0aGlz
Lnl5bGluZW5vIC09IGxpbmVzLmxlbmd0aC0xOworICAgICAgICB2YXIgciA9IHRoaXMueXlsbG9j
LnJhbmdlOworCisgICAgICAgIHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6IHRoaXMueXlsbG9j
LmZpcnN0X2xpbmUsCisgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vKzEsCisgICAg
ICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCisgICAgICAgICAg
bGFzdF9jb2x1bW46IGxpbmVzID8KKyAgICAgICAgICAgICAgKGxpbmVzLmxlbmd0aCA9PT0gb2xk
TGluZXMubGVuZ3RoID8gdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIDogMCkgKyBvbGRMaW5lc1tv
bGRMaW5lcy5sZW5ndGggLSBsaW5lcy5sZW5ndGhdLmxlbmd0aCAtIGxpbmVzWzBdLmxlbmd0aDoK
KyAgICAgICAgICAgICAgdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIC0gbGVuCisgICAgICAgICAg
fTsKKworICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgeworICAgICAgICAgICAgdGhp
cy55eWxsb2MucmFuZ2UgPSBbclswXSwgclswXSArIHRoaXMueXlsZW5nIC0gbGVuXTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorbW9yZTpmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAor
bGVzczpmdW5jdGlvbiAobikgeworICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0Y2guc2xpY2Uo
bikpOworICAgIH0sCitwYXN0SW5wdXQ6ZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgcGFzdCA9
IHRoaXMubWF0Y2hlZC5zdWJzdHIoMCwgdGhpcy5tYXRjaGVkLmxlbmd0aCAtIHRoaXMubWF0Y2gu
bGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4uLic6JycpICsg
cGFzdC5zdWJzdHIoLTIwKS5yZXBsYWNlKC9cbi9nLCAiIik7CisgICAgfSwKK3VwY29taW5nSW5w
dXQ6ZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgbmV4dCA9IHRoaXMubWF0Y2g7CisgICAgICAg
IGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7CisgICAgICAgICAgICBuZXh0ICs9IHRoaXMuX2lucHV0
LnN1YnN0cigwLCAyMC1uZXh0Lmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChu
ZXh0LnN1YnN0cigwLDIwKSsobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSkucmVwbGFjZSgv
XG4vZywgIiIpOworICAgIH0sCitzaG93UG9zaXRpb246ZnVuY3Rpb24gKCkgeworICAgICAgICB2
YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTsKKyAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJl
Lmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKKyAgICAgICAgcmV0dXJuIHByZSArIHRoaXMudXBjb21p
bmdJbnB1dCgpICsgIlxuIiArIGMrIl4iOworICAgIH0sCituZXh0OmZ1bmN0aW9uICgpIHsKKyAg
ICAgICAgaWYgKHRoaXMuZG9uZSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOworICAg
ICAgICB9CisgICAgICAgIGlmICghdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IHRydWU7CisKKyAg
ICAgICAgdmFyIHRva2VuLAorICAgICAgICAgICAgbWF0Y2gsCisgICAgICAgICAgICB0ZW1wTWF0
Y2gsCisgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgIGNvbCwKKyAgICAgICAgICAgIGxp
bmVzOworICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHsKKyAgICAgICAgICAgIHRoaXMueXl0ZXh0
ID0gJyc7CisgICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7CisgICAgICAgIH0KKyAgICAgICAg
dmFyIHJ1bGVzID0gdGhpcy5fY3VycmVudFJ1bGVzKCk7CisgICAgICAgIGZvciAodmFyIGk9MDtp
IDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lu
cHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTsKKyAgICAgICAgICAgIGlmICh0ZW1wTWF0
Y2ggJiYgKCFtYXRjaCB8fCB0ZW1wTWF0Y2hbMF0ubGVuZ3RoID4gbWF0Y2hbMF0ubGVuZ3RoKSkg
eworICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOworICAgICAgICAgICAgICAgIGlu
ZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5mbGV4KSBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAg
ICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpOworICAgICAgICAg
ICAgaWYgKGxpbmVzKSB0aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDsKKyAgICAgICAgICAg
IHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6IHRoaXMueXlsbG9jLmxhc3RfbGluZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy55eWxpbmVubysxLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVt
biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IGxpbmVz
W2xpbmVzLmxlbmd0aC0xXS5sZW5ndGgtbGluZXNbbGluZXMubGVuZ3RoLTFdLm1hdGNoKC9ccj9c
bj8vKVswXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbiArIG1hdGNoWzBdLmxlbmd0
aH07CisgICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBtYXRjaFswXTsKKyAgICAgICAgICAgIHRo
aXMubWF0Y2ggKz0gbWF0Y2hbMF07CisgICAgICAgICAgICB0aGlzLm1hdGNoZXMgPSBtYXRjaDsK
KyAgICAgICAgICAgIHRoaXMueXlsZW5nID0gdGhpcy55eXRleHQubGVuZ3RoOworICAgICAgICAg
ICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnl5bGxv
Yy5yYW5nZSA9IFt0aGlzLm9mZnNldCwgdGhpcy5vZmZzZXQgKz0gdGhpcy55eWxlbmddOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOworICAgICAgICAgICAg
dGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZShtYXRjaFswXS5sZW5ndGgpOworICAgICAg
ICAgICAgdGhpcy5tYXRjaGVkICs9IG1hdGNoWzBdOworICAgICAgICAgICAgdG9rZW4gPSB0aGlz
LnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sdGhp
cy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXSk7CisgICAgICAg
ICAgICBpZiAodGhpcy5kb25lICYmIHRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSBmYWxzZTsKKyAg
ICAgICAgICAgIGlmICh0b2tlbikgcmV0dXJuIHRva2VuOworICAgICAgICAgICAgZWxzZSByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuX2lucHV0ID09PSAiIikgeworICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuRU9GOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0
dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcrKHRoaXMueXlsaW5l
bm8rMSkrJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nK3RoaXMuc2hvd1Bvc2l0aW9uKCksCisgICAg
ICAgICAgICAgICAgICAgIHt0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5l
bm99KTsKKyAgICAgICAgfQorICAgIH0sCitsZXg6ZnVuY3Rpb24gbGV4KCkgeworICAgICAgICB2
YXIgciA9IHRoaXMubmV4dCgpOworICAgICAgICBpZiAodHlwZW9mIHIgIT09ICd1bmRlZmluZWQn
KSB7CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLmxleCgpOworICAgICAgICB9CisgICAgfSwKK2JlZ2luOmZ1bmN0aW9uIGJl
Z2luKGNvbmRpdGlvbikgeworICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrLnB1c2goY29uZGl0
aW9uKTsKKyAgICB9LAorcG9wU3RhdGU6ZnVuY3Rpb24gcG9wU3RhdGUoKSB7CisgICAgICAgIHJl
dHVybiB0aGlzLmNvbmRpdGlvblN0YWNrLnBvcCgpOworICAgIH0sCitfY3VycmVudFJ1bGVzOmZ1
bmN0aW9uIF9jdXJyZW50UnVsZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNb
dGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXV0ucnVsZXM7
CisgICAgfSwKK3RvcFN0YXRlOmZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29u
ZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgtMl07CisgICAgfSwKK3B1c2hT
dGF0ZTpmdW5jdGlvbiBiZWdpbihjb25kaXRpb24pIHsKKyAgICAgICAgdGhpcy5iZWdpbihjb25k
aXRpb24pOworICAgIH19KTsKK2xleGVyLm9wdGlvbnMgPSB7fTsKK2xleGVyLnBlcmZvcm1BY3Rp
b24gPSBmdW5jdGlvbiBhbm9ueW1vdXMoeXkseXlfLCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMs
WVlfU1RBUlQpIHsKKwordmFyIFlZU1RBVEU9WVlfU1RBUlQKK3N3aXRjaCgkYXZvaWRpbmdfbmFt
ZV9jb2xsaXNpb25zKSB7CitjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmKHl5Xy55eXRleHQuc2xpY2UoLTEpICE9PSAiXFwiKSB0aGlzLmJlZ2luKCJtdSIpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNlKC0x
KSA9PT0gIlxcIikgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDAseXlfLnl5bGVuZy0x
KSwgdGhpcy5iZWdpbigiZW11Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmKHl5Xy55eXRleHQpIHJldHVybiAxNDsKKworYnJlYWs7CitjYXNlIDE6IHJldHVybiAxNDsK
K2JyZWFrOworY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5
eV8ueXl0ZXh0LnNsaWNlKC0xKSAhPT0gIlxcIikgdGhpcy5wb3BTdGF0ZSgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxc
IikgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDAseXlfLnl5bGVuZy0xKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OworCiticmVhazsKK2Nhc2Ug
MzogeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDAsIHl5Xy55eWxlbmctNCk7IHRoaXMu
cG9wU3RhdGUoKTsgcmV0dXJuIDE1OworYnJlYWs7CitjYXNlIDQ6IHRoaXMuYmVnaW4oInBhciIp
OyByZXR1cm4gMjQ7CiticmVhazsKK2Nhc2UgNTogcmV0dXJuIDE2OworYnJlYWs7CitjYXNlIDY6
IHJldHVybiAyMDsKK2JyZWFrOworY2FzZSA3OiByZXR1cm4gMTk7CiticmVhazsKK2Nhc2UgODog
cmV0dXJuIDE5OworYnJlYWs7CitjYXNlIDk6IHJldHVybiAyMzsKK2JyZWFrOworY2FzZSAxMDog
cmV0dXJuIDIzOworYnJlYWs7CitjYXNlIDExOiB0aGlzLnBvcFN0YXRlKCk7IHRoaXMuYmVnaW4o
J2NvbScpOworYnJlYWs7CitjYXNlIDEyOiB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIo
Myx5eV8ueXlsZW5nLTUpOyB0aGlzLnBvcFN0YXRlKCk7IHJldHVybiAxNTsKK2JyZWFrOworY2Fz
ZSAxMzogcmV0dXJuIDIyOworYnJlYWs7CitjYXNlIDE0OiByZXR1cm4gMzY7CiticmVhazsKK2Nh
c2UgMTU6IHJldHVybiAzNTsKK2JyZWFrOworY2FzZSAxNjogcmV0dXJuIDM1OworYnJlYWs7Citj
YXNlIDE3OiByZXR1cm4gMzk7CiticmVhazsKK2Nhc2UgMTg6IC8qaWdub3JlIHdoaXRlc3BhY2Uq
LworYnJlYWs7CitjYXNlIDE5OiB0aGlzLnBvcFN0YXRlKCk7IHJldHVybiAxODsKK2JyZWFrOwor
Y2FzZSAyMDogdGhpcy5wb3BTdGF0ZSgpOyByZXR1cm4gMTg7CiticmVhazsKK2Nhc2UgMjE6IHl5
Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cigxLHl5Xy55eWxlbmctMikucmVwbGFjZSgvXFwi
L2csJyInKTsgcmV0dXJuIDMwOworYnJlYWs7CitjYXNlIDIyOiB5eV8ueXl0ZXh0ID0geXlfLnl5
dGV4dC5zdWJzdHIoMSx5eV8ueXlsZW5nLTIpLnJlcGxhY2UoL1xcJy9nLCInIik7IHJldHVybiAz
MDsKK2JyZWFrOworY2FzZSAyMzogeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDEpOyBy
ZXR1cm4gMjg7CiticmVhazsKK2Nhc2UgMjQ6IHJldHVybiAzMjsKK2JyZWFrOworY2FzZSAyNTog
cmV0dXJuIDMyOworYnJlYWs7CitjYXNlIDI2OiByZXR1cm4gMzE7CiticmVhazsKK2Nhc2UgMjc6
IHJldHVybiAzNTsKK2JyZWFrOworY2FzZSAyODogeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vi
c3RyKDEsIHl5Xy55eWxlbmctMik7IHJldHVybiAzNTsKK2JyZWFrOworY2FzZSAyOTogcmV0dXJu
ICdJTlZBTElEJzsKK2JyZWFrOworY2FzZSAzMDogLyppZ25vcmUgd2hpdGVzcGFjZSovCiticmVh
azsKK2Nhc2UgMzE6IHRoaXMucG9wU3RhdGUoKTsgcmV0dXJuIDM3OworYnJlYWs7CitjYXNlIDMy
OiByZXR1cm4gNTsKK2JyZWFrOworfQorfTsKK2xleGVyLnJ1bGVzID0gWy9eKD86W15ceDAwXSo/
KD89KFx7XHspKSkvLC9eKD86W15ceDAwXSspLywvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fCQp
KSkvLC9eKD86W1xzXFNdKj8tLVx9XH0pLywvXig/Olx7XHs+KS8sL14oPzpce1x7IykvLC9eKD86
XHtce1wvKS8sL14oPzpce1x7XF4pLywvXig/Olx7XHtccyplbHNlXGIpLywvXig/Olx7XHtceykv
LC9eKD86XHtceyYpLywvXig/Olx7XHshLS0pLywvXig/Olx7XHshW1xzXFNdKj9cfVx9KS8sL14o
Pzpce1x7KS8sL14oPzo9KS8sL14oPzpcLig/PVt9IF0pKS8sL14oPzpcLlwuKS8sL14oPzpbXC8u
XSkvLC9eKD86XHMrKS8sL14oPzpcfVx9XH0pLywvXig/Olx9XH0pLywvXig/OiIoXFxbIl18W14i
XSkqIikvLC9eKD86JyhcXFsnXXxbXiddKSonKS8sL14oPzpAW2EtekEtWl0rKS8sL14oPzp0cnVl
KD89W31cc10pKS8sL14oPzpmYWxzZSg/PVt9XHNdKSkvLC9eKD86WzAtOV0rKD89W31cc10pKS8s
L14oPzpbYS16QS1aMC05XyQtXSsoPz1bPX1cc1wvLl0pKS8sL14oPzpcW1teXF1dKlxdKS8sL14o
PzouKS8sL14oPzpccyspLywvXig/OlthLXpBLVowLTlfJC0vXSspLywvXig/OiQpL107CitsZXhl
ci5jb25kaXRpb25zID0geyJtdSI6eyJydWxlcyI6WzQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0
LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMyXSwiaW5jbHVz
aXZlIjpmYWxzZX0sImVtdSI6eyJydWxlcyI6WzJdLCJpbmNsdXNpdmUiOmZhbHNlfSwiY29tIjp7
InJ1bGVzIjpbM10sImluY2x1c2l2ZSI6ZmFsc2V9LCJwYXIiOnsicnVsZXMiOlszMCwzMV0sImlu
Y2x1c2l2ZSI6ZmFsc2V9LCJJTklUSUFMIjp7InJ1bGVzIjpbMCwxLDMyXSwiaW5jbHVzaXZlIjp0
cnVlfX07CityZXR1cm4gbGV4ZXI7fSkoKQorcGFyc2VyLmxleGVyID0gbGV4ZXI7CitmdW5jdGlv
biBQYXJzZXIgKCkgeyB0aGlzLnl5ID0ge307IH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3Bh
cnNlci5QYXJzZXIgPSBQYXJzZXI7CityZXR1cm4gbmV3IFBhcnNlcjsKK30pKCk7OworLy8gbGli
L2hhbmRsZWJhcnMvY29tcGlsZXIvYmFzZS5qcworSGFuZGxlYmFycy5QYXJzZXIgPSBoYW5kbGVi
YXJzOworCitIYW5kbGViYXJzLnBhcnNlID0gZnVuY3Rpb24oaW5wdXQpIHsKKworICAvLyBKdXN0
IHJldHVybiBpZiBhbiBhbHJlYWR5LWNvbXBpbGUgQVNUIHdhcyBwYXNzZWQgaW4uCisgIGlmKGlu
cHV0LmNvbnN0cnVjdG9yID09PSBIYW5kbGViYXJzLkFTVC5Qcm9ncmFtTm9kZSkgeyByZXR1cm4g
aW5wdXQ7IH0KKworICBIYW5kbGViYXJzLlBhcnNlci55eSA9IEhhbmRsZWJhcnMuQVNUOworICBy
ZXR1cm4gSGFuZGxlYmFycy5QYXJzZXIucGFyc2UoaW5wdXQpOworfTsKKworSGFuZGxlYmFycy5w
cmludCA9IGZ1bmN0aW9uKGFzdCkgeworICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuUHJpbnRWaXNp
dG9yKCkuYWNjZXB0KGFzdCk7Cit9OzsKKy8vIGxpYi9oYW5kbGViYXJzL2NvbXBpbGVyL2FzdC5q
cworKGZ1bmN0aW9uKCkgeworCisgIEhhbmRsZWJhcnMuQVNUID0ge307CisKKyAgSGFuZGxlYmFy
cy5BU1QuUHJvZ3JhbU5vZGUgPSBmdW5jdGlvbihzdGF0ZW1lbnRzLCBpbnZlcnNlKSB7CisgICAg
dGhpcy50eXBlID0gInByb2dyYW0iOworICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7
CisgICAgaWYoaW52ZXJzZSkgeyB0aGlzLmludmVyc2UgPSBuZXcgSGFuZGxlYmFycy5BU1QuUHJv
Z3JhbU5vZGUoaW52ZXJzZSk7IH0KKyAgfTsKKworICBIYW5kbGViYXJzLkFTVC5NdXN0YWNoZU5v
ZGUgPSBmdW5jdGlvbihyYXdQYXJhbXMsIGhhc2gsIHVuZXNjYXBlZCkgeworICAgIHRoaXMudHlw
ZSA9ICJtdXN0YWNoZSI7CisgICAgdGhpcy5lc2NhcGVkID0gIXVuZXNjYXBlZDsKKyAgICB0aGlz
Lmhhc2ggPSBoYXNoOworCisgICAgdmFyIGlkID0gdGhpcy5pZCA9IHJhd1BhcmFtc1swXTsKKyAg
ICB2YXIgcGFyYW1zID0gdGhpcy5wYXJhbXMgPSByYXdQYXJhbXMuc2xpY2UoMSk7CisKKyAgICAv
LyBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBpZjoKKyAgICAvLyAqIGl0cyBpZCBp
cyBzaW1wbGUgKGEgc2luZ2xlIHBhcnQsIG5vdCBgdGhpc2Agb3IgYC4uYCkKKyAgICB2YXIgZWxp
Z2libGVIZWxwZXIgPSB0aGlzLmVsaWdpYmxlSGVscGVyID0gaWQuaXNTaW1wbGU7CisKKyAgICAv
LyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6CisgICAgLy8gKiBpdCBpcyBh
biBlbGlnaWJsZSBoZWxwZXIsIGFuZAorICAgIC8vICogaXQgaGFzIGF0IGxlYXN0IG9uZSBwYXJh
bWV0ZXIgb3IgaGFzaCBzZWdtZW50CisgICAgdGhpcy5pc0hlbHBlciA9IGVsaWdpYmxlSGVscGVy
ICYmIChwYXJhbXMubGVuZ3RoIHx8IGhhc2gpOworCisgICAgLy8gaWYgYSBtdXN0YWNoZSBpcyBh
biBlbGlnaWJsZSBoZWxwZXIgYnV0IG5vdCBhIGRlZmluaXRlCisgICAgLy8gaGVscGVyLCBpdCBp
cyBhbWJpZ3VvdXMsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGluIGEgbGF0ZXIKKyAgICAvLyBwYXNz
IG9yIGF0IHJ1bnRpbWUuCisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuUGFydGlhbE5vZGUgPSBm
dW5jdGlvbihwYXJ0aWFsTmFtZSwgY29udGV4dCkgeworICAgIHRoaXMudHlwZSAgICAgICAgID0g
InBhcnRpYWwiOworICAgIHRoaXMucGFydGlhbE5hbWUgID0gcGFydGlhbE5hbWU7CisgICAgdGhp
cy5jb250ZXh0ICAgICAgPSBjb250ZXh0OworICB9OworCisgIHZhciB2ZXJpZnlNYXRjaCA9IGZ1
bmN0aW9uKG9wZW4sIGNsb3NlKSB7CisgICAgaWYob3Blbi5vcmlnaW5hbCAhPT0gY2xvc2Uub3Jp
Z2luYWwpIHsKKyAgICAgIHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlvbihvcGVuLm9yaWdp
bmFsICsgIiBkb2Vzbid0IG1hdGNoICIgKyBjbG9zZS5vcmlnaW5hbCk7CisgICAgfQorICB9Owor
CisgIEhhbmRsZWJhcnMuQVNULkJsb2NrTm9kZSA9IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFt
LCBpbnZlcnNlLCBjbG9zZSkgeworICAgIHZlcmlmeU1hdGNoKG11c3RhY2hlLmlkLCBjbG9zZSk7
CisgICAgdGhpcy50eXBlID0gImJsb2NrIjsKKyAgICB0aGlzLm11c3RhY2hlID0gbXVzdGFjaGU7
CisgICAgdGhpcy5wcm9ncmFtICA9IHByb2dyYW07CisgICAgdGhpcy5pbnZlcnNlICA9IGludmVy
c2U7CisKKyAgICBpZiAodGhpcy5pbnZlcnNlICYmICF0aGlzLnByb2dyYW0pIHsKKyAgICAgIHRo
aXMuaXNJbnZlcnNlID0gdHJ1ZTsKKyAgICB9CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuQ29u
dGVudE5vZGUgPSBmdW5jdGlvbihzdHJpbmcpIHsKKyAgICB0aGlzLnR5cGUgPSAiY29udGVudCI7
CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuSGFz
aE5vZGUgPSBmdW5jdGlvbihwYWlycykgeworICAgIHRoaXMudHlwZSA9ICJoYXNoIjsKKyAgICB0
aGlzLnBhaXJzID0gcGFpcnM7CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuSWROb2RlID0gZnVu
Y3Rpb24ocGFydHMpIHsKKyAgICB0aGlzLnR5cGUgPSAiSUQiOworICAgIHRoaXMub3JpZ2luYWwg
PSBwYXJ0cy5qb2luKCIuIik7CisKKyAgICB2YXIgZGlnID0gW10sIGRlcHRoID0gMDsKKworICAg
IGZvcih2YXIgaT0wLGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgdmFyIHBhcnQg
PSBwYXJ0c1tpXTsKKworICAgICAgaWYgKHBhcnQgPT09ICIuLiIgfHwgcGFydCA9PT0gIi4iIHx8
IHBhcnQgPT09ICJ0aGlzIikgeworICAgICAgICBpZiAoZGlnLmxlbmd0aCA+IDApIHsgdGhyb3cg
bmV3IEhhbmRsZWJhcnMuRXhjZXB0aW9uKCJJbnZhbGlkIHBhdGg6ICIgKyB0aGlzLm9yaWdpbmFs
KTsgfQorICAgICAgICBlbHNlIGlmIChwYXJ0ID09PSAiLi4iKSB7IGRlcHRoKys7IH0KKyAgICAg
ICAgZWxzZSB7IHRoaXMuaXNTY29wZWQgPSB0cnVlOyB9CisgICAgICB9CisgICAgICBlbHNlIHsg
ZGlnLnB1c2gocGFydCk7IH0KKyAgICB9CisKKyAgICB0aGlzLnBhcnRzICAgID0gZGlnOworICAg
IHRoaXMuc3RyaW5nICAgPSBkaWcuam9pbignLicpOworICAgIHRoaXMuZGVwdGggICAgPSBkZXB0
aDsKKworICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5k
IHRoYXQgcGFydCBpcyBub3QKKyAgICAvLyBgLi5gIG9yIGB0aGlzYC4KKyAgICB0aGlzLmlzU2lt
cGxlID0gcGFydHMubGVuZ3RoID09PSAxICYmICF0aGlzLmlzU2NvcGVkICYmIGRlcHRoID09PSAw
OworCisgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSB0aGlzLnN0cmluZzsKKyAgfTsKKworICBI
YW5kbGViYXJzLkFTVC5QYXJ0aWFsTmFtZU5vZGUgPSBmdW5jdGlvbihuYW1lKSB7CisgICAgdGhp
cy50eXBlID0gIlBBUlRJQUxfTkFNRSI7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfTsKKwor
ICBIYW5kbGViYXJzLkFTVC5EYXRhTm9kZSA9IGZ1bmN0aW9uKGlkKSB7CisgICAgdGhpcy50eXBl
ID0gIkRBVEEiOworICAgIHRoaXMuaWQgPSBpZDsKKyAgfTsKKworICBIYW5kbGViYXJzLkFTVC5T
dHJpbmdOb2RlID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgICAgdGhpcy50eXBlID0gIlNUUklORyI7
CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBz
dHJpbmc7CisgIH07CisKKyAgSGFuZGxlYmFycy5BU1QuSW50ZWdlck5vZGUgPSBmdW5jdGlvbihp
bnRlZ2VyKSB7CisgICAgdGhpcy50eXBlID0gIklOVEVHRVIiOworICAgIHRoaXMuaW50ZWdlciA9
IGludGVnZXI7CisgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBOdW1iZXIoaW50ZWdlcik7Cisg
IH07CisKKyAgSGFuZGxlYmFycy5BU1QuQm9vbGVhbk5vZGUgPSBmdW5jdGlvbihib29sKSB7Cisg
ICAgdGhpcy50eXBlID0gIkJPT0xFQU4iOworICAgIHRoaXMuYm9vbCA9IGJvb2w7CisgICAgdGhp
cy5zdHJpbmdNb2RlVmFsdWUgPSBib29sID09PSAidHJ1ZSI7CisgIH07CisKKyAgSGFuZGxlYmFy
cy5BU1QuQ29tbWVudE5vZGUgPSBmdW5jdGlvbihjb21tZW50KSB7CisgICAgdGhpcy50eXBlID0g
ImNvbW1lbnQiOworICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgIH07CisKK30pKCk7Owor
Ly8gbGliL2hhbmRsZWJhcnMvdXRpbHMuanMKKwordmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0
aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJl
cicsICdzdGFjayddOworCitIYW5kbGViYXJzLkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2Up
IHsKKyAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBh
cmd1bWVudHMpOworCisgIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFyZSBub3QgZW51bWVyYWJs
ZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRtcGAgZG9lc24ndCB3b3Jr
LgorICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHsK
KyAgICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTsKKyAgfQor
fTsKK0hhbmRsZWJhcnMuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOworCisvLyBC
dWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZQorSGFuZGxlYmFycy5TYWZlU3RyaW5n
ID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworfTsKK0hhbmRs
ZWJhcnMuU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgcmV0
dXJuIHRoaXMuc3RyaW5nLnRvU3RyaW5nKCk7Cit9OworCisoZnVuY3Rpb24oKSB7CisgIHZhciBl
c2NhcGUgPSB7CisgICAgIiYiOiAiJmFtcDsiLAorICAgICI8IjogIiZsdDsiLAorICAgICI+Ijog
IiZndDsiLAorICAgICciJzogIiZxdW90OyIsCisgICAgIiciOiAiJiN4Mjc7IiwKKyAgICAiYCI6
ICImI3g2MDsiCisgIH07CisKKyAgdmFyIGJhZENoYXJzID0gL1smPD4iJ2BdL2c7CisgIHZhciBw
b3NzaWJsZSA9IC9bJjw+IidgXS87CisKKyAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihjaHIp
IHsKKyAgICByZXR1cm4gZXNjYXBlW2Nocl0gfHwgIiZhbXA7IjsKKyAgfTsKKworICBIYW5kbGVi
YXJzLlV0aWxzID0geworICAgIGVzY2FwZUV4cHJlc3Npb246IGZ1bmN0aW9uKHN0cmluZykgewor
ICAgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkg
c2FmZQorICAgICAgaWYgKHN0cmluZyBpbnN0YW5jZW9mIEhhbmRsZWJhcnMuU2FmZVN0cmluZykg
eworICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7CisgICAgICB9IGVsc2UgaWYgKHN0
cmluZyA9PSBudWxsIHx8IHN0cmluZyA9PT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuICIiOwor
ICAgICAgfQorCisgICAgICBpZighcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJp
bmc7IH0KKyAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7
CisgICAgfSwKKworICAgIGlzRW1wdHk6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAoIXZh
bHVlICYmIHZhbHVlICE9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNl
IGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICJbb2JqZWN0IEFy
cmF5XSIgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfTsK
K30pKCk7OworLy8gbGliL2hhbmRsZWJhcnMvY29tcGlsZXIvY29tcGlsZXIuanMKKworLypqc2hp
bnQgZXFudWxsOnRydWUqLworSGFuZGxlYmFycy5Db21waWxlciA9IGZ1bmN0aW9uKCkge307CitI
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CisKKyhmdW5jdGlv
bihDb21waWxlciwgSmF2YVNjcmlwdENvbXBpbGVyKSB7CisgIC8vIHRoZSBmb3VuZEhlbHBlciBy
ZWdpc3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIgbG9va3VwIGZyb20gZmluZGluZyBhCisg
IC8vIGZ1bmN0aW9uIGluIGEgY29udGV4dC4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIG11c3RhY2hl
IGNvbXBhdGliaWxpdHksIHdoaWNoCisgIC8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlv
bnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAorICAvLyBh
bmQgdGhlbiBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRv
IGJsb2NrSGVscGVyTWlzc2luZy4KKworICBDb21waWxlci5wcm90b3R5cGUgPSB7CisgICAgY29t
cGlsZXI6IENvbXBpbGVyLAorCisgICAgZGlzYXNzZW1ibGU6IGZ1bmN0aW9uKCkgeworICAgICAg
dmFyIG9wY29kZXMgPSB0aGlzLm9wY29kZXMsIG9wY29kZSwgb3V0ID0gW10sIHBhcmFtcywgcGFy
YW07CisKKyAgICAgIGZvciAodmFyIGk9MCwgbD1vcGNvZGVzLmxlbmd0aDsgaTxsOyBpKyspIHsK
KyAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKKworICAgICAgICBpZiAob3Bjb2RlLm9wY29k
ZSA9PT0gJ0RFQ0xBUkUnKSB7CisgICAgICAgICAgb3V0LnB1c2goIkRFQ0xBUkUgIiArIG9wY29k
ZS5uYW1lICsgIj0iICsgb3Bjb2RlLnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICBwYXJhbXMgPSBbXTsKKyAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8b3Bjb2RlLmFyZ3MubGVu
Z3RoOyBqKyspIHsKKyAgICAgICAgICAgIHBhcmFtID0gb3Bjb2RlLmFyZ3Nbal07CisgICAgICAg
ICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICBwYXJh
bSA9ICJcIiIgKyBwYXJhbS5yZXBsYWNlKCJcbiIsICJcXG4iKSArICJcIiI7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7CisgICAgICAgICAgfQorICAgICAg
ICAgIG91dC5wdXNoKG9wY29kZS5vcGNvZGUgKyAiICIgKyBwYXJhbXMuam9pbigiICIpKTsKKyAg
ICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gb3V0LmpvaW4oIlxuIik7CisgICAgfSwK
KyAgICBlcXVhbHM6IGZ1bmN0aW9uKG90aGVyKSB7CisgICAgICB2YXIgbGVuID0gdGhpcy5vcGNv
ZGVzLmxlbmd0aDsKKyAgICAgIGlmIChvdGhlci5vcGNvZGVzLmxlbmd0aCAhPT0gbGVuKSB7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBsZW47IGkrKykgeworICAgICAgICB2YXIgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLAorICAg
ICAgICAgICAgb3RoZXJPcGNvZGUgPSBvdGhlci5vcGNvZGVzW2ldOworICAgICAgICBpZiAob3Bj
b2RlLm9wY29kZSAhPT0gb3RoZXJPcGNvZGUub3Bjb2RlIHx8IG9wY29kZS5hcmdzLmxlbmd0aCAh
PT0gb3RoZXJPcGNvZGUuYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvcGNvZGUuYXJncy5sZW5ndGg7
IGorKykgeworICAgICAgICAgIGlmIChvcGNvZGUuYXJnc1tqXSAhPT0gb3RoZXJPcGNvZGUuYXJn
c1tqXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIGd1aWQ6IDAsCisK
KyAgICBjb21waWxlOiBmdW5jdGlvbihwcm9ncmFtLCBvcHRpb25zKSB7CisgICAgICB0aGlzLmNo
aWxkcmVuID0gW107CisgICAgICB0aGlzLmRlcHRocyA9IHtsaXN0OiBbXX07CisgICAgICB0aGlz
Lm9wdGlvbnMgPSBvcHRpb25zOworCisgICAgICAvLyBUaGVzZSBjaGFuZ2VzIHdpbGwgcHJvcGFn
YXRlIHRvIHRoZSBvdGhlciBjb21waWxlciBjb21wb25lbnRzCisgICAgICB2YXIga25vd25IZWxw
ZXJzID0gdGhpcy5vcHRpb25zLmtub3duSGVscGVyczsKKyAgICAgIHRoaXMub3B0aW9ucy5rbm93
bkhlbHBlcnMgPSB7CisgICAgICAgICdoZWxwZXJNaXNzaW5nJzogdHJ1ZSwKKyAgICAgICAgJ2Js
b2NrSGVscGVyTWlzc2luZyc6IHRydWUsCisgICAgICAgICdlYWNoJzogdHJ1ZSwKKyAgICAgICAg
J2lmJzogdHJ1ZSwKKyAgICAgICAgJ3VubGVzcyc6IHRydWUsCisgICAgICAgICd3aXRoJzogdHJ1
ZSwKKyAgICAgICAgJ2xvZyc6IHRydWUKKyAgICAgIH07CisgICAgICBpZiAoa25vd25IZWxwZXJz
KSB7CisgICAgICAgIGZvciAodmFyIG5hbWUgaW4ga25vd25IZWxwZXJzKSB7CisgICAgICAgICAg
dGhpcy5vcHRpb25zLmtub3duSGVscGVyc1tuYW1lXSA9IGtub3duSGVscGVyc1tuYW1lXTsKKyAg
ICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5wcm9ncmFtKHByb2dyYW0pOwor
ICAgIH0sCisKKyAgICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIHJldHVybiB0aGlz
W25vZGUudHlwZV0obm9kZSk7CisgICAgfSwKKworICAgIHByb2dyYW06IGZ1bmN0aW9uKHByb2dy
YW0pIHsKKyAgICAgIHZhciBzdGF0ZW1lbnRzID0gcHJvZ3JhbS5zdGF0ZW1lbnRzLCBzdGF0ZW1l
bnQ7CisgICAgICB0aGlzLm9wY29kZXMgPSBbXTsKKworICAgICAgZm9yKHZhciBpPTAsIGw9c3Rh
dGVtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVu
dHNbaV07CisgICAgICAgIHRoaXNbc3RhdGVtZW50LnR5cGVdKHN0YXRlbWVudCk7CisgICAgICB9
CisgICAgICB0aGlzLmlzU2ltcGxlID0gbCA9PT0gMTsKKworICAgICAgdGhpcy5kZXB0aHMubGlz
dCA9IHRoaXMuZGVwdGhzLmxpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7CisgICAgICAgIHJldHVy
biBhIC0gYjsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAg
Y29tcGlsZVByb2dyYW06IGZ1bmN0aW9uKHByb2dyYW0pIHsKKyAgICAgIHZhciByZXN1bHQgPSBu
ZXcgdGhpcy5jb21waWxlcigpLmNvbXBpbGUocHJvZ3JhbSwgdGhpcy5vcHRpb25zKTsKKyAgICAg
IHZhciBndWlkID0gdGhpcy5ndWlkKyssIGRlcHRoOworCisgICAgICB0aGlzLnVzZVBhcnRpYWwg
PSB0aGlzLnVzZVBhcnRpYWwgfHwgcmVzdWx0LnVzZVBhcnRpYWw7CisKKyAgICAgIHRoaXMuY2hp
bGRyZW5bZ3VpZF0gPSByZXN1bHQ7CisKKyAgICAgIGZvcih2YXIgaT0wLCBsPXJlc3VsdC5kZXB0
aHMubGlzdC5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGRlcHRoID0gcmVzdWx0LmRlcHRo
cy5saXN0W2ldOworCisgICAgICAgIGlmKGRlcHRoIDwgMikgeyBjb250aW51ZTsgfQorICAgICAg
ICBlbHNlIHsgdGhpcy5hZGREZXB0aChkZXB0aCAtIDEpOyB9CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBndWlkOworICAgIH0sCisKKyAgICBibG9jazogZnVuY3Rpb24oYmxvY2spIHsKKyAgICAg
IHZhciBtdXN0YWNoZSA9IGJsb2NrLm11c3RhY2hlLAorICAgICAgICAgIHByb2dyYW0gPSBibG9j
ay5wcm9ncmFtLAorICAgICAgICAgIGludmVyc2UgPSBibG9jay5pbnZlcnNlOworCisgICAgICBp
ZiAocHJvZ3JhbSkgeworICAgICAgICBwcm9ncmFtID0gdGhpcy5jb21waWxlUHJvZ3JhbShwcm9n
cmFtKTsKKyAgICAgIH0KKworICAgICAgaWYgKGludmVyc2UpIHsKKyAgICAgICAgaW52ZXJzZSA9
IHRoaXMuY29tcGlsZVByb2dyYW0oaW52ZXJzZSk7CisgICAgICB9CisKKyAgICAgIHZhciB0eXBl
ID0gdGhpcy5jbGFzc2lmeU11c3RhY2hlKG11c3RhY2hlKTsKKworICAgICAgaWYgKHR5cGUgPT09
ICJoZWxwZXIiKSB7CisgICAgICAgIHRoaXMuaGVscGVyTXVzdGFjaGUobXVzdGFjaGUsIHByb2dy
YW0sIGludmVyc2UpOworICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAic2ltcGxlIikgeworICAg
ICAgICB0aGlzLnNpbXBsZU11c3RhY2hlKG11c3RhY2hlKTsKKworICAgICAgICAvLyBub3cgdGhh
dCB0aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvCisgICAgICAgIC8v
IGV2YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYAorICAgICAgICB0
aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKKyAgICAgICAgdGhpcy5vcGNvZGUo
J3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CisgICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gn
KTsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnKTsKKyAgICAgIH0gZWxzZSB7Cisg
ICAgICAgIHRoaXMuYW1iaWd1b3VzTXVzdGFjaGUobXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2Up
OworCisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQs
IHdlIG5lZWQgdG8KKyAgICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hl
bHBlck1pc3NpbmdgCisgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0p
OworICAgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKKyAgICAgICAg
dGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOworICAgICAgICB0aGlzLm9wY29kZSgnYW1iaWd1b3Vz
QmxvY2tWYWx1ZScpOworICAgICAgfQorCisgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7Cisg
ICAgfSwKKworICAgIGhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKKyAgICAgIHZhciBwYWlycyA9IGhh
c2gucGFpcnMsIHBhaXIsIHZhbDsKKworICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7CisK
KyAgICAgIGZvcih2YXIgaT0wLCBsPXBhaXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAg
cGFpciA9IHBhaXJzW2ldOworICAgICAgICB2YWwgID0gcGFpclsxXTsKKworICAgICAgICBpZiAo
dGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykgeworICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNo
U3RyaW5nUGFyYW0nLCB2YWwuc3RyaW5nTW9kZVZhbHVlLCB2YWwudHlwZSk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgdGhpcy5hY2NlcHQodmFsKTsKKyAgICAgICAgfQorCisgICAgICAg
IHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyWzBdKTsKKyAgICAgIH0KKyAgICAgIHRo
aXMub3Bjb2RlKCdwb3BIYXNoJyk7CisgICAgfSwKKworICAgIHBhcnRpYWw6IGZ1bmN0aW9uKHBh
cnRpYWwpIHsKKyAgICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwucGFydGlhbE5hbWU7Cisg
ICAgICB0aGlzLnVzZVBhcnRpYWwgPSB0cnVlOworCisgICAgICBpZihwYXJ0aWFsLmNvbnRleHQp
IHsKKyAgICAgICAgdGhpcy5JRChwYXJ0aWFsLmNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy5vcGNvZGUoJ3B1c2gnLCAnZGVwdGgwJyk7CisgICAgICB9CisKKyAgICAgIHRo
aXMub3Bjb2RlKCdpbnZva2VQYXJ0aWFsJywgcGFydGlhbE5hbWUubmFtZSk7CisgICAgICB0aGlz
Lm9wY29kZSgnYXBwZW5kJyk7CisgICAgfSwKKworICAgIGNvbnRlbnQ6IGZ1bmN0aW9uKGNvbnRl
bnQpIHsKKyAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRDb250ZW50JywgY29udGVudC5zdHJpbmcp
OworICAgIH0sCisKKyAgICBtdXN0YWNoZTogZnVuY3Rpb24obXVzdGFjaGUpIHsKKyAgICAgIHZh
ciBvcHRpb25zID0gdGhpcy5vcHRpb25zOworICAgICAgdmFyIHR5cGUgPSB0aGlzLmNsYXNzaWZ5
TXVzdGFjaGUobXVzdGFjaGUpOworCisgICAgICBpZiAodHlwZSA9PT0gInNpbXBsZSIpIHsKKyAg
ICAgICAgdGhpcy5zaW1wbGVNdXN0YWNoZShtdXN0YWNoZSk7CisgICAgICB9IGVsc2UgaWYgKHR5
cGUgPT09ICJoZWxwZXIiKSB7CisgICAgICAgIHRoaXMuaGVscGVyTXVzdGFjaGUobXVzdGFjaGUp
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5hbWJpZ3VvdXNNdXN0YWNoZShtdXN0YWNo
ZSk7CisgICAgICB9CisKKyAgICAgIGlmKG11c3RhY2hlLmVzY2FwZWQgJiYgIW9wdGlvbnMubm9F
c2NhcGUpIHsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKKyAgICAgIH0KKyAgICB9LAor
CisgICAgYW1iaWd1b3VzTXVzdGFjaGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFtLCBpbnZl
cnNlKSB7CisgICAgICB2YXIgaWQgPSBtdXN0YWNoZS5pZCwKKyAgICAgICAgICBuYW1lID0gaWQu
cGFydHNbMF0sCisgICAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNl
ICE9IG51bGw7CisKKyAgICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgaWQuZGVwdGgpOwor
CisgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKKyAgICAgIHRoaXMu
b3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOworCisgICAgICB0aGlzLm9wY29kZSgnaW52
b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9jayk7CisgICAgfSwKKworICAgIHNpbXBsZU11c3Rh
Y2hlOiBmdW5jdGlvbihtdXN0YWNoZSkgeworICAgICAgdmFyIGlkID0gbXVzdGFjaGUuaWQ7CisK
KyAgICAgIGlmIChpZC50eXBlID09PSAnREFUQScpIHsKKyAgICAgICAgdGhpcy5EQVRBKGlkKTsK
KyAgICAgIH0gZWxzZSBpZiAoaWQucGFydHMubGVuZ3RoKSB7CisgICAgICAgIHRoaXMuSUQoaWQp
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2ltcGxpZmllZCBJRCBmb3IgYHRoaXNgCisg
ICAgICAgIHRoaXMuYWRkRGVwdGgoaWQuZGVwdGgpOworICAgICAgICB0aGlzLm9wY29kZSgnZ2V0
Q29udGV4dCcsIGlkLmRlcHRoKTsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7
CisgICAgICB9CisKKyAgICAgIHRoaXMub3Bjb2RlKCdyZXNvbHZlUG9zc2libGVMYW1iZGEnKTsK
KyAgICB9LAorCisgICAgaGVscGVyTXVzdGFjaGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFt
LCBpbnZlcnNlKSB7CisgICAgICB2YXIgcGFyYW1zID0gdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBh
cmFtcyhtdXN0YWNoZSwgcHJvZ3JhbSwgaW52ZXJzZSksCisgICAgICAgICAgbmFtZSA9IG11c3Rh
Y2hlLmlkLnBhcnRzWzBdOworCisgICAgICBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc1tu
YW1lXSkgeworICAgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMu
bGVuZ3RoLCBuYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5rbm93bkhlbHBlcnNPbmx5KSB7
CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5
LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgIiArIG5hbWUpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgdGhpcy5vcGNvZGUoJ2ludm9rZUhlbHBlcicsIHBhcmFtcy5sZW5ndGgsIG5hbWUp
OworICAgICAgfQorICAgIH0sCisKKyAgICBJRDogZnVuY3Rpb24oaWQpIHsKKyAgICAgIHRoaXMu
YWRkRGVwdGgoaWQuZGVwdGgpOworICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBpZC5k
ZXB0aCk7CisKKyAgICAgIHZhciBuYW1lID0gaWQucGFydHNbMF07CisgICAgICBpZiAoIW5hbWUp
IHsKKyAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICB0aGlzLm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgaWQucGFydHNbMF0pOworICAg
ICAgfQorCisgICAgICBmb3IodmFyIGk9MSwgbD1pZC5wYXJ0cy5sZW5ndGg7IGk8bDsgaSsrKSB7
CisgICAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXAnLCBpZC5wYXJ0c1tpXSk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIERBVEE6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHRoaXMub3B0aW9ucy5k
YXRhID0gdHJ1ZTsKKyAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBEYXRhJywgZGF0YS5pZCk7Cisg
ICAgfSwKKworICAgIFNUUklORzogZnVuY3Rpb24oc3RyaW5nKSB7CisgICAgICB0aGlzLm9wY29k
ZSgncHVzaFN0cmluZycsIHN0cmluZy5zdHJpbmcpOworICAgIH0sCisKKyAgICBJTlRFR0VSOiBm
dW5jdGlvbihpbnRlZ2VyKSB7CisgICAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBpbnRl
Z2VyLmludGVnZXIpOworICAgIH0sCisKKyAgICBCT09MRUFOOiBmdW5jdGlvbihib29sKSB7Cisg
ICAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBib29sLmJvb2wpOworICAgIH0sCisKKyAg
ICBjb21tZW50OiBmdW5jdGlvbigpIHt9LAorCisgICAgLy8gSEVMUEVSUworICAgIG9wY29kZTog
ZnVuY3Rpb24obmFtZSkgeworICAgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6IG5hbWUs
IGFyZ3M6IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSB9KTsKKyAgICB9LAorCisgICAgZGVj
bGFyZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKKyAgICAgIHRoaXMub3Bjb2Rlcy5wdXNoKHsg
b3Bjb2RlOiAnREVDTEFSRScsIG5hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZSB9KTsKKyAgICB9LAor
CisgICAgYWRkRGVwdGg6IGZ1bmN0aW9uKGRlcHRoKSB7CisgICAgICBpZihpc05hTihkZXB0aCkp
IHsgdGhyb3cgbmV3IEVycm9yKCJFV09UIik7IH0KKyAgICAgIGlmKGRlcHRoID09PSAwKSB7IHJl
dHVybjsgfQorCisgICAgICBpZighdGhpcy5kZXB0aHNbZGVwdGhdKSB7CisgICAgICAgIHRoaXMu
ZGVwdGhzW2RlcHRoXSA9IHRydWU7CisgICAgICAgIHRoaXMuZGVwdGhzLmxpc3QucHVzaChkZXB0
aCk7CisgICAgICB9CisgICAgfSwKKworICAgIGNsYXNzaWZ5TXVzdGFjaGU6IGZ1bmN0aW9uKG11
c3RhY2hlKSB7CisgICAgICB2YXIgaXNIZWxwZXIgICA9IG11c3RhY2hlLmlzSGVscGVyOworICAg
ICAgdmFyIGlzRWxpZ2libGUgPSBtdXN0YWNoZS5lbGlnaWJsZUhlbHBlcjsKKyAgICAgIHZhciBv
cHRpb25zICAgID0gdGhpcy5vcHRpb25zOworCisgICAgICAvLyBpZiBhbWJpZ3VvdXMsIHdlIGNh
biBwb3NzaWJseSByZXNvbHZlIHRoZSBhbWJpZ3VpdHkgbm93CisgICAgICBpZiAoaXNFbGlnaWJs
ZSAmJiAhaXNIZWxwZXIpIHsKKyAgICAgICAgdmFyIG5hbWUgPSBtdXN0YWNoZS5pZC5wYXJ0c1sw
XTsKKworICAgICAgICBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0pIHsKKyAgICAgICAg
ICBpc0hlbHBlciA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5rbm93bkhlbHBl
cnNPbmx5KSB7CisgICAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOworICAgICAgICB9CisgICAg
ICB9CisKKyAgICAgIGlmIChpc0hlbHBlcikgeyByZXR1cm4gImhlbHBlciI7IH0KKyAgICAgIGVs
c2UgaWYgKGlzRWxpZ2libGUpIHsgcmV0dXJuICJhbWJpZ3VvdXMiOyB9CisgICAgICBlbHNlIHsg
cmV0dXJuICJzaW1wbGUiOyB9CisgICAgfSwKKworICAgIHB1c2hQYXJhbXM6IGZ1bmN0aW9uKHBh
cmFtcykgeworICAgICAgdmFyIGkgPSBwYXJhbXMubGVuZ3RoLCBwYXJhbTsKKworICAgICAgd2hp
bGUoaS0tKSB7CisgICAgICAgIHBhcmFtID0gcGFyYW1zW2ldOworCisgICAgICAgIGlmKHRoaXMu
b3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKKyAgICAgICAgICBpZihwYXJhbS5kZXB0aCkgeworICAg
ICAgICAgICAgdGhpcy5hZGREZXB0aChwYXJhbS5kZXB0aCk7CisgICAgICAgICAgfQorCisgICAg
ICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXJhbS5kZXB0aCB8fCAwKTsKKyAgICAg
ICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgcGFyYW0uc3RyaW5nTW9kZVZhbHVl
LCBwYXJhbS50eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzW3BhcmFtLnR5
cGVdKHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICBzZXR1cE11c3Rh
Y2hlUGFyYW1zOiBmdW5jdGlvbihtdXN0YWNoZSkgeworICAgICAgdmFyIHBhcmFtcyA9IG11c3Rh
Y2hlLnBhcmFtczsKKyAgICAgIHRoaXMucHVzaFBhcmFtcyhwYXJhbXMpOworCisgICAgICBpZiht
dXN0YWNoZS5oYXNoKSB7CisgICAgICAgIHRoaXMuaGFzaChtdXN0YWNoZS5oYXNoKTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9LAorCisgICAgLy8gdGhpcyB3aWxsIHJlcGxhY2Ug
c2V0dXBNdXN0YWNoZVBhcmFtcyB3aGVuIHdlJ3JlIGRvbmUKKyAgICBzZXR1cEZ1bGxNdXN0YWNo
ZVBhcmFtczogZnVuY3Rpb24obXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UpIHsKKyAgICAgIHZh
ciBwYXJhbXMgPSBtdXN0YWNoZS5wYXJhbXM7CisgICAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1z
KTsKKworICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7CisgICAgICB0
aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKKworICAgICAgaWYobXVzdGFjaGUu
aGFzaCkgeworICAgICAgICB0aGlzLmhhc2gobXVzdGFjaGUuaGFzaCk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJyk7CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBwYXJhbXM7CisgICAgfQorICB9OworCisgIHZhciBMaXRlcmFsID0gZnVuY3Rpb24odmFs
dWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH07CisKKyAgSmF2YVNjcmlwdENvbXBp
bGVyLnByb3RvdHlwZSA9IHsKKyAgICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRo
ZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCisgICAgLy8gYWx0ZXJuYXRpdmUg
Y29tcGlsZWQgZm9ybXMgZm9yIG5hbWUgbG9va3VwIGFuZCBidWZmZXJpbmcgc2VtYW50aWNzCisg
ICAgbmFtZUxvb2t1cDogZnVuY3Rpb24ocGFyZW50LCBuYW1lIC8qICwgdHlwZSovKSB7CisgICAg
ICBpZiAoL15bMC05XSskLy50ZXN0KG5hbWUpKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgKyAi
WyIgKyBuYW1lICsgIl0iOworICAgICAgfSBlbHNlIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNW
YWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVu
dCArICIuIiArIG5hbWU7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBh
cmVudCArICJbJyIgKyBuYW1lICsgIiddIjsKKyAgICAgIH0KKyAgICB9LAorCisgICAgYXBwZW5k
VG9CdWZmZXI6IGZ1bmN0aW9uKHN0cmluZykgeworICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQu
aXNTaW1wbGUpIHsKKyAgICAgICAgcmV0dXJuICJyZXR1cm4gIiArIHN0cmluZyArICI7IjsKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgYXBwZW5kVG9CdWZmZXI6
IHRydWUsCisgICAgICAgICAgY29udGVudDogc3RyaW5nLAorICAgICAgICAgIHRvU3RyaW5nOiBm
dW5jdGlvbigpIHsgcmV0dXJuICJidWZmZXIgKz0gIiArIHN0cmluZyArICI7IjsgfQorICAgICAg
ICB9OworICAgICAgfQorICAgIH0sCisKKyAgICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbigp
IHsKKyAgICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygiIik7CisgICAgfSwKKworICAgIG5h
bWVzcGFjZTogIkhhbmRsZWJhcnMiLAorICAgIC8vIEVORCBQVUJMSUMgQVBJCisKKyAgICBjb21w
aWxlOiBmdW5jdGlvbihlbnZpcm9ubWVudCwgb3B0aW9ucywgY29udGV4dCwgYXNPYmplY3QpIHsK
KyAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKKyAgICAgIHRoaXMub3B0aW9u
cyA9IG9wdGlvbnMgfHwge307CisKKyAgICAgIEhhbmRsZWJhcnMubG9nKEhhbmRsZWJhcnMubG9n
Z2VyLkRFQlVHLCB0aGlzLmVudmlyb25tZW50LmRpc2Fzc2VtYmxlKCkgKyAiXG5cbiIpOworCisg
ICAgICB0aGlzLm5hbWUgPSB0aGlzLmVudmlyb25tZW50Lm5hbWU7CisgICAgICB0aGlzLmlzQ2hp
bGQgPSAhIWNvbnRleHQ7CisgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHsKKyAgICAg
ICAgcHJvZ3JhbXM6IFtdLAorICAgICAgICBlbnZpcm9ubWVudHM6IFtdLAorICAgICAgICBhbGlh
c2VzOiB7IH0KKyAgICAgIH07CisKKyAgICAgIHRoaXMucHJlYW1ibGUoKTsKKworICAgICAgdGhp
cy5zdGFja1Nsb3QgPSAwOworICAgICAgdGhpcy5zdGFja1ZhcnMgPSBbXTsKKyAgICAgIHRoaXMu
cmVnaXN0ZXJzID0geyBsaXN0OiBbXSB9OworICAgICAgdGhpcy5jb21waWxlU3RhY2sgPSBbXTsK
KyAgICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKKworICAgICAgdGhpcy5jb21waWxlQ2hpbGRy
ZW4oZW52aXJvbm1lbnQsIG9wdGlvbnMpOworCisgICAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25t
ZW50Lm9wY29kZXMsIG9wY29kZTsKKworICAgICAgdGhpcy5pID0gMDsKKworICAgICAgZm9yKGw9
b3Bjb2Rlcy5sZW5ndGg7IHRoaXMuaTxsOyB0aGlzLmkrKykgeworICAgICAgICBvcGNvZGUgPSBv
cGNvZGVzW3RoaXMuaV07CisKKyAgICAgICAgaWYob3Bjb2RlLm9wY29kZSA9PT0gJ0RFQ0xBUkUn
KSB7CisgICAgICAgICAgdGhpc1tvcGNvZGUubmFtZV0gPSBvcGNvZGUudmFsdWU7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgdGhpc1tvcGNvZGUub3Bjb2RlXS5hcHBseSh0aGlzLCBvcGNv
ZGUuYXJncyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuY3JlYXRl
RnVuY3Rpb25Db250ZXh0KGFzT2JqZWN0KTsKKyAgICB9LAorCisgICAgbmV4dE9wY29kZTogZnVu
Y3Rpb24oKSB7CisgICAgICB2YXIgb3Bjb2RlcyA9IHRoaXMuZW52aXJvbm1lbnQub3Bjb2RlczsK
KyAgICAgIHJldHVybiBvcGNvZGVzW3RoaXMuaSArIDFdOworICAgIH0sCisKKyAgICBlYXQ6IGZ1
bmN0aW9uKCkgeworICAgICAgdGhpcy5pID0gdGhpcy5pICsgMTsKKyAgICB9LAorCisgICAgcHJl
YW1ibGU6IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG91dCA9IFtdOworCisgICAgICBpZiAoIXRo
aXMuaXNDaGlsZCkgeworICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2U7Cisg
ICAgICAgIHZhciBjb3BpZXMgPSAiaGVscGVycyA9IGhlbHBlcnMgfHwgIiArIG5hbWVzcGFjZSAr
ICIuaGVscGVyczsiOworICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsKSB7
IGNvcGllcyA9IGNvcGllcyArICIgcGFydGlhbHMgPSBwYXJ0aWFscyB8fCAiICsgbmFtZXNwYWNl
ICsgIi5wYXJ0aWFsczsiOyB9CisgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkgeyBjb3Bp
ZXMgPSBjb3BpZXMgKyAiIGRhdGEgPSBkYXRhIHx8IHt9OyI7IH0KKyAgICAgICAgb3V0LnB1c2go
Y29waWVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dC5wdXNoKCcnKTsKKyAgICAgIH0K
KworICAgICAgaWYgKCF0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlKSB7CisgICAgICAgIG91dC5w
dXNoKCIsIGJ1ZmZlciA9ICIgKyB0aGlzLmluaXRpYWxpemVCdWZmZXIoKSk7CisgICAgICB9IGVs
c2UgeworICAgICAgICBvdXQucHVzaCgiIik7CisgICAgICB9CisKKyAgICAgIC8vIHRyYWNrIHRo
ZSBsYXN0IGNvbnRleHQgcHVzaGVkIGludG8gcGxhY2UgdG8gYWxsb3cgc2tpcHBpbmcgdGhlCisg
ICAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcAorICAgICAg
dGhpcy5sYXN0Q29udGV4dCA9IDA7CisgICAgICB0aGlzLnNvdXJjZSA9IG91dDsKKyAgICB9LAor
CisgICAgY3JlYXRlRnVuY3Rpb25Db250ZXh0OiBmdW5jdGlvbihhc09iamVjdCkgeworICAgICAg
dmFyIGxvY2FscyA9IHRoaXMuc3RhY2tWYXJzLmNvbmNhdCh0aGlzLnJlZ2lzdGVycy5saXN0KTsK
KworICAgICAgaWYobG9jYWxzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5zb3VyY2VbMV0g
PSB0aGlzLnNvdXJjZVsxXSArICIsICIgKyBsb2NhbHMuam9pbigiLCAiKTsKKyAgICAgIH0KKwor
ICAgICAgLy8gR2VuZXJhdGUgbWluaW1pemVyIGFsaWFzIG1hcHBpbmdzCisgICAgICBpZiAoIXRo
aXMuaXNDaGlsZCkgeworICAgICAgICBmb3IgKHZhciBhbGlhcyBpbiB0aGlzLmNvbnRleHQuYWxp
YXNlcykgeworICAgICAgICAgIHRoaXMuc291cmNlWzFdID0gdGhpcy5zb3VyY2VbMV0gKyAnLCAn
ICsgYWxpYXMgKyAnPScgKyB0aGlzLmNvbnRleHQuYWxpYXNlc1thbGlhc107CisgICAgICAgIH0K
KyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuc291cmNlWzFdKSB7CisgICAgICAgIHRoaXMuc291
cmNlWzFdID0gInZhciAiICsgdGhpcy5zb3VyY2VbMV0uc3Vic3RyaW5nKDIpICsgIjsiOworICAg
ICAgfQorCisgICAgICAvLyBNZXJnZSBjaGlsZHJlbgorICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQp
IHsKKyAgICAgICAgdGhpcy5zb3VyY2VbMV0gKz0gJ1xuJyArIHRoaXMuY29udGV4dC5wcm9ncmFt
cy5qb2luKCdcbicpICsgJ1xuJzsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGlzLmVudmlyb25t
ZW50LmlzU2ltcGxlKSB7CisgICAgICAgIHRoaXMuc291cmNlLnB1c2goInJldHVybiBidWZmZXI7
Iik7CisgICAgICB9CisKKyAgICAgIHZhciBwYXJhbXMgPSB0aGlzLmlzQ2hpbGQgPyBbImRlcHRo
MCIsICJkYXRhIl0gOiBbIkhhbmRsZWJhcnMiLCAiZGVwdGgwIiwgImhlbHBlcnMiLCAicGFydGlh
bHMiLCAiZGF0YSJdOworCisgICAgICBmb3IodmFyIGk9MCwgbD10aGlzLmVudmlyb25tZW50LmRl
cHRocy5saXN0Lmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgcGFyYW1zLnB1c2goImRlcHRo
IiArIHRoaXMuZW52aXJvbm1lbnQuZGVwdGhzLmxpc3RbaV0pOworICAgICAgfQorCisgICAgICAv
LyBQZXJmb3JtIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgb3V0cHV0IHRvIG1lcmdlIGNvbnRlbnQg
d2hlbiBwb3NzaWJsZQorICAgICAgdmFyIHNvdXJjZSA9IHRoaXMubWVyZ2VTb3VyY2UoKTsKKwor
ICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQpIHsKKyAgICAgICAgdmFyIHJldmlzaW9uID0gSGFuZGxl
YmFycy5DT01QSUxFUl9SRVZJU0lPTiwKKyAgICAgICAgICAgIHZlcnNpb25zID0gSGFuZGxlYmFy
cy5SRVZJU0lPTl9DSEFOR0VTW3JldmlzaW9uXTsKKyAgICAgICAgc291cmNlID0gInRoaXMuY29t
cGlsZXJJbmZvID0gWyIrcmV2aXNpb24rIiwnIit2ZXJzaW9ucysiJ107XG4iK3NvdXJjZTsKKyAg
ICAgIH0KKworICAgICAgaWYgKGFzT2JqZWN0KSB7CisgICAgICAgIHBhcmFtcy5wdXNoKHNvdXJj
ZSk7CisKKyAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7CisgICAg
ICB9IGVsc2UgeworICAgICAgICB2YXIgZnVuY3Rpb25Tb3VyY2UgPSAnZnVuY3Rpb24gJyArICh0
aGlzLm5hbWUgfHwgJycpICsgJygnICsgcGFyYW1zLmpvaW4oJywnKSArICcpIHtcbiAgJyArIHNv
dXJjZSArICd9JzsKKyAgICAgICAgSGFuZGxlYmFycy5sb2coSGFuZGxlYmFycy5sb2dnZXIuREVC
VUcsIGZ1bmN0aW9uU291cmNlICsgIlxuXG4iKTsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uU291
cmNlOworICAgICAgfQorICAgIH0sCisgICAgbWVyZ2VTb3VyY2U6IGZ1bmN0aW9uKCkgeworICAg
ICAgLy8gV0FSTjogV2UgYXJlIG5vdCBoYW5kbGluZyB0aGUgY2FzZSB3aGVyZSBidWZmZXIgaXMg
c3RpbGwgcG9wdWxhdGVkIGFzIHRoZSBzb3VyY2Ugc2hvdWxkCisgICAgICAvLyBub3QgaGF2ZSBi
dWZmZXIgYXBwZW5kIG9wZXJhdGlvbnMgYXMgdGhlaXIgZmluYWwgYWN0aW9uLgorICAgICAgdmFy
IHNvdXJjZSA9ICcnLAorICAgICAgICAgIGJ1ZmZlcjsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBs
ZW4gPSB0aGlzLnNvdXJjZS5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2YXIgbGlu
ZSA9IHRoaXMuc291cmNlW2ldOworICAgICAgICBpZiAobGluZS5hcHBlbmRUb0J1ZmZlcikgewor
ICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciArICdc
biAgICArICcgKyBsaW5lLmNvbnRlbnQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGJ1ZmZlciA9IGxpbmUuY29udGVudDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgc291cmNlICs9ICdidWZmZXIgKz0g
JyArIGJ1ZmZlciArICc7XG4gICc7CisgICAgICAgICAgICBidWZmZXIgPSB1bmRlZmluZWQ7Cisg
ICAgICAgICAgfQorICAgICAgICAgIHNvdXJjZSArPSBsaW5lICsgJ1xuICAnOworICAgICAgICB9
CisgICAgICB9CisgICAgICByZXR1cm4gc291cmNlOworICAgIH0sCisKKyAgICAvLyBbYmxvY2tW
YWx1ZV0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHBy
b2dyYW0sIHZhbHVlCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXR1cm4gdmFsdWUgb2YgYmxv
Y2tIZWxwZXJNaXNzaW5nCisgICAgLy8KKyAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIG9wY29k
ZSBpcyB0byB0YWtlIGEgYmxvY2sgb2YgdGhlIGZvcm0KKyAgICAvLyBge3sjZm9vfX0uLi57ey9m
b299fWAsIHJlc29sdmUgdGhlIHZhbHVlIG9mIGBmb29gLCBhbmQKKyAgICAvLyByZXBsYWNlIGl0
IG9uIHRoZSBzdGFjayB3aXRoIHRoZSByZXN1bHQgb2YgcHJvcGVybHkKKyAgICAvLyBpbnZva2lu
ZyBibG9ja0hlbHBlck1pc3NpbmcuCisgICAgYmxvY2tWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAg
ICB0aGlzLmNvbnRleHQuYWxpYXNlcy5ibG9ja0hlbHBlck1pc3NpbmcgPSAnaGVscGVycy5ibG9j
a0hlbHBlck1pc3NpbmcnOworCisgICAgICB2YXIgcGFyYW1zID0gWyJkZXB0aDAiXTsKKyAgICAg
IHRoaXMuc2V0dXBQYXJhbXMoMCwgcGFyYW1zKTsKKworICAgICAgdGhpcy5yZXBsYWNlU3RhY2so
ZnVuY3Rpb24oY3VycmVudCkgeworICAgICAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQp
OworICAgICAgICByZXR1cm4gImJsb2NrSGVscGVyTWlzc2luZy5jYWxsKCIgKyBwYXJhbXMuam9p
bigiLCAiKSArICIpIjsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICAvLyBbYW1iaWd1b3VzQmxv
Y2tWYWx1ZV0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2Us
IHByb2dyYW0sIHZhbHVlCisgICAgLy8gQ29tcGlsZXIgdmFsdWUsIGJlZm9yZTogbGFzdEhlbHBl
cj12YWx1ZSBvZiBsYXN0IGZvdW5kIGhlbHBlciwgaWYgYW55CisgICAgLy8gT24gc3RhY2ssIGFm
dGVyLCBpZiBubyBsYXN0SGVscGVyOiBzYW1lIGFzIFtibG9ja1ZhbHVlXQorICAgIC8vIE9uIHN0
YWNrLCBhZnRlciwgaWYgbGFzdEhlbHBlcjogdmFsdWUKKyAgICBhbWJpZ3VvdXNCbG9ja1ZhbHVl
OiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLmJsb2NrSGVscGVyTWlz
c2luZyA9ICdoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZyc7CisKKyAgICAgIHZhciBwYXJhbXMg
PSBbImRlcHRoMCJdOworICAgICAgdGhpcy5zZXR1cFBhcmFtcygwLCBwYXJhbXMpOworCisgICAg
ICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTsKKyAgICAgIHBhcmFtcy5zcGxpY2UoMSwg
MCwgY3VycmVudCk7CisKKyAgICAgIC8vIFVzZSB0aGUgb3B0aW9ucyB2YWx1ZSBnZW5lcmF0ZWQg
ZnJvbSB0aGUgaW52b2NhdGlvbgorICAgICAgcGFyYW1zW3BhcmFtcy5sZW5ndGgtMV0gPSAnb3B0
aW9ucyc7CisKKyAgICAgIHRoaXMuc291cmNlLnB1c2goImlmICghIiArIHRoaXMubGFzdEhlbHBl
ciArICIpIHsgIiArIGN1cnJlbnQgKyAiID0gYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoIiArIHBh
cmFtcy5qb2luKCIsICIpICsgIik7IH0iKTsKKyAgICB9LAorCisgICAgLy8gW2FwcGVuZENvbnRl
bnRdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KKyAgICAvLyBPbiBzdGFj
aywgYWZ0ZXI6IC4uLgorICAgIC8vCisgICAgLy8gQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9m
IGBjb250ZW50YCB0byB0aGUgY3VycmVudCBidWZmZXIKKyAgICBhcHBlbmRDb250ZW50OiBmdW5j
dGlvbihjb250ZW50KSB7CisgICAgICB0aGlzLnNvdXJjZS5wdXNoKHRoaXMuYXBwZW5kVG9CdWZm
ZXIodGhpcy5xdW90ZWRTdHJpbmcoY29udGVudCkpKTsKKyAgICB9LAorCisgICAgLy8gW2FwcGVu
ZF0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KKyAgICAvLyBP
biBzdGFjaywgYWZ0ZXI6IC4uLgorICAgIC8vCisgICAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEg
U3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICAvLworICAg
IC8vIElmIGB2YWx1ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2VyY2VkIGludG8gYSBzdHJp
bmcgYW5kIGFwcGVuZGVkCisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFw
cGVuZGVkCisgICAgYXBwZW5kOiBmdW5jdGlvbigpIHsKKyAgICAgIC8vIEZvcmNlIGFueXRoaW5n
IHRoYXQgaXMgaW5saW5lZCBvbnRvIHRoZSBzdGFjayBzbyB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0
aW9uCisgICAgICAvLyB3aGVuIHdlIGV4YW1pbmUgbG9jYWwKKyAgICAgIHRoaXMuZmx1c2hJbmxp
bmUoKTsKKyAgICAgIHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTsKKyAgICAgIHRoaXMuc291
cmNlLnB1c2goImlmKCIgKyBsb2NhbCArICIgfHwgIiArIGxvY2FsICsgIiA9PT0gMCkgeyAiICsg
dGhpcy5hcHBlbmRUb0J1ZmZlcihsb2NhbCkgKyAiIH0iKTsKKyAgICAgIGlmICh0aGlzLmVudmly
b25tZW50LmlzU2ltcGxlKSB7CisgICAgICAgIHRoaXMuc291cmNlLnB1c2goImVsc2UgeyAiICsg
dGhpcy5hcHBlbmRUb0J1ZmZlcigiJyciKSArICIgfSIpOworICAgICAgfQorICAgIH0sCisKKyAg
ICAvLyBbYXBwZW5kRXNjYXBlZF0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZh
bHVlLCAuLi4KKyAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgorICAgIC8vCisgICAgLy8gRXNj
YXBlIGB2YWx1ZWAgYW5kIGFwcGVuZCBpdCB0byB0aGUgYnVmZmVyCisgICAgYXBwZW5kRXNjYXBl
ZDogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5lc2NhcGVFeHByZXNz
aW9uID0gJ3RoaXMuZXNjYXBlRXhwcmVzc2lvbic7CisKKyAgICAgIHRoaXMuc291cmNlLnB1c2go
dGhpcy5hcHBlbmRUb0J1ZmZlcigiZXNjYXBlRXhwcmVzc2lvbigiICsgdGhpcy5wb3BTdGFjaygp
ICsgIikiKSk7CisgICAgfSwKKworICAgIC8vIFtnZXRDb250ZXh0XQorICAgIC8vCisgICAgLy8g
T24gc3RhY2ssIGJlZm9yZTogLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KKyAgICAv
LyBDb21waWxlciB2YWx1ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoCisgICAgLy8KKyAgICAv
LyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRo
ZSBkZXB0aAorICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uKGRlcHRoKSB7CisgICAgICBpZih0aGlz
Lmxhc3RDb250ZXh0ICE9PSBkZXB0aCkgeworICAgICAgICB0aGlzLmxhc3RDb250ZXh0ID0gZGVw
dGg7CisgICAgICB9CisgICAgfSwKKworICAgIC8vIFtsb29rdXBPbkNvbnRleHRdCisgICAgLy8K
KyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KKyAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1
cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KKyAgICAvLworICAgIC8vIExvb2tzIHVwIHRoZSB2YWx1
ZSBvZiBgbmFtZWAgb24gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVzCisgICAgLy8gaXQg
b250byB0aGUgc3RhY2suCisgICAgbG9va3VwT25Db250ZXh0OiBmdW5jdGlvbihuYW1lKSB7Cisg
ICAgICB0aGlzLnB1c2godGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0
LCBuYW1lLCAnY29udGV4dCcpKTsKKyAgICB9LAorCisgICAgLy8gW3B1c2hDb250ZXh0XQorICAg
IC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVy
OiBjdXJyZW50Q29udGV4dCwgLi4uCisgICAgLy8KKyAgICAvLyBQdXNoZXMgdGhlIHZhbHVlIG9m
IHRoZSBjdXJyZW50IGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgcHVzaENvbnRleHQ6IGZ1
bmN0aW9uKCkgeworICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkZXB0aCcgKyB0aGlzLmxh
c3RDb250ZXh0KTsKKyAgICB9LAorCisgICAgLy8gW3Jlc29sdmVQb3NzaWJsZUxhbWJkYV0KKyAg
ICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KKyAgICAvLyBPbiBzdGFj
aywgYWZ0ZXI6IHJlc29sdmVkIHZhbHVlLCAuLi4KKyAgICAvLworICAgIC8vIElmIHRoZSBgdmFs
dWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQorICAgIC8vIHRoZSBy
ZXR1cm4gdmFsdWUgb2YgdGhlIGxhbWJkYQorICAgIHJlc29sdmVQb3NzaWJsZUxhbWJkYTogZnVu
Y3Rpb24oKSB7CisgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlvblR5cGUgPSAnImZ1
bmN0aW9uIic7CisKKyAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGN1cnJlbnQpIHsK
KyAgICAgICAgcmV0dXJuICJ0eXBlb2YgIiArIGN1cnJlbnQgKyAiID09PSBmdW5jdGlvblR5cGUg
PyAiICsgY3VycmVudCArICIuYXBwbHkoZGVwdGgwKSA6ICIgKyBjdXJyZW50OworICAgICAgfSk7
CisgICAgfSwKKworICAgIC8vIFtsb29rdXBdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVm
b3JlOiB2YWx1ZSwgLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZVtuYW1lXSwgLi4u
CisgICAgLy8KKyAgICAvLyBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sgd2l0aCB0aGUg
cmVzdWx0IG9mIGxvb2tpbmcKKyAgICAvLyB1cCBgbmFtZWAgb24gYHZhbHVlYAorICAgIGxvb2t1
cDogZnVuY3Rpb24obmFtZSkgeworICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24oY3Vy
cmVudCkgeworICAgICAgICByZXR1cm4gY3VycmVudCArICIgPT0gbnVsbCB8fCAiICsgY3VycmVu
dCArICIgPT09IGZhbHNlID8gIiArIGN1cnJlbnQgKyAiIDogIiArIHRoaXMubmFtZUxvb2t1cChj
dXJyZW50LCBuYW1lLCAnY29udGV4dCcpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8vIFts
b29rdXBEYXRhXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCisgICAgLy8g
T24gc3RhY2ssIGFmdGVyOiBkYXRhW2lkXSwgLi4uCisgICAgLy8KKyAgICAvLyBQdXNoIHRoZSBy
ZXN1bHQgb2YgbG9va2luZyB1cCBgaWRgIG9uIHRoZSBjdXJyZW50IGRhdGEKKyAgICBsb29rdXBE
YXRhOiBmdW5jdGlvbihpZCkgeworICAgICAgdGhpcy5wdXNoKHRoaXMubmFtZUxvb2t1cCgnZGF0
YScsIGlkLCAnZGF0YScpKTsKKyAgICB9LAorCisgICAgLy8gW3B1c2hTdHJpbmdQYXJhbV0KKyAg
ICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgorICAgIC8vIE9uIHN0YWNrLCBhZnRl
cjogc3RyaW5nLCBjdXJyZW50Q29udGV4dCwgLi4uCisgICAgLy8KKyAgICAvLyBUaGlzIG9wY29k
ZSBpcyBkZXNpZ25lZCBmb3IgdXNlIGluIHN0cmluZyBtb2RlLCB3aGljaAorICAgIC8vIHByb3Zp
ZGVzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgYWxvbmcgd2l0aCBpdHMKKyAgICAv
LyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCisgICAgcHVzaFN0
cmluZ1BhcmFtOiBmdW5jdGlvbihzdHJpbmcsIHR5cGUpIHsKKyAgICAgIHRoaXMucHVzaFN0YWNr
TGl0ZXJhbCgnZGVwdGgnICsgdGhpcy5sYXN0Q29udGV4dCk7CisKKyAgICAgIHRoaXMucHVzaFN0
cmluZyh0eXBlKTsKKworICAgICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnKSB7Cisg
ICAgICAgIHRoaXMucHVzaFN0cmluZyhzdHJpbmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAg
dGhpcy5wdXNoU3RhY2tMaXRlcmFsKHN0cmluZyk7CisgICAgICB9CisgICAgfSwKKworICAgIGVt
cHR5SGFzaDogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ3t9Jyk7
CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CisgICAgICAgIHRoaXMu
cmVnaXN0ZXIoJ2hhc2hUeXBlcycsICd7fScpOworICAgICAgfQorICAgIH0sCisgICAgcHVzaEhh
c2g6IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5oYXNoID0ge3ZhbHVlczogW10sIHR5cGVzOiBb
XX07CisgICAgfSwKKyAgICBwb3BIYXNoOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBoYXNoID0g
dGhpcy5oYXNoOworICAgICAgdGhpcy5oYXNoID0gdW5kZWZpbmVkOworCisgICAgICBpZiAodGhp
cy5vcHRpb25zLnN0cmluZ1BhcmFtcykgeworICAgICAgICB0aGlzLnJlZ2lzdGVyKCdoYXNoVHlw
ZXMnLCAneycgKyBoYXNoLnR5cGVzLmpvaW4oJywnKSArICd9Jyk7CisgICAgICB9CisgICAgICB0
aGlzLnB1c2goJ3tcbiAgICAnICsgaGFzaC52YWx1ZXMuam9pbignLFxuICAgICcpICsgJ1xuICB9
Jyk7CisgICAgfSwKKworICAgIC8vIFtwdXNoU3RyaW5nXQorICAgIC8vCisgICAgLy8gT24gc3Rh
Y2ssIGJlZm9yZTogLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiBxdW90ZWRTdHJpbmcoc3Ry
aW5nKSwgLi4uCisgICAgLy8KKyAgICAvLyBQdXNoIGEgcXVvdGVkIHZlcnNpb24gb2YgYHN0cmlu
Z2Agb250byB0aGUgc3RhY2sKKyAgICBwdXNoU3RyaW5nOiBmdW5jdGlvbihzdHJpbmcpIHsKKyAg
ICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLnF1b3RlZFN0cmluZyhzdHJpbmcpKTsKKyAg
ICB9LAorCisgICAgLy8gW3B1c2hdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAu
Li4KKyAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGV4cHIsIC4uLgorICAgIC8vCisgICAgLy8gUHVz
aCBhbiBleHByZXNzaW9uIG9udG8gdGhlIHN0YWNrCisgICAgcHVzaDogZnVuY3Rpb24oZXhwcikg
eworICAgICAgdGhpcy5pbmxpbmVTdGFjay5wdXNoKGV4cHIpOworICAgICAgcmV0dXJuIGV4cHI7
CisgICAgfSwKKworICAgIC8vIFtwdXNoTGl0ZXJhbF0KKyAgICAvLworICAgIC8vIE9uIHN0YWNr
LCBiZWZvcmU6IC4uLgorICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogdmFsdWUsIC4uLgorICAgIC8v
CisgICAgLy8gUHVzaGVzIGEgdmFsdWUgb250byB0aGUgc3RhY2suIFRoaXMgb3BlcmF0aW9uIHBy
ZXZlbnRzCisgICAgLy8gdGhlIGNvbXBpbGVyIGZyb20gY3JlYXRpbmcgYSB0ZW1wb3JhcnkgdmFy
aWFibGUgdG8gaG9sZAorICAgIC8vIGl0LgorICAgIHB1c2hMaXRlcmFsOiBmdW5jdGlvbih2YWx1
ZSkgeworICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHZhbHVlKTsKKyAgICB9LAorCisgICAg
Ly8gW3B1c2hQcm9ncmFtXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCisg
ICAgLy8gT24gc3RhY2ssIGFmdGVyOiBwcm9ncmFtKGd1aWQpLCAuLi4KKyAgICAvLworICAgIC8v
IFB1c2ggYSBwcm9ncmFtIGV4cHJlc3Npb24gb250byB0aGUgc3RhY2suIFRoaXMgdGFrZXMKKyAg
ICAvLyBhIGNvbXBpbGUtdGltZSBndWlkIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgcnVudGltZS1h
Y2Nlc3NpYmxlCisgICAgLy8gZXhwcmVzc2lvbi4KKyAgICBwdXNoUHJvZ3JhbTogZnVuY3Rpb24o
Z3VpZCkgeworICAgICAgaWYgKGd1aWQgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnB1c2hTdGFj
a0xpdGVyYWwodGhpcy5wcm9ncmFtRXhwcmVzc2lvbihndWlkKSk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwobnVsbCk7CisgICAgICB9CisgICAgfSwKKwor
ICAgIC8vIFtpbnZva2VIZWxwZXJdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiBo
YXNoLCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgorICAgIC8vIE9uIHN0YWNrLCBh
ZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uCisgICAgLy8KKyAgICAvLyBQb3BzIG9m
ZiB0aGUgaGVscGVyJ3MgcGFyYW1ldGVycywgaW52b2tlcyB0aGUgaGVscGVyLAorICAgIC8vIGFu
ZCBwdXNoZXMgdGhlIGhlbHBlcidzIHJldHVybiB2YWx1ZSBvbnRvIHRoZSBzdGFjay4KKyAgICAv
LworICAgIC8vIElmIHRoZSBoZWxwZXIgaXMgbm90IGZvdW5kLCBgaGVscGVyTWlzc2luZ2AgaXMg
Y2FsbGVkLgorICAgIGludm9rZUhlbHBlcjogZnVuY3Rpb24ocGFyYW1TaXplLCBuYW1lKSB7Cisg
ICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5oZWxwZXJNaXNzaW5nID0gJ2hlbHBlcnMuaGVscGVy
TWlzc2luZyc7CisKKyAgICAgIHZhciBoZWxwZXIgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLnNl
dHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSwgdHJ1ZSk7CisKKyAgICAgIHRoaXMucHVzaChoZWxw
ZXIubmFtZSk7CisgICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbihuYW1lKSB7CisgICAg
ICAgIHJldHVybiBuYW1lICsgJyA/ICcgKyBuYW1lICsgJy5jYWxsKCcgKworICAgICAgICAgICAg
aGVscGVyLmNhbGxQYXJhbXMgKyAiKSAiICsgIjogaGVscGVyTWlzc2luZy5jYWxsKCIgKworICAg
ICAgICAgICAgaGVscGVyLmhlbHBlck1pc3NpbmdQYXJhbXMgKyAiKSI7CisgICAgICB9KTsKKyAg
ICB9LAorCisgICAgLy8gW2ludm9rZUtub3duSGVscGVyXQorICAgIC8vCisgICAgLy8gT24gc3Rh
Y2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi4KKyAgICAv
LyBPbiBzdGFjaywgYWZ0ZXI6IHJlc3VsdCBvZiBoZWxwZXIgaW52b2NhdGlvbgorICAgIC8vCisg
ICAgLy8gVGhpcyBvcGVyYXRpb24gaXMgdXNlZCB3aGVuIHRoZSBoZWxwZXIgaXMga25vd24gdG8g
ZXhpc3QsCisgICAgLy8gc28gYSBgaGVscGVyTWlzc2luZ2AgZmFsbGJhY2sgaXMgbm90IHJlcXVp
cmVkLgorICAgIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbihwYXJhbVNpemUsIG5hbWUpIHsK
KyAgICAgIHZhciBoZWxwZXIgPSB0aGlzLnNldHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSk7Cisg
ICAgICB0aGlzLnB1c2goaGVscGVyLm5hbWUgKyAiLmNhbGwoIiArIGhlbHBlci5jYWxsUGFyYW1z
ICsgIikiKTsKKyAgICB9LAorCisgICAgLy8gW2ludm9rZUFtYmlndW91c10KKyAgICAvLworICAg
IC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwg
Li4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgZGlzYW1iaWd1YXRpb24KKyAg
ICAvLworICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiBhbiBleHByZXNzaW9uIGxp
a2UgYHt7Zm9vfX1gCisgICAgLy8gaXMgcHJvdmlkZWQsIGJ1dCB3ZSBkb24ndCBrbm93IGF0IGNv
bXBpbGUtdGltZSB3aGV0aGVyIGl0CisgICAgLy8gaXMgYSBoZWxwZXIgb3IgYSBwYXRoLgorICAg
IC8vCisgICAgLy8gVGhpcyBvcGVyYXRpb24gZW1pdHMgbW9yZSBjb2RlIHRoYW4gdGhlIG90aGVy
IG9wdGlvbnMsCisgICAgLy8gYW5kIGNhbiBiZSBhdm9pZGVkIGJ5IHBhc3NpbmcgdGhlIGBrbm93
bkhlbHBlcnNgIGFuZAorICAgIC8vIGBrbm93bkhlbHBlcnNPbmx5YCBmbGFncyBhdCBjb21waWxl
LXRpbWUuCisgICAgaW52b2tlQW1iaWd1b3VzOiBmdW5jdGlvbihuYW1lLCBoZWxwZXJDYWxsKSB7
CisgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlvblR5cGUgPSAnImZ1bmN0aW9uIic7
CisKKyAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgne30nKTsgICAgLy8gSGFzaCB2YWx1ZQor
ICAgICAgdmFyIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIoMCwgbmFtZSwgaGVscGVyQ2FsbCk7
CisKKyAgICAgIHZhciBoZWxwZXJOYW1lID0gdGhpcy5sYXN0SGVscGVyID0gdGhpcy5uYW1lTG9v
a3VwKCdoZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpOworCisgICAgICB2YXIgbm9uSGVscGVyID0g
dGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0LCBuYW1lLCAnY29udGV4
dCcpOworICAgICAgdmFyIG5leHRTdGFjayA9IHRoaXMubmV4dFN0YWNrKCk7CisKKyAgICAgIHRo
aXMuc291cmNlLnB1c2goJ2lmICgnICsgbmV4dFN0YWNrICsgJyA9ICcgKyBoZWxwZXJOYW1lICsg
JykgeyAnICsgbmV4dFN0YWNrICsgJyA9ICcgKyBuZXh0U3RhY2sgKyAnLmNhbGwoJyArIGhlbHBl
ci5jYWxsUGFyYW1zICsgJyk7IH0nKTsKKyAgICAgIHRoaXMuc291cmNlLnB1c2goJ2Vsc2UgeyAn
ICsgbmV4dFN0YWNrICsgJyA9ICcgKyBub25IZWxwZXIgKyAnOyAnICsgbmV4dFN0YWNrICsgJyA9
IHR5cGVvZiAnICsgbmV4dFN0YWNrICsgJyA9PT0gZnVuY3Rpb25UeXBlID8gJyArIG5leHRTdGFj
ayArICcuYXBwbHkoZGVwdGgwKSA6ICcgKyBuZXh0U3RhY2sgKyAnOyB9Jyk7CisgICAgfSwKKwor
ICAgIC8vIFtpbnZva2VQYXJ0aWFsXQorICAgIC8vCisgICAgLy8gT24gc3RhY2ssIGJlZm9yZTog
Y29udGV4dCwgLi4uCisgICAgLy8gT24gc3RhY2sgYWZ0ZXI6IHJlc3VsdCBvZiBwYXJ0aWFsIGlu
dm9jYXRpb24KKyAgICAvLworICAgIC8vIFRoaXMgb3BlcmF0aW9uIHBvcHMgb2ZmIGEgY29udGV4
dCwgaW52b2tlcyBhIHBhcnRpYWwgd2l0aCB0aGF0IGNvbnRleHQsCisgICAgLy8gYW5kIHB1c2hl
cyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGJhY2suCisgICAgaW52b2tlUGFydGlhbDog
ZnVuY3Rpb24obmFtZSkgeworICAgICAgdmFyIHBhcmFtcyA9IFt0aGlzLm5hbWVMb29rdXAoJ3Bh
cnRpYWxzJywgbmFtZSwgJ3BhcnRpYWwnKSwgIiciICsgbmFtZSArICInIiwgdGhpcy5wb3BTdGFj
aygpLCAiaGVscGVycyIsICJwYXJ0aWFscyJdOworCisgICAgICBpZiAodGhpcy5vcHRpb25zLmRh
dGEpIHsKKyAgICAgICAgcGFyYW1zLnB1c2goImRhdGEiKTsKKyAgICAgIH0KKworICAgICAgdGhp
cy5jb250ZXh0LmFsaWFzZXMuc2VsZiA9ICJ0aGlzIjsKKyAgICAgIHRoaXMucHVzaCgic2VsZi5p
bnZva2VQYXJ0aWFsKCIgKyBwYXJhbXMuam9pbigiLCAiKSArICIpIik7CisgICAgfSwKKworICAg
IC8vIFthc3NpZ25Ub0hhc2hdCisgICAgLy8KKyAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1
ZSwgaGFzaCwgLi4uCisgICAgLy8gT24gc3RhY2ssIGFmdGVyOiBoYXNoLCAuLi4KKyAgICAvLwor
ICAgIC8vIFBvcHMgYSB2YWx1ZSBhbmQgaGFzaCBvZmYgdGhlIHN0YWNrLCBhc3NpZ25zIGBoYXNo
W2tleV0gPSB2YWx1ZWAKKyAgICAvLyBhbmQgcHVzaGVzIHRoZSBoYXNoIGJhY2sgb250byB0aGUg
c3RhY2suCisgICAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbihrZXkpIHsKKyAgICAgIHZhciB2YWx1
ZSA9IHRoaXMucG9wU3RhY2soKSwKKyAgICAgICAgICB0eXBlOworCisgICAgICBpZiAodGhpcy5v
cHRpb25zLnN0cmluZ1BhcmFtcykgeworICAgICAgICB0eXBlID0gdGhpcy5wb3BTdGFjaygpOwor
ICAgICAgICB0aGlzLnBvcFN0YWNrKCk7CisgICAgICB9CisKKyAgICAgIHZhciBoYXNoID0gdGhp
cy5oYXNoOworICAgICAgaWYgKHR5cGUpIHsKKyAgICAgICAgaGFzaC50eXBlcy5wdXNoKCInIiAr
IGtleSArICInOiAiICsgdHlwZSk7CisgICAgICB9CisgICAgICBoYXNoLnZhbHVlcy5wdXNoKCIn
IiArIGtleSArICInOiAoIiArIHZhbHVlICsgIikiKTsKKyAgICB9LAorCisgICAgLy8gSEVMUEVS
UworCisgICAgY29tcGlsZXI6IEphdmFTY3JpcHRDb21waWxlciwKKworICAgIGNvbXBpbGVDaGls
ZHJlbjogZnVuY3Rpb24oZW52aXJvbm1lbnQsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBjaGlsZHJl
biA9IGVudmlyb25tZW50LmNoaWxkcmVuLCBjaGlsZCwgY29tcGlsZXI7CisKKyAgICAgIGZvcih2
YXIgaT0wLCBsPWNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgY2hpbGQgPSBj
aGlsZHJlbltpXTsKKyAgICAgICAgY29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpOworCisg
ICAgICAgIHZhciBpbmRleCA9IHRoaXMubWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpOworCisg
ICAgICAgIGlmIChpbmRleCA9PSBudWxsKSB7CisgICAgICAgICAgdGhpcy5jb250ZXh0LnByb2dy
YW1zLnB1c2goJycpOyAgICAgLy8gUGxhY2Vob2xkZXIgdG8gcHJldmVudCBuYW1lIGNvbmZsaWN0
cyBmb3IgbmVzdGVkIGNoaWxkcmVuCisgICAgICAgICAgaW5kZXggPSB0aGlzLmNvbnRleHQucHJv
Z3JhbXMubGVuZ3RoOworICAgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAg
Y2hpbGQubmFtZSA9ICdwcm9ncmFtJyArIGluZGV4OworICAgICAgICAgIHRoaXMuY29udGV4dC5w
cm9ncmFtc1tpbmRleF0gPSBjb21waWxlci5jb21waWxlKGNoaWxkLCBvcHRpb25zLCB0aGlzLmNv
bnRleHQpOworICAgICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hp
bGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hpbGQuaW5kZXggPSBpbmRleDsKKyAg
ICAgICAgICBjaGlsZC5uYW1lID0gJ3Byb2dyYW0nICsgaW5kZXg7CisgICAgICAgIH0KKyAgICAg
IH0KKyAgICB9LAorICAgIG1hdGNoRXhpc3RpbmdQcm9ncmFtOiBmdW5jdGlvbihjaGlsZCkgewor
ICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHMubGVu
Z3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdmFyIGVudmlyb25tZW50ID0gdGhpcy5jb250
ZXh0LmVudmlyb25tZW50c1tpXTsKKyAgICAgICAgaWYgKGVudmlyb25tZW50ICYmIGVudmlyb25t
ZW50LmVxdWFscyhjaGlsZCkpIHsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0sCisKKyAgICBwcm9ncmFtRXhwcmVzc2lvbjogZnVuY3Rpb24oZ3VpZCkgewor
ICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuc2VsZiA9ICJ0aGlzIjsKKworICAgICAgaWYoZ3Vp
ZCA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiAic2VsZi5ub29wIjsKKyAgICAgIH0KKworICAg
ICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSwKKyAgICAgICAg
ICBkZXB0aHMgPSBjaGlsZC5kZXB0aHMubGlzdCwgZGVwdGg7CisKKyAgICAgIHZhciBwcm9ncmFt
UGFyYW1zID0gW2NoaWxkLmluZGV4LCBjaGlsZC5uYW1lLCAiZGF0YSJdOworCisgICAgICBmb3Io
dmFyIGk9MCwgbCA9IGRlcHRocy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGRlcHRoID0g
ZGVwdGhzW2ldOworCisgICAgICAgIGlmKGRlcHRoID09PSAxKSB7IHByb2dyYW1QYXJhbXMucHVz
aCgiZGVwdGgwIik7IH0KKyAgICAgICAgZWxzZSB7IHByb2dyYW1QYXJhbXMucHVzaCgiZGVwdGgi
ICsgKGRlcHRoIC0gMSkpOyB9CisgICAgICB9CisKKyAgICAgIGlmKGRlcHRocy5sZW5ndGggPT09
IDApIHsKKyAgICAgICAgcmV0dXJuICJzZWxmLnByb2dyYW0oIiArIHByb2dyYW1QYXJhbXMuam9p
bigiLCAiKSArICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByb2dyYW1QYXJhbXMuc2hp
ZnQoKTsKKyAgICAgICAgcmV0dXJuICJzZWxmLnByb2dyYW1XaXRoRGVwdGgoIiArIHByb2dyYW1Q
YXJhbXMuam9pbigiLCAiKSArICIpIjsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVnaXN0ZXI6
IGZ1bmN0aW9uKG5hbWUsIHZhbCkgeworICAgICAgdGhpcy51c2VSZWdpc3RlcihuYW1lKTsKKyAg
ICAgIHRoaXMuc291cmNlLnB1c2gobmFtZSArICIgPSAiICsgdmFsICsgIjsiKTsKKyAgICB9LAor
CisgICAgdXNlUmVnaXN0ZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgIGlmKCF0aGlzLnJlZ2lz
dGVyc1tuYW1lXSkgeworICAgICAgICB0aGlzLnJlZ2lzdGVyc1tuYW1lXSA9IHRydWU7CisgICAg
ICAgIHRoaXMucmVnaXN0ZXJzLmxpc3QucHVzaChuYW1lKTsKKyAgICAgIH0KKyAgICB9LAorCisg
ICAgcHVzaFN0YWNrTGl0ZXJhbDogZnVuY3Rpb24oaXRlbSkgeworICAgICAgcmV0dXJuIHRoaXMu
cHVzaChuZXcgTGl0ZXJhbChpdGVtKSk7CisgICAgfSwKKworICAgIHB1c2hTdGFjazogZnVuY3Rp
b24oaXRlbSkgeworICAgICAgdGhpcy5mbHVzaElubGluZSgpOworCisgICAgICB2YXIgc3RhY2sg
PSB0aGlzLmluY3JTdGFjaygpOworICAgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgdGhpcy5zb3Vy
Y2UucHVzaChzdGFjayArICIgPSAiICsgaXRlbSArICI7Iik7CisgICAgICB9CisgICAgICB0aGlz
LmNvbXBpbGVTdGFjay5wdXNoKHN0YWNrKTsKKyAgICAgIHJldHVybiBzdGFjazsKKyAgICB9LAor
CisgICAgcmVwbGFjZVN0YWNrOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgICAgdmFyIHByZWZp
eCA9ICcnLAorICAgICAgICAgIGlubGluZSA9IHRoaXMuaXNJbmxpbmUoKSwKKyAgICAgICAgICBz
dGFjazsKKworICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbmxpbmUgdGhlbiB3ZSB3YW50
IHRvIG1lcmdlIHRoZSBpbmxpbmUgc3RhdGVtZW50IGludG8gdGhlCisgICAgICAvLyByZXBsYWNl
bWVudCBzdGF0ZW1lbnQgdmlhICcsJworICAgICAgaWYgKGlubGluZSkgeworICAgICAgICB2YXIg
dG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTsKKworICAgICAgICBpZiAodG9wIGluc3RhbmNlb2Yg
TGl0ZXJhbCkgeworICAgICAgICAgIC8vIExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGlu
ZWQKKyAgICAgICAgICBzdGFjayA9IHRvcC52YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0
aGUgaW5saW5lCisgICAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnN0YWNrU2xvdCA/IHRoaXMudG9w
U3RhY2tOYW1lKCkgOiB0aGlzLmluY3JTdGFjaygpOworCisgICAgICAgICAgcHJlZml4ID0gJygn
ICsgdGhpcy5wdXNoKG5hbWUpICsgJyA9ICcgKyB0b3AgKyAnKSwnOworICAgICAgICAgIHN0YWNr
ID0gdGhpcy50b3BTdGFjaygpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBz
dGFjayA9IHRoaXMudG9wU3RhY2soKTsKKyAgICAgIH0KKworICAgICAgdmFyIGl0ZW0gPSBjYWxs
YmFjay5jYWxsKHRoaXMsIHN0YWNrKTsKKworICAgICAgaWYgKGlubGluZSkgeworICAgICAgICBp
ZiAodGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3RhY2subGVuZ3RoKSB7
CisgICAgICAgICAgdGhpcy5wb3BTdGFjaygpOworICAgICAgICB9CisgICAgICAgIHRoaXMucHVz
aCgnKCcgKyBwcmVmaXggKyBpdGVtICsgJyknKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8v
IFByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IGRlcHRoIHZhcmlhYmxlLiBUaHJv
dWdoIHJlcGxhY2VTdGFjaworICAgICAgICBpZiAoIS9ec3RhY2svLnRlc3Qoc3RhY2spKSB7Cisg
ICAgICAgICAgc3RhY2sgPSB0aGlzLm5leHRTdGFjaygpOworICAgICAgICB9CisKKyAgICAgICAg
dGhpcy5zb3VyY2UucHVzaChzdGFjayArICIgPSAoIiArIHByZWZpeCArIGl0ZW0gKyAiKTsiKTsK
KyAgICAgIH0KKyAgICAgIHJldHVybiBzdGFjazsKKyAgICB9LAorCisgICAgbmV4dFN0YWNrOiBm
dW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjaygpOworICAgIH0sCisKKyAg
ICBpbmNyU3RhY2s6IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5zdGFja1Nsb3QrKzsKKyAgICAg
IGlmKHRoaXMuc3RhY2tTbG90ID4gdGhpcy5zdGFja1ZhcnMubGVuZ3RoKSB7IHRoaXMuc3RhY2tW
YXJzLnB1c2goInN0YWNrIiArIHRoaXMuc3RhY2tTbG90KTsgfQorICAgICAgcmV0dXJuIHRoaXMu
dG9wU3RhY2tOYW1lKCk7CisgICAgfSwKKyAgICB0b3BTdGFja05hbWU6IGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuICJzdGFjayIgKyB0aGlzLnN0YWNrU2xvdDsKKyAgICB9LAorICAgIGZsdXNo
SW5saW5lOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBpbmxpbmVTdGFjayA9IHRoaXMuaW5saW5l
U3RhY2s7CisgICAgICBpZiAoaW5saW5lU3RhY2subGVuZ3RoKSB7CisgICAgICAgIHRoaXMuaW5s
aW5lU3RhY2sgPSBbXTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGlubGluZVN0YWNr
Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgdmFyIGVudHJ5ID0gaW5saW5lU3Rh
Y2tbaV07CisgICAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgTGl0ZXJhbCkgeworICAgICAg
ICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChlbnRyeSk7CisgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIHRoaXMucHVzaFN0YWNrKGVudHJ5KTsKKyAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICB9LAorICAgIGlzSW5saW5lOiBmdW5jdGlvbigpIHsKKyAgICAgIHJl
dHVybiB0aGlzLmlubGluZVN0YWNrLmxlbmd0aDsKKyAgICB9LAorCisgICAgcG9wU3RhY2s6IGZ1
bmN0aW9uKHdyYXBwZWQpIHsKKyAgICAgIHZhciBpbmxpbmUgPSB0aGlzLmlzSW5saW5lKCksCisg
ICAgICAgICAgaXRlbSA9IChpbmxpbmUgPyB0aGlzLmlubGluZVN0YWNrIDogdGhpcy5jb21waWxl
U3RhY2spLnBvcCgpOworCisgICAgICBpZiAoIXdyYXBwZWQgJiYgKGl0ZW0gaW5zdGFuY2VvZiBM
aXRlcmFsKSkgeworICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKKyAgICAgIH0gZWxzZSB7Cisg
ICAgICAgIGlmICghaW5saW5lKSB7CisgICAgICAgICAgdGhpcy5zdGFja1Nsb3QtLTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgdG9wU3Rh
Y2s6IGZ1bmN0aW9uKHdyYXBwZWQpIHsKKyAgICAgIHZhciBzdGFjayA9ICh0aGlzLmlzSW5saW5l
KCkgPyB0aGlzLmlubGluZVN0YWNrIDogdGhpcy5jb21waWxlU3RhY2spLAorICAgICAgICAgIGl0
ZW0gPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKworICAgICAgaWYgKCF3cmFwcGVkICYmIChp
dGVtIGluc3RhbmNlb2YgTGl0ZXJhbCkpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgIH0KKyAgICB9LAorCisg
ICAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbihzdHIpIHsKKyAgICAgIHJldHVybiAnIicgKyBzdHIK
KyAgICAgICAgLnJlcGxhY2UoL1xcL2csICdcXFxcJykKKyAgICAgICAgLnJlcGxhY2UoLyIvZywg
J1xcIicpCisgICAgICAgIC5yZXBsYWNlKC9cbi9nLCAnXFxuJykKKyAgICAgICAgLnJlcGxhY2Uo
L1xyL2csICdcXHInKSArICciJzsKKyAgICB9LAorCisgICAgc2V0dXBIZWxwZXI6IGZ1bmN0aW9u
KHBhcmFtU2l6ZSwgbmFtZSwgbWlzc2luZ1BhcmFtcykgeworICAgICAgdmFyIHBhcmFtcyA9IFtd
OworICAgICAgdGhpcy5zZXR1cFBhcmFtcyhwYXJhbVNpemUsIHBhcmFtcywgbWlzc2luZ1BhcmFt
cyk7CisgICAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBu
YW1lLCAnaGVscGVyJyk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHBhcmFtczogcGFyYW1z
LAorICAgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKKyAgICAgICAgY2FsbFBhcmFtczogWyJkZXB0
aDAiXS5jb25jYXQocGFyYW1zKS5qb2luKCIsICIpLAorICAgICAgICBoZWxwZXJNaXNzaW5nUGFy
YW1zOiBtaXNzaW5nUGFyYW1zICYmIFsiZGVwdGgwIiwgdGhpcy5xdW90ZWRTdHJpbmcobmFtZSld
LmNvbmNhdChwYXJhbXMpLmpvaW4oIiwgIikKKyAgICAgIH07CisgICAgfSwKKworICAgIC8vIHRo
ZSBwYXJhbXMgYW5kIGNvbnRleHRzIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIGFycmF5cworICAg
IC8vIHRvIGZpbGwgaW4KKyAgICBzZXR1cFBhcmFtczogZnVuY3Rpb24ocGFyYW1TaXplLCBwYXJh
bXMsIHVzZVJlZ2lzdGVyKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IFtdLCBjb250ZXh0cyA9IFtd
LCB0eXBlcyA9IFtdLCBwYXJhbSwgaW52ZXJzZSwgcHJvZ3JhbTsKKworICAgICAgb3B0aW9ucy5w
dXNoKCJoYXNoOiIgKyB0aGlzLnBvcFN0YWNrKCkpOworCisgICAgICBpbnZlcnNlID0gdGhpcy5w
b3BTdGFjaygpOworICAgICAgcHJvZ3JhbSA9IHRoaXMucG9wU3RhY2soKTsKKworICAgICAgLy8g
QXZvaWQgc2V0dGluZyBmbiBhbmQgaW52ZXJzZSBpZiBuZWl0aGVyIGFyZSBzZXQuIFRoaXMgYWxs
b3dzCisgICAgICAvLyBoZWxwZXJzIHRvIGRvIGEgY2hlY2sgZm9yIGBpZiAob3B0aW9ucy5mbilg
CisgICAgICBpZiAocHJvZ3JhbSB8fCBpbnZlcnNlKSB7CisgICAgICAgIGlmICghcHJvZ3JhbSkg
eworICAgICAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLnNlbGYgPSAidGhpcyI7CisgICAgICAg
ICAgcHJvZ3JhbSA9ICJzZWxmLm5vb3AiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpbnZl
cnNlKSB7CisgICAgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRoaXMiOworICAg
ICAgICAgIGludmVyc2UgPSAic2VsZi5ub29wIjsKKyAgICAgICAgfQorCisgICAgICAgIG9wdGlv
bnMucHVzaCgiaW52ZXJzZToiICsgaW52ZXJzZSk7CisgICAgICAgIG9wdGlvbnMucHVzaCgiZm46
IiArIHByb2dyYW0pOworICAgICAgfQorCisgICAgICBmb3IodmFyIGk9MDsgaTxwYXJhbVNpemU7
IGkrKykgeworICAgICAgICBwYXJhbSA9IHRoaXMucG9wU3RhY2soKTsKKyAgICAgICAgcGFyYW1z
LnB1c2gocGFyYW0pOworCisgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsK
KyAgICAgICAgICB0eXBlcy5wdXNoKHRoaXMucG9wU3RhY2soKSk7CisgICAgICAgICAgY29udGV4
dHMucHVzaCh0aGlzLnBvcFN0YWNrKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlm
ICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CisgICAgICAgIG9wdGlvbnMucHVzaCgiY29u
dGV4dHM6WyIgKyBjb250ZXh0cy5qb2luKCIsIikgKyAiXSIpOworICAgICAgICBvcHRpb25zLnB1
c2goInR5cGVzOlsiICsgdHlwZXMuam9pbigiLCIpICsgIl0iKTsKKyAgICAgICAgb3B0aW9ucy5w
dXNoKCJoYXNoVHlwZXM6aGFzaFR5cGVzIik7CisgICAgICB9CisKKyAgICAgIGlmKHRoaXMub3B0
aW9ucy5kYXRhKSB7CisgICAgICAgIG9wdGlvbnMucHVzaCgiZGF0YTpkYXRhIik7CisgICAgICB9
CisKKyAgICAgIG9wdGlvbnMgPSAieyIgKyBvcHRpb25zLmpvaW4oIiwiKSArICJ9IjsKKyAgICAg
IGlmICh1c2VSZWdpc3RlcikgeworICAgICAgICB0aGlzLnJlZ2lzdGVyKCdvcHRpb25zJywgb3B0
aW9ucyk7CisgICAgICAgIHBhcmFtcy5wdXNoKCdvcHRpb25zJyk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBwYXJhbXMucHVzaChvcHRpb25zKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwYXJh
bXMuam9pbigiLCAiKTsKKyAgICB9CisgIH07CisKKyAgdmFyIHJlc2VydmVkV29yZHMgPSAoCisg
ICAgImJyZWFrIGVsc2UgbmV3IHZhciIgKworICAgICIgY2FzZSBmaW5hbGx5IHJldHVybiB2b2lk
IiArCisgICAgIiBjYXRjaCBmb3Igc3dpdGNoIHdoaWxlIiArCisgICAgIiBjb250aW51ZSBmdW5j
dGlvbiB0aGlzIHdpdGgiICsKKyAgICAiIGRlZmF1bHQgaWYgdGhyb3ciICsKKyAgICAiIGRlbGV0
ZSBpbiB0cnkiICsKKyAgICAiIGRvIGluc3RhbmNlb2YgdHlwZW9mIiArCisgICAgIiBhYnN0cmFj
dCBlbnVtIGludCBzaG9ydCIgKworICAgICIgYm9vbGVhbiBleHBvcnQgaW50ZXJmYWNlIHN0YXRp
YyIgKworICAgICIgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXIiICsKKyAgICAiIGNoYXIgZmluYWwg
bmF0aXZlIHN5bmNocm9uaXplZCIgKworICAgICIgY2xhc3MgZmxvYXQgcGFja2FnZSB0aHJvd3Mi
ICsKKyAgICAiIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQiICsKKyAgICAiIGRlYnVnZ2Vy
IGltcGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlIiArCisgICAgIiBkb3VibGUgaW1wb3J0IHB1
YmxpYyBsZXQgeWllbGQiCisgICkuc3BsaXQoIiAiKTsKKworICB2YXIgY29tcGlsZXJXb3JkcyA9
IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OworCisgIGZvcih2YXIgaT0w
LCBsPXJlc2VydmVkV29yZHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIGNvbXBpbGVyV29yZHNb
cmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOworICB9CisKKyAgSmF2YVNjcmlwdENvbXBpbGVyLmlz
VmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lID0gZnVuY3Rpb24obmFtZSkgeworICAgIGlmKCFK
YXZhU2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYgL15bYS16QS1aXyRdWzAt
OWEtekEtWl8kXSskLy50ZXN0KG5hbWUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cisg
ICAgcmV0dXJuIGZhbHNlOworICB9OworCit9KShIYW5kbGViYXJzLkNvbXBpbGVyLCBIYW5kbGVi
YXJzLkphdmFTY3JpcHRDb21waWxlcik7CisKK0hhbmRsZWJhcnMucHJlY29tcGlsZSA9IGZ1bmN0
aW9uKGlucHV0LCBvcHRpb25zKSB7CisgIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0g
J3N0cmluZycgJiYgaW5wdXQuY29uc3RydWN0b3IgIT09IEhhbmRsZWJhcnMuQVNULlByb2dyYW1O
b2RlKSkgeworICAgIHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlvbigiWW91IG11c3QgcGFz
cyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBw
YXNzZWQgIiArIGlucHV0KTsKKyAgfQorCisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICBp
ZiAoISgnZGF0YScgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLmRhdGEgPSB0cnVlOworICB9
CisgIHZhciBhc3QgPSBIYW5kbGViYXJzLnBhcnNlKGlucHV0KTsKKyAgdmFyIGVudmlyb25tZW50
ID0gbmV3IEhhbmRsZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7CisgIHJl
dHVybiBuZXcgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGVudmlyb25t
ZW50LCBvcHRpb25zKTsKK307CisKK0hhbmRsZWJhcnMuY29tcGlsZSA9IGZ1bmN0aW9uKGlucHV0
LCBvcHRpb25zKSB7CisgIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycg
JiYgaW5wdXQuY29uc3RydWN0b3IgIT09IEhhbmRsZWJhcnMuQVNULlByb2dyYW1Ob2RlKSkgewor
ICAgIHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlvbigiWW91IG11c3QgcGFzcyBhIHN0cmlu
ZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgIiAr
IGlucHV0KTsKKyAgfQorCisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICBpZiAoISgnZGF0
YScgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLmRhdGEgPSB0cnVlOworICB9CisgIHZhciBj
b21waWxlZDsKKyAgZnVuY3Rpb24gY29tcGlsZSgpIHsKKyAgICB2YXIgYXN0ID0gSGFuZGxlYmFy
cy5wYXJzZShpbnB1dCk7CisgICAgdmFyIGVudmlyb25tZW50ID0gbmV3IEhhbmRsZWJhcnMuQ29t
cGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7CisgICAgdmFyIHRlbXBsYXRlU3BlYyA9IG5l
dyBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9w
dGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7CisgICAgcmV0dXJuIEhhbmRsZWJhcnMudGVtcGxhdGUo
dGVtcGxhdGVTcGVjKTsKKyAgfQorCisgIC8vIFRlbXBsYXRlIGlzIG9ubHkgY29tcGlsZWQgb24g
Zmlyc3QgdXNlIGFuZCBjYWNoZWQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgcmV0dXJuIGZ1bmN0aW9u
KGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICBpZiAoIWNvbXBpbGVkKSB7CisgICAgICBjb21waWxl
ZCA9IGNvbXBpbGUoKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBpbGVkLmNhbGwodGhpcywgY29u
dGV4dCwgb3B0aW9ucyk7CisgIH07Cit9OworOworLy8gbGliL2hhbmRsZWJhcnMvcnVudGltZS5q
cworSGFuZGxlYmFycy5WTSA9IHsKKyAgdGVtcGxhdGU6IGZ1bmN0aW9uKHRlbXBsYXRlU3BlYykg
eworICAgIC8vIEp1c3QgYWRkIHdhdGVyCisgICAgdmFyIGNvbnRhaW5lciA9IHsKKyAgICAgIGVz
Y2FwZUV4cHJlc3Npb246IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbiwKKyAgICAg
IGludm9rZVBhcnRpYWw6IEhhbmRsZWJhcnMuVk0uaW52b2tlUGFydGlhbCwKKyAgICAgIHByb2dy
YW1zOiBbXSwKKyAgICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGZuLCBkYXRhKSB7CisgICAgICAg
IHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV07CisgICAgICAgIGlmKGRhdGEp
IHsKKyAgICAgICAgICByZXR1cm4gSGFuZGxlYmFycy5WTS5wcm9ncmFtKGZuLCBkYXRhKTsKKyAg
ICAgICAgfSBlbHNlIGlmKHByb2dyYW1XcmFwcGVyKSB7CisgICAgICAgICAgcmV0dXJuIHByb2dy
YW1XcmFwcGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb2dyYW1XcmFwcGVyID0g
dGhpcy5wcm9ncmFtc1tpXSA9IEhhbmRsZWJhcnMuVk0ucHJvZ3JhbShmbik7CisgICAgICAgICAg
cmV0dXJuIHByb2dyYW1XcmFwcGVyOworICAgICAgICB9CisgICAgICB9LAorICAgICAgcHJvZ3Jh
bVdpdGhEZXB0aDogSGFuZGxlYmFycy5WTS5wcm9ncmFtV2l0aERlcHRoLAorICAgICAgbm9vcDog
SGFuZGxlYmFycy5WTS5ub29wLAorICAgICAgY29tcGlsZXJJbmZvOiBudWxsCisgICAgfTsKKwor
ICAgIHJldHVybiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CisgICAgICBvcHRpb25zID0g
b3B0aW9ucyB8fCB7fTsKKyAgICAgIHZhciByZXN1bHQgPSB0ZW1wbGF0ZVNwZWMuY2FsbChjb250
YWluZXIsIEhhbmRsZWJhcnMsIGNvbnRleHQsIG9wdGlvbnMuaGVscGVycywgb3B0aW9ucy5wYXJ0
aWFscywgb3B0aW9ucy5kYXRhKTsKKworICAgICAgdmFyIGNvbXBpbGVySW5mbyA9IGNvbnRhaW5l
ci5jb21waWxlckluZm8gfHwgW10sCisgICAgICAgICAgY29tcGlsZXJSZXZpc2lvbiA9IGNvbXBp
bGVySW5mb1swXSB8fCAxLAorICAgICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IEhhbmRsZWJhcnMu
Q09NUElMRVJfUkVWSVNJT047CisKKyAgICAgIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJy
ZW50UmV2aXNpb24pIHsKKyAgICAgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2
aXNpb24pIHsKKyAgICAgICAgICB2YXIgcnVudGltZVZlcnNpb25zID0gSGFuZGxlYmFycy5SRVZJ
U0lPTl9DSEFOR0VTW2N1cnJlbnRSZXZpc2lvbl0sCisgICAgICAgICAgICAgIGNvbXBpbGVyVmVy
c2lvbnMgPSBIYW5kbGViYXJzLlJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07Cisg
ICAgICAgICAgdGhyb3cgIlRlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGFuIG9sZGVyIHZl
cnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICIrCisgICAgICAg
ICAgICAgICAgIlBsZWFzZSB1cGRhdGUgeW91ciBwcmVjb21waWxlciB0byBhIG5ld2VyIHZlcnNp
b24gKCIrcnVudGltZVZlcnNpb25zKyIpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4g
b2xkZXIgdmVyc2lvbiAoIitjb21waWxlclZlcnNpb25zKyIpLiI7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1
bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0CisgICAgICAgICAgdGhy
b3cgIlRlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5k
bGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gIisKKyAgICAgICAgICAgICAgICAiUGxl
YXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgiK2NvbXBpbGVySW5m
b1sxXSsiKS4iOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfTsKKyAgfSwKKworICBwcm9ncmFtV2l0aERlcHRoOiBmdW5jdGlvbihmbiwgZGF0YSwgJGRl
cHRoKSB7CisgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVu
dHMsIDIpOworCisgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAg
IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywg
W2NvbnRleHQsIG9wdGlvbnMuZGF0YSB8fCBkYXRhXS5jb25jYXQoYXJncykpOworICAgIH07Cisg
IH0sCisgIHByb2dyYW06IGZ1bmN0aW9uKGZuLCBkYXRhKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9u
KGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisg
ICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucy5kYXRhIHx8IGRhdGEpOworICAgIH07Cisg
IH0sCisgIG5vb3A6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIiI7IH0sCisgIGludm9rZVBhcnRpYWw6
IGZ1bmN0aW9uKHBhcnRpYWwsIG5hbWUsIGNvbnRleHQsIGhlbHBlcnMsIHBhcnRpYWxzLCBkYXRh
KSB7CisgICAgdmFyIG9wdGlvbnMgPSB7IGhlbHBlcnM6IGhlbHBlcnMsIHBhcnRpYWxzOiBwYXJ0
aWFscywgZGF0YTogZGF0YSB9OworCisgICAgaWYocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7Cisg
ICAgICB0aHJvdyBuZXcgSGFuZGxlYmFycy5FeGNlcHRpb24oIlRoZSBwYXJ0aWFsICIgKyBuYW1l
ICsgIiBjb3VsZCBub3QgYmUgZm91bmQiKTsKKyAgICB9IGVsc2UgaWYocGFydGlhbCBpbnN0YW5j
ZW9mIEZ1bmN0aW9uKSB7CisgICAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTsK
KyAgICB9IGVsc2UgaWYgKCFIYW5kbGViYXJzLmNvbXBpbGUpIHsKKyAgICAgIHRocm93IG5ldyBI
YW5kbGViYXJzLkV4Y2VwdGlvbigiVGhlIHBhcnRpYWwgIiArIG5hbWUgKyAiIGNvdWxkIG5vdCBi
ZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGUiKTsKKyAgICB9IGVs
c2UgeworICAgICAgcGFydGlhbHNbbmFtZV0gPSBIYW5kbGViYXJzLmNvbXBpbGUocGFydGlhbCwg
e2RhdGE6IGRhdGEgIT09IHVuZGVmaW5lZH0pOworICAgICAgcmV0dXJuIHBhcnRpYWxzW25hbWVd
KGNvbnRleHQsIG9wdGlvbnMpOworICAgIH0KKyAgfQorfTsKKworSGFuZGxlYmFycy50ZW1wbGF0
ZSA9IEhhbmRsZWJhcnMuVk0udGVtcGxhdGU7Cis7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05v
dENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2pxdWVyeS9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9qcXVlcnkuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93ZXJfY29tcG9uZW50cy9qcXVlcnkv
anF1ZXJ5LmpzCShyZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkv
Ym93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsOTU5NyBAQAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjkuMQorICog
aHR0cDovL2pxdWVyeS5jb20vCisgKgorICogSW5jbHVkZXMgU2l6emxlLmpzCisgKiBodHRwOi8v
c2l6emxlanMuY29tLworICoKKyAqIENvcHlyaWdodCAyMDA1LCAyMDEyIGpRdWVyeSBGb3VuZGF0
aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBN
SVQgbGljZW5zZQorICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIw
MTMtMi00CisgKi8KKyhmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CisKKy8vIENhbid0
IGRvIHRoaXMgYmVjYXVzZSBzZXZlcmFsIGFwcHMgaW5jbHVkaW5nIEFTUC5ORVQgdHJhY2UKKy8v
IHRoZSBzdGFjayB2aWEgYXJndW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVmb3ggZGllcyBp
ZgorLy8geW91IHRyeSB0byB0cmFjZSB0aHJvdWdoICJ1c2Ugc3RyaWN0IiBjYWxsIGNoYWlucy4g
KCMxMzMzNSkKKy8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrCisvLyJ1c2Ugc3RyaWN0IjsKK3Zhcgor
ICAgIC8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQorICAgIHJlYWR5TGlzdCwKKwor
ICAgIC8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQor
ICAgIHJvb3RqUXVlcnksCisKKyAgICAvLyBTdXBwb3J0OiBJRTw5CisgICAgLy8gRm9yIGB0eXBl
b2Ygbm9kZS5tZXRob2RgIGluc3RlYWQgb2YgYG5vZGUubWV0aG9kICE9PSB1bmRlZmluZWRgCisg
ICAgY29yZV9zdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAorCisgICAgLy8gVXNlIHRo
ZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5k
Ym94KQorICAgIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LAorICAgIGxvY2F0aW9uID0gd2lu
ZG93LmxvY2F0aW9uLAorCisgICAgLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3Zlcndy
aXRlCisgICAgX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCisKKyAgICAvLyBNYXAgb3ZlciB0aGUg
JCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorICAgIF8kID0gd2luZG93LiQsCisKKyAgICAvLyBbW0Ns
YXNzXV0gLT4gdHlwZSBwYWlycworICAgIGNsYXNzMnR5cGUgPSB7fSwKKworICAgIC8vIExpc3Qg
b2YgZGVsZXRlZCBkYXRhIGNhY2hlIGlkcywgc28gd2UgY2FuIHJldXNlIHRoZW0KKyAgICBjb3Jl
X2RlbGV0ZWRJZHMgPSBbXSwKKworICAgIGNvcmVfdmVyc2lvbiA9ICIxLjkuMSIsCisKKyAgICAv
LyBTYXZlIGEgcmVmZXJlbmNlIHRvIHNvbWUgY29yZSBtZXRob2RzCisgICAgY29yZV9jb25jYXQg
PSBjb3JlX2RlbGV0ZWRJZHMuY29uY2F0LAorICAgIGNvcmVfcHVzaCA9IGNvcmVfZGVsZXRlZElk
cy5wdXNoLAorICAgIGNvcmVfc2xpY2UgPSBjb3JlX2RlbGV0ZWRJZHMuc2xpY2UsCisgICAgY29y
ZV9pbmRleE9mID0gY29yZV9kZWxldGVkSWRzLmluZGV4T2YsCisgICAgY29yZV90b1N0cmluZyA9
IGNsYXNzMnR5cGUudG9TdHJpbmcsCisgICAgY29yZV9oYXNPd24gPSBjbGFzczJ0eXBlLmhhc093
blByb3BlcnR5LAorICAgIGNvcmVfdHJpbSA9IGNvcmVfdmVyc2lvbi50cmltLAorCisgICAgLy8g
RGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKKyAgICBqUXVlcnkgPSBmdW5jdGlvbiggc2Vs
ZWN0b3IsIGNvbnRleHQgKSB7CisgICAgLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkg
anVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCisgICAgcmV0dXJuIG5ldyBqUXVl
cnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKKyAgICB9LAorCisg
ICAgLy8gVXNlZCBmb3IgbWF0Y2hpbmcgbnVtYmVycworICAgIGNvcmVfcG51bSA9IC9bKy1dPyg/
OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLAorCisgICAgLy8gVXNlZCBmb3Ig
c3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UKKyAgICBjb3JlX3Jub3R3aGl0ZSA9IC9cUysvZywKKwor
ICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQg
eW91LCBTYWZhcmkgNS4wIGFuZCBJRSkKKyAgICBydHJpbSA9IC9eW1xzXHVGRUZGXHhBMF0rfFtc
c1x1RkVGRlx4QTBdKyQvZywKKworICAgIC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRN
TCBzdHJpbmdzCisgICAgLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1Mg
dmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQorICAgIC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9u
ICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KQorICAgIHJxdWlja0V4cHIgPSAvXig/Oig8W1x3
XFddKz4pW14+XSp8IyhbXHctXSopKSQvLAorCisgICAgLy8gTWF0Y2ggYSBzdGFuZGFsb25lIHRh
ZworICAgIHJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLAorCisgICAg
Ly8gSlNPTiBSZWdFeHAKKyAgICBydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKKyAgICBy
dmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAorICAgIHJ2YWxpZGVzY2FwZSA9
IC9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZywKKyAgICBydmFsaWR0b2tlbnMg
PSAvIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZCtcLnwpXGQrKD86W2VFXVsr
LV0/XGQrfCkvZywKKworICAgIC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemlu
ZworICAgIHJtc1ByZWZpeCA9IC9eLW1zLS8sCisgICAgcmRhc2hBbHBoYSA9IC8tKFtcZGEtel0p
L2dpLAorCisgICAgLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJl
cGxhY2UoKQorICAgIGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7CisgICAg
cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworICAgIH0sCisKKyAgICAvLyBUaGUgcmVhZHkg
ZXZlbnQgaGFuZGxlcgorICAgIGNvbXBsZXRlZCA9IGZ1bmN0aW9uKCBldmVudCApIHsKKworICAg
IC8vIHJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvIGNh
bGwgdGhlIGRvbSByZWFkeSBpbiBvbGRJRQorICAgIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0
ZW5lciB8fCBldmVudC50eXBlID09PSAibG9hZCIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0g
ImNvbXBsZXRlIiApIHsKKyAgICBkZXRhY2goKTsKKyAgICBqUXVlcnkucmVhZHkoKTsKKyAgICB9
CisgICAgfSwKKyAgICAvLyBDbGVhbi11cCBtZXRob2QgZm9yIGRvbSByZWFkeSBldmVudHMKKyAg
ICBkZXRhY2ggPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVu
ZXIgKSB7CisgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2Fk
ZWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7CisgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIo
ICJsb2FkIiwgY29tcGxldGVkLCBmYWxzZSApOworCisgICAgfSBlbHNlIHsKKyAgICBkb2N1bWVu
dC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGNvbXBsZXRlZCApOworICAgIHdp
bmRvdy5kZXRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRlZCApOworICAgIH0KKyAgICB9Owor
CitqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0geworICAgIC8vIFRoZSBjdXJyZW50IHZl
cnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKKyAgICBqcXVlcnk6IGNvcmVfdmVyc2lvbiwKKwor
ICAgIGNvbnN0cnVjdG9yOiBqUXVlcnksCisgICAgaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBj
b250ZXh0LCByb290alF1ZXJ5ICkgeworICAgIHZhciBtYXRjaCwgZWxlbTsKKworICAgIC8vIEhB
TkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKKyAgICBpZiAoICFz
ZWxlY3RvciApIHsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgSFRN
TCBzdHJpbmdzCisgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAg
IGlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxl
Y3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKKyAg
ICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBI
VE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVjaworICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3Rv
ciwgbnVsbCBdOworCisgICAgfSBlbHNlIHsKKyAgICBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYygg
c2VsZWN0b3IgKTsKKyAgICB9CisKKyAgICAvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBj
b250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCisgICAgaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0g
fHwgIWNvbnRleHQpICkgeworCisgICAgLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisg
ICAgaWYgKCBtYXRjaFsxXSApIHsKKyAgICBjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpR
dWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OworCisgICAgLy8gc2NyaXB0cyBpcyB0cnVlIGZv
ciBiYWNrLWNvbXBhdAorICAgIGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTCgK
KyAgICBtYXRjaFsxXSwKKyAgICBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0
Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LAorICAgIHRydWUKKyAgICApICk7
CisKKyAgICAvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpCisgICAgaWYgKCByc2luZ2xlVGFnLnRl
c3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHsKKyAg
ICBmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgeworICAgIC8vIFByb3BlcnRpZXMgb2YgY29udGV4
dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGUKKyAgICBpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CisgICAgdGhpc1sgbWF0Y2ggXSggY29udGV4dFsg
bWF0Y2ggXSApOworCisgICAgLy8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlcwor
ICAgIH0gZWxzZSB7CisgICAgdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwor
ICAgIH0KKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisKKyAgICAvLyBIQU5ETEU6
ICQoI2lkKQorICAgIH0gZWxzZSB7CisgICAgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCBtYXRjaFsyXSApOworCisgICAgLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJs
YWNrYmVycnkgNC42IHJldHVybnMKKyAgICAvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4g
dGhlIGRvY3VtZW50ICM2OTYzCisgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsK
KyAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwor
ICAgIC8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAorICAgIGlmICggZWxlbS5pZCAhPT0gbWF0Y2hb
Ml0gKSB7CisgICAgcmV0dXJuIHJvb3RqUXVlcnkuZmluZCggc2VsZWN0b3IgKTsKKyAgICB9CisK
KyAgICAvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRo
ZSBqUXVlcnkgb2JqZWN0CisgICAgdGhpcy5sZW5ndGggPSAxOworICAgIHRoaXNbMF0gPSBlbGVt
OworICAgIH0KKworICAgIHRoaXMuY29udGV4dCA9IGRvY3VtZW50OworICAgIHRoaXMuc2VsZWN0
b3IgPSBzZWxlY3RvcjsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLyBIQU5ETEU6
ICQoZXhwciwgJCguLi4pKQorICAgIH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1
ZXJ5ICkgeworICAgIHJldHVybiAoIGNvbnRleHQgfHwgcm9vdGpRdWVyeSApLmZpbmQoIHNlbGVj
dG9yICk7CisKKyAgICAvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dCkKKyAgICAvLyAod2hpY2gg
aXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKKyAgICB9IGVsc2Ug
eworICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3Ig
KTsKKyAgICB9CisKKyAgICAvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKKyAgICB9IGVsc2UgaWYg
KCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKKyAgICB0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2Vs
ZWN0b3I7CisgICAgdGhpcy5sZW5ndGggPSAxOworICAgIHJldHVybiB0aGlzOworCisgICAgLy8g
SEFORExFOiAkKGZ1bmN0aW9uKQorICAgIC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQor
ICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgeworICAgIHJl
dHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApOworICAgIH0KKworICAgIGlmICggc2Vs
ZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsKKyAgICB0aGlzLnNlbGVjdG9yID0gc2Vs
ZWN0b3Iuc2VsZWN0b3I7CisgICAgdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKyAg
ICB9CisKKyAgICByZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKyAg
ICB9LAorCisgICAgLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorICAgIHNlbGVjdG9y
OiAiIiwKKworICAgIC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMg
MAorICAgIGxlbmd0aDogMCwKKworICAgIC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFp
bmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0CisgICAgc2l6ZTogZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuIHRoaXMubGVuZ3RoOworICAgIH0sCisKKyAgICB0b0FycmF5OiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7CisgICAgfSwKKworICAgIC8v
IEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKyAgICAv
LyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorICAg
IGdldDogZnVuY3Rpb24oIG51bSApIHsKKyAgICByZXR1cm4gbnVtID09IG51bGwgPworCisgICAg
Ly8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQorICAgIHRoaXMudG9BcnJheSgpIDoKKworICAgIC8v
IFJldHVybiBqdXN0IHRoZSBvYmplY3QKKyAgICAoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0
aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTsKKyAgICB9LAorCisgICAgLy8gVGFrZSBhbiBhcnJh
eSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjaworICAgIC8vIChyZXR1cm5p
bmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQorICAgIHB1c2hTdGFjazogZnVuY3Rpb24o
IGVsZW1zICkgeworCisgICAgLy8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBz
ZXQKKyAgICB2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1z
ICk7CisKKyAgICAvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVm
ZXJlbmNlKQorICAgIHJldC5wcmV2T2JqZWN0ID0gdGhpczsKKyAgICByZXQuY29udGV4dCA9IHRo
aXMuY29udGV4dDsKKworICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0
CisgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZv
ciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KKyAgICAvLyAoWW91IGNhbiBzZWVk
IHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcworICAgIC8v
IG9ubHkgdXNlZCBpbnRlcm5hbGx5LikKKyAgICBlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFy
Z3MgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwor
ICAgIH0sCisKKyAgICByZWFkeTogZnVuY3Rpb24oIGZuICkgeworICAgIC8vIEFkZCB0aGUgY2Fs
bGJhY2sKKyAgICBqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7CisKKyAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgc2xpY2U6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggY29yZV9zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTsKKyAg
ICB9LAorCisgICAgZmlyc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVxKCAwICk7
CisgICAgfSwKKworICAgIGxhc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmVxKCAt
MSApOworICAgIH0sCisKKyAgICBlcTogZnVuY3Rpb24oIGkgKSB7CisgICAgdmFyIGxlbiA9IHRo
aXMubGVuZ3RoLAorICAgIGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CisgICAgcmV0dXJu
IHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsK
KyAgICB9LAorCisgICAgbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisgICAgcmV0dXJuIHRo
aXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworICAg
IHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisgICAgfSkpOworICAgIH0s
CisKKyAgICBlbmQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwg
dGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKKyAgICB9LAorCisgICAgLy8gRm9yIGludGVybmFsIHVz
ZSBvbmx5LgorICAgIC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2Ug
YSBqUXVlcnkgbWV0aG9kLgorICAgIHB1c2g6IGNvcmVfcHVzaCwKKyAgICBzb3J0OiBbXS5zb3J0
LAorICAgIHNwbGljZTogW10uc3BsaWNlCit9OworCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9u
IHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4u
aW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CisKK2pRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4u
ZXh0ZW5kID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5h
bWUsIG9wdGlvbnMsIGNsb25lLAorICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwKKyAg
ICBpID0gMSwKKyAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgIGRlZXAgPSBmYWxz
ZTsKKworICAgIC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKyAgICBpZiAoIHR5cGVv
ZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKKyAgICBkZWVwID0gdGFyZ2V0OworICAgIHRhcmdl
dCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKKyAgICAvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUg
dGFyZ2V0CisgICAgaSA9IDI7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJn
ZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisgICAg
aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFy
Z2V0KSApIHsKKyAgICB0YXJnZXQgPSB7fTsKKyAgICB9CisKKyAgICAvLyBleHRlbmQgalF1ZXJ5
IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQKKyAgICBpZiAoIGxlbmd0aCA9
PT0gaSApIHsKKyAgICB0YXJnZXQgPSB0aGlzOworICAgIC0taTsKKyAgICB9CisKKyAgICBmb3Ig
KCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICAvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91
bmRlZmluZWQgdmFsdWVzCisgICAgaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBu
dWxsICkgeworICAgIC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKyAgICBmb3IgKCBuYW1lIGlu
IG9wdGlvbnMgKSB7CisgICAgc3JjID0gdGFyZ2V0WyBuYW1lIF07CisgICAgY29weSA9IG9wdGlv
bnNbIG5hbWUgXTsKKworICAgIC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKyAgICBpZiAo
IHRhcmdldCA9PT0gY29weSApIHsKKyAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWN1
cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKKyAgICBpZiAoIGRl
ZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJh
eSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkgeworICAgIGlmICggY29weUlzQXJyYXkgKSB7
CisgICAgY29weUlzQXJyYXkgPSBmYWxzZTsKKyAgICBjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNB
cnJheShzcmMpID8gc3JjIDogW107CisKKyAgICB9IGVsc2UgeworICAgIGNsb25lID0gc3JjICYm
IGpRdWVyeS5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTsKKyAgICB9CisKKyAgICAvLyBO
ZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KKyAgICB0YXJnZXRbIG5hbWUg
XSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKyAgICAvLyBEb24ndCBi
cmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCisgICAgfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZp
bmVkICkgeworICAgIHRhcmdldFsgbmFtZSBdID0gY29weTsKKyAgICB9CisgICAgfQorICAgIH0K
KyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAorICAgIHJldHVybiB0
YXJnZXQ7Cit9OworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICBub0NvbmZsaWN0OiBmdW5jdGlvbigg
ZGVlcCApIHsKKyAgICBpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisgICAgd2luZG93LiQg
PSBfJDsKKyAgICB9CisKKyAgICBpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5
ICkgeworICAgIHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OworICAgIH0KKworICAgIHJldHVybiBq
UXVlcnk7CisgICAgfSwKKworICAgIC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0
IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuCisgICAgaXNSZWFkeTogZmFsc2UsCisKKyAgICAvLyBB
IGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCisgICAg
Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKKyAgICByZWFkeVdhaXQ6IDEsCisK
KyAgICAvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKKyAgICBob2xkUmVhZHk6
IGZ1bmN0aW9uKCBob2xkICkgeworICAgIGlmICggaG9sZCApIHsKKyAgICBqUXVlcnkucmVhZHlX
YWl0Kys7CisgICAgfSBlbHNlIHsKKyAgICBqUXVlcnkucmVhZHkoIHRydWUgKTsKKyAgICB9Cisg
ICAgfSwKKworICAgIC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKyAgICByZWFkeTog
ZnVuY3Rpb24oIHdhaXQgKSB7CisKKyAgICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBo
b2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CisgICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1q
UXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CisgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIE1ha2Ugc3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0
cyBhIGxpdHRsZSBvdmVyemVhbG91cyAodGlja2V0ICM1NDQzKS4KKyAgICBpZiAoICFkb2N1bWVu
dC5ib2R5ICkgeworICAgIHJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTsKKyAgICB9
CisKKyAgICAvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKyAgICBqUXVlcnkuaXNS
ZWFkeSA9IHRydWU7CisKKyAgICAvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQs
IGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQorICAgIGlmICggd2FpdCAhPT0gdHJ1ZSAm
JiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisgICAgcmVhZHlMaXN0
LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApOworCisgICAgLy8gVHJpZ2dlciBh
bnkgYm91bmQgcmVhZHkgZXZlbnRzCisgICAgaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKKyAg
ICBqUXVlcnkoIGRvY3VtZW50ICkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iik7CisgICAg
fQorICAgIH0sCisKKyAgICAvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29u
Y2VybmluZyBpc0Z1bmN0aW9uLgorICAgIC8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9k
cyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKKyAgICAvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5
IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgorICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBv
YmogKSB7CisgICAgcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7CisgICAg
fSwKKworICAgIGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKKyAg
ICByZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKKyAgICB9LAorCisgICAgaXNX
aW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9
PSBvYmoud2luZG93OworICAgIH0sCisKKyAgICBpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7
CisgICAgcmV0dXJuICFpc05hTiggcGFyc2VGbG9hdChvYmopICkgJiYgaXNGaW5pdGUoIG9iaiAp
OworICAgIH0sCisKKyAgICB0eXBlOiBmdW5jdGlvbiggb2JqICkgeworICAgIGlmICggb2JqID09
IG51bGwgKSB7CisgICAgcmV0dXJuIFN0cmluZyggb2JqICk7CisgICAgfQorICAgIHJldHVybiB0
eXBlb2Ygb2JqID09PSAib2JqZWN0IiB8fCB0eXBlb2Ygb2JqID09PSAiZnVuY3Rpb24iID8KKyAg
ICBjbGFzczJ0eXBlWyBjb3JlX3RvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiIDoKKyAg
ICB0eXBlb2Ygb2JqOworICAgIH0sCisKKyAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2Jq
ICkgeworICAgIC8vIE11c3QgYmUgYW4gT2JqZWN0LgorICAgIC8vIEJlY2F1c2Ugb2YgSUUsIHdl
IGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3Bl
cnR5LgorICAgIC8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMg
ZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCisgICAgaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBl
KG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9i
aiApICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0cnkgeworICAgIC8vIE5v
dCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3QKKyAgICBpZiAoIG9iai5j
b25zdHJ1Y3RvciAmJgorICAgICFjb3JlX2hhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIikg
JiYKKyAgICAhY29yZV9oYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAiaXNQ
cm90b3R5cGVPZiIpICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfSBjYXRjaCAo
IGUgKSB7CisgICAgLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9z
dCBvYmplY3RzICM5ODk3CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE93biBw
cm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAorICAgIC8v
IGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgorCisgICAg
dmFyIGtleTsKKyAgICBmb3IgKCBrZXkgaW4gb2JqICkge30KKworICAgIHJldHVybiBrZXkgPT09
IHVuZGVmaW5lZCB8fCBjb3JlX2hhc093bi5jYWxsKCBvYmosIGtleSApOworICAgIH0sCisKKyAg
ICBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgeworICAgIHZhciBuYW1lOworICAgIGZv
ciAoIG5hbWUgaW4gb2JqICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIGVycm9yOiBmdW5jdGlvbiggbXNnICkgeworICAgIHRocm93
IG5ldyBFcnJvciggbXNnICk7CisgICAgfSwKKworICAgIC8vIGRhdGE6IHN0cmluZyBvZiBodG1s
CisgICAgLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3
aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAorICAg
IC8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRz
IHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmcKKyAgICBwYXJzZUhUTUw6IGZ1bmN0aW9uKCBkYXRh
LCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRh
ICE9PSAic3RyaW5nIiApIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKCB0eXBl
b2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgeworICAgIGtlZXBTY3JpcHRzID0gY29udGV4dDsK
KyAgICBjb250ZXh0ID0gZmFsc2U7CisgICAgfQorICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRv
Y3VtZW50OworCisgICAgdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAorICAg
IHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107CisKKyAgICAvLyBTaW5nbGUgdGFnCisgICAg
aWYgKCBwYXJzZWQgKSB7CisgICAgcmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJz
ZWRbMV0gKSBdOworICAgIH0KKworICAgIHBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBb
IGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApOworICAgIGlmICggc2NyaXB0cyApIHsKKyAgICBq
UXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTsKKyAgICB9CisgICAgcmV0dXJuIGpRdWVyeS5tZXJn
ZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7CisgICAgfSwKKworICAgIHBhcnNlSlNPTjogZnVu
Y3Rpb24oIGRhdGEgKSB7CisgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSB1c2luZyB0aGUgbmF0aXZl
IEpTT04gcGFyc2VyIGZpcnN0CisgICAgaWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5w
YXJzZSApIHsKKyAgICByZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsKKyAgICB9CisK
KyAgICBpZiAoIGRhdGEgPT09IG51bGwgKSB7CisgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisg
ICAgaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisKKyAgICAvLyBNYWtlIHN1cmUg
bGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQgKElFIGNhbid0IGhhbmRsZSBp
dCkKKyAgICBkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKKworICAgIGlmICggZGF0YSApIHsK
KyAgICAvLyBNYWtlIHN1cmUgdGhlIGluY29taW5nIGRhdGEgaXMgYWN0dWFsIEpTT04KKyAgICAv
LyBMb2dpYyBib3Jyb3dlZCBmcm9tIGh0dHA6Ly9qc29uLm9yZy9qc29uMi5qcworICAgIGlmICgg
cnZhbGlkY2hhcnMudGVzdCggZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsICJAIiApCisgICAg
LnJlcGxhY2UoIHJ2YWxpZHRva2VucywgIl0iICkKKyAgICAucmVwbGFjZSggcnZhbGlkYnJhY2Vz
LCAiIikpICkgeworCisgICAgcmV0dXJuICggbmV3IEZ1bmN0aW9uKCAicmV0dXJuICIgKyBkYXRh
ICkgKSgpOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgalF1ZXJ5LmVycm9yKCAiSW52YWxp
ZCBKU09OOiAiICsgZGF0YSApOworICAgIH0sCisKKyAgICAvLyBDcm9zcy1icm93c2VyIHhtbCBw
YXJzaW5nCisgICAgcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIHZhciB4bWwsIHRt
cDsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKKyAgICBy
ZXR1cm4gbnVsbDsKKyAgICB9CisgICAgdHJ5IHsKKyAgICBpZiAoIHdpbmRvdy5ET01QYXJzZXIg
KSB7IC8vIFN0YW5kYXJkCisgICAgdG1wID0gbmV3IERPTVBhcnNlcigpOworICAgIHhtbCA9IHRt
cC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94bWwiICk7CisgICAgfSBlbHNlIHsgLy8g
SUUKKyAgICB4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxET00iICk7Cisg
ICAgeG1sLmFzeW5jID0gImZhbHNlIjsKKyAgICB4bWwubG9hZFhNTCggZGF0YSApOworICAgIH0K
KyAgICB9IGNhdGNoKCBlICkgeworICAgIHhtbCA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgaWYg
KCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFt
ZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKKyAgICBqUXVlcnkuZXJyb3IoICJJbnZhbGlk
IFhNTDogIiArIGRhdGEgKTsKKyAgICB9CisgICAgcmV0dXJuIHhtbDsKKyAgICB9LAorCisgICAg
bm9vcDogZnVuY3Rpb24oKSB7fSwKKworICAgIC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGds
b2JhbCBjb250ZXh0CisgICAgLy8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkgSmlt
IERyaXNjb2xsCisgICAgLy8gaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9h
cmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0CisgICAgZ2xv
YmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgaWYgKCBkYXRhICYmIGpRdWVyeS50cmlt
KCBkYXRhICkgKSB7CisgICAgLy8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9y
ZXIKKyAgICAvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBp
cyB3aW5kb3cKKyAgICAvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAorICAgICggd2lu
ZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgd2luZG93WyAiZXZhbCIg
XS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKKyAgICB9ICkoIGRhdGEgKTsKKyAgICB9CisgICAgfSwK
KworICAgIC8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFu
ZCBkYXRhIG1vZHVsZXMKKyAgICAvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVu
ZG9yIHByZWZpeCAoIzk1NzIpCisgICAgY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgewor
ICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJk
YXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKyAgICB9LAorCisgICAgbm9kZU5hbWU6IGZ1bmN0aW9u
KCBlbGVtLCBuYW1lICkgeworICAgIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5h
bWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0sCisKKyAgICAv
LyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAgZWFjaDogZnVuY3Rpb24oIG9i
aiwgY2FsbGJhY2ssIGFyZ3MgKSB7CisgICAgdmFyIHZhbHVlLAorICAgIGkgPSAwLAorICAgIGxl
bmd0aCA9IG9iai5sZW5ndGgsCisgICAgaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTsKKwor
ICAgIGlmICggYXJncyApIHsKKyAgICBpZiAoIGlzQXJyYXkgKSB7CisgICAgZm9yICggOyBpIDwg
bGVuZ3RoOyBpKysgKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFy
Z3MgKTsKKworICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworICAgIGJyZWFrOworICAgIH0K
KyAgICB9CisgICAgfSBlbHNlIHsKKyAgICBmb3IgKCBpIGluIG9iaiApIHsKKyAgICB2YWx1ZSA9
IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOworCisgICAgaWYgKCB2YWx1ZSA9PT0g
ZmFsc2UgKSB7CisgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHNw
ZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAorICAgIH0g
ZWxzZSB7CisgICAgaWYgKCBpc0FycmF5ICkgeworICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsr
ICkgeworICAgIHZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7
CisKKyAgICBpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKyAgICBicmVhazsKKyAgICB9CisgICAg
fQorICAgIH0gZWxzZSB7CisgICAgZm9yICggaSBpbiBvYmogKSB7CisgICAgdmFsdWUgPSBjYWxs
YmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKKworICAgIGlmICggdmFsdWUgPT09
IGZhbHNlICkgeworICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAg
IHJldHVybiBvYmo7CisgICAgfSwKKworICAgIC8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVu
Y3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKKyAgICB0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJp
bS5jYWxsKCJcdUZFRkZceEEwIikgPworICAgIGZ1bmN0aW9uKCB0ZXh0ICkgeworICAgIHJldHVy
biB0ZXh0ID09IG51bGwgPworICAgICIiIDoKKyAgICBjb3JlX3RyaW0uY2FsbCggdGV4dCApOwor
ICAgIH0gOgorCisgICAgLy8gT3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9u
YWxpdHkKKyAgICBmdW5jdGlvbiggdGV4dCApIHsKKyAgICByZXR1cm4gdGV4dCA9PSBudWxsID8K
KyAgICAiIiA6CisgICAgKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKKyAgICB9
LAorCisgICAgLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorICAgIG1ha2VB
cnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHsKKyAgICB2YXIgcmV0ID0gcmVzdWx0cyB8
fCBbXTsKKworICAgIGlmICggYXJyICE9IG51bGwgKSB7CisgICAgaWYgKCBpc0FycmF5bGlrZSgg
T2JqZWN0KGFycikgKSApIHsKKyAgICBqUXVlcnkubWVyZ2UoIHJldCwKKyAgICB0eXBlb2YgYXJy
ID09PSAic3RyaW5nIiA/CisgICAgWyBhcnIgXSA6IGFycgorICAgICk7CisgICAgfSBlbHNlIHsK
KyAgICBjb3JlX3B1c2guY2FsbCggcmV0LCBhcnIgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIHJldDsKKyAgICB9LAorCisgICAgaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSAp
IHsKKyAgICB2YXIgbGVuOworCisgICAgaWYgKCBhcnIgKSB7CisgICAgaWYgKCBjb3JlX2luZGV4
T2YgKSB7CisgICAgcmV0dXJuIGNvcmVfaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTsKKyAg
ICB9CisKKyAgICBsZW4gPSBhcnIubGVuZ3RoOworICAgIGkgPSBpID8gaSA8IDAgPyBNYXRoLm1h
eCggMCwgbGVuICsgaSApIDogaSA6IDA7CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsK
KyAgICAvLyBTa2lwIGFjY2Vzc2luZyBpbiBzcGFyc2UgYXJyYXlzCisgICAgaWYgKCBpIGluIGFy
ciAmJiBhcnJbIGkgXSA9PT0gZWxlbSApIHsKKyAgICByZXR1cm4gaTsKKyAgICB9CisgICAgfQor
ICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgICB9LAorCisgICAgbWVyZ2U6IGZ1bmN0aW9uKCBm
aXJzdCwgc2Vjb25kICkgeworICAgIHZhciBsID0gc2Vjb25kLmxlbmd0aCwKKyAgICBpID0gZmly
c3QubGVuZ3RoLAorICAgIGogPSAwOworCisgICAgaWYgKCB0eXBlb2YgbCA9PT0gIm51bWJlciIg
KSB7CisgICAgZm9yICggOyBqIDwgbDsgaisrICkgeworICAgIGZpcnN0WyBpKysgXSA9IHNlY29u
ZFsgaiBdOworICAgIH0KKyAgICB9IGVsc2UgeworICAgIHdoaWxlICggc2Vjb25kW2pdICE9PSB1
bmRlZmluZWQgKSB7CisgICAgZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKKyAgICB9Cisg
ICAgfQorCisgICAgZmlyc3QubGVuZ3RoID0gaTsKKworICAgIHJldHVybiBmaXJzdDsKKyAgICB9
LAorCisgICAgZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworICAgIHZh
ciByZXRWYWwsCisgICAgcmV0ID0gW10sCisgICAgaSA9IDAsCisgICAgbGVuZ3RoID0gZWxlbXMu
bGVuZ3RoOworICAgIGludiA9ICEhaW52OworCisgICAgLy8gR28gdGhyb3VnaCB0aGUgYXJyYXks
IG9ubHkgc2F2aW5nIHRoZSBpdGVtcworICAgIC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1
bmN0aW9uCisgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisgICAgcmV0VmFsID0gISFj
YWxsYmFjayggZWxlbXNbIGkgXSwgaSApOworICAgIGlmICggaW52ICE9PSByZXRWYWwgKSB7Cisg
ICAgcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJl
dDsKKyAgICB9LAorCisgICAgLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAg
bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CisgICAgdmFyIHZhbHVlLAor
ICAgIGkgPSAwLAorICAgIGxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKKyAgICBpc0FycmF5ID0gaXNB
cnJheWxpa2UoIGVsZW1zICksCisgICAgcmV0ID0gW107CisKKyAgICAvLyBHbyB0aHJvdWdoIHRo
ZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKyAgICBpZiAo
IGlzQXJyYXkgKSB7CisgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisgICAgdmFsdWUg
PSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKyAgICBpZiAoIHZhbHVlICE9IG51
bGwgKSB7CisgICAgcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgfQorCisg
ICAgLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKKyAgICB9IGVsc2Ugewor
ICAgIGZvciAoIGkgaW4gZWxlbXMgKSB7CisgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkg
XSwgaSwgYXJnICk7CisKKyAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7CisgICAgcmV0WyByZXQu
bGVuZ3RoIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZsYXR0ZW4g
YW55IG5lc3RlZCBhcnJheXMKKyAgICByZXR1cm4gY29yZV9jb25jYXQuYXBwbHkoIFtdLCByZXQg
KTsKKyAgICB9LAorCisgICAgLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCisg
ICAgZ3VpZDogMSwKKworICAgIC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlv
bmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQorICAgIC8vIGFyZ3VtZW50cy4KKyAgICBwcm94
eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgeworICAgIHZhciBhcmdzLCBwcm94eSwgdG1wOwor
CisgICAgaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CisgICAgdG1wID0gZm5b
IGNvbnRleHQgXTsKKyAgICBjb250ZXh0ID0gZm47CisgICAgZm4gPSB0bXA7CisgICAgfQorCisg
ICAgLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4g
dGhlIHNwZWMKKyAgICAvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVz
dCByZXR1cm4gdW5kZWZpbmVkLgorICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkg
eworICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQorCisgICAgLy8gU2ltdWxhdGVkIGJpbmQK
KyAgICBhcmdzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKKyAgICBwcm94eSA9
IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdz
LmNvbmNhdCggY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CisgICAgfTsKKworICAg
IC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5h
bCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAorICAgIHByb3h5Lmd1aWQgPSBmbi5ndWlk
ID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOworCisgICAgcmV0dXJuIHByb3h5OworICAgIH0s
CisKKyAgICAvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBv
ZiBhIGNvbGxlY3Rpb24KKyAgICAvLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVj
dXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KKyAgICBhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4s
IGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKyAgICB2YXIgaSA9IDAs
CisgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAorICAgIGJ1bGsgPSBrZXkgPT0gbnVsbDsKKwor
ICAgIC8vIFNldHMgbWFueSB2YWx1ZXMKKyAgICBpZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0g
Im9iamVjdCIgKSB7CisgICAgY2hhaW5hYmxlID0gdHJ1ZTsKKyAgICBmb3IgKCBpIGluIGtleSAp
IHsKKyAgICBqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlH
ZXQsIHJhdyApOworICAgIH0KKworICAgIC8vIFNldHMgb25lIHZhbHVlCisgICAgfSBlbHNlIGlm
ICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKyAgICBjaGFpbmFibGUgPSB0cnVlOworCisgICAg
aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmF3ID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICBpZiAoIGJ1bGsgKSB7CisgICAgLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2Fp
bnN0IHRoZSBlbnRpcmUgc2V0CisgICAgaWYgKCByYXcgKSB7CisgICAgZm4uY2FsbCggZWxlbXMs
IHZhbHVlICk7CisgICAgZm4gPSBudWxsOworCisgICAgLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0
aW5nIGZ1bmN0aW9uIHZhbHVlcworICAgIH0gZWxzZSB7CisgICAgYnVsayA9IGZuOworICAgIGZu
ID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7CisgICAgcmV0dXJuIGJ1bGsuY2FsbCgg
alF1ZXJ5KCBlbGVtICksIHZhbHVlICk7CisgICAgfTsKKyAgICB9CisgICAgfQorCisgICAgaWYg
KCBmbiApIHsKKyAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICBmbiggZWxlbXNb
aV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1z
W2ldLCBrZXkgKSApICk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2hhaW5h
YmxlID8KKyAgICBlbGVtcyA6CisKKyAgICAvLyBHZXRzCisgICAgYnVsayA/CisgICAgZm4uY2Fs
bCggZWxlbXMgKSA6CisgICAgbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0
OworICAgIH0sCisKKyAgICBub3c6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAoIG5ldyBEYXRl
KCkgKS5nZXRUaW1lKCk7CisgICAgfQorfSk7CisKK2pRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVu
Y3Rpb24oIG9iaiApIHsKKyAgICBpZiAoICFyZWFkeUxpc3QgKSB7CisKKyAgICByZWFkeUxpc3Qg
PSBqUXVlcnkuRGVmZXJyZWQoKTsKKworICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1l
bnQpLnJlYWR5KCkgaXMgY2FsbGVkIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5
IG9jY3VycmVkLgorICAgIC8vIHdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVy
YWN0aXZlIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmUKKyAgICAvLyBk
aXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8x
MjI4MiNjb21tZW50OjE1CisgICAgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxl
dGUiICkgeworICAgIC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRz
IHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQorICAgIHNldFRpbWVvdXQoIGpRdWVyeS5y
ZWFkeSApOworCisgICAgLy8gU3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29u
dGVudExvYWRlZAorICAgIH0gZWxzZSBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7
CisgICAgLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaworICAgIGRvY3VtZW50LmFkZEV2
ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOworCisg
ICAgLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsK
KyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7
CisKKyAgICAvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisgICAgfSBlbHNlIHsKKyAgICAv
LyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBm
b3IgaWZyYW1lcworICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdl
IiwgY29tcGxldGVkICk7CisKKyAgICAvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRo
YXQgd2lsbCBhbHdheXMgd29yaworICAgIHdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGNv
bXBsZXRlZCApOworCisgICAgLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCisgICAgLy8gY29udGlu
dWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeQorICAgIHZhciB0b3Ag
PSBmYWxzZTsKKworICAgIHRyeSB7CisgICAgdG9wID0gd2luZG93LmZyYW1lRWxlbWVudCA9PSBu
dWxsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB9IGNhdGNoKGUpIHt9CisKKyAg
ICBpZiAoIHRvcCAmJiB0b3AuZG9TY3JvbGwgKSB7CisgICAgKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hl
Y2soKSB7CisgICAgaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CisKKyAgICB0cnkgeworICAgIC8v
IFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCisgICAgLy8gaHR0cDovL2phdmFzY3JpcHQu
bndib3guY29tL0lFQ29udGVudExvYWRlZC8KKyAgICB0b3AuZG9TY3JvbGwoImxlZnQiKTsKKyAg
ICB9IGNhdGNoKGUpIHsKKyAgICByZXR1cm4gc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgNTAg
KTsKKyAgICB9CisKKyAgICAvLyBkZXRhY2ggYWxsIGRvbSByZWFkeSBldmVudHMKKyAgICBkZXRh
Y2goKTsKKworICAgIC8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucworICAgIGpR
dWVyeS5yZWFkeSgpOworICAgIH0KKyAgICB9KSgpOworICAgIH0KKyAgICB9CisgICAgfQorICAg
IHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7Cit9OworCisvLyBQb3B1bGF0ZSB0aGUg
Y2xhc3MydHlwZSBtYXAKK2pRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rp
b24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihp
LCBuYW1lKSB7CisgICAgY2xhc3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5h
bWUudG9Mb3dlckNhc2UoKTsKK30pOworCitmdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkgewor
ICAgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoLAorICAgIHR5cGUgPSBqUXVlcnkudHlwZSggb2Jq
ICk7CisKKyAgICBpZiAoIGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7CisgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIGlmICggb2JqLm5vZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHsK
KyAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8
fCB0eXBlICE9PSAiZnVuY3Rpb24iICYmCisgICAgKCBsZW5ndGggPT09IDAgfHwKKyAgICB0eXBl
b2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGlu
IG9iaiApOworfQorCisvLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8g
dGhlc2UKK3Jvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOworLy8gU3RyaW5nIHRvIE9iamVj
dCBvcHRpb25zIGZvcm1hdCBjYWNoZQordmFyIG9wdGlvbnNDYWNoZSA9IHt9OworCisvLyBDb252
ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lcyBh
bmQgc3RvcmUgaW4gY2FjaGUKK2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cisg
ICAgdmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307CisgICAgalF1ZXJ5
LmVhY2goIG9wdGlvbnMubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBf
LCBmbGFnICkgeworICAgIG9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKKyAgICB9KTsKKyAgICByZXR1
cm4gb2JqZWN0OworfQorCisvKgorICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUg
Zm9sbG93aW5nIHBhcmFtZXRlcnM6CisgKgorICogICAgb3B0aW9uczogYW4gb3B0aW9uYWwgbGlz
dCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdworICogICAg
ICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBv
cHRpb24gb2JqZWN0CisgKgorICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3Qg
bGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJlZCIgbXVsdGlw
bGUgdGltZXMuCisgKgorICogUG9zc2libGUgb3B0aW9uczoKKyAqCisgKiAgICBvbmNlOiAgICAg
ICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9u
Y2UgKGxpa2UgYSBEZWZlcnJlZCkKKyAqCisgKiAgICBtZW1vcnk6ICAgICAgICAgICAgd2lsbCBr
ZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBh
ZGRlZAorICogICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVk
IHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCisgKiAgICAgICAgICAgICAg
ICAgICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICogICAgdW5pcXVlOiAgICAgICAg
ICAgIHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVw
bGljYXRlIGluIHRoZSBsaXN0KQorICoKKyAqICAgIHN0b3BPbkZhbHNlOiAgICBpbnRlcnJ1cHQg
Y2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2UKKyAqCisgKi8KK2pRdWVyeS5D
YWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKKworICAgIC8vIENvbnZlcnQgb3B0aW9u
cyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKKyAg
ICAvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpCisgICAgb3B0aW9ucyA9IHR5cGVvZiBvcHRp
b25zID09PSAic3RyaW5nIiA/CisgICAgKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVh
dGVPcHRpb25zKCBvcHRpb25zICkgKSA6CisgICAgalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMg
KTsKKworICAgIHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5n
CisgICAgZmlyaW5nLAorICAgIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJs
ZSBsaXN0cykKKyAgICBtZW1vcnksCisgICAgLy8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFs
cmVhZHkgZmlyZWQKKyAgICBmaXJlZCwKKyAgICAvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJp
bmcKKyAgICBmaXJpbmdMZW5ndGgsCisgICAgLy8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBj
YWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlmIG5lZWRlZCkKKyAgICBmaXJpbmdJbmRleCwK
KyAgICAvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFu
ZCBmaXJlV2l0aCkKKyAgICBmaXJpbmdTdGFydCwKKyAgICAvLyBBY3R1YWwgY2FsbGJhY2sgbGlz
dAorICAgIGxpc3QgPSBbXSwKKyAgICAvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRh
YmxlIGxpc3RzCisgICAgc3RhY2sgPSAhb3B0aW9ucy5vbmNlICYmIFtdLAorICAgIC8vIEZpcmUg
Y2FsbGJhY2tzCisgICAgZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIG1lbW9yeSA9IG9w
dGlvbnMubWVtb3J5ICYmIGRhdGE7CisgICAgZmlyZWQgPSB0cnVlOworICAgIGZpcmluZ0luZGV4
ID0gZmlyaW5nU3RhcnQgfHwgMDsKKyAgICBmaXJpbmdTdGFydCA9IDA7CisgICAgZmlyaW5nTGVu
Z3RoID0gbGlzdC5sZW5ndGg7CisgICAgZmlyaW5nID0gdHJ1ZTsKKyAgICBmb3IgKCA7IGxpc3Qg
JiYgZmlyaW5nSW5kZXggPCBmaXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7CisgICAgaWYg
KCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBm
YWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkgeworICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBU
byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkCisgICAgYnJlYWs7CisgICAgfQorICAg
IH0KKyAgICBmaXJpbmcgPSBmYWxzZTsKKyAgICBpZiAoIGxpc3QgKSB7CisgICAgaWYgKCBzdGFj
ayApIHsKKyAgICBpZiAoIHN0YWNrLmxlbmd0aCApIHsKKyAgICBmaXJlKCBzdGFjay5zaGlmdCgp
ICk7CisgICAgfQorICAgIH0gZWxzZSBpZiAoIG1lbW9yeSApIHsKKyAgICBsaXN0ID0gW107Cisg
ICAgfSBlbHNlIHsKKyAgICBzZWxmLmRpc2FibGUoKTsKKyAgICB9CisgICAgfQorICAgIH0sCisg
ICAgLy8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3QKKyAgICBzZWxmID0geworICAgIC8vIEFkZCBh
IGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKKyAgICBh
ZGQ6IGZ1bmN0aW9uKCkgeworICAgIGlmICggbGlzdCApIHsKKyAgICAvLyBGaXJzdCwgd2Ugc2F2
ZSB0aGUgY3VycmVudCBsZW5ndGgKKyAgICB2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsKKyAgICAo
ZnVuY3Rpb24gYWRkKCBhcmdzICkgeworICAgIGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbigg
XywgYXJnICkgeworICAgIHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOworICAgIGlmICgg
dHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKKyAgICBpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2Vs
Zi5oYXMoIGFyZyApICkgeworICAgIGxpc3QucHVzaCggYXJnICk7CisgICAgfQorICAgIH0gZWxz
ZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHR5cGUgIT09ICJzdHJpbmciICkgeworICAgIC8v
IEluc3BlY3QgcmVjdXJzaXZlbHkKKyAgICBhZGQoIGFyZyApOworICAgIH0KKyAgICB9KTsKKyAg
ICB9KSggYXJndW1lbnRzICk7CisgICAgLy8gRG8gd2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNr
cyB0byB0aGUKKyAgICAvLyBjdXJyZW50IGZpcmluZyBiYXRjaD8KKyAgICBpZiAoIGZpcmluZyAp
IHsKKyAgICBmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDsKKyAgICAvLyBXaXRoIG1lbW9yeSwg
aWYgd2UncmUgbm90IGZpcmluZyB0aGVuCisgICAgLy8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdh
eQorICAgIH0gZWxzZSBpZiAoIG1lbW9yeSApIHsKKyAgICBmaXJpbmdTdGFydCA9IHN0YXJ0Owor
ICAgIGZpcmUoIG1lbW9yeSApOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAg
fSwKKyAgICAvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0CisgICAgcmVtb3ZlOiBm
dW5jdGlvbigpIHsKKyAgICBpZiAoIGxpc3QgKSB7CisgICAgalF1ZXJ5LmVhY2goIGFyZ3VtZW50
cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKKyAgICB2YXIgaW5kZXg7CisgICAgd2hpbGUoICggaW5k
ZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHsKKyAgICBs
aXN0LnNwbGljZSggaW5kZXgsIDEgKTsKKyAgICAvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXMKKyAg
ICBpZiAoIGZpcmluZyApIHsKKyAgICBpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKKyAg
ICBmaXJpbmdMZW5ndGgtLTsKKyAgICB9CisgICAgaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCAp
IHsKKyAgICBmaXJpbmdJbmRleC0tOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0pOworICAg
IH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAgIC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2Fs
bGJhY2sgaXMgaW4gdGhlIGxpc3QuCisgICAgLy8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJl
dHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuCisgICAgaGFz
OiBmdW5jdGlvbiggZm4gKSB7CisgICAgcmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBs
aXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3QubGVuZ3RoICk7CisgICAgfSwKKyAgICAvLyBS
ZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0CisgICAgZW1wdHk6IGZ1bmN0aW9uKCkg
eworICAgIGxpc3QgPSBbXTsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAgIC8vIEhhdmUg
dGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlCisgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7Cisg
ICAgbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOworICAgIHJldHVybiB0aGlzOwor
ICAgIH0sCisgICAgLy8gSXMgaXQgZGlzYWJsZWQ/CisgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiAhbGlzdDsKKyAgICB9LAorICAgIC8vIExvY2sgdGhlIGxpc3QgaW4gaXRz
IGN1cnJlbnQgc3RhdGUKKyAgICBsb2NrOiBmdW5jdGlvbigpIHsKKyAgICBzdGFjayA9IHVuZGVm
aW5lZDsKKyAgICBpZiAoICFtZW1vcnkgKSB7CisgICAgc2VsZi5kaXNhYmxlKCk7CisgICAgfQor
ICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgLy8gSXMgaXQgbG9ja2VkPworICAgIGxvY2tl
ZDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICFzdGFjazsKKyAgICB9LAorICAgIC8vIENhbGwg
YWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHMKKyAgICBm
aXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7CisgICAgYXJncyA9IGFyZ3MgfHwg
W107CisgICAgYXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFy
Z3MgXTsKKyAgICBpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKKyAgICBpZiAo
IGZpcmluZyApIHsKKyAgICBzdGFjay5wdXNoKCBhcmdzICk7CisgICAgfSBlbHNlIHsKKyAgICBm
aXJlKCBhcmdzICk7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorICAg
IC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCisgICAg
ZmlyZTogZnVuY3Rpb24oKSB7CisgICAgc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKyAgICAvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFj
a3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKKyAgICBmaXJlZDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuICEhZmlyZWQ7CisgICAgfQorICAgIH07CisKKyAgICByZXR1
cm4gc2VsZjsKK307CitqUXVlcnkuZXh0ZW5kKHsKKworICAgIERlZmVycmVkOiBmdW5jdGlvbigg
ZnVuYyApIHsKKyAgICB2YXIgdHVwbGVzID0gWworICAgIC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVy
LCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQorICAgIFsgInJlc29sdmUiLCAiZG9uZSIsIGpR
dWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZXNvbHZlZCIgXSwKKyAgICBbICJyZWpl
Y3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIg
XSwKKyAgICBbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnki
KSBdCisgICAgXSwKKyAgICBzdGF0ZSA9ICJwZW5kaW5nIiwKKyAgICBwcm9taXNlID0geworICAg
IHN0YXRlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gc3RhdGU7CisgICAgfSwKKyAgICBhbHdh
eXM6IGZ1bmN0aW9uKCkgeworICAgIGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFy
Z3VtZW50cyApOworICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgdGhlbjogZnVuY3Rpb24o
IC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgeworICAgIHZhciBmbnMgPSBhcmd1
bWVudHM7CisgICAgcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7
CisgICAgalF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgeworICAgIHZh
ciBhY3Rpb24gPSB0dXBsZVsgMCBdLAorICAgIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sg
aSBdICkgJiYgZm5zWyBpIF07CisgICAgLy8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jl
c3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyCisgICAgZGVmZXJyZWRbIHR1
cGxlWzFdIF0oZnVuY3Rpb24oKSB7CisgICAgdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHko
IHRoaXMsIGFyZ3VtZW50cyApOworICAgIGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rp
b24oIHJldHVybmVkLnByb21pc2UgKSApIHsKKyAgICByZXR1cm5lZC5wcm9taXNlKCkKKyAgICAu
ZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApCisgICAgLmZhaWwoIG5ld0RlZmVyLnJlamVjdCApCisg
ICAgLnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTsKKyAgICB9IGVsc2UgeworICAgIG5ld0Rl
ZmVyWyBhY3Rpb24gKyAiV2l0aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21p
c2UoKSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7CisgICAgfQorICAg
IH0pOworICAgIH0pOworICAgIGZucyA9IG51bGw7CisgICAgfSkucHJvbWlzZSgpOworICAgIH0s
CisgICAgLy8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZAorICAgIC8vIElmIG9iaiBp
cyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKKyAg
ICBwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgeworICAgIHJldHVybiBvYmogIT0gbnVsbCA/IGpR
dWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKKyAgICB9CisgICAgfSwKKyAg
ICBkZWZlcnJlZCA9IHt9OworCisgICAgLy8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdAorICAg
IHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKKworICAgIC8vIEFkZCBsaXN0LXNwZWNpZmlj
IG1ldGhvZHMKKyAgICBqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7
CisgICAgdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAorICAgIHN0YXRlU3RyaW5nID0gdHVwbGVbIDMg
XTsKKworICAgIC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRk
CisgICAgcHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkOworCisgICAgLy8gSGFuZGxlIHN0
YXRlCisgICAgaWYgKCBzdGF0ZVN0cmluZyApIHsKKyAgICBsaXN0LmFkZChmdW5jdGlvbigpIHsK
KyAgICAvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdCisgICAgc3RhdGUgPSBzdGF0
ZVN0cmluZzsKKworICAgIC8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxl
OyBwcm9ncmVzc19saXN0LmxvY2sKKyAgICB9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxl
LCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKKyAgICB9CisKKyAgICAvLyBkZWZlcnJlZFsgcmVz
b2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdCisgICAgZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5j
dGlvbigpIHsKKyAgICBkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gZGVm
ZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7CisgICAgcmV0dXJuIHRoaXM7Cisg
ICAgfTsKKyAgICBkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7
CisgICAgfSk7CisKKyAgICAvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKKyAgICBwcm9t
aXNlLnByb21pc2UoIGRlZmVycmVkICk7CisKKyAgICAvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55
CisgICAgaWYgKCBmdW5jICkgeworICAgIGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7
CisgICAgfQorCisgICAgLy8gQWxsIGRvbmUhCisgICAgcmV0dXJuIGRlZmVycmVkOworICAgIH0s
CisKKyAgICAvLyBEZWZlcnJlZCBoZWxwZXIKKyAgICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5h
dGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgcmVz
b2x2ZVZhbHVlcyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICksCisgICAgbGVuZ3RoID0g
cmVzb2x2ZVZhbHVlcy5sZW5ndGgsCisKKyAgICAvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQg
c3Vib3JkaW5hdGVzCisgICAgcmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5h
dGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3Ro
IDogMCwKKworICAgIC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29u
c2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgorICAgIGRlZmVy
cmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwK
KworICAgIC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2
YWx1ZXMKKyAgICB1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7
CisgICAgcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICBjb250ZXh0c1sgaSBdID0gdGhp
czsKKyAgICB2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gY29yZV9zbGljZS5j
YWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOworICAgIGlmKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFs
dWVzICkgeworICAgIGRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKKyAg
ICB9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkgeworICAgIGRlZmVycmVkLnJlc29sdmVX
aXRoKCBjb250ZXh0cywgdmFsdWVzICk7CisgICAgfQorICAgIH07CisgICAgfSwKKworICAgIHBy
b2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7CisKKyAgICAv
LyBhZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFz
IHJlc29sdmVkCisgICAgaWYgKCBsZW5ndGggPiAxICkgeworICAgIHByb2dyZXNzVmFsdWVzID0g
bmV3IEFycmF5KCBsZW5ndGggKTsKKyAgICBwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBs
ZW5ndGggKTsKKyAgICByZXNvbHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOworICAg
IGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAgIGlmICggcmVzb2x2ZVZhbHVlc1sgaSBd
ICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkgewor
ICAgIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKCkKKyAgICAuZG9uZSggdXBkYXRlRnVuYygg
aSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKQorICAgIC5mYWlsKCBkZWZlcnJl
ZC5yZWplY3QgKQorICAgIC5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0
cywgcHJvZ3Jlc3NWYWx1ZXMgKSApOworICAgIH0gZWxzZSB7CisgICAgLS1yZW1haW5pbmc7Cisg
ICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0
aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCisgICAgaWYgKCAhcmVtYWluaW5nICkgeworICAgIGRl
ZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOworICAgIH0KK30pOworalF1ZXJ5
LnN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CisKKyAgICB2YXIgc3VwcG9ydCwgYWxsLCBhLAorICAg
IGlucHV0LCBzZWxlY3QsIGZyYWdtZW50LAorICAgIG9wdCwgZXZlbnROYW1lLCBpc1N1cHBvcnRl
ZCwgaSwKKyAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworICAgIC8v
IFNldHVwCisgICAgZGl2LnNldEF0dHJpYnV0ZSggImNsYXNzTmFtZSIsICJ0IiApOworICAgIGRp
di5pbm5lckhUTUwgPSAiICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+
PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IjsKKworICAgIC8vIFN1cHBvcnQgdGVzdHMgd29uJ3Qg
cnVuIGluIHNvbWUgbGltaXRlZCBvciBub24tYnJvd3NlciBlbnZpcm9ubWVudHMKKyAgICBhbGwg
PSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICBhID0gZGl2LmdldEVsZW1lbnRz
QnlUYWdOYW1lKCJhIilbIDAgXTsKKyAgICBpZiAoICFhbGwgfHwgIWEgfHwgIWFsbC5sZW5ndGgg
KSB7CisgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIC8vIEZpcnN0IGJhdGNoIG9mIHRlc3Rz
CisgICAgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CisgICAgb3B0
ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSAp
OworICAgIGlucHV0ID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWyAwIF07CisK
KyAgICBhLnN0eWxlLmNzc1RleHQgPSAidG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiOwor
ICAgIHN1cHBvcnQgPSB7CisgICAgLy8gVGVzdCBzZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNs
YXNzLiBJZiBpdCB3b3Jrcywgd2UgbmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0
cmlidXRlIChpZTYvNykKKyAgICBnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09ICJ0
IiwKKworICAgIC8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1M
IGlzIHVzZWQKKyAgICBsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUg
PT09IDMsCisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0
b21hdGljYWxseSBpbnNlcnRlZAorICAgIC8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0
eSB0YWJsZXMKKyAgICB0Ym9keTogIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5s
ZW5ndGgsCisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxp
emVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKKyAgICAvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBl
ciBlbGVtZW50IGluIElFCisgICAgaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoImxpbmsiKS5sZW5ndGgsCisKKyAgICAvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9u
IGZyb20gZ2V0QXR0cmlidXRlCisgICAgLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKKyAg
ICBzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKKworICAgIC8v
IE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCisgICAgLy8gKElFIG5vcm1h
bGl6ZXMgaXQgYnkgZGVmYXVsdCkKKyAgICBocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUo
ImhyZWYiKSA9PT0gIi9hIiwKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0
eSBleGlzdHMKKyAgICAvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKKyAgICAvLyBVc2UgYSBy
ZWdleCB0byB3b3JrIGFyb3VuZCBhIFdlYktpdCBpc3N1ZS4gU2VlICM1MTQ1CisgICAgb3BhY2l0
eTogL14wLjUvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAorCisgICAgLy8gVmVyaWZ5IHN0eWxl
IGZsb2F0IGV4aXN0ZW5jZQorICAgIC8vIChJRSB1c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBj
c3NGbG9hdCkKKyAgICBjc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisgICAgLy8gQ2hl
Y2sgdGhlIGRlZmF1bHQgY2hlY2tib3gvcmFkaW8gdmFsdWUgKCIiIG9uIFdlYktpdDsgIm9uIiBl
bHNld2hlcmUpCisgICAgY2hlY2tPbjogISFpbnB1dC52YWx1ZSwKKworICAgIC8vIE1ha2Ugc3Vy
ZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3Rl
ZCBwcm9wZXJ0eS4KKyAgICAvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2Yg
dHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKQorICAgIG9wdFNlbGVjdGVkOiBv
cHQuc2VsZWN0ZWQsCisKKyAgICAvLyBUZXN0cyBmb3IgZW5jdHlwZSBzdXBwb3J0IG9uIGEgZm9y
bSAoIzY3NDMpCisgICAgZW5jdHlwZTogISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiku
ZW5jdHlwZSwKKworICAgIC8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRv
ZXMgbm90IGNhdXNlIHByb2JsZW1zCisgICAgLy8gV2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5l
ZCwgdGhpcyBzdGlsbCB3b3JrcworICAgIGh0bWw1Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4i
LAorCisgICAgLy8galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgREVQUkVDQVRFRCBpbiAxLjggc2lu
Y2Ugd2UgZG9uJ3Qgc3VwcG9ydCBRdWlya3MgTW9kZQorICAgIGJveE1vZGVsOiBkb2N1bWVudC5j
b21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIsCisKKyAgICAvLyBXaWxsIGJlIGRlZmluZWQgbGF0
ZXIKKyAgICBkZWxldGVFeHBhbmRvOiB0cnVlLAorICAgIG5vQ2xvbmVFdmVudDogdHJ1ZSwKKyAg
ICBpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxzZSwKKyAgICBzaHJpbmtXcmFwQmxvY2tzOiBm
YWxzZSwKKyAgICByZWxpYWJsZU1hcmdpblJpZ2h0OiB0cnVlLAorICAgIGJveFNpemluZ1JlbGlh
YmxlOiB0cnVlLAorICAgIHBpeGVsUG9zaXRpb246IGZhbHNlCisgICAgfTsKKworICAgIC8vIE1h
a2Ugc3VyZSBjaGVja2VkIHN0YXR1cyBpcyBwcm9wZXJseSBjbG9uZWQKKyAgICBpbnB1dC5jaGVj
a2VkID0gdHJ1ZTsKKyAgICBzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2Rl
KCB0cnVlICkuY2hlY2tlZDsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGlu
c2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKKyAgICAvLyAo
V2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCisgICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1
ZTsKKyAgICBzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworICAgIC8vIFN1
cHBvcnQ6IElFPDkKKyAgICB0cnkgeworICAgIGRlbGV0ZSBkaXYudGVzdDsKKyAgICB9IGNhdGNo
KCBlICkgeworICAgIHN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOworICAgIH0KKworICAg
IC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBnZXRBdHRyaWJ1dGUoInZhbHVlIikKKyAgICBpbnB1
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgaW5wdXQuc2V0QXR0cmli
dXRlKCAidmFsdWUiLCAiIiApOworICAgIHN1cHBvcnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1
dGUoICJ2YWx1ZSIgKSA9PT0gIiI7CisKKyAgICAvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFp
bnMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW8KKyAgICBpbnB1dC52YWx1ZSA9ICJ0
IjsKKyAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOworICAgIHN1cHBv
cnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7CisKKyAgICAvLyAjMTEyMTcgLSBX
ZWJLaXQgbG9zZXMgY2hlY2sgd2hlbiB0aGUgbmFtZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRy
aWJ1dGUKKyAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInQiICk7CisgICAgaW5w
dXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiApOworCisgICAgZnJhZ21lbnQgPSBkb2N1bWVu
dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlu
cHV0ICk7CisKKyAgICAvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJl
dGFpbiBpdHMgY2hlY2tlZAorICAgIC8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8g
dGhlIERPTSAoSUU2LzcpCisgICAgc3VwcG9ydC5hcHBlbmRDaGVja2VkID0gaW5wdXQuY2hlY2tl
ZDsKKworICAgIC8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5
IGluIGZyYWdtZW50cworICAgIHN1cHBvcnQuY2hlY2tDbG9uZSA9IGZyYWdtZW50LmNsb25lTm9k
ZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOworCisgICAgLy8g
U3VwcG9ydDogSUU8OQorICAgIC8vIE9wZXJhIGRvZXMgbm90IGNsb25lIGV2ZW50cyAoYW5kIHR5
cGVvZiBkaXYuYXR0YWNoRXZlbnQgPT09IHVuZGVmaW5lZCkuCisgICAgLy8gSUU5LTEwIGNsb25l
cyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50LCBidXQgdGhleSBkb24ndCB0cmlnZ2VyIHdp
dGggLmNsaWNrKCkKKyAgICBpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKKyAgICBkaXYuYXR0YWNo
RXZlbnQoICJvbmNsaWNrIiwgZnVuY3Rpb24oKSB7CisgICAgc3VwcG9ydC5ub0Nsb25lRXZlbnQg
PSBmYWxzZTsKKyAgICB9KTsKKworICAgIGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbGljaygpOwor
ICAgIH0KKworICAgIC8vIFN1cHBvcnQ6IElFPDkgKGxhY2sgc3VibWl0L2NoYW5nZSBidWJibGUp
LCBGaXJlZm94IDE3KyAobGFjayBmb2N1c2luIGV2ZW50KQorICAgIC8vIEJld2FyZSBvZiBDU1Ag
cmVzdHJpY3Rpb25zIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9D
U1ApLCB0ZXN0L2NzcC5waHAKKyAgICBmb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6
IHRydWUsIGZvY3VzaW46IHRydWUgfSkgeworICAgIGRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFt
ZSA9ICJvbiIgKyBpLCAidCIgKTsKKworICAgIHN1cHBvcnRbIGkgKyAiQnViYmxlcyIgXSA9IGV2
ZW50TmFtZSBpbiB3aW5kb3cgfHwgZGl2LmF0dHJpYnV0ZXNbIGV2ZW50TmFtZSBdLmV4cGFuZG8g
PT09IGZhbHNlOworICAgIH0KKworICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250
ZW50LWJveCI7CisgICAgZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlw
ID0gIiI7CisgICAgc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3Vu
ZENsaXAgPT09ICJjb250ZW50LWJveCI7CisKKyAgICAvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEg
Ym9keSBhdCBkb2MgcmVhZHkKKyAgICBqUXVlcnkoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRh
aW5lciwgbWFyZ2luRGl2LCB0ZHMsCisgICAgZGl2UmVzZXQgPSAicGFkZGluZzowO21hcmdpbjow
O2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1z
aXppbmc6Y29udGVudC1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OyIsCisgICAg
Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CisKKyAgICBp
ZiAoICFib2R5ICkgeworICAgIC8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0
IGhhdmUgYSBib2R5CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRhaW5lciA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0g
ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDot
OTk5OXB4O21hcmdpbi10b3A6MXB4IjsKKworICAgIGJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5l
ciApLmFwcGVuZENoaWxkKCBkaXYgKTsKKworICAgIC8vIFN1cHBvcnQ6IElFOAorICAgIC8vIENo
ZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhl
eSBhcmUgc2V0CisgICAgLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3Ro
ZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCisgICAgLy8gdGFibGUgcm93OyBpZiBzbywgb2Zm
c2V0V2lkdGgvSGVpZ2h0IGFyZSBub3QgcmVsaWFibGUgZm9yIHVzZSB3aGVuCisgICAgLy8gZGV0
ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKKyAg
ICAvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBw
YXJlbnQgZWxlbWVudCBpcworICAgIC8vIGhpZGRlbjsgZG9uIHNhZmV0eSBnb2dnbGVzIGFuZCBz
ZWUgYnVnICM0NTEyIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKyAgICBkaXYuaW5uZXJIVE1MID0g
Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iOworICAgIHRkcyA9
IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKyAgICB0ZHNbIDAgXS5zdHlsZS5jc3NU
ZXh0ID0gInBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiOworICAgIGlz
U3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKKworICAgIHRkc1sg
MCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKKyAgICB0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5v
bmUiOworCisgICAgLy8gU3VwcG9ydDogSUU4CisgICAgLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUg
Y2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQKKyAgICBzdXBwb3J0LnJlbGlhYmxl
SGlkZGVuT2Zmc2V0cyA9IGlzU3VwcG9ydGVkICYmICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09
PSAwICk7CisKKyAgICAvLyBDaGVjayBib3gtc2l6aW5nIGFuZCBtYXJnaW4gYmVoYXZpb3IKKyAg
ICBkaXYuaW5uZXJIVE1MID0gIiI7CisgICAgZGl2LnN0eWxlLmNzc1RleHQgPSAiYm94LXNpemlu
Zzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemlu
Zzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0
cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7IjsKKyAgICBzdXBwb3J0
LmJveFNpemluZyA9ICggZGl2Lm9mZnNldFdpZHRoID09PSA0ICk7CisgICAgc3VwcG9ydC5kb2Vz
Tm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCA9ICggYm9keS5vZmZzZXRUb3AgIT09IDEgKTsK
KworICAgIC8vIFVzZSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSBiZWNhdXNlIGpzZG9tIG9uIG5v
ZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0LgorICAgIGlmICggd2luZG93LmdldENvbXB1dGVk
U3R5bGUgKSB7CisgICAgc3VwcG9ydC5waXhlbFBvc2l0aW9uID0gKCB3aW5kb3cuZ2V0Q29tcHV0
ZWRTdHlsZSggZGl2LCBudWxsICkgfHwge30gKS50b3AgIT09ICIxJSI7CisgICAgc3VwcG9ydC5i
b3hTaXppbmdSZWxpYWJsZSA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCAp
IHx8IHsgd2lkdGg6ICI0cHgiIH0gKS53aWR0aCA9PT0gIjRweCI7CisKKyAgICAvLyBDaGVjayBp
ZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5
CisgICAgLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29u
dGFpbmVyLiAoIzMzMzMpCisgICAgLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBu
aWdodGxpZXMKKyAgICAvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1
cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKKyAgICBtYXJnaW5EaXYgPSBkaXYuYXBw
ZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7CisgICAgbWFyZ2luRGl2
LnN0eWxlLmNzc1RleHQgPSBkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0OworICAgIG1hcmdp
bkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKKyAg
ICBkaXYuc3R5bGUud2lkdGggPSAiMXB4IjsKKworICAgIHN1cHBvcnQucmVsaWFibGVNYXJnaW5S
aWdodCA9CisgICAgIXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdp
bkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmlnaHQgKTsKKyAgICB9CisKKyAgICBpZiAoIHR5
cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7CisgICAgLy8gU3Vw
cG9ydDogSUU8OAorICAgIC8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRz
IGFjdCBsaWtlIGlubGluZS1ibG9jaworICAgIC8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVp
ciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmcKKyAgICAvLyB0aGVtIGxheW91dAorICAg
IGRpdi5pbm5lckhUTUwgPSAiIjsKKyAgICBkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsg
IndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiOworICAgIHN1cHBv
cnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7CisK
KyAgICAvLyBTdXBwb3J0OiBJRTYKKyAgICAvLyBDaGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91
dCBzaHJpbmstd3JhcCB0aGVpciBjaGlsZHJlbgorICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJs
b2NrIjsKKyAgICBkaXYuaW5uZXJIVE1MID0gIjxkaXY+PC9kaXY+IjsKKyAgICBkaXYuZmlyc3RD
aGlsZC5zdHlsZS53aWR0aCA9ICI1cHgiOworICAgIHN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9
ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7CisKKyAgICBpZiAoIHN1cHBvcnQuaW5saW5lQmxv
Y2tOZWVkc0xheW91dCApIHsKKyAgICAvLyBQcmV2ZW50IElFIDYgZnJvbSBhZmZlY3RpbmcgbGF5
b3V0IGZvciBwb3NpdGlvbmVkIGVsZW1lbnRzICMxMTA0OAorICAgIC8vIFByZXZlbnQgSUUgZnJv
bSBzaHJpbmtpbmcgdGhlIGJvZHkgaW4gSUUgNyBtb2RlICMxMjg2OQorICAgIC8vIFN1cHBvcnQ6
IElFPDgKKyAgICBib2R5LnN0eWxlLnpvb20gPSAxOworICAgIH0KKyAgICB9CisKKyAgICBib2R5
LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKKworICAgIC8vIE51bGwgZWxlbWVudHMgdG8gYXZv
aWQgbGVha3MgaW4gSUUKKyAgICBjb250YWluZXIgPSBkaXYgPSB0ZHMgPSBtYXJnaW5EaXYgPSBu
dWxsOworICAgIH0pOworCisgICAgLy8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJ
RQorICAgIGFsbCA9IHNlbGVjdCA9IGZyYWdtZW50ID0gb3B0ID0gYSA9IGlucHV0ID0gbnVsbDsK
KworICAgIHJldHVybiBzdXBwb3J0OworfSkoKTsKKwordmFyIHJicmFjZSA9IC8oPzpce1tcc1xT
XSpcfXxcW1tcc1xTXSpcXSkkLywKKyAgICBybXVsdGlEYXNoID0gLyhbQS1aXSkvZzsKKworZnVu
Y3Rpb24gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNl
IE9ubHkgKi8gKXsKKyAgICBpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworICAg
IHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgdGhpc0NhY2hlLCByZXQsCisgICAgaW50ZXJuYWxL
ZXkgPSBqUXVlcnkuZXhwYW5kbywKKyAgICBnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gInN0
cmluZyIsCisKKyAgICAvLyBXZSBoYXZlIHRvIGhhbmRsZSBET00gbm9kZXMgYW5kIEpTIG9iamVj
dHMgZGlmZmVyZW50bHkgYmVjYXVzZSBJRTYtNworICAgIC8vIGNhbid0IEdDIG9iamVjdCByZWZl
cmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5CisgICAgaXNOb2RlID0g
ZWxlbS5ub2RlVHlwZSwKKworICAgIC8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBq
UXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCisgICAgLy8gYXR0YWNoZWQgZGlyZWN0bHkg
dG8gdGhlIG9iamVjdCBzbyBHQyBjYW4gb2NjdXIgYXV0b21hdGljYWxseQorICAgIGNhY2hlID0g
aXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKKworICAgIC8vIE9ubHkgZGVmaW5pbmcgYW4g
SUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93cworICAg
IC8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3
aXRoIG5vIGNhY2hlCisgICAgaWQgPSBpc05vZGUgPyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxl
bVsgaW50ZXJuYWxLZXkgXSAmJiBpbnRlcm5hbEtleTsKKworICAgIC8vIEF2b2lkIGRvaW5nIGFu
eSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFu
CisgICAgLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCisgICAgaWYgKCAoIWlkIHx8
ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNhY2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYm
IGRhdGEgPT09IHVuZGVmaW5lZCApIHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCAh
aWQgKSB7CisgICAgLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVh
Y2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCisgICAgLy8gZW5kcyB1cCBpbiB0aGUgZ2xvYmFs
IGNhY2hlCisgICAgaWYgKCBpc05vZGUgKSB7CisgICAgZWxlbVsgaW50ZXJuYWxLZXkgXSA9IGlk
ID0gY29yZV9kZWxldGVkSWRzLnBvcCgpIHx8IGpRdWVyeS5ndWlkKys7CisgICAgfSBlbHNlIHsK
KyAgICBpZCA9IGludGVybmFsS2V5OworICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFjYWNoZVsg
aWQgXSApIHsKKyAgICBjYWNoZVsgaWQgXSA9IHt9OworCisgICAgLy8gQXZvaWRzIGV4cG9zaW5n
IGpRdWVyeSBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdAorICAg
IC8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkKKyAgICBpZiAoICFpc05vZGUg
KSB7CisgICAgY2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7CisgICAgfQorICAgIH0K
KworICAgIC8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQg
b2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRzCisgICAgLy8gc2hhbGxvdyBjb3BpZWQgb3Zl
ciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQorICAgIGlmICggdHlwZW9mIG5hbWUgPT09ICJvYmpl
Y3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iICkgeworICAgIGlmICggcHZ0ICkgewor
ICAgIGNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKKyAg
ICB9IGVsc2UgeworICAgIGNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsg
aWQgXS5kYXRhLCBuYW1lICk7CisgICAgfQorICAgIH0KKworICAgIHRoaXNDYWNoZSA9IGNhY2hl
WyBpZCBdOworCisgICAgLy8galF1ZXJ5IGRhdGEoKSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBv
YmplY3QgaW5zaWRlIHRoZSBvYmplY3QncyBpbnRlcm5hbCBkYXRhCisgICAgLy8gY2FjaGUgaW4g
b3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1
c2VyLWRlZmluZWQKKyAgICAvLyBkYXRhLgorICAgIGlmICggIXB2dCApIHsKKyAgICBpZiAoICF0
aGlzQ2FjaGUuZGF0YSApIHsKKyAgICB0aGlzQ2FjaGUuZGF0YSA9IHt9OworICAgIH0KKworICAg
IHRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOworICAgIH0KKworICAgIGlmICggZGF0YSAhPT0g
dW5kZWZpbmVkICkgeworICAgIHRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0g
PSBkYXRhOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1l
bCBhbmQgbm9uLWNvbnZlcnRlZCBkYXRhIHByb3BlcnR5IG5hbWVzCisgICAgLy8gSWYgYSBkYXRh
IHByb3BlcnR5IHdhcyBzcGVjaWZpZWQKKyAgICBpZiAoIGdldEJ5TmFtZSApIHsKKworICAgIC8v
IEZpcnN0IFRyeSB0byBmaW5kIGFzLWlzIHByb3BlcnR5IGRhdGEKKyAgICByZXQgPSB0aGlzQ2Fj
aGVbIG5hbWUgXTsKKworICAgIC8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRh
dGEKKyAgICBpZiAoIHJldCA9PSBudWxsICkgeworCisgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNh
bWVsQ2FzZWQgcHJvcGVydHkKKyAgICByZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2Uo
IG5hbWUgKSBdOworICAgIH0KKyAgICB9IGVsc2UgeworICAgIHJldCA9IHRoaXNDYWNoZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitmdW5jdGlvbiBpbnRlcm5hbFJlbW92ZURhdGEo
IGVsZW0sIG5hbWUsIHB2dCApIHsKKyAgICBpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSAp
ICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaSwgbCwgdGhpc0NhY2hlLAorICAg
IGlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCisKKyAgICAvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1v
cmUgaW5mb3JtYXRpb24KKyAgICBjYWNoZSA9IGlzTm9kZSA/IGpRdWVyeS5jYWNoZSA6IGVsZW0s
CisgICAgaWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFu
ZG87CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IG5vIGNhY2hlIGVudHJ5IGZvciB0aGlz
IG9iamVjdCwgdGhlcmUgaXMgbm8KKyAgICAvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmcKKyAgICBp
ZiAoICFjYWNoZVsgaWQgXSApIHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBuYW1l
ICkgeworCisgICAgdGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5k
YXRhOworCisgICAgaWYgKCB0aGlzQ2FjaGUgKSB7CisKKyAgICAvLyBTdXBwb3J0IGFycmF5IG9y
IHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgbmFtZXMgZm9yIGRhdGEga2V5cworICAgIGlmICggIWpR
dWVyeS5pc0FycmF5KCBuYW1lICkgKSB7CisKKyAgICAvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtl
eSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbgorICAgIGlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7
CisgICAgbmFtZSA9IFsgbmFtZSBdOworICAgIH0gZWxzZSB7CisKKyAgICAvLyBzcGxpdCB0aGUg
Y2FtZWwgY2FzZWQgdmVyc2lvbiBieSBzcGFjZXMgdW5sZXNzIGEga2V5IHdpdGggdGhlIHNwYWNl
cyBleGlzdHMKKyAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOworICAgIGlmICgg
bmFtZSBpbiB0aGlzQ2FjaGUgKSB7CisgICAgbmFtZSA9IFsgbmFtZSBdOworICAgIH0gZWxzZSB7
CisgICAgbmFtZSA9IG5hbWUuc3BsaXQoIiAiKTsKKyAgICB9CisgICAgfQorICAgIH0gZWxzZSB7
CisgICAgLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5IG9mIGtleXMuLi4KKyAgICAvLyBXaGVuIGRh
dGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIsICJ2YWwiKSBzaWduYXR1cmUsCisg
ICAgLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuCisgICAgLy8gU2luY2Ug
dGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKKyAg
ICAvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2CisgICAgLy8gVGhp
cyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguCisgICAgbmFtZSA9
IG5hbWUuY29uY2F0KCBqUXVlcnkubWFwKCBuYW1lLCBqUXVlcnkuY2FtZWxDYXNlICkgKTsKKyAg
ICB9CisKKyAgICBmb3IgKCBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSsrICkgewor
ICAgIGRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWVbaV0gXTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVy
ZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlCisgICAg
Ly8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCisgICAgaWYg
KCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRo
aXNDYWNoZSApICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8v
IFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICAgIGlmICggIXB2dCApIHsK
KyAgICBkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTsKKworICAgIC8vIERvbid0IGRlc3Ryb3kgdGhl
IHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CisgICAgLy8gaGFk
IGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBpdAorICAgIGlmICggIWlzRW1wdHlEYXRhT2Jq
ZWN0KCBjYWNoZVsgaWQgXSApICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQorCisgICAg
Ly8gRGVzdHJveSB0aGUgY2FjaGUKKyAgICBpZiAoIGlzTm9kZSApIHsKKyAgICBqUXVlcnkuY2xl
YW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApOworCisgICAgLy8gVXNlIGRlbGV0ZSB3aGVuIHN1cHBv
cnRlZCBmb3IgZXhwYW5kb3Mgb3IgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgcGVyIGlzV2luZG93
ICgjMTAwODApCisgICAgfSBlbHNlIGlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8
fCBjYWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7CisgICAgZGVsZXRlIGNhY2hlWyBpZCBdOworCisg
ICAgLy8gV2hlbiBhbGwgZWxzZSBmYWlscywgbnVsbAorICAgIH0gZWxzZSB7CisgICAgY2FjaGVb
IGlkIF0gPSBudWxsOworICAgIH0KK30KKworalF1ZXJ5LmV4dGVuZCh7CisgICAgY2FjaGU6IHt9
LAorCisgICAgLy8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCisg
ICAgLy8gTm9uLWRpZ2l0cyByZW1vdmVkIHRvIG1hdGNoIHJpbmxpbmVqUXVlcnkKKyAgICBleHBh
bmRvOiAialF1ZXJ5IiArICggY29yZV92ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2Uo
IC9cRC9nLCAiIiApLAorCisgICAgLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNh
dGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdQorICAgIC8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8g
cHJvcGVydGllcyB0byB0aGVtLgorICAgIG5vRGF0YTogeworICAgICJlbWJlZCI6IHRydWUsCisg
ICAgLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBh
bmRvcykKKyAgICAib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1
MzU0MDAwMCIsCisgICAgImFwcGxldCI6IHRydWUKKyAgICB9LAorCisgICAgaGFzRGF0YTogZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVb
IGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOworICAgIHJl
dHVybiAhIWVsZW0gJiYgIWlzRW1wdHlEYXRhT2JqZWN0KCBlbGVtICk7CisgICAgfSwKKworICAg
IGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworICAgIHJldHVybiBpbnRlcm5h
bERhdGEoIGVsZW0sIG5hbWUsIGRhdGEgKTsKKyAgICB9LAorCisgICAgcmVtb3ZlRGF0YTogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUgKSB7CisgICAgcmV0dXJuIGludGVybmFsUmVtb3ZlRGF0YSggZWxl
bSwgbmFtZSApOworICAgIH0sCisKKyAgICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgICAg
X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworICAgIHJldHVybiBpbnRlcm5h
bERhdGEoIGVsZW0sIG5hbWUsIGRhdGEsIHRydWUgKTsKKyAgICB9LAorCisgICAgX3JlbW92ZURh
dGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworICAgIHJldHVybiBpbnRlcm5hbFJlbW92ZURh
dGEoIGVsZW0sIG5hbWUsIHRydWUgKTsKKyAgICB9LAorCisgICAgLy8gQSBtZXRob2QgZm9yIGRl
dGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhhbmRsZSB0aGUgZGF0YSBleHBhbmRvCisgICAg
YWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gRG8gbm90IHNldCBkYXRhIG9u
IG5vbi1lbGVtZW50IGJlY2F1c2UgaXQgd2lsbCBub3QgYmUgY2xlYXJlZCAoIzgzMzUpLgorICAg
IGlmICggZWxlbS5ub2RlVHlwZSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICYmIGVsZW0ubm9kZVR5
cGUgIT09IDkgKSB7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciBub0RhdGEg
PSBlbGVtLm5vZGVOYW1lICYmIGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNh
c2UoKSBdOworCisgICAgLy8gbm9kZXMgYWNjZXB0IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVj
aWZpZWQ7IHJlamVjdGlvbiBjYW4gYmUgY29uZGl0aW9uYWwKKyAgICByZXR1cm4gIW5vRGF0YSB8
fCBub0RhdGEgIT09IHRydWUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSA9PT0gbm9E
YXRhOworICAgIH0KK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBkYXRhOiBmdW5jdGlv
bigga2V5LCB2YWx1ZSApIHsKKyAgICB2YXIgYXR0cnMsIG5hbWUsCisgICAgZWxlbSA9IHRoaXNb
MF0sCisgICAgaSA9IDAsCisgICAgZGF0YSA9IG51bGw7CisKKyAgICAvLyBHZXRzIGFsbCB2YWx1
ZXMKKyAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgeworICAgIGlmICggdGhpcy5sZW5ndGgg
KSB7CisgICAgZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtICk7CisKKyAgICBpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiApICkgewor
ICAgIGF0dHJzID0gZWxlbS5hdHRyaWJ1dGVzOworICAgIGZvciAoIDsgaSA8IGF0dHJzLmxlbmd0
aDsgaSsrICkgeworICAgIG5hbWUgPSBhdHRyc1tpXS5uYW1lOworCisgICAgaWYgKCAhbmFtZS5p
bmRleE9mKCAiZGF0YS0iICkgKSB7CisgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUu
c2xpY2UoNSkgKTsKKworICAgIGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsK
KyAgICB9CisgICAgfQorICAgIGpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiwgdHJ1
ZSApOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvLyBT
ZXRzIG11bHRpcGxlIHZhbHVlcworICAgIGlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7
CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICBqUXVlcnkuZGF0YSggdGhp
cywga2V5ICk7CisgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRo
aXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKworICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAp
IHsKKyAgICAvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QK
KyAgICByZXR1cm4gZWxlbSA/IGRhdGFBdHRyKCBlbGVtLCBrZXksIGpRdWVyeS5kYXRhKCBlbGVt
LCBrZXkgKSApIDogbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKKyAgICB9KTsKKyAgICB9LCBudWxs
LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTsKKyAgICB9LAorCisg
ICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1
bmN0aW9uKCkgeworICAgIGpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKKyAgICB9KTsK
KyAgICB9Cit9KTsKKworZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKyAg
ICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55Cisg
ICAgLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCisgICAgaWYgKCBkYXRh
ID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKworICAgIHZhciBuYW1l
ID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQxIiApLnRvTG93ZXJDYXNl
KCk7CisKKyAgICBkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKworICAgIGlmICgg
dHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgeworICAgIHRyeSB7CisgICAgZGF0YSA9IGRhdGEg
PT09ICJ0cnVlIiA/IHRydWUgOgorICAgIGRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CisgICAg
ZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6CisgICAgLy8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVy
IGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmcKKyAgICArZGF0YSArICIiID09PSBkYXRh
ID8gK2RhdGEgOgorICAgIHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBk
YXRhICkgOgorICAgIGRhdGE7CisgICAgfSBjYXRjaCggZSApIHt9CisKKyAgICAvLyBNYWtlIHN1
cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKKyAgICBqUXVlcnku
ZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CisKKyAgICB9IGVsc2UgeworICAgIGRhdGEgPSB1bmRl
ZmluZWQ7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvLyBjaGVja3Mg
YSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzcworZnVuY3Rpb24gaXNFbXB0eURhdGFPYmplY3Qo
IG9iaiApIHsKKyAgICB2YXIgbmFtZTsKKyAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKKworICAg
IC8vIGlmIHRoZSBwdWJsaWMgZGF0YSBvYmplY3QgaXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0
aWxsIGVtcHR5CisgICAgaWYgKCBuYW1lID09PSAiZGF0YSIgJiYgalF1ZXJ5LmlzRW1wdHlPYmpl
Y3QoIG9ialtuYW1lXSApICkgeworICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIG5hbWUg
IT09ICJ0b0pTT04iICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIHRydWU7Cit9CitqUXVlcnkuZXh0ZW5kKHsKKyAgICBxdWV1ZTogZnVuY3Rpb24oIGVs
ZW0sIHR5cGUsIGRhdGEgKSB7CisgICAgdmFyIHF1ZXVlOworCisgICAgaWYgKCBlbGVtICkgewor
ICAgIHR5cGUgPSAoIHR5cGUgfHwgImZ4IiApICsgInF1ZXVlIjsKKyAgICBxdWV1ZSA9IGpRdWVy
eS5fZGF0YSggZWxlbSwgdHlwZSApOworCisgICAgLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0
aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAorICAgIGlmICggZGF0YSAp
IHsKKyAgICBpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKKyAgICBxdWV1
ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOwor
ICAgIH0gZWxzZSB7CisgICAgcXVldWUucHVzaCggZGF0YSApOworICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHF1ZXVlIHx8IFtdOworICAgIH0KKyAgICB9LAorCisgICAgZGVxdWV1ZTogZnVuY3Rp
b24oIGVsZW0sIHR5cGUgKSB7CisgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworICAgIHZhciBx
dWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAorICAgIHN0YXJ0TGVuZ3RoID0gcXVl
dWUubGVuZ3RoLAorICAgIGZuID0gcXVldWUuc2hpZnQoKSwKKyAgICBob29rcyA9IGpRdWVyeS5f
cXVldWVIb29rcyggZWxlbSwgdHlwZSApLAorICAgIG5leHQgPSBmdW5jdGlvbigpIHsKKyAgICBq
UXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOworICAgIH07CisKKyAgICAvLyBJZiB0aGUgZngg
cXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCisg
ICAgaWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgeworICAgIGZuID0gcXVldWUuc2hpZnQoKTsK
KyAgICBzdGFydExlbmd0aC0tOworICAgIH0KKworICAgIGhvb2tzLmN1ciA9IGZuOworICAgIGlm
ICggZm4gKSB7CisKKyAgICAvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRo
ZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCisgICAgLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAorICAg
IGlmICggdHlwZSA9PT0gImZ4IiApIHsKKyAgICBxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIg
KTsKKyAgICB9CisKKyAgICAvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9u
CisgICAgZGVsZXRlIGhvb2tzLnN0b3A7CisgICAgZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3Mg
KTsKKyAgICB9CisKKyAgICBpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKKyAgICBob29r
cy5lbXB0eS5maXJlKCk7CisgICAgfQorICAgIH0sCisKKyAgICAvLyBub3QgaW50ZW5kZWQgZm9y
IHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciBy
ZXR1cm5zIHRoZSBjdXJyZW50IG9uZQorICAgIF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwg
dHlwZSApIHsKKyAgICB2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKKyAgICByZXR1cm4g
alF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXkgKSB8fCBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSwgewor
ICAgIGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigp
IHsKKyAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiICk7CisgICAg
alF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBrZXkgKTsKKyAgICB9KQorICAgIH0pOworICAgIH0K
K30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRh
dGEgKSB7CisgICAgdmFyIHNldHRlciA9IDI7CisKKyAgICBpZiAoIHR5cGVvZiB0eXBlICE9PSAi
c3RyaW5nIiApIHsKKyAgICBkYXRhID0gdHlwZTsKKyAgICB0eXBlID0gImZ4IjsKKyAgICBzZXR0
ZXItLTsKKyAgICB9CisKKyAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7Cisg
ICAgcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOworICAgIH0KKworICAgIHJl
dHVybiBkYXRhID09PSB1bmRlZmluZWQgPworICAgIHRoaXMgOgorICAgIHRoaXMuZWFjaChmdW5j
dGlvbigpIHsKKyAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEg
KTsKKworICAgIC8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCisgICAgalF1ZXJ5Ll9x
dWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CisKKyAgICBpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVl
dWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKKyAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlw
ZSApOworICAgIH0KKyAgICB9KTsKKyAgICB9LAorICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBl
ICkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmRlcXVl
dWUoIHRoaXMsIHR5cGUgKTsKKyAgICB9KTsKKyAgICB9LAorICAgIC8vIEJhc2VkIG9mZiBvZiB0
aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4KKyAgICAvLyBodHRw
Oi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCisgICAg
ZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgeworICAgIHRpbWUgPSBqUXVlcnkuZnggPyBq
UXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7CisgICAgdHlwZSA9IHR5cGUg
fHwgImZ4IjsKKworICAgIHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwg
aG9va3MgKSB7CisgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7Cisg
ICAgaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgIGNsZWFyVGltZW91dCggdGltZW91dCAp
OworICAgIH07CisgICAgfSk7CisgICAgfSwKKyAgICBjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlw
ZSApIHsKKyAgICByZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworICAgIH0s
CisgICAgLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4g
dHlwZQorICAgIC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQorICAg
IHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CisgICAgdmFyIHRtcCwKKyAgICBjb3Vu
dCA9IDEsCisgICAgZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICBlbGVtZW50cyA9IHRo
aXMsCisgICAgaSA9IHRoaXMubGVuZ3RoLAorICAgIHJlc29sdmUgPSBmdW5jdGlvbigpIHsKKyAg
ICBpZiAoICEoIC0tY291bnQgKSApIHsKKyAgICBkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMs
IFsgZWxlbWVudHMgXSApOworICAgIH0KKyAgICB9OworCisgICAgaWYgKCB0eXBlb2YgdHlwZSAh
PT0gInN0cmluZyIgKSB7CisgICAgb2JqID0gdHlwZTsKKyAgICB0eXBlID0gdW5kZWZpbmVkOwor
ICAgIH0KKyAgICB0eXBlID0gdHlwZSB8fCAiZngiOworCisgICAgd2hpbGUoIGktLSApIHsKKyAg
ICB0bXAgPSBqUXVlcnkuX2RhdGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIg
KTsKKyAgICBpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CisgICAgY291bnQrKzsKKyAgICB0bXAu
ZW1wdHkuYWRkKCByZXNvbHZlICk7CisgICAgfQorICAgIH0KKyAgICByZXNvbHZlKCk7CisgICAg
cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOworICAgIH0KK30pOwordmFyIG5vZGVIb29rLCBi
b29sSG9vaywKKyAgICByY2xhc3MgPSAvW1x0XHJcbl0vZywKKyAgICBycmV0dXJuID0gL1xyL2cs
CisgICAgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmpl
Y3QpJC9pLAorICAgIHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2ksCisgICAgcmJvb2xlYW4g
PSAvXig/OmNoZWNrZWR8c2VsZWN0ZWR8YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNvbnRyb2xz
fGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWly
ZWR8c2NvcGVkKSQvaSwKKyAgICBydXNlRGVmYXVsdCA9IC9eKD86Y2hlY2tlZHxzZWxlY3RlZCkk
L2ksCisgICAgZ2V0U2V0QXR0cmlidXRlID0galF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRl
LAorICAgIGdldFNldElucHV0ID0galF1ZXJ5LnN1cHBvcnQuaW5wdXQ7CisKK2pRdWVyeS5mbi5l
eHRlbmQoeworICAgIGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKyAgICByZXR1cm4g
alF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMu
bGVuZ3RoID4gMSApOworICAgIH0sCisKKyAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSAp
IHsKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeS5yZW1vdmVB
dHRyKCB0aGlzLCBuYW1lICk7CisgICAgfSk7CisgICAgfSwKKworICAgIHByb3A6IGZ1bmN0aW9u
KCBuYW1lLCB2YWx1ZSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5
LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworICAgIH0sCisKKyAg
ICByZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKKyAgICBuYW1lID0galF1ZXJ5LnByb3BG
aXhbIG5hbWUgXSB8fCBuYW1lOworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVt
b3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCisgICAgdHJ5IHsKKyAgICB0aGlzWyBuYW1lIF0g
PSB1bmRlZmluZWQ7CisgICAgZGVsZXRlIHRoaXNbIG5hbWUgXTsKKyAgICB9IGNhdGNoKCBlICkg
e30KKyAgICB9KTsKKyAgICB9LAorCisgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsK
KyAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwKKyAgICBpID0gMCwKKyAgICBs
ZW4gPSB0aGlzLmxlbmd0aCwKKyAgICBwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5n
IiAmJiB2YWx1ZTsKKworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7Cisg
ICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5h
ZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApOworICAgIH0p
OworICAgIH0KKworICAgIGlmICggcHJvY2VlZCApIHsKKyAgICAvLyBUaGUgZGlzanVuY3Rpb24g
aGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIHJlbW92ZUNsYXNzKQorICAg
IGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107
CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBlbGVtID0gdGhpc1sgaSBdOwor
ICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/CisgICAg
KCAiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIiApLnJlcGxhY2UoIHJjbGFzcywgIiAiICkgOgor
ICAgICIgIgorICAgICk7CisKKyAgICBpZiAoIGN1ciApIHsKKyAgICBqID0gMDsKKyAgICB3aGls
ZSAoIChjbGF6eiA9IGNsYXNzZXNbaisrXSkgKSB7CisgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAi
ICsgY2xhenogKyAiICIgKSA8IDAgKSB7CisgICAgY3VyICs9IGNsYXp6ICsgIiAiOworICAgIH0K
KyAgICB9CisgICAgZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY3VyICk7CisKKyAgICB9
CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICByZW1vdmVD
bGFzczogZnVuY3Rpb24oIHZhbHVlICkgeworICAgIHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNs
YXp6LCBqLAorICAgIGkgPSAwLAorICAgIGxlbiA9IHRoaXMubGVuZ3RoLAorICAgIHByb2NlZWQg
PSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYg
dmFsdWU7CisKKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworICAgIHJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CisgICAgalF1ZXJ5KCB0aGlzICkucmVtb3Zl
Q2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKKyAgICB9KTsK
KyAgICB9CisgICAgaWYgKCBwcm9jZWVkICkgeworICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIi
ICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKyAgICBmb3IgKCA7IGkgPCBsZW47
IGkrKyApIHsKKyAgICBlbGVtID0gdGhpc1sgaSBdOworICAgIC8vIFRoaXMgZXhwcmVzc2lvbiBp
cyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCisgICAgY3Vy
ID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID8KKyAgICAoICIgIiAr
IGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CisgICAgIiIK
KyAgICApOworCisgICAgaWYgKCBjdXIgKSB7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoY2xh
enogPSBjbGFzc2VzW2orK10pICkgeworICAgIC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKKyAg
ICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBjbGF6eiArICIgIiApID49IDAgKSB7CisgICAg
Y3VyID0gY3VyLnJlcGxhY2UoICIgIiArIGNsYXp6ICsgIiAiLCAiICIgKTsKKyAgICB9CisgICAg
fQorICAgIGVsZW0uY2xhc3NOYW1lID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiAiIjsK
KyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICB0
b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKyAgICB2YXIgdHlwZSA9
IHR5cGVvZiB2YWx1ZSwKKyAgICBpc0Jvb2wgPSB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFu
IjsKKworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFz
cyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZh
bCApOworICAgIH0pOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7
CisgICAgaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKKyAgICAvLyB0b2dnbGUgaW5kaXZpZHVh
bCBjbGFzcyBuYW1lcworICAgIHZhciBjbGFzc05hbWUsCisgICAgaSA9IDAsCisgICAgc2VsZiA9
IGpRdWVyeSggdGhpcyApLAorICAgIHN0YXRlID0gc3RhdGVWYWwsCisgICAgY2xhc3NOYW1lcyA9
IHZhbHVlLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFtdOworCisgICAgd2hpbGUgKCAoY2xh
c3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgeworICAgIC8vIGNoZWNrIGVhY2ggY2xhc3NO
YW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAorICAgIHN0YXRlID0gaXNCb29sID8gc3Rh
dGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7CisgICAgc2VsZlsgc3RhdGUgPyAiYWRk
Q2xhc3MiIDogInJlbW92ZUNsYXNzIiBdKCBjbGFzc05hbWUgKTsKKyAgICB9CisKKyAgICAvLyBU
b2dnbGUgd2hvbGUgY2xhc3MgbmFtZQorICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09IGNvcmVfc3Ry
dW5kZWZpbmVkIHx8IHR5cGUgPT09ICJib29sZWFuIiApIHsKKyAgICBpZiAoIHRoaXMuY2xhc3NO
YW1lICkgeworICAgIC8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKyAgICBqUXVlcnkuX2RhdGEo
IHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKKyAgICB9CisKKyAgICAv
LyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCAiZmFs
c2UiLAorICAgIC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdh
cyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCisgICAgLy8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sg
d2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSwKKyAgICAvLyBmYWxs
aW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuCisgICAg
dGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6
IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CisgICAgfQorICAg
IH0pOworICAgIH0sCisKKyAgICBoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAg
IHZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwKKyAgICBpID0gMCwKKyAgICBs
ID0gdGhpcy5sZW5ndGg7CisgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIGlmICggdGhp
c1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJl
cGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID49IDAgKSB7CisgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisg
ICAgdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgdmFyIHJldCwgaG9va3MsIGlzRnVuY3Rp
b24sCisgICAgZWxlbSA9IHRoaXNbMF07CisKKyAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkg
eworICAgIGlmICggZWxlbSApIHsKKyAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50
eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsK
KworICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCgg
ZWxlbSwgInZhbHVlIiApKSAhPT0gdW5kZWZpbmVkICkgeworICAgIHJldHVybiByZXQ7CisgICAg
fQorCisgICAgcmV0ID0gZWxlbS52YWx1ZTsKKworICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAi
c3RyaW5nIiA/CisgICAgLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcworICAgIHJl
dC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6CisgICAgLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVl
IGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCisgICAgcmV0ID09IG51bGwgPyAiIiA6IHJldDsKKyAg
ICB9CisKKyAgICByZXR1cm47CisgICAgfQorCisgICAgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1
bmN0aW9uKCB2YWx1ZSApOworCisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsK
KyAgICB2YXIgdmFsLAorICAgIHNlbGYgPSBqUXVlcnkodGhpcyk7CisKKyAgICBpZiAoIHRoaXMu
bm9kZVR5cGUgIT09IDEgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggaXNGdW5j
dGlvbiApIHsKKyAgICB2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBzZWxmLnZhbCgpICk7Cisg
ICAgfSBlbHNlIHsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBUcmVhdCBudWxs
L3VuZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZworICAgIGlmICggdmFs
ID09IG51bGwgKSB7CisgICAgdmFsID0gIiI7CisgICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9
PT0gIm51bWJlciIgKSB7CisgICAgdmFsICs9ICIiOworICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5p
c0FycmF5KCB2YWwgKSApIHsKKyAgICB2YWwgPSBqUXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKKyAg
ICB9KTsKKyAgICB9CisKKyAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0g
fHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKKworICAg
IC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5n
CisgICAgaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlz
LCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgeworICAgIHRoaXMudmFsdWUgPSB2YWw7
CisgICAgfQorICAgIH0pOworICAgIH0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICB2YWxI
b29rczogeworICAgIG9wdGlvbjogeworICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
Ly8gYXR0cmlidXRlcy52YWx1ZSBpcyB1bmRlZmluZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0Cisg
ICAgLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgorICAgIHZhciB2YWwgPSBlbGVtLmF0dHJpYnV0
ZXMudmFsdWU7CisgICAgcmV0dXJuICF2YWwgfHwgdmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUg
OiBlbGVtLnRleHQ7CisgICAgfQorICAgIH0sCisgICAgc2VsZWN0OiB7CisgICAgZ2V0OiBmdW5j
dGlvbiggZWxlbSApIHsKKyAgICB2YXIgdmFsdWUsIG9wdGlvbiwKKyAgICBvcHRpb25zID0gZWxl
bS5vcHRpb25zLAorICAgIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorICAgIG9uZSA9IGVs
ZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiIHx8IGluZGV4IDwgMCwKKyAgICB2YWx1ZXMgPSBvbmUg
PyBudWxsIDogW10sCisgICAgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgs
CisgICAgaSA9IGluZGV4IDwgMCA/CisgICAgbWF4IDoKKyAgICBvbmUgPyBpbmRleCA6IDA7CisK
KyAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCisgICAgZm9yICgg
OyBpIDwgbWF4OyBpKysgKSB7CisgICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisgICAgLy8g
b2xkSUUgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCisg
ICAgaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCisgICAgLy8gRG9u
J3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRn
cm91cAorICAgICggalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVk
IDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCApICYmCisgICAgKCAh
b3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBh
cmVudE5vZGUsICJvcHRncm91cCIgKSApICkgeworCisgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyB2
YWx1ZSBmb3IgdGhlIG9wdGlvbgorICAgIHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTsK
KworICAgIC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisgICAgaWYg
KCBvbmUgKSB7CisgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIE11bHRpLVNlbGVj
dHMgcmV0dXJuIGFuIGFycmF5CisgICAgdmFsdWVzLnB1c2goIHZhbHVlICk7CisgICAgfQorICAg
IH0KKworICAgIHJldHVybiB2YWx1ZXM7CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oIGVs
ZW0sIHZhbHVlICkgeworICAgIHZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSAp
OworCisgICAgalF1ZXJ5KGVsZW0pLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7Cisg
ICAgdGhpcy5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkodGhpcykudmFsKCksIHZh
bHVlcyApID49IDA7CisgICAgfSk7CisKKyAgICBpZiAoICF2YWx1ZXMubGVuZ3RoICkgeworICAg
IGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVzOworICAg
IH0KKyAgICB9CisgICAgfSwKKworICAgIGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1
ZSApIHsKKyAgICB2YXIgaG9va3MsIG5vdHhtbCwgcmV0LAorICAgIG5UeXBlID0gZWxlbS5ub2Rl
VHlwZTsKKworICAgIC8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50
IGFuZCBhdHRyaWJ1dGUgbm9kZXMKKyAgICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5U
eXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAorICAg
IGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBjb3JlX3N0cnVuZGVmaW5lZCApIHsK
KyAgICByZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CisgICAgfQorCisg
ICAgbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOworCisg
ICAgLy8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZQorICAgIC8vIEdyYWIgbmVjZXNzYXJ5
IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKKyAgICBpZiAoIG5vdHhtbCApIHsKKyAgICBuYW1lID0g
bmFtZS50b0xvd2VyQ2FzZSgpOworICAgIGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBd
IHx8ICggcmJvb2xlYW4udGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOworICAg
IH0KKworICAgIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKworICAgIGlmICggdmFsdWUg
PT09IG51bGwgKSB7CisgICAgalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKKworICAg
IH0gZWxzZSBpZiAoIGhvb2tzICYmIG5vdHhtbCAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0g
aG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgeworICAgIHJl
dHVybiByZXQ7CisKKyAgICB9IGVsc2UgeworICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2
YWx1ZSArICIiICk7CisgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIH0gZWxzZSBpZiAo
IGhvb2tzICYmIG5vdHhtbCAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBl
bGVtLCBuYW1lICkpICE9PSBudWxsICkgeworICAgIHJldHVybiByZXQ7CisKKyAgICB9IGVsc2Ug
eworCisgICAgLy8gSW4gSUU5KywgRmxhc2ggb2JqZWN0cyBkb24ndCBoYXZlIC5nZXRBdHRyaWJ1
dGUgKCMxMjk0NSkKKyAgICAvLyBTdXBwb3J0OiBJRTkrCisgICAgaWYgKCB0eXBlb2YgZWxlbS5n
ZXRBdHRyaWJ1dGUgIT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIHJldCA9ICBlbGVtLmdl
dEF0dHJpYnV0ZSggbmFtZSApOworICAgIH0KKworICAgIC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1
dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisgICAgcmV0dXJuIHJl
dCA9PSBudWxsID8KKyAgICB1bmRlZmluZWQgOgorICAgIHJldDsKKyAgICB9CisgICAgfSwKKwor
ICAgIHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICB2YXIgbmFtZSwg
cHJvcE5hbWUsCisgICAgaSA9IDAsCisgICAgYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0
Y2goIGNvcmVfcm5vdHdoaXRlICk7CisKKyAgICBpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVU
eXBlID09PSAxICkgeworICAgIHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7Cisg
ICAgcHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKyAgICAvLyBC
b29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisgICAgaWYg
KCByYm9vbGVhbi50ZXN0KCBuYW1lICkgKSB7CisgICAgLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJv
cGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcworICAgIC8vIEFsc28gY2xlYXIg
ZGVmYXVsdENoZWNrZWQvZGVmYXVsdFNlbGVjdGVkIChpZiBhcHByb3ByaWF0ZSkgZm9yIElFPDgK
KyAgICBpZiAoICFnZXRTZXRBdHRyaWJ1dGUgJiYgcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkg
eworICAgIGVsZW1bIGpRdWVyeS5jYW1lbENhc2UoICJkZWZhdWx0LSIgKyBuYW1lICkgXSA9Cisg
ICAgZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgZWxlbVsgcHJv
cE5hbWUgXSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRp
b24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKQorICAgIH0g
ZWxzZSB7CisgICAgalF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsICIiICk7CisgICAgfQorCisgICAg
ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSAp
OworICAgIH0KKyAgICB9CisgICAgfSwKKworICAgIGF0dHJIb29rczogeworICAgIHR5cGU6IHsK
KyAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICBpZiAoICFqUXVlcnkuc3Vw
cG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSAicmFkaW8iICYmIGpRdWVyeS5ub2RlTmFtZShl
bGVtLCAiaW5wdXQiKSApIHsKKyAgICAvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0
dG9uIGFmdGVyIHRoZSB2YWx1ZSByZXNldHMgdGhlIHZhbHVlIGluIElFNi05CisgICAgLy8gUmVz
ZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmlu
ZyBjcmVhdGlvbgorICAgIHZhciB2YWwgPSBlbGVtLnZhbHVlOworICAgIGVsZW0uc2V0QXR0cmli
dXRlKCAidHlwZSIsIHZhbHVlICk7CisgICAgaWYgKCB2YWwgKSB7CisgICAgZWxlbS52YWx1ZSA9
IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICB9CisgICAgfQorICAg
IH0sCisKKyAgICBwcm9wRml4OiB7CisgICAgdGFiaW5kZXg6ICJ0YWJJbmRleCIsCisgICAgcmVh
ZG9ubHk6ICJyZWFkT25seSIsCisgICAgImZvciI6ICJodG1sRm9yIiwKKyAgICAiY2xhc3MiOiAi
Y2xhc3NOYW1lIiwKKyAgICBtYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorICAgIGNlbGxzcGFjaW5n
OiAiY2VsbFNwYWNpbmciLAorICAgIGNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAorICAgIHJv
d3NwYW46ICJyb3dTcGFuIiwKKyAgICBjb2xzcGFuOiAiY29sU3BhbiIsCisgICAgdXNlbWFwOiAi
dXNlTWFwIiwKKyAgICBmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKKyAgICBjb250ZW50ZWRp
dGFibGU6ICJjb250ZW50RWRpdGFibGUiCisgICAgfSwKKworICAgIHByb3A6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lLCB2YWx1ZSApIHsKKyAgICB2YXIgcmV0LCBob29rcywgbm90eG1sLAorICAgIG5U
eXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAgIC8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBv
biB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKKyAgICBpZiAoICFlbGVtIHx8IG5U
eXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBl
bGVtICk7CisKKyAgICBpZiAoIG5vdHhtbCApIHsKKyAgICAvLyBGaXggbmFtZSBhbmQgYXR0YWNo
IGhvb2tzCisgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKyAgICBo
b29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVl
ICE9PSB1bmRlZmluZWQgKSB7CisgICAgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAo
cmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewor
ICAgIHJldHVybiByZXQ7CisKKyAgICB9IGVsc2UgeworICAgIHJldHVybiAoIGVsZW1bIG5hbWUg
XSA9IHZhbHVlICk7CisgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICBpZiAoIGhvb2tzICYmICJn
ZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwg
KSB7CisgICAgcmV0dXJuIHJldDsKKworICAgIH0gZWxzZSB7CisgICAgcmV0dXJuIGVsZW1bIG5h
bWUgXTsKKyAgICB9CisgICAgfQorICAgIH0sCisKKyAgICBwcm9wSG9va3M6IHsKKyAgICB0YWJJ
bmRleDogeworICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gZWxlbS50YWJJbmRl
eCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3Qg
YmVlbiBleHBsaWNpdGx5IHNldAorICAgIC8vIGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cv
MjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13
aXRoLWphdmFzY3JpcHQvCisgICAgdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0
ZU5vZGUoInRhYmluZGV4Iik7CisKKyAgICByZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1
dGVOb2RlLnNwZWNpZmllZCA/CisgICAgcGFyc2VJbnQoIGF0dHJpYnV0ZU5vZGUudmFsdWUsIDEw
ICkgOgorICAgIHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUu
dGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/CisgICAgMCA6CisgICAgdW5kZWZp
bmVkOworICAgIH0KKyAgICB9CisgICAgfQorfSk7CisKKy8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0
cmlidXRlcworYm9vbEhvb2sgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsK
KyAgICB2YXIKKyAgICAvLyBVc2UgLnByb3AgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgYXR0cmlidXRl
IGlzIHVuZGVyc3Rvb2QgYXMgYm9vbGVhbgorICAgIHByb3AgPSBqUXVlcnkucHJvcCggZWxlbSwg
bmFtZSApLAorCisgICAgLy8gRmV0Y2ggaXQgYWNjb3JkaW5nbHkKKyAgICBhdHRyID0gdHlwZW9m
IHByb3AgPT09ICJib29sZWFuIiAmJiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorICAgIGRl
dGFpbCA9IHR5cGVvZiBwcm9wID09PSAiYm9vbGVhbiIgPworCisgICAgZ2V0U2V0SW5wdXQgJiYg
Z2V0U2V0QXR0cmlidXRlID8KKyAgICBhdHRyICE9IG51bGwgOgorICAgIC8vIG9sZElFIGZhYnJp
Y2F0ZXMgYW4gZW1wdHkgc3RyaW5nIGZvciBtaXNzaW5nIGJvb2xlYW4gYXR0cmlidXRlcworICAg
IC8vIGFuZCBjb25mbGF0ZXMgY2hlY2tlZC9zZWxlY3RlZCBpbnRvIGF0dHJvcGVydGllcworICAg
IHJ1c2VEZWZhdWx0LnRlc3QoIG5hbWUgKSA/CisgICAgZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSgg
ImRlZmF1bHQtIiArIG5hbWUgKSBdIDoKKyAgICAhIWF0dHIgOgorCisgICAgLy8gZmV0Y2ggYW4g
YXR0cmlidXRlIG5vZGUgZm9yIHByb3BlcnRpZXMgbm90IHJlY29nbml6ZWQgYXMgYm9vbGVhbgor
ICAgIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOworCisgICAgcmV0dXJuIGRldGFpbCAm
JiBkZXRhaWwudmFsdWUgIT09IGZhbHNlID8KKyAgICBuYW1lLnRvTG93ZXJDYXNlKCkgOgorICAg
IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1l
ICkgeworICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworICAgIC8vIFJlbW92ZSBib29sZWFu
IGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2UKKyAgICBqUXVlcnkucmVtb3ZlQXR0ciggZWxl
bSwgbmFtZSApOworICAgIH0gZWxzZSBpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0
ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgeworICAgIC8vIElFPDggbmVlZHMgdGhl
ICpwcm9wZXJ0eSogbmFtZQorICAgIGVsZW0uc2V0QXR0cmlidXRlKCAhZ2V0U2V0QXR0cmlidXRl
ICYmIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSwgbmFtZSApOworCisgICAgLy8gVXNl
IGRlZmF1bHRDaGVja2VkIGFuZCBkZWZhdWx0U2VsZWN0ZWQgZm9yIG9sZElFCisgICAgfSBlbHNl
IHsKKyAgICBlbGVtWyBqUXVlcnkuY2FtZWxDYXNlKCAiZGVmYXVsdC0iICsgbmFtZSApIF0gPSBl
bGVtWyBuYW1lIF0gPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBuYW1lOworICAgIH0KK307
CisKKy8vIGZpeCBvbGRJRSB2YWx1ZSBhdHRyb3BlcnR5CitpZiAoICFnZXRTZXRJbnB1dCB8fCAh
Z2V0U2V0QXR0cmlidXRlICkgeworICAgIGpRdWVyeS5hdHRySG9va3MudmFsdWUgPSB7CisgICAg
Z2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIgcmV0ID0gZWxlbS5nZXRBdHRy
aWJ1dGVOb2RlKCBuYW1lICk7CisgICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlu
cHV0IiApID8KKworICAgIC8vIElnbm9yZSB0aGUgdmFsdWUgKnByb3BlcnR5KiBieSB1c2luZyBk
ZWZhdWx0VmFsdWUKKyAgICBlbGVtLmRlZmF1bHRWYWx1ZSA6CisKKyAgICByZXQgJiYgcmV0LnNw
ZWNpZmllZCA/IHJldC52YWx1ZSA6IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rp
b24oIGVsZW0sIHZhbHVlLCBuYW1lICkgeworICAgIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVt
LCAiaW5wdXQiICkgKSB7CisgICAgLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmli
dXRlIGlzIGFsc28gdXNlZAorICAgIGVsZW0uZGVmYXVsdFZhbHVlID0gdmFsdWU7CisgICAgfSBl
bHNlIHsKKyAgICAvLyBVc2Ugbm9kZUhvb2sgaWYgZGVmaW5lZCAoIzE5NTQpOyBvdGhlcndpc2Ug
c2V0QXR0cmlidXRlIGlzIGZpbmUKKyAgICByZXR1cm4gbm9kZUhvb2sgJiYgbm9kZUhvb2suc2V0
KCBlbGVtLCB2YWx1ZSwgbmFtZSApOworICAgIH0KKyAgICB9CisgICAgfTsKK30KKworLy8gSUU2
LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdl
dC9zZXRBdHRyaWJ1dGUKK2lmICggIWdldFNldEF0dHJpYnV0ZSApIHsKKworICAgIC8vIFVzZSB0
aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83CisgICAgLy8gVGhpcyBmaXhlcyBhbG1vc3Qg
ZXZlcnkgSUU2LzcgaXNzdWUKKyAgICBub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24g
PSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICB2YXIgcmV0ID0gZWxl
bS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7CisgICAgcmV0dXJuIHJldCAmJiAoIG5hbWUgPT09
ICJpZCIgfHwgbmFtZSA9PT0gIm5hbWUiIHx8IG5hbWUgPT09ICJjb29yZHMiID8gcmV0LnZhbHVl
ICE9PSAiIiA6IHJldC5zcGVjaWZpZWQgKSA/CisgICAgcmV0LnZhbHVlIDoKKyAgICB1bmRlZmlu
ZWQ7CisgICAgfSwKKyAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKKyAg
ICAvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQorICAg
IHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKKyAgICBpZiAoICFyZXQg
KSB7CisgICAgZWxlbS5zZXRBdHRyaWJ1dGVOb2RlKAorICAgIChyZXQgPSBlbGVtLm93bmVyRG9j
dW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICkpCisgICAgKTsKKyAgICB9CisKKyAgICByZXQu
dmFsdWUgPSB2YWx1ZSArPSAiIjsKKworICAgIC8vIEJyZWFrIGFzc29jaWF0aW9uIHdpdGggY2xv
bmVkIGVsZW1lbnRzIGJ5IGFsc28gdXNpbmcgc2V0QXR0cmlidXRlICgjOTY0NikKKyAgICByZXR1
cm4gbmFtZSA9PT0gInZhbHVlIiB8fCB2YWx1ZSA9PT0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUg
KSA/CisgICAgdmFsdWUgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9CisgICAgfTsKKworICAgIC8v
IFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQorICAgIC8v
IFNldHRpbmcgdG8gZW1wdHkgc3RyaW5nIHRocm93cyBhbiBlcnJvciBhcyBhbiBpbnZhbGlkIHZh
bHVlCisgICAgalF1ZXJ5LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGUgPSB7CisgICAgZ2V0OiBu
b2RlSG9vay5nZXQsCisgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7Cisg
ICAgbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSA9PT0gIiIgPyBmYWxzZSA6IHZhbHVlLCBuYW1l
ICk7CisgICAgfQorICAgIH07CisKKyAgICAvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRv
IGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCisgICAgLy8gVGhpcyBp
cyBmb3IgcmVtb3ZhbHMKKyAgICBqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1
bmN0aW9uKCBpLCBuYW1lICkgeworICAgIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVy
eS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgeworICAgIHNldDogZnVuY3Rpb24o
IGVsZW0sIHZhbHVlICkgeworICAgIGlmICggdmFsdWUgPT09ICIiICkgeworICAgIGVsZW0uc2V0
QXR0cmlidXRlKCBuYW1lLCAiYXV0byIgKTsKKyAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAg
IH0KKyAgICB9KTsKKyAgICB9KTsKK30KKworCisvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBh
IHNwZWNpYWwgY2FsbCBvbiBJRQorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9s
aWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHJl
Zk5vcm1hbGl6ZWQgKSB7CisgICAgalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgi
LCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICBqUXVlcnkuYXR0ckhvb2tz
WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKKyAg
ICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0
ZSggbmFtZSwgMiApOworICAgIHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsK
KyAgICB9CisgICAgfSk7CisgICAgfSk7CisKKyAgICAvLyBocmVmL3NyYyBwcm9wZXJ0eSBzaG91
bGQgZ2V0IHRoZSBmdWxsIG5vcm1hbGl6ZWQgVVJMICgjMTAyOTkvIzEyOTE1KQorICAgIGpRdWVy
eS5lYWNoKFsgImhyZWYiLCAic3JjIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICBqUXVl
cnkucHJvcEhvb2tzWyBuYW1lIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDQgKTsKKyAgICB9CisgICAgfTsKKyAg
ICB9KTsKK30KKworaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7CisgICAgalF1ZXJ5LmF0
dHJIb29rcy5zdHlsZSA9IHsKKyAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIC8vIFJl
dHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nCisgICAgLy8gTm90ZTog
SUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFtZXMsIGJ1dCBpZiB3ZSB3ZXJlIHRvIC50b0xv
d2VyQ2FzZSgpCisgICAgLy8gLmNzc1RleHQsIHRoYXQgd291bGQgZGVzdHJveSBjYXNlIHNlbnN0
aXRpdml0eSBpbiBVUkwncywgbGlrZSBpbiAiYmFja2dyb3VuZCIKKyAgICByZXR1cm4gZWxlbS5z
dHlsZS5jc3NUZXh0IHx8IHVuZGVmaW5lZDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIGVs
ZW0sIHZhbHVlICkgeworICAgIHJldHVybiAoIGVsZW0uc3R5bGUuY3NzVGV4dCA9IHZhbHVlICsg
IiIgKTsKKyAgICB9CisgICAgfTsKK30KKworLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZh
dWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGFuIG9wdGlvbgorLy8gQWNjZXNzaW5nIHRoZSBwYXJl
bnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CitpZiAoICFqUXVlcnkuc3VwcG9y
dC5vcHRTZWxlY3RlZCApIHsKKyAgICBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0galF1ZXJ5
LmV4dGVuZCggalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCwgeworICAgIGdldDogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKworICAgIGlmICgg
cGFyZW50ICkgeworICAgIHBhcmVudC5zZWxlY3RlZEluZGV4OworCisgICAgLy8gTWFrZSBzdXJl
IHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCisgICAgaWYgKCBw
YXJlbnQucGFyZW50Tm9kZSApIHsKKyAgICBwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4
OworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIH0pOworfQorCisv
LyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmcKK2lmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5
cGUgKSB7CisgICAgalF1ZXJ5LnByb3BGaXguZW5jdHlwZSA9ICJlbmNvZGluZyI7Cit9CisKKy8v
IFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCitpZiAoICFqUXVlcnkuc3VwcG9y
dC5jaGVja09uICkgeworICAgIGpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBm
dW5jdGlvbigpIHsKKyAgICBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKKyAgICBnZXQ6IGZ1
bmN0aW9uKCBlbGVtICkgeworICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQg
IiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVk
CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6
IGVsZW0udmFsdWU7CisgICAgfQorICAgIH07CisgICAgfSk7Cit9CitqUXVlcnkuZWFjaChbICJy
YWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LnZhbEhvb2tzWyB0
aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgeworICAgIHNl
dDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZh
bHVlICkgKSB7CisgICAgcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpR
dWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAwICk7CisgICAgfQorICAgIH0KKyAgICB9KTsK
K30pOwordmFyIHJmb3JtRWxlbXMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCisg
ICAgcmtleUV2ZW50ID0gL15rZXkvLAorICAgIHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250
ZXh0bWVudSl8Y2xpY2svLAorICAgIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9j
dXNvdXRibHVyKSQvLAorICAgIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkk
LzsKKworZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZnVu
Y3Rpb24gcmV0dXJuRmFsc2UoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogSGVs
cGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJs
aWMgaW50ZXJmYWNlLgorICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5
IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisgICAgZ2xv
YmFsOiB7fSwKKworICAgIGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRh
LCBzZWxlY3RvciApIHsKKyAgICB2YXIgdG1wLCBldmVudHMsIHQsIGhhbmRsZU9iakluLAorICAg
IHNwZWNpYWwsIGV2ZW50SGFuZGxlLCBoYW5kbGVPYmosCisgICAgaGFuZGxlcnMsIHR5cGUsIG5h
bWVzcGFjZXMsIG9yaWdUeXBlLAorICAgIGVsZW1EYXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICk7
CisKKyAgICAvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQg
bm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKQorICAgIGlmICggIWVsZW1EYXRhICkgewor
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0
IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXIKKyAgICBpZiAoIGhhbmRsZXIu
aGFuZGxlciApIHsKKyAgICBoYW5kbGVPYmpJbiA9IGhhbmRsZXI7CisgICAgaGFuZGxlciA9IGhh
bmRsZU9iakluLmhhbmRsZXI7CisgICAgc2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsK
KyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUg
SUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKKyAgICBpZiAoICFoYW5kbGVyLmd1aWQg
KSB7CisgICAgaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKKyAgICB9CisKKyAgICAvLyBJ
bml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRo
aXMgaXMgdGhlIGZpcnN0CisgICAgaWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7
CisgICAgZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307CisgICAgfQorICAgIGlmICggIShl
dmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSkgKSB7CisgICAgZXZlbnRIYW5kbGUgPSBlbGVt
RGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHsKKyAgICAvLyBEaXNjYXJkIHRoZSBzZWNvbmQg
ZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAorICAgIC8vIHdoZW4gYW4gZXZl
bnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKKyAgICByZXR1cm4gdHlwZW9m
IGpRdWVyeSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmln
Z2VyZWQgIT09IGUudHlwZSkgPworICAgIGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZXZl
bnRIYW5kbGUuZWxlbSwgYXJndW1lbnRzICkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9OworICAg
IC8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEg
bWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50cworICAgIGV2ZW50SGFuZGxlLmVs
ZW0gPSBlbGVtOworICAgIH0KKworICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJh
dGVkIGJ5IGEgc3BhY2UKKyAgICAvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2Vv
dXQiLCBmbik7CisgICAgdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdo
aXRlICkgfHwgWyIiXTsKKyAgICB0ID0gdHlwZXMubGVuZ3RoOworICAgIHdoaWxlICggdC0tICkg
eworICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CisgICAg
dHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdOworICAgIG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAi
IiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7CisKKyAgICAvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0
eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUK
KyAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAg
IC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBl
LCBvdGhlcndpc2UgZ2l2ZW4gdHlwZQorICAgIHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5k
ZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKworICAgIC8vIFVwZGF0
ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKKyAgICBzcGVjaWFsID0galF1ZXJ5
LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAgIC8vIGhhbmRsZU9iaiBpcyBwYXNz
ZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzCisgICAgaGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7
CisgICAgdHlwZTogdHlwZSwKKyAgICBvcmlnVHlwZTogb3JpZ1R5cGUsCisgICAgZGF0YTogZGF0
YSwKKyAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgIGd1aWQ6IGhhbmRsZXIuZ3VpZCwKKyAgICBz
ZWxlY3Rvcjogc2VsZWN0b3IsCisgICAgbmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnku
ZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSwKKyAgICBuYW1lc3BhY2U6
IG5hbWVzcGFjZXMuam9pbigiLiIpCisgICAgfSwgaGFuZGxlT2JqSW4gKTsKKworICAgIC8vIElu
aXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0CisgICAgaWYgKCAh
KGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkgeworICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0
eXBlIF0gPSBbXTsKKyAgICBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsKKworICAgIC8vIE9u
bHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRz
IGhhbmRsZXIgcmV0dXJucyBmYWxzZQorICAgIGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lh
bC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBm
YWxzZSApIHsKKyAgICAvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxl
bWVudAorICAgIGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgeworICAgIGVsZW0uYWRkRXZl
bnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CisKKyAgICB9IGVsc2UgaWYg
KCBlbGVtLmF0dGFjaEV2ZW50ICkgeworICAgIGVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBl
LCBldmVudEhhbmRsZSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgaWYgKCBzcGVjaWFs
LmFkZCApIHsKKyAgICBzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKKworICAg
IGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CisgICAgaGFuZGxlT2JqLmhhbmRsZXIu
Z3VpZCA9IGhhbmRsZXIuZ3VpZDsKKyAgICB9CisgICAgfQorCisgICAgLy8gQWRkIHRvIHRoZSBl
bGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnQKKyAgICBpZiAoIHNlbGVj
dG9yICkgeworICAgIGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAw
LCBoYW5kbGVPYmogKTsKKyAgICB9IGVsc2UgeworICAgIGhhbmRsZXJzLnB1c2goIGhhbmRsZU9i
aiApOworICAgIH0KKworICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZl
ciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KKyAgICBqUXVlcnkuZXZlbnQuZ2xv
YmFsWyB0eXBlIF0gPSB0cnVlOworICAgIH0KKworICAgIC8vIE51bGxpZnkgZWxlbSB0byBwcmV2
ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorICAgIGVsZW0gPSBudWxsOworICAgIH0sCisKKyAgICAv
LyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKKyAgICBy
ZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5
cGVzICkgeworICAgIHZhciBqLCBoYW5kbGVPYmosIHRtcCwKKyAgICBvcmlnQ291bnQsIHQsIGV2
ZW50cywKKyAgICBzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwKKyAgICBuYW1lc3BhY2VzLCBvcmln
VHlwZSwKKyAgICBlbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9k
YXRhKCBlbGVtICk7CisKKyAgICBpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRh
LmV2ZW50cykgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9uY2UgZm9yIGVhY2gg
dHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWQKKyAgICB0eXBlcyA9
ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggY29yZV9ybm90d2hpdGUgKSB8fCBbIiJdOworICAgIHQg
PSB0eXBlcy5sZW5ndGg7CisgICAgd2hpbGUgKCB0LS0gKSB7CisgICAgdG1wID0gcnR5cGVuYW1l
c3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKKyAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBb
MV07CisgICAgbmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQo
KTsKKworICAgIC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJv
dmlkZWQpIGZvciB0aGUgZWxlbWVudAorICAgIGlmICggIXR5cGUgKSB7CisgICAgZm9yICggdHlw
ZSBpbiBldmVudHMgKSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5
cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7CisgICAgfQorICAgIGNvbnRpbnVl
OworICAgIH0KKworICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8
IHt9OworICAgIHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVj
aWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKyAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8
IFtdOworICAgIHRtcCA9IHRtcFsyXSAmJiBuZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3Bh
Y2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiApOworCisgICAgLy8gUmVtb3Zl
IG1hdGNoaW5nIGV2ZW50cworICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7Cisg
ICAgd2hpbGUgKCBqLS0gKSB7CisgICAgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKKworICAg
IGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkg
JiYKKyAgICAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAm
JgorICAgICggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiYKKyAg
ICAoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8IHNlbGVj
dG9yID09PSAiKioiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkgeworICAgIGhhbmRsZXJzLnNw
bGljZSggaiwgMSApOworCisgICAgaWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7CisgICAgaGFu
ZGxlcnMuZGVsZWdhdGVDb3VudC0tOworICAgIH0KKyAgICBpZiAoIHNwZWNpYWwucmVtb3ZlICkg
eworICAgIHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworICAgIH0KKyAg
ICB9CisgICAgfQorCisgICAgLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSBy
ZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAorICAgIC8vIChhdm9p
ZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVj
aWFsIGV2ZW50IGhhbmRsZXJzKQorICAgIGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5n
dGggKSB7CisgICAgaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNh
bGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKKyAg
ICBqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApOworICAg
IH0KKworICAgIGRlbGV0ZSBldmVudHNbIHR5cGUgXTsKKyAgICB9CisgICAgfQorCisgICAgLy8g
UmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKKyAgICBpZiAoIGpRdWVy
eS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKKyAgICBkZWxldGUgZWxlbURhdGEuaGFuZGxl
OworCisgICAgLy8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVh
cnMgdGhlIGV4cGFuZG8gaWYgZW1wdHkKKyAgICAvLyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxl
dGUKKyAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CisgICAgfQorICAg
IH0sCisKKyAgICB0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5k
bGVycyApIHsKKyAgICB2YXIgaGFuZGxlLCBvbnR5cGUsIGN1ciwKKyAgICBidWJibGVUeXBlLCBz
cGVjaWFsLCB0bXAsIGksCisgICAgZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCisg
ICAgdHlwZSA9IGNvcmVfaGFzT3duLmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUg
OiBldmVudCwKKyAgICBuYW1lc3BhY2VzID0gY29yZV9oYXNPd24uY2FsbCggZXZlbnQsICJuYW1l
c3BhY2UiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOworCisgICAgY3VyID0g
dG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7CisKKyAgICAvLyBEb24ndCBkbyBldmVudHMg
b24gdGV4dCBhbmQgY29tbWVudCBub2RlcworICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8
fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBm
b2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcg
dGhlbSByaWdodCBub3cKKyAgICBpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnku
ZXZlbnQudHJpZ2dlcmVkICkgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggdHlw
ZS5pbmRleE9mKCIuIikgPj0gMCApIHsKKyAgICAvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0
ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisgICAgbmFtZXNwYWNl
cyA9IHR5cGUuc3BsaXQoIi4iKTsKKyAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworICAg
IG5hbWVzcGFjZXMuc29ydCgpOworICAgIH0KKyAgICBvbnR5cGUgPSB0eXBlLmluZGV4T2YoIjoi
KSA8IDAgJiYgIm9uIiArIHR5cGU7CisKKyAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVl
cnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKKyAg
ICBldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KKyAgICBldmVudCA6CisgICAgbmV3
IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCAp
OworCisgICAgZXZlbnQuaXNUcmlnZ2VyID0gdHJ1ZTsKKyAgICBldmVudC5uYW1lc3BhY2UgPSBu
YW1lc3BhY2VzLmpvaW4oIi4iKTsKKyAgICBldmVudC5uYW1lc3BhY2VfcmUgPSBldmVudC5uYW1l
c3BhY2UgPworICAgIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwu
KD86LipcXC58KSIpICsgIihcXC58JCkiICkgOgorICAgIG51bGw7CisKKyAgICAvLyBDbGVhbiB1
cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWQKKyAgICBldmVudC5yZXN1bHQg
PSB1bmRlZmluZWQ7CisgICAgaWYgKCAhZXZlbnQudGFyZ2V0ICkgeworICAgIGV2ZW50LnRhcmdl
dCA9IGVsZW07CisgICAgfQorCisgICAgLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHBy
ZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAorICAgIGRhdGEg
PSBkYXRhID09IG51bGwgPworICAgIFsgZXZlbnQgXSA6CisgICAgalF1ZXJ5Lm1ha2VBcnJheSgg
ZGF0YSwgWyBldmVudCBdICk7CisKKyAgICAvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3
IG91dHNpZGUgdGhlIGxpbmVzCisgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0
eXBlIF0gfHwge307CisgICAgaWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAm
JiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRo
IGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKQorICAgIC8vIEJ1YmJsZSB1
cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRv
Y3VtZW50IHZhciAoIzk3MjQpCisgICAgaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5v
QnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworICAgIGJ1YmJsZVR5cGUg
PSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlOworICAgIGlmICggIXJmb2N1c01vcnBoLnRl
c3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7CisgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7Cisg
ICAgfQorICAgIGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKKyAgICBldmVu
dFBhdGgucHVzaCggY3VyICk7CisgICAgdG1wID0gY3VyOworICAgIH0KKworICAgIC8vIE9ubHkg
YWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3Ig
ZGV0YWNoZWQgRE9NKQorICAgIGlmICggdG1wID09PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRv
Y3VtZW50KSApIHsKKyAgICBldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5w
YXJlbnRXaW5kb3cgfHwgd2luZG93ICk7CisgICAgfQorICAgIH0KKworICAgIC8vIEZpcmUgaGFu
ZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoIChjdXIgPSBl
dmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisKKyAg
ICBldmVudC50eXBlID0gaSA+IDEgPworICAgIGJ1YmJsZVR5cGUgOgorICAgIHNwZWNpYWwuYmlu
ZFR5cGUgfHwgdHlwZTsKKworICAgIC8vIGpRdWVyeSBoYW5kbGVyCisgICAgaGFuZGxlID0gKCBq
UXVlcnkuX2RhdGEoIGN1ciwgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1
ZXJ5Ll9kYXRhKCBjdXIsICJoYW5kbGUiICk7CisgICAgaWYgKCBoYW5kbGUgKSB7CisgICAgaGFu
ZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKyAgICB9CisKKyAgICAvLyBOYXRpdmUgaGFuZGxlcgor
ICAgIGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOworICAgIGlmICggaGFuZGxlICYm
IGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBoYW5kbGUuYXBwbHkgJiYgaGFuZGxlLmFwcGx5
KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsK
KyAgICB9CisgICAgfQorICAgIGV2ZW50LnR5cGUgPSB0eXBlOworCisgICAgLy8gSWYgbm9ib2R5
IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdworICAgIGlmICggIW9ubHlI
YW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisKKyAgICBpZiAoICgh
c3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBlbGVtLm93bmVyRG9j
dW1lbnQsIGRhdGEgKSA9PT0gZmFsc2UpICYmCisgICAgISh0eXBlID09PSAiY2xpY2siICYmIGpR
dWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkg
KSB7CisKKyAgICAvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRo
IHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuCisgICAgLy8gQ2FuJ3QgdXNlIGFuIC5p
c0Z1bmN0aW9uKCkgY2hlY2sgaGVyZSBiZWNhdXNlIElFNi83IGZhaWxzIHRoYXQgdGVzdC4KKyAg
ICAvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xv
YmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApCisgICAgaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBd
ICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworICAgIC8vIERvbid0IHJlLXRyaWdn
ZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKKyAgICB0bXAg
PSBlbGVtWyBvbnR5cGUgXTsKKworICAgIGlmICggdG1wICkgeworICAgIGVsZW1bIG9udHlwZSBd
ID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNh
bWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQorICAgIGpRdWVyeS5l
dmVudC50cmlnZ2VyZWQgPSB0eXBlOworICAgIHRyeSB7CisgICAgZWxlbVsgdHlwZSBdKCk7Cisg
ICAgfSBjYXRjaCAoIGUgKSB7CisgICAgLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlk
ZGVuIGVsZW1lbnQgKCMxNDg2LCMxMjUxOCkKKyAgICAvLyBvbmx5IHJlcHJvZHVjaWJsZSBvbiB3
aW5YUCBJRTggbmF0aXZlLCBub3QgSUU5IGluIElFOCBtb2RlCisgICAgfQorICAgIGpRdWVyeS5l
dmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CisKKyAgICBpZiAoIHRtcCApIHsKKyAgICBlbGVt
WyBvbnR5cGUgXSA9IHRtcDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gZXZlbnQucmVzdWx0OworICAgIH0sCisKKyAgICBkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50
ICkgeworCisgICAgLy8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRp
dmUgZXZlbnQgb2JqZWN0CisgICAgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApOwor
CisgICAgdmFyIGksIHJldCwgaGFuZGxlT2JqLCBtYXRjaGVkLCBqLAorICAgIGhhbmRsZXJRdWV1
ZSA9IFtdLAorICAgIGFyZ3MgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorICAgIGhh
bmRsZXJzID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQu
dHlwZSBdIHx8IFtdLAorICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQu
dHlwZSBdIHx8IHt9OworCisgICAgLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhl
ciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKKyAgICBhcmdzWzBdID0gZXZlbnQ7
CisgICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzOworCisgICAgLy8gQ2FsbCB0aGUgcHJl
RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVz
aXJlZAorICAgIGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNo
LmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgeworICAgIHJldHVybjsKKyAgICB9CisK
KyAgICAvLyBEZXRlcm1pbmUgaGFuZGxlcnMKKyAgICBoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZl
bnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CisKKyAgICAvLyBSdW4g
ZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0
aCB1cworICAgIGkgPSAwOworICAgIHdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkr
KyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKyAgICBldmVudC5jdXJy
ZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOworCisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoaGFu
ZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVBy
b3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCisgICAgLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0
aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgorICAgIC8vIDIpIGhhdmUgbmFtZXNwYWNlKHMp
IGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4g
aGF2ZSBubyBuYW1lc3BhY2UpLgorICAgIGlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVu
dC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgeworCisgICAgZXZl
bnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOworICAgIGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0
YTsKKworICAgIHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5
cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyICkKKyAgICAuYXBwbHkoIG1h
dGNoZWQuZWxlbSwgYXJncyApOworCisgICAgaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKKyAg
ICBpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHsKKyAgICBldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgIH0KKyAgICB9
CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9v
ayBmb3IgdGhlIG1hcHBlZCB0eXBlCisgICAgaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsK
KyAgICBzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApOworICAgIH0KKwor
ICAgIHJldHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKKworICAgIGhhbmRsZXJzOiBmdW5jdGlv
biggZXZlbnQsIGhhbmRsZXJzICkgeworICAgIHZhciBzZWwsIGhhbmRsZU9iaiwgbWF0Y2hlcywg
aSwKKyAgICBoYW5kbGVyUXVldWUgPSBbXSwKKyAgICBkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMu
ZGVsZWdhdGVDb3VudCwKKyAgICBjdXIgPSBldmVudC50YXJnZXQ7CisKKyAgICAvLyBGaW5kIGRl
bGVnYXRlIGhhbmRsZXJzCisgICAgLy8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJl
ZXMgKCMxMzE4MCkKKyAgICAvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJl
Zm94ICgjMzg2MSkKKyAgICBpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmICgh
ZXZlbnQuYnV0dG9uIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkgeworCisgICAgZm9yICgg
OyBjdXIgIT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKKworICAgIC8v
IERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KQorICAgIC8vIERvbid0IHByb2Nlc3Mg
Y2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0
KQorICAgIGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmIChjdXIuZGlzYWJsZWQgIT09IHRydWUg
fHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7CisgICAgbWF0Y2hlcyA9IFtdOworICAgIGZv
ciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgeworICAgIGhhbmRsZU9iaiA9IGhh
bmRsZXJzWyBpIF07CisKKyAgICAvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5
cGUgcHJvcGVydGllcyAoIzEzMjAzKQorICAgIHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArICIg
IjsKKworICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHsKKyAgICBtYXRj
aGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgPworICAgIGpRdWVyeSggc2VsLCB0
aGlzICkuaW5kZXgoIGN1ciApID49IDAgOgorICAgIGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51
bGwsIFsgY3VyIF0gKS5sZW5ndGg7CisgICAgfQorICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gKSB7
CisgICAgbWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTsKKyAgICB9CisgICAgfQorICAgIGlmICgg
bWF0Y2hlcy5sZW5ndGggKSB7CisgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhh
bmRsZXJzOiBtYXRjaGVzIH0pOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8v
IEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKKyAgICBpZiAoIGRl
bGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7CisgICAgaGFuZGxlclF1ZXVlLnB1c2go
eyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9
KTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFuZGxlclF1ZXVlOworICAgIH0sCisKKyAgICBmaXg6
IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICBpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkg
eworICAgIHJldHVybiBldmVudDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBj
b3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKKyAg
ICB2YXIgaSwgcHJvcCwgY29weSwKKyAgICB0eXBlID0gZXZlbnQudHlwZSwKKyAgICBvcmlnaW5h
bEV2ZW50ID0gZXZlbnQsCisgICAgZml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTsKKwor
ICAgIGlmICggIWZpeEhvb2sgKSB7CisgICAgdGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9v
ayA9CisgICAgcm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDoKKyAg
ICBya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5rZXlIb29rcyA6CisgICAge307CisgICAg
fQorICAgIGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2su
cHJvcHMgKSA6IHRoaXMucHJvcHM7CisKKyAgICBldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9y
aWdpbmFsRXZlbnQgKTsKKworICAgIGkgPSBjb3B5Lmxlbmd0aDsKKyAgICB3aGlsZSAoIGktLSAp
IHsKKyAgICBwcm9wID0gY29weVsgaSBdOworICAgIGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2
ZW50WyBwcm9wIF07CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8vIEZpeCB0
YXJnZXQgcHJvcGVydHkgKCMxOTI1KQorICAgIGlmICggIWV2ZW50LnRhcmdldCApIHsKKyAgICBl
dmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CisgICAg
fQorCisgICAgLy8gU3VwcG9ydDogQ2hyb21lIDIzKywgU2FmYXJpPworICAgIC8vIFRhcmdldCBz
aG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpCisgICAgaWYgKCBldmVudC50
YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7CisgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0
LnBhcmVudE5vZGU7CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU8OQorICAgIC8vIEZvciBt
b3VzZS9rZXkgZXZlbnRzLCBtZXRhS2V5PT1mYWxzZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgs
ICMxMTMyOCkKKyAgICBldmVudC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5OworCisgICAgcmV0
dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50
ICkgOiBldmVudDsKKyAgICB9LAorCisgICAgLy8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBz
aGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQKKyAgICBwcm9wczogImFsdEtleSBidWJi
bGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSBy
ZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQo
IiAiKSwKKworICAgIGZpeEhvb2tzOiB7fSwKKworICAgIGtleUhvb2tzOiB7CisgICAgcHJvcHM6
ICJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLAorICAgIGZpbHRlcjogZnVu
Y3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKKworICAgIC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2
ZW50cworICAgIGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHsKKyAgICBldmVudC53aGljaCA9
IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFs
LmtleUNvZGU7CisgICAgfQorCisgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKyAgICB9LAorCisg
ICAgbW91c2VIb29rczogeworICAgIHByb3BzOiAiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGll
bnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVl
blkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLAorICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBv
cmlnaW5hbCApIHsKKyAgICB2YXIgYm9keSwgZXZlbnREb2MsIGRvYywKKyAgICBidXR0b24gPSBv
cmlnaW5hbC5idXR0b24sCisgICAgZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDsK
KworICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFp
bGFibGUKKyAgICBpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAh
PSBudWxsICkgeworICAgIGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwg
ZG9jdW1lbnQ7CisgICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OworICAgIGJvZHkg
PSBldmVudERvYy5ib2R5OworCisgICAgZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsg
KCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCAp
IC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwg
MCApOworICAgIGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5z
Y3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRv
Yy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTsKKyAgICB9CisK
KyAgICAvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCAhZXZlbnQu
cmVsYXRlZFRhcmdldCAmJiBmcm9tRWxlbWVudCApIHsKKyAgICBldmVudC5yZWxhdGVkVGFyZ2V0
ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZy
b21FbGVtZW50OworICAgIH0KKworICAgIC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxl
ZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQKKyAgICAvLyBOb3RlOiBidXR0b24gaXMgbm90
IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorICAgIGlmICggIWV2ZW50LndoaWNoICYmIGJ1
dHRvbiAhPT0gdW5kZWZpbmVkICkgeworICAgIGV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8g
MSA6ICggYnV0dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTsKKyAgICB9
CisKKyAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorICAgIH0sCisKKyAgICBzcGVjaWFsOiB7Cisg
ICAgbG9hZDogeworICAgIC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZy
b20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKKyAgICBub0J1YmJsZTogdHJ1ZQorICAgIH0sCisg
ICAgY2xpY2s6IHsKKyAgICAvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNo
ZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAorICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgeworICAg
IGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiaW5wdXQiICkgJiYgdGhpcy50eXBlID09PSAi
Y2hlY2tib3giICYmIHRoaXMuY2xpY2sgKSB7CisgICAgdGhpcy5jbGljaygpOworICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgfQorICAgIH0sCisgICAgZm9jdXM6IHsKKyAgICAvLyBGaXJl
IG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJl
Y3QKKyAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIHRoaXMgIT09IGRvY3VtZW50
LmFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5mb2N1cyApIHsKKyAgICB0cnkgeworICAgIHRoaXMuZm9j
dXMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgLy8gU3Vw
cG9ydDogSUU8OQorICAgIC8vIElmIHdlIGVycm9yIG9uIGZvY3VzIHRvIGhpZGRlbiBlbGVtZW50
ICgjMTQ4NiwgIzEyNTE4KSwKKyAgICAvLyBsZXQgLnRyaWdnZXIoKSBydW4gdGhlIGhhbmRsZXJz
CisgICAgfQorICAgIH0KKyAgICB9LAorICAgIGRlbGVnYXRlVHlwZTogImZvY3VzaW4iCisgICAg
fSwKKyAgICBibHVyOiB7CisgICAgdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisgICAgaWYgKCB0aGlz
ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIHRoaXMuYmx1ciApIHsKKyAgICB0aGlzLmJs
dXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0sCisgICAgZGVsZWdhdGVUeXBl
OiAiZm9jdXNvdXQiCisgICAgfSwKKworICAgIGJlZm9yZXVubG9hZDogeworICAgIHBvc3REaXNw
YXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgeworCisgICAgLy8gRXZlbiB3aGVuIHJldHVyblZhbHVl
IGVxdWFscyB0byB1bmRlZmluZWQgRmlyZWZveCB3aWxsIHN0aWxsIHNob3cgYWxlcnQKKyAgICBp
ZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICkgeworICAgIGV2ZW50Lm9yaWdpbmFsRXZl
bnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7CisgICAgfQorICAgIH0KKyAgICB9CisgICAg
fSwKKworICAgIHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSAp
IHsKKyAgICAvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZl
cmVudCBvbmUuCisgICAgLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3Rv
cFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCisgICAgLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRz
IGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuCisgICAgdmFyIGUgPSBq
UXVlcnkuZXh0ZW5kKAorICAgIG5ldyBqUXVlcnkuRXZlbnQoKSwKKyAgICBldmVudCwKKyAgICB7
IHR5cGU6IHR5cGUsCisgICAgaXNTaW11bGF0ZWQ6IHRydWUsCisgICAgb3JpZ2luYWxFdmVudDog
e30KKyAgICB9CisgICAgKTsKKyAgICBpZiAoIGJ1YmJsZSApIHsKKyAgICBqUXVlcnkuZXZlbnQu
dHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOworICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5LmV2ZW50
LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTsKKyAgICB9CisgICAgaWYgKCBlLmlzRGVmYXVsdFBy
ZXZlbnRlZCgpICkgeworICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgfQorICAgIH0K
K307CisKK2pRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIg
PworICAgIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CisgICAgaWYgKCBlbGVtLnJl
bW92ZUV2ZW50TGlzdGVuZXIgKSB7CisgICAgZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBl
LCBoYW5kbGUsIGZhbHNlICk7CisgICAgfQorICAgIH0gOgorICAgIGZ1bmN0aW9uKCBlbGVtLCB0
eXBlLCBoYW5kbGUgKSB7CisgICAgdmFyIG5hbWUgPSAib24iICsgdHlwZTsKKworICAgIGlmICgg
ZWxlbS5kZXRhY2hFdmVudCApIHsKKworICAgIC8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBt
ZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgKKyAgICAvLyBkZXRhY2hFdmVu
dCBuZWVkZWQgcHJvcGVydHkgb24gZWxlbWVudCwgYnkgbmFtZSBvZiB0aGF0IGV2ZW50LCB0byBw
cm9wZXJseSBleHBvc2UgaXQgdG8gR0MKKyAgICBpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09
IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIGVsZW1bIG5hbWUgXSA9IG51bGw7CisgICAgfQor
CisgICAgZWxlbS5kZXRhY2hFdmVudCggbmFtZSwgaGFuZGxlICk7CisgICAgfQorICAgIH07CisK
K2pRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgeworICAgIC8vIEFsbG93IGlu
c3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAorICAgIGlmICggISh0aGlzIGlu
c3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKKyAgICByZXR1cm4gbmV3IGpRdWVyeS5FdmVudCgg
c3JjLCBwcm9wcyApOworICAgIH0KKworICAgIC8vIEV2ZW50IG9iamVjdAorICAgIGlmICggc3Jj
ICYmIHNyYy50eXBlICkgeworICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKyAgICB0aGlz
LnR5cGUgPSBzcmMudHlwZTsKKworICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1l
bnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCisgICAgLy8gYnkgYSBoYW5kbGVy
IGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgdGhp
cy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoIHNyYy5kZWZhdWx0UHJldmVudGVkIHx8IHNyYy5yZXR1
cm5WYWx1ZSA9PT0gZmFsc2UgfHwKKyAgICBzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdl
dFByZXZlbnREZWZhdWx0KCkgKSA/IHJldHVyblRydWUgOiByZXR1cm5GYWxzZTsKKworICAgIC8v
IEV2ZW50IHR5cGUKKyAgICB9IGVsc2UgeworICAgIHRoaXMudHlwZSA9IHNyYzsKKyAgICB9CisK
KyAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50
IG9iamVjdAorICAgIGlmICggcHJvcHMgKSB7CisgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJv
cHMgKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZl
bnQgZG9lc24ndCBoYXZlIG9uZQorICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1l
U3RhbXAgfHwgalF1ZXJ5Lm5vdygpOworCisgICAgLy8gTWFyayBpdCBhcyBmaXhlZAorICAgIHRo
aXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlzIGJh
c2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFn
ZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2
ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90
b3R5cGUgPSB7CisgICAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKyAgICBpc1By
b3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisgICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlv
blN0b3BwZWQ6IHJldHVybkZhbHNlLAorCisgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkg
eworICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCisgICAgdGhpcy5pc0RlZmF1bHRQ
cmV2ZW50ZWQgPSByZXR1cm5UcnVlOworICAgIGlmICggIWUgKSB7CisgICAgcmV0dXJuOworICAg
IH0KKworICAgIC8vIElmIHByZXZlbnREZWZhdWx0IGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmln
aW5hbCBldmVudAorICAgIGlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKKyAgICBlLnByZXZlbnRE
ZWZhdWx0KCk7CisKKyAgICAvLyBTdXBwb3J0OiBJRQorICAgIC8vIE90aGVyd2lzZSBzZXQgdGhl
IHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZQorICAg
IH0gZWxzZSB7CisgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOworICAgIH0KKyAgICB9LAorICAg
IHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFs
RXZlbnQ7CisKKyAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKyAg
ICBpZiAoICFlICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgc3RvcFByb3BhZ2F0
aW9uIGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAorICAgIGlmICggZS5zdG9w
UHJvcGFnYXRpb24gKSB7CisgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9CisKKyAgICAv
LyBTdXBwb3J0OiBJRQorICAgIC8vIFNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRo
ZSBvcmlnaW5hbCBldmVudCB0byB0cnVlCisgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlOworICAg
IH0sCisgICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKKyAgICB0aGlz
LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKyAgICB0aGlzLnN0
b3BQcm9wYWdhdGlvbigpOworICAgIH0KK307CisKKy8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZl
IGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcworalF1ZXJ5
LmVhY2goeworICAgIG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAorICAgIG1vdXNlbGVhdmU6ICJt
b3VzZW91dCIKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CisgICAgalF1ZXJ5LmV2ZW50LnNw
ZWNpYWxbIG9yaWcgXSA9IHsKKyAgICBkZWxlZ2F0ZVR5cGU6IGZpeCwKKyAgICBiaW5kVHlwZTog
Zml4LAorCisgICAgaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgdmFyIHJldCwKKyAg
ICB0YXJnZXQgPSB0aGlzLAorICAgIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAorICAg
IGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajsKKworICAgIC8vIEZvciBtb3VzZW50ZXIvbGVh
dmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KKyAg
ICAvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBi
cm93c2VyIHdpbmRvdworICAgIGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAm
JiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7CisgICAgZXZlbnQudHlw
ZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKKyAgICByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBs
eSggdGhpcywgYXJndW1lbnRzICk7CisgICAgZXZlbnQudHlwZSA9IGZpeDsKKyAgICB9CisgICAg
cmV0dXJuIHJldDsKKyAgICB9CisgICAgfTsKK30pOworCisvLyBJRSBzdWJtaXQgZGVsZWdhdGlv
bgoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyApIHsKKworICAgIGpRdWVyeS5l
dmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKKyAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgLy8g
T25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKKyAgICBpZiAo
IGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CisgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIC8vIExhenktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRh
bnQgZm9ybSBtYXkgcG90ZW50aWFsbHkgYmUgc3VibWl0dGVkCisgICAgalF1ZXJ5LmV2ZW50LmFk
ZCggdGhpcywgImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBlICkg
eworICAgIC8vIE5vZGUgbmFtZSBjaGVjayBhdm9pZHMgYSBWTUwtcmVsYXRlZCBjcmFzaCBpbiBJ
RSAoIzk4MDcpCisgICAgdmFyIGVsZW0gPSBlLnRhcmdldCwKKyAgICBmb3JtID0galF1ZXJ5Lm5v
ZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9u
IiApID8gZWxlbS5mb3JtIDogdW5kZWZpbmVkOworICAgIGlmICggZm9ybSAmJiAhalF1ZXJ5Ll9k
YXRhKCBmb3JtLCAic3VibWl0QnViYmxlcyIgKSApIHsKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCBm
b3JtLCAic3VibWl0Ll9zdWJtaXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgZXZlbnQuX3N1
Ym1pdF9idWJibGUgPSB0cnVlOworICAgIH0pOworICAgIGpRdWVyeS5fZGF0YSggZm9ybSwgInN1
Ym1pdEJ1YmJsZXMiLCB0cnVlICk7CisgICAgfQorICAgIH0pOworICAgIC8vIHJldHVybiB1bmRl
ZmluZWQgc2luY2Ugd2UgZG9uJ3QgbmVlZCBhbiBldmVudCBsaXN0ZW5lcgorICAgIH0sCisKKyAg
ICBwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICAvLyBJZiBmb3JtIHdhcyBz
dWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWUKKyAgICBp
ZiAoIGV2ZW50Ll9zdWJtaXRfYnViYmxlICkgeworICAgIGRlbGV0ZSBldmVudC5fc3VibWl0X2J1
YmJsZTsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewor
ICAgIGpRdWVyeS5ldmVudC5zaW11bGF0ZSggInN1Ym1pdCIsIHRoaXMucGFyZW50Tm9kZSwgZXZl
bnQsIHRydWUgKTsKKyAgICB9CisgICAgfQorICAgIH0sCisKKyAgICB0ZWFyZG93bjogZnVuY3Rp
b24oKSB7CisgICAgLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBl
dmVudHMKKyAgICBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CisgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlbW92ZSBkZWxlZ2F0ZWQgaGFuZGxlcnM7
IGNsZWFuRGF0YSBldmVudHVhbGx5IHJlYXBzIHN1Ym1pdCBoYW5kbGVycyBhdHRhY2hlZCBhYm92
ZQorICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKKyAgICB9Cisg
ICAgfTsKK30KKworLy8gSUUgY2hhbmdlIGRlbGVnYXRpb24gYW5kIGNoZWNrYm94L3JhZGlvIGZp
eAoraWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHsKKworICAgIGpRdWVyeS5l
dmVudC5zcGVjaWFsLmNoYW5nZSA9IHsKKworICAgIHNldHVwOiBmdW5jdGlvbigpIHsKKworICAg
IGlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7CisgICAgLy8gSUUgZG9l
c24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQg
b24gY2xpY2sKKyAgICAvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hh
bmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS4KKyAgICAvLyBUaGlzIHN0aWxsIGZpcmVzIG9u
Y2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuCisgICAgaWYg
KCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgewor
ICAgIGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIiwgZnVu
Y3Rpb24oIGV2ZW50ICkgeworICAgIGlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5h
bWUgPT09ICJjaGVja2VkIiApIHsKKyAgICB0aGlzLl9qdXN0X2NoYW5nZWQgPSB0cnVlOworICAg
IH0KKyAgICB9KTsKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2NoYW5nZSIs
IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICBpZiAoIHRoaXMuX2p1c3RfY2hhbmdlZCAmJiAhZXZl
bnQuaXNUcmlnZ2VyICkgeworICAgIHRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOworICAgIH0K
KyAgICAvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDAp
CisgICAgalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUg
KTsKKyAgICB9KTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBEZWxl
Z2F0ZWQgZXZlbnQ7IGxhenktYWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBpbnB1
dHMKKyAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIs
IGZ1bmN0aW9uKCBlICkgeworICAgIHZhciBlbGVtID0gZS50YXJnZXQ7CisKKyAgICBpZiAoIHJm
b3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApICYmICFqUXVlcnkuX2RhdGEoIGVsZW0sICJj
aGFuZ2VCdWJibGVzIiApICkgeworICAgIGpRdWVyeS5ldmVudC5hZGQoIGVsZW0sICJjaGFuZ2Uu
X2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAm
JiAhZXZlbnQuaXNTaW11bGF0ZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKKyAgICBqUXVlcnku
ZXZlbnQuc2ltdWxhdGUoICJjaGFuZ2UiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7
CisgICAgfQorICAgIH0pOworICAgIGpRdWVyeS5fZGF0YSggZWxlbSwgImNoYW5nZUJ1YmJsZXMi
LCB0cnVlICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAgICBoYW5kbGU6IGZ1bmN0aW9u
KCBldmVudCApIHsKKyAgICB2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDsKKworICAgIC8vIFN3YWxs
b3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0
cmlnZ2VyZWQgdGhlbSBhYm92ZQorICAgIGlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1Np
bXVsYXRlZCB8fCBldmVudC5pc1RyaWdnZXIgfHwgKGVsZW0udHlwZSAhPT0gInJhZGlvIiAmJiBl
bGVtLnR5cGUgIT09ICJjaGVja2JveCIpICkgeworICAgIHJldHVybiBldmVudC5oYW5kbGVPYmou
aGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisgICAgfQorICAgIH0sCisKKyAgICB0
ZWFyZG93bjogZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5f
Y2hhbmdlIiApOworCisgICAgcmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUg
KTsKKyAgICB9CisgICAgfTsKK30KKworLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJs
dXIgZXZlbnRzCitpZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKKyAgICBq
UXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rp
b24oIG9yaWcsIGZpeCApIHsKKworICAgIC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFu
ZGxlciB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQKKyAgICB2YXIgYXR0YWNo
ZXMgPSAwLAorICAgIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisgICAgalF1ZXJ5LmV2
ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQg
KSwgdHJ1ZSApOworICAgIH07CisKKyAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7
CisgICAgc2V0dXA6IGZ1bmN0aW9uKCkgeworICAgIGlmICggYXR0YWNoZXMrKyA9PT0gMCApIHsK
KyAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7Cisg
ICAgfQorICAgIH0sCisgICAgdGVhcmRvd246IGZ1bmN0aW9uKCkgeworICAgIGlmICggLS1hdHRh
Y2hlcyA9PT0gMCApIHsKKyAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBo
YW5kbGVyLCB0cnVlICk7CisgICAgfQorICAgIH0KKyAgICB9OworICAgIH0pOworfQorCitqUXVl
cnkuZm4uZXh0ZW5kKHsKKworICAgIG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRh
LCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsKKyAgICB2YXIgdHlwZSwgb3JpZ0ZuOworCisgICAg
Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCisgICAgaWYgKCB0eXBlb2Yg
dHlwZXMgPT09ICJvYmplY3QiICkgeworICAgIC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3Rvciwg
ZGF0YSApCisgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworICAgIC8v
ICggdHlwZXMtT2JqZWN0LCBkYXRhICkKKyAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKKyAg
ICBzZWxlY3RvciA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgZm9yICggdHlwZSBpbiB0eXBlcyAp
IHsKKyAgICB0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25l
ICk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGlmICggZGF0YSA9PSBu
dWxsICYmIGZuID09IG51bGwgKSB7CisgICAgLy8gKCB0eXBlcywgZm4gKQorICAgIGZuID0gc2Vs
ZWN0b3I7CisgICAgZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSBpZiAo
IGZuID09IG51bGwgKSB7CisgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkg
eworICAgIC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCisgICAgZm4gPSBkYXRhOworICAgIGRh
dGEgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAvLyAoIHR5cGVzLCBkYXRhLCBmbiAp
CisgICAgZm4gPSBkYXRhOworICAgIGRhdGEgPSBzZWxlY3RvcjsKKyAgICBzZWxlY3RvciA9IHVu
ZGVmaW5lZDsKKyAgICB9CisgICAgfQorICAgIGlmICggZm4gPT09IGZhbHNlICkgeworICAgIGZu
ID0gcmV0dXJuRmFsc2U7CisgICAgfSBlbHNlIGlmICggIWZuICkgeworICAgIHJldHVybiB0aGlz
OworICAgIH0KKworICAgIGlmICggb25lID09PSAxICkgeworICAgIG9yaWdGbiA9IGZuOworICAg
IGZuID0gZnVuY3Rpb24oIGV2ZW50ICkgeworICAgIC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBz
aW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mbworICAgIGpRdWVyeSgpLm9mZiggZXZlbnQgKTsK
KyAgICByZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKyAgICB9OworICAg
IC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisgICAg
Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7
CisgICAgfQorICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgIGpRdWVyeS5l
dmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKKyAgICB9KTsKKyAg
ICB9LAorICAgIG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7Cisg
ICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsKKyAgICB9
LAorICAgIG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7CisgICAgdmFyIGhh
bmRsZU9iaiwgdHlwZTsKKyAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYm
IHR5cGVzLmhhbmRsZU9iaiApIHsKKyAgICAvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5
LkV2ZW50CisgICAgaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOworICAgIGpRdWVyeSggdHlw
ZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCisgICAgaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRs
ZU9iai5vcmlnVHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3Jp
Z1R5cGUsCisgICAgaGFuZGxlT2JqLnNlbGVjdG9yLAorICAgIGhhbmRsZU9iai5oYW5kbGVyCisg
ICAgKTsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09
ICJvYmplY3QiICkgeworICAgIC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCisgICAg
Zm9yICggdHlwZSBpbiB0eXBlcyApIHsKKyAgICB0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5
cGVzWyB0eXBlIF0gKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmICgg
c2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsK
KyAgICAvLyAoIHR5cGVzIFssIGZuXSApCisgICAgZm4gPSBzZWxlY3RvcjsKKyAgICBzZWxlY3Rv
ciA9IHVuZGVmaW5lZDsKKyAgICB9CisgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgZm4g
PSByZXR1cm5GYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsK
KyAgICBqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7Cisg
ICAgfSk7CisgICAgfSwKKworICAgIGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7
CisgICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOworICAgIH0sCisg
ICAgdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgeworICAgIHJldHVybiB0aGlzLm9mZigg
dHlwZXMsIG51bGwsIGZuICk7CisgICAgfSwKKworICAgIGRlbGVnYXRlOiBmdW5jdGlvbiggc2Vs
ZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKKyAgICByZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNl
bGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNl
bGVjdG9yLCB0eXBlcywgZm4gKSB7CisgICAgLy8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9y
LCB0eXBlcyBbLCBmbl0gKQorICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhp
cy5vZmYoIHNlbGVjdG9yLCAiKioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIq
KiIsIGZuICk7CisgICAgfSwKKworICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkg
eworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LmV2ZW50LnRy
aWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsKKyAgICB9KTsKKyAgICB9LAorICAgIHRyaWdnZXJI
YW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKyAgICB2YXIgZWxlbSA9IHRoaXNbMF07
CisgICAgaWYgKCBlbGVtICkgeworICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlw
ZSwgZGF0YSwgZWxlbSwgdHJ1ZSApOworICAgIH0KKyAgICB9Cit9KTsKKy8qIQorICogU2l6emxl
IENTUyBTZWxlY3RvciBFbmdpbmUKKyAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9u
IGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5z
ZQorICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqLworKGZ1bmN0aW9uKCB3aW5kb3csIHVuZGVm
aW5lZCApIHsKKwordmFyIGksCisgICAgY2FjaGVkcnVucywKKyAgICBFeHByLAorICAgIGdldFRl
eHQsCisgICAgaXNYTUwsCisgICAgY29tcGlsZSwKKyAgICBoYXNEdXBsaWNhdGUsCisgICAgb3V0
ZXJtb3N0Q29udGV4dCwKKworICAgIC8vIExvY2FsIGRvY3VtZW50IHZhcnMKKyAgICBzZXREb2N1
bWVudCwKKyAgICBkb2N1bWVudCwKKyAgICBkb2NFbGVtLAorICAgIGRvY3VtZW50SXNYTUwsCisg
ICAgcmJ1Z2d5UVNBLAorICAgIHJidWdneU1hdGNoZXMsCisgICAgbWF0Y2hlcywKKyAgICBjb250
YWlucywKKyAgICBzb3J0T3JkZXIsCisKKyAgICAvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCisg
ICAgZXhwYW5kbyA9ICJzaXp6bGUiICsgLShuZXcgRGF0ZSgpKSwKKyAgICBwcmVmZXJyZWREb2Mg
PSB3aW5kb3cuZG9jdW1lbnQsCisgICAgc3VwcG9ydCA9IHt9LAorICAgIGRpcnJ1bnMgPSAwLAor
ICAgIGRvbmUgPSAwLAorICAgIGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHRva2Vu
Q2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgp
LAorCisgICAgLy8gR2VuZXJhbC1wdXJwb3NlIGNvbnN0YW50cworICAgIHN0cnVuZGVmaW5lZCA9
IHR5cGVvZiB1bmRlZmluZWQsCisgICAgTUFYX05FR0FUSVZFID0gMSA8PCAzMSwKKworICAgIC8v
IEFycmF5IG1ldGhvZHMKKyAgICBhcnIgPSBbXSwKKyAgICBwb3AgPSBhcnIucG9wLAorICAgIHB1
c2ggPSBhcnIucHVzaCwKKyAgICBzbGljZSA9IGFyci5zbGljZSwKKyAgICAvLyBVc2UgYSBzdHJp
cHBlZC1kb3duIGluZGV4T2YgaWYgd2UgY2FuJ3QgdXNlIGEgbmF0aXZlIG9uZQorICAgIGluZGV4
T2YgPSBhcnIuaW5kZXhPZiB8fCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgaSA9IDAsCisg
ICAgbGVuID0gdGhpcy5sZW5ndGg7CisgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAg
aWYgKCB0aGlzW2ldID09PSBlbGVtICkgeworICAgIHJldHVybiBpOworICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIC0xOworICAgIH0sCisKKworICAgIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMKKwor
ICAgIC8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNl
bGVjdG9ycy8jd2hpdGVzcGFjZQorICAgIHdoaXRlc3BhY2UgPSAiW1xceDIwXFx0XFxyXFxuXFxm
XSIsCisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2NoYXJhY3RlcnMK
KyAgICBjaGFyYWN0ZXJFbmNvZGluZyA9ICIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0p
KyIsCisKKyAgICAvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVy
cworICAgIC8vIEFuIHVucXVvdGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlmaWVyIGh0
dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisg
ICAgLy8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5o
dG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyCisgICAgaWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29k
aW5nLnJlcGxhY2UoICJ3IiwgIncjIiApLAorCisgICAgLy8gQWNjZXB0YWJsZSBvcGVyYXRvcnMg
aHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisgICAg
b3BlcmF0b3JzID0gIihbKl4kfCF+XT89KSIsCisgICAgYXR0cmlidXRlcyA9ICJcXFsiICsgd2hp
dGVzcGFjZSArICIqKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpIiArIHdoaXRlc3BhY2UgKwor
ICAgICIqKD86IiArIG9wZXJhdG9ycyArIHdoaXRlc3BhY2UgKyAiKig/OihbJ1wiXSkoKD86XFxc
XC58W15cXFxcXSkqPylcXDN8KCIgKyBpZGVudGlmaWVyICsgIil8KXwpIiArIHdoaXRlc3BhY2Ug
KyAiKlxcXSIsCisKKyAgICAvLyBQcmVmZXIgYXJndW1lbnRzIHF1b3RlZCwKKyAgICAvLyAgIHRo
ZW4gbm90IGNvbnRhaW5pbmcgcHNldWRvcy9icmFja2V0cywKKyAgICAvLyAgIHRoZW4gYXR0cmli
dXRlIHNlbGVjdG9ycy9ub24tcGFyZW50aGV0aWNhbCBleHByZXNzaW9ucywKKyAgICAvLyAgIHRo
ZW4gYW55dGhpbmcgZWxzZQorICAgIC8vIFRoZXNlIHByZWZlcmVuY2VzIGFyZSBoZXJlIHRvIHJl
ZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycworICAgIC8vICAgbmVlZGluZyB0b2tlbml6ZSBp
biB0aGUgUFNFVURPIHByZUZpbHRlcgorICAgIHBzZXVkb3MgPSAiOigiICsgY2hhcmFjdGVyRW5j
b2RpbmcgKyAiKSg/OlxcKCgoWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxc
LnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzLnJlcGxhY2UoIDMsIDggKSArICIpKil8Liop
XFwpfCkiLAorCisgICAgLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVz
cGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcg
dGhlIGxhdHRlcgorICAgIHJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIr
fCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAor
CisgICAgcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqLCIgKyB3aGl0
ZXNwYWNlICsgIioiICksCisgICAgcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hp
dGVzcGFjZSArICIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIiArIHdoaXRlc3BhY2UgKyAiKiIg
KSwKKyAgICBycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAorICAgIHJpZGVudGlmaWVy
ID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAorCisgICAgbWF0Y2hFeHBy
ID0geworICAgICJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAi
KSIgKSwKKyAgICAiQ0xBU1MiOiBuZXcgUmVnRXhwKCAiXlxcLigiICsgY2hhcmFjdGVyRW5jb2Rp
bmcgKyAiKSIgKSwKKyAgICAiTkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wiXT8oIiAr
IGNoYXJhY3RlckVuY29kaW5nICsgIilbJ1wiXT9cXF0iICksCisgICAgIlRBRyI6IG5ldyBSZWdF
eHAoICJeKCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3KiIgKSArICIpIiAp
LAorICAgICJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAorICAgICJQU0VV
RE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCisgICAgIkNISUxEIjogbmV3IFJlZ0V4
cCggIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/Olxc
KCIgKyB3aGl0ZXNwYWNlICsKKyAgICAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3
aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKworICAgICIqKFxcZCspfCkp
IiArIHdoaXRlc3BhY2UgKyAiKlxcKXwpIiwgImkiICksCisgICAgLy8gRm9yIHVzZSBpbiBsaWJy
YXJpZXMgaW1wbGVtZW50aW5nIC5pcygpCisgICAgLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRj
aGluZyBpbiBgc2VsZWN0YAorICAgICJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIgKyB3
aGl0ZXNwYWNlICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/
OlxcKCIgKworICAgIHdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNl
ICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQorICAgIH0sCisKKyAgICByc2libGluZyA9IC9b
XHgyMFx0XHJcblxmXSpbK35dLywKKworICAgIHJuYXRpdmUgPSAvXltee10rXHtccypcW25hdGl2
ZSBjb2RlLywKKworICAgIC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFH
IG9yIENMQVNTIHNlbGVjdG9ycworICAgIHJxdWlja0V4cHIgPSAvXig/OiMoW1x3LV0rKXwoXHcr
KXxcLihbXHctXSspKSQvLAorCisgICAgcmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRh
cmVhfGJ1dHRvbikkL2ksCisgICAgcmhlYWRlciA9IC9eaFxkJC9pLAorCisgICAgcmVzY2FwZSA9
IC8nfFxcL2csCisgICAgcmF0dHJpYnV0ZVF1b3RlcyA9IC9cPVtceDIwXHRcclxuXGZdKihbXici
XF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLAorCisgICAgLy8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3
dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVycworICAgIHJ1
bmVzY2FwZSA9IC9cXChbXGRhLWZBLUZdezEsNn1bXHgyMFx0XHJcblxmXT98LikvZywKKyAgICBm
dW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCApIHsKKyAgICB2YXIgaGlnaCA9ICIweCIg
KyBlc2NhcGVkIC0gMHgxMDAwMDsKKyAgICAvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAorICAg
IHJldHVybiBoaWdoICE9PSBoaWdoID8KKyAgICBlc2NhcGVkIDoKKyAgICAvLyBCTVAgY29kZXBv
aW50CisgICAgaGlnaCA8IDAgPworICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEw
MDAwICkgOgorICAgIC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBw
YWlyKQorICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2gg
JiAweDNGRiB8IDB4REMwMCApOworICAgIH07CisKKy8vIFVzZSBhIHN0cmlwcGVkLWRvd24gc2xp
Y2UgaWYgd2UgY2FuJ3QgdXNlIGEgbmF0aXZlIG9uZQordHJ5IHsKKyAgICBzbGljZS5jYWxsKCBw
cmVmZXJyZWREb2MuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsK
K30gY2F0Y2ggKCBlICkgeworICAgIHNsaWNlID0gZnVuY3Rpb24oIGkgKSB7CisgICAgdmFyIGVs
ZW0sCisgICAgcmVzdWx0cyA9IFtdOworICAgIHdoaWxlICggKGVsZW0gPSB0aGlzW2krK10pICkg
eworICAgIHJlc3VsdHMucHVzaCggZWxlbSApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgICB9OworfQorCisvKioKKyAqIEZvciBmZWF0dXJlIGRldGVjdGlvbgorICogQHBhcmFtIHtG
dW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHRlc3QgZm9yIG5hdGl2ZSBzdXBwb3J0CisgKi8K
K2Z1bmN0aW9uIGlzTmF0aXZlKCBmbiApIHsKKyAgICByZXR1cm4gcm5hdGl2ZS50ZXN0KCBmbiAr
ICIiICk7Cit9CisKKy8qKgorICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBz
aXplCisgKiBAcmV0dXJucyB7RnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBP
YmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoCisgKiAgICBwcm9wZXJ0
eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBs
YXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKQorICogICAgZGVsZXRpbmcgdGhlIG9sZGVzdCBl
bnRyeQorICovCitmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKKyAgICB2YXIgY2FjaGUsCisgICAg
a2V5cyA9IFtdOworCisgICAgcmV0dXJuIChjYWNoZSA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkg
eworICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUg
cHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQorICAgIGlmICgga2V5cy5wdXNo
KCBrZXkgKz0gIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgeworICAgIC8vIE9ubHkga2VlcCB0
aGUgbW9zdCByZWNlbnQgZW50cmllcworICAgIGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07
CisgICAgfQorICAgIHJldHVybiAoY2FjaGVbIGtleSBdID0gdmFsdWUpOworICAgIH0pOworfQor
CisvKioKKyAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCisgKiBA
cGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFyaworICovCitmdW5jdGlvbiBt
YXJrRnVuY3Rpb24oIGZuICkgeworICAgIGZuWyBleHBhbmRvIF0gPSB0cnVlOworICAgIHJldHVy
biBmbjsKK30KKworLyoqCisgKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAorICog
QHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBh
IGJvb2xlYW4gcmVzdWx0CisgKi8KK2Z1bmN0aW9uIGFzc2VydCggZm4gKSB7CisgICAgdmFyIGRp
diA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCisgICAgdHJ5IHsKKyAgICByZXR1
cm4gZm4oIGRpdiApOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgICAg
fSBmaW5hbGx5IHsKKyAgICAvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQorICAgIGRpdiA9IG51bGw7
CisgICAgfQorfQorCitmdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRz
LCBzZWVkICkgeworICAgIHZhciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsCisgICAgLy8gUVNB
IHZhcnMKKyAgICBpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsK
KworICAgIGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQg
OiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7CisgICAgc2V0RG9jdW1lbnQoIGNvbnRl
eHQgKTsKKyAgICB9CisKKyAgICBjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKyAgICBy
ZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKKworICAgIGlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBz
ZWxlY3RvciAhPT0gInN0cmluZyIgKSB7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisg
ICAgaWYgKCAobm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBub2RlVHlwZSAh
PT0gOSApIHsKKyAgICByZXR1cm4gW107CisgICAgfQorCisgICAgaWYgKCAhZG9jdW1lbnRJc1hN
TCAmJiAhc2VlZCApIHsKKworICAgIC8vIFNob3J0Y3V0cworICAgIGlmICggKG1hdGNoID0gcnF1
aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsKKyAgICAvLyBTcGVlZC11cDogU2l6emxlKCIj
SUQiKQorICAgIGlmICggKG0gPSBtYXRjaFsxXSkgKSB7CisgICAgaWYgKCBub2RlVHlwZSA9PT0g
OSApIHsKKyAgICBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApOworICAgIC8vIENo
ZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAg
Ly8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgIGlm
ICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CisgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdo
ZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXMKKyAgICAvLyBieSBuYW1lIGlu
c3RlYWQgb2YgSUQKKyAgICBpZiAoIGVsZW0uaWQgPT09IG0gKSB7CisgICAgcmVzdWx0cy5wdXNo
KCBlbGVtICk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgLy8gQ29udGV4dCBpcyBu
b3QgYSBkb2N1bWVudAorICAgIGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0g
Y29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCisgICAgY29udGFp
bnMoIGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgeworICAgIHJlc3VsdHMucHVz
aCggZWxlbSApOworICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKyAgICB9CisKKyAgICAvLyBT
cGVlZC11cDogU2l6emxlKCJUQUciKQorICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgeworICAg
IHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5VGFn
TmFtZSggc2VsZWN0b3IgKSwgMCkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKworICAgIC8vIFNw
ZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCisgICAgfSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkg
JiYgc3VwcG9ydC5nZXRCeUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUgKSB7CisgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVs
ZW1lbnRzQnlDbGFzc05hbWUoIG0gKSwgMCkgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9
CisgICAgfQorCisgICAgLy8gUVNBIHBhdGgKKyAgICBpZiAoIHN1cHBvcnQucXNhICYmICFyYnVn
Z3lRU0EudGVzdChzZWxlY3RvcikgKSB7CisgICAgb2xkID0gdHJ1ZTsKKyAgICBuaWQgPSBleHBh
bmRvOworICAgIG5ld0NvbnRleHQgPSBjb250ZXh0OworICAgIG5ld1NlbGVjdG9yID0gbm9kZVR5
cGUgPT09IDkgJiYgc2VsZWN0b3I7CisKKyAgICAvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVs
ZW1lbnQtcm9vdGVkIHF1ZXJpZXMKKyAgICAvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBz
cGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290CisgICAgLy8gYW5kIHdvcmtpbmcgdXAg
ZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCisg
ICAgLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCisgICAgaWYgKCBub2Rl
VHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3Qi
ICkgeworICAgIGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApOworCisgICAgaWYgKCAob2xk
ID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImlkIikpICkgeworICAgIG5pZCA9IG9sZC5yZXBsYWNl
KCByZXNjYXBlLCAiXFwkJiIgKTsKKyAgICB9IGVsc2UgeworICAgIGNvbnRleHQuc2V0QXR0cmli
dXRlKCAiaWQiLCBuaWQgKTsKKyAgICB9CisgICAgbmlkID0gIltpZD0nIiArIG5pZCArICInXSAi
OworCisgICAgaSA9IGdyb3Vwcy5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgZ3Jv
dXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7CisgICAgfQorICAgIG5ld0Nv
bnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8
fCBjb250ZXh0OworICAgIG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIiwiKTsKKyAgICB9CisK
KyAgICBpZiAoIG5ld1NlbGVjdG9yICkgeworICAgIHRyeSB7CisgICAgcHVzaC5hcHBseSggcmVz
dWx0cywgc2xpY2UuY2FsbCggbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKAorICAgIG5ld1Nl
bGVjdG9yCisgICAgKSwgMCApICk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSBjYXRjaChx
c2FFcnJvcikgeworICAgIH0gZmluYWxseSB7CisgICAgaWYgKCAhb2xkICkgeworICAgIGNvbnRl
eHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAg
ICB9CisKKyAgICAvLyBBbGwgb3RoZXJzCisgICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVw
bGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOworfQorCisvKioK
KyAqIERldGVjdCB4bWwKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVu
dCBvciBhIGRvY3VtZW50CisgKi8KK2lzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVy
ZSBpdCBkb2Vzbid0IHlldCBleGlzdAorICAgIC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBp
biBJRSAtICM0ODMzKQorICAgIHZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93
bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OworICAgIHJldHVybiBkb2N1bWVu
dEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiA6IGZhbHNlOwor
fTsKKworLyoqCisgKiBTZXRzIGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQg
b24gdGhlIGN1cnJlbnQgZG9jdW1lbnQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2Nd
IEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50
CisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50CisgKi8K
K3NldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cisg
ICAgdmFyIGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJl
ZERvYzsKKworICAgIC8vIElmIG5vIGRvY3VtZW50IGFuZCBkb2N1bWVudEVsZW1lbnQgaXMgYXZh
aWxhYmxlLCByZXR1cm4KKyAgICBpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBl
ICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkgeworICAgIHJldHVybiBkb2N1bWVudDsK
KyAgICB9CisKKyAgICAvLyBTZXQgb3VyIGRvY3VtZW50CisgICAgZG9jdW1lbnQgPSBkb2M7Cisg
ICAgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICAvLyBTdXBwb3J0IHRlc3Rz
CisgICAgZG9jdW1lbnRJc1hNTCA9IGlzWE1MKCBkb2MgKTsKKworICAgIC8vIENoZWNrIGlmIGdl
dEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzCisgICAgc3VwcG9y
dC50YWdOYW1lTm9Db21tZW50cyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworICAgIGRpdi5h
cHBlbmRDaGlsZCggZG9jLmNyZWF0ZUNvbW1lbnQoIiIpICk7CisgICAgcmV0dXJuICFkaXYuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7CisgICAgfSk7CisKKyAgICAvLyBDaGVjayBp
ZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzCisgICAg
c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisgICAgZGl2Lmlu
bmVySFRNTCA9ICI8c2VsZWN0Pjwvc2VsZWN0PiI7CisgICAgdmFyIHR5cGUgPSB0eXBlb2YgZGl2
Lmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7CisgICAgLy8gSUU4IHJldHVybnMg
YSBzdHJpbmcgZm9yIHNvbWUgYXR0cmlidXRlcyBldmVuIHdoZW4gbm90IHByZXNlbnQKKyAgICBy
ZXR1cm4gdHlwZSAhPT0gImJvb2xlYW4iICYmIHR5cGUgIT09ICJzdHJpbmciOworICAgIH0pOwor
CisgICAgLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSBjYW4gYmUgdHJ1c3RlZAor
ICAgIHN1cHBvcnQuZ2V0QnlDbGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAg
ICAvLyBPcGVyYSBjYW4ndCBmaW5kIGEgc2Vjb25kIGNsYXNzbmFtZSAoaW4gOS42KQorICAgIGRp
di5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0naGlkZGVuIGUnPjwvZGl2PjxkaXYgY2xhc3M9J2hp
ZGRlbic+PC9kaXY+IjsKKyAgICBpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCAh
ZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggKSB7CisgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIC8vIFNhZmFyaSAzLjIgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMg
YW5kIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcworICAgIGRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0g
ImUiOworICAgIHJldHVybiBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9
PT0gMjsKKyAgICB9KTsKKworICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMg
ZWxlbWVudHMgYnkgbmFtZQorICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZp
bGVnZXMgZm9ybSBjb250cm9scyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElECisgICAgc3VwcG9y
dC5nZXRCeU5hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBJbmplY3QgY29u
dGVudAorICAgIGRpdi5pZCA9IGV4cGFuZG8gKyAwOworICAgIGRpdi5pbm5lckhUTUwgPSAiPGEg
bmFtZT0nIiArIGV4cGFuZG8gKyAiJz48L2E+PGRpdiBuYW1lPSciICsgZXhwYW5kbyArICInPjwv
ZGl2PiI7CisgICAgZG9jRWxlbS5pbnNlcnRCZWZvcmUoIGRpdiwgZG9jRWxlbS5maXJzdENoaWxk
ICk7CisKKyAgICAvLyBUZXN0CisgICAgdmFyIHBhc3MgPSBkb2MuZ2V0RWxlbWVudHNCeU5hbWUg
JiYKKyAgICAvLyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBmZXdlciB0aGFuIHRoZSBjb3Jy
ZWN0IDIKKyAgICBkb2MuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGggPT09IDIg
KworICAgIC8vIGJ1Z2d5IGJyb3dzZXJzIHdpbGwgcmV0dXJuIG1vcmUgdGhhbiB0aGUgY29ycmVj
dCAwCisgICAgZG9jLmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICsgMCApLmxlbmd0aDsKKyAg
ICBzdXBwb3J0LmdldElkTm90TmFtZSA9ICFkb2MuZ2V0RWxlbWVudEJ5SWQoIGV4cGFuZG8gKTsK
KworICAgIC8vIENsZWFudXAKKyAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBkaXYgKTsKKworICAg
IHJldHVybiBwYXNzOworICAgIH0pOworCisgICAgLy8gSUU2LzcgcmV0dXJuIG1vZGlmaWVkIGF0
dHJpYnV0ZXMKKyAgICBFeHByLmF0dHJIYW5kbGUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsK
KyAgICBkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOworICAgIHJldHVybiBkaXYu
Zmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSBzdHJ1
bmRlZmluZWQgJiYKKyAgICBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0g
IiMiOworICAgIH0pID8KKyAgICB7fSA6CisgICAgeworICAgICJocmVmIjogZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAiaHJlZiIsIDIgKTsKKyAgICB9
LAorICAgICJ0eXBlIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZ2V0QXR0
cmlidXRlKCJ0eXBlIik7CisgICAgfQorICAgIH07CisKKyAgICAvLyBJRCBmaW5kIGFuZCBmaWx0
ZXIKKyAgICBpZiAoIHN1cHBvcnQuZ2V0SWROb3ROYW1lICkgeworICAgIEV4cHIuZmluZFsiSUQi
XSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKKyAgICBpZiAoIHR5cGVvZiBjb250ZXh0Lmdl
dEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIWRvY3VtZW50SXNYTUwgKSB7CisgICAg
dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApOworICAgIC8vIENoZWNrIHBhcmVu
dE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAgLy8gbm9kZXMg
dGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgIHJldHVybiBtICYm
IG0ucGFyZW50Tm9kZSA/IFttXSA6IFtdOworICAgIH0KKyAgICB9OworICAgIEV4cHIuZmlsdGVy
WyJJRCJdID0gZnVuY3Rpb24oIGlkICkgeworICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBy
dW5lc2NhcGUsIGZ1bmVzY2FwZSApOworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKKyAgICB9OworICAg
IH07CisgICAgfSBlbHNlIHsKKyAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNv
bnRleHQgKSB7CisgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3Ry
dW5kZWZpbmVkICYmICFkb2N1bWVudElzWE1MICkgeworICAgIHZhciBtID0gY29udGV4dC5nZXRF
bGVtZW50QnlJZCggaWQgKTsKKworICAgIHJldHVybiBtID8KKyAgICBtLmlkID09PSBpZCB8fCB0
eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgbS5nZXRBdHRyaWJ1
dGVOb2RlKCJpZCIpLnZhbHVlID09PSBpZCA/CisgICAgW21dIDoKKyAgICB1bmRlZmluZWQgOgor
ICAgIFtdOworICAgIH0KKyAgICB9OworICAgIEV4cHIuZmlsdGVyWyJJRCJdID0gIGZ1bmN0aW9u
KCBpZCApIHsKKyAgICB2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2Nh
cGUgKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIG5vZGUgPSB0eXBl
b2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRy
aWJ1dGVOb2RlKCJpZCIpOworICAgIHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJ
ZDsKKyAgICB9OworICAgIH07CisgICAgfQorCisgICAgLy8gVGFnCisgICAgRXhwci5maW5kWyJU
QUciXSA9IHN1cHBvcnQudGFnTmFtZU5vQ29tbWVudHMgPworICAgIGZ1bmN0aW9uKCB0YWcsIGNv
bnRleHQgKSB7CisgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAh
PT0gc3RydW5kZWZpbmVkICkgeworICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdO
YW1lKCB0YWcgKTsKKyAgICB9CisgICAgfSA6CisgICAgZnVuY3Rpb24oIHRhZywgY29udGV4dCAp
IHsKKyAgICB2YXIgZWxlbSwKKyAgICB0bXAgPSBbXSwKKyAgICBpID0gMCwKKyAgICByZXN1bHRz
ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7CisKKyAgICAvLyBGaWx0ZXIg
b3V0IHBvc3NpYmxlIGNvbW1lbnRzCisgICAgaWYgKCB0YWcgPT09ICIqIiApIHsKKyAgICB3aGls
ZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgKSB7CisgICAgdG1wLnB1c2goIGVsZW0gKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IHRtcDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfTsKKworICAgIC8vIE5hbWUK
KyAgICBFeHByLmZpbmRbIk5BTUUiXSA9IHN1cHBvcnQuZ2V0QnlOYW1lICYmIGZ1bmN0aW9uKCB0
YWcsIGNvbnRleHQgKSB7CisgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFt
ZSAhPT0gc3RydW5kZWZpbmVkICkgeworICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlO
YW1lKCBuYW1lICk7CisgICAgfQorICAgIH07CisKKyAgICAvLyBDbGFzcworICAgIEV4cHIuZmlu
ZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0QnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFt
ZSwgY29udGV4dCApIHsKKyAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFz
c05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiAhZG9jdW1lbnRJc1hNTCApIHsKKyAgICByZXR1cm4g
Y29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsKKyAgICB9CisgICAg
fTsKKworICAgIC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKKworICAgIC8vIG1h
dGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJh
IDExLjUpCisgICAgcmJ1Z2d5TWF0Y2hlcyA9IFtdOworCisgICAgLy8gcVNhKDpmb2N1cykgcmVw
b3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSksCisgICAgLy8gbm8gbmVlZCB0byBhbHNv
IGFkZCB0byBidWdneU1hdGNoZXMgc2luY2UgbWF0Y2hlcyBjaGVja3MgYnVnZ3lRU0EKKyAgICAv
LyBBIHN1cHBvcnQgdGVzdCB3b3VsZCByZXF1aXJlIHRvbyBtdWNoIGNvZGUgKHdvdWxkIGluY2x1
ZGUgZG9jdW1lbnQgcmVhZHkpCisgICAgcmJ1Z2d5UVNBID0gWyAiOmZvY3VzIiBdOworCisgICAg
aWYgKCAoc3VwcG9ydC5xc2EgPSBpc05hdGl2ZShkb2MucXVlcnlTZWxlY3RvckFsbCkpICkgewor
ICAgIC8vIEJ1aWxkIFFTQSByZWdleAorICAgIC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJv
bSBEaWVnbyBQZXJpbmkKKyAgICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBTZWxl
Y3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlCisgICAgLy8gVGhpcyBpcyB0byB0
ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0bHkKKyAgICAvLyBzZXR0aW5nIGEgYm9v
bGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKKyAgICAvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxk
IGJlIGVub3VnaAorICAgIC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5Cisg
ICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+
PC9zZWxlY3Q+IjsKKworICAgIC8vIElFOCAtIFNvbWUgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBu
b3QgdHJlYXRlZCBjb3JyZWN0bHkKKyAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3Nl
bGVjdGVkXSIpLmxlbmd0aCApIHsKKyAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNw
YWNlICsgIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVj
dGVkfHZhbHVlKSIgKTsKKyAgICB9CisKKyAgICAvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBz
aG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50cworICAgIC8vIGh0dHA6Ly93d3cu
dzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCisgICAg
Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKKyAg
ICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CisgICAg
cmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7CisgICAgfQorICAgIH0pOworCisgICAgYXNzZXJ0
KGZ1bmN0aW9uKCBkaXYgKSB7CisKKyAgICAvLyBPcGVyYSAxMC0xMi9JRTggLSBePSAkPSAqPSBh
bmQgZW1wdHkgdmFsdWVzCisgICAgLy8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmcKKyAgICBk
aXYuaW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIGk9JycvPiI7CisgICAgaWYgKCBk
aXYucXVlcnlTZWxlY3RvckFsbCgiW2lePScnXSIpLmxlbmd0aCApIHsKKyAgICByYnVnZ3lRU0Eu
cHVzaCggIlsqXiRdPSIgKyB3aGl0ZXNwYWNlICsgIiooPzpcIlwifCcnKSIgKTsKKyAgICB9CisK
KyAgICAvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAo
aGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQorICAgIC8vIElFOCB0aHJvd3MgZXJy
b3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgaWYgKCAhZGl2LnF1ZXJ5
U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoICkgeworICAgIHJidWdneVFTQS5wdXNoKCAi
OmVuYWJsZWQiLCAiOmRpc2FibGVkIiApOworICAgIH0KKworICAgIC8vIE9wZXJhIDEwLTExIGRv
ZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCisgICAgZGl2LnF1ZXJ5
U2VsZWN0b3JBbGwoIiosOngiKTsKKyAgICByYnVnZ3lRU0EucHVzaCgiLC4qOiIpOworICAgIH0p
OworICAgIH0KKworICAgIGlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gaXNOYXRpdmUo
IChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzU2VsZWN0b3IgfHwKKyAgICBkb2NFbGVtLm1vek1h
dGNoZXNTZWxlY3RvciB8fAorICAgIGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8Cisg
ICAgZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CisgICAgZG9jRWxlbS5tc01hdGNoZXNTZWxl
Y3RvcikgKSkgKSB7CisKKyAgICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAvLyBDaGVj
ayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3IKKyAgICAvLyBv
biBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQorICAgIHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0
Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsKKworICAgIC8vIFRoaXMgc2hvdWxkIGZh
aWwgd2l0aCBhbiBleGNlcHRpb24KKyAgICAvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJu
cyBmYWxzZSBpbnN0ZWFkCisgICAgbWF0Y2hlcy5jYWxsKCBkaXYsICJbcyE9JyddOngiICk7Cisg
ICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CisgICAgfSk7CisgICAgfQor
CisgICAgcmJ1Z2d5UVNBID0gbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oInwiKSApOworICAg
IHJidWdneU1hdGNoZXMgPSBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOwor
CisgICAgLy8gRWxlbWVudCBjb250YWlucyBhbm90aGVyCisgICAgLy8gUHVycG9zZWZ1bGx5IGRv
ZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudAorICAgIC8vIEFzIGluLCBhbiBl
bGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmCisgICAgY29udGFpbnMgPSBpc05hdGl2ZShk
b2NFbGVtLmNvbnRhaW5zKSB8fCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8KKyAg
ICBmdW5jdGlvbiggYSwgYiApIHsKKyAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8g
YS5kb2N1bWVudEVsZW1lbnQgOiBhLAorICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOworICAg
IHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKAor
ICAgIGFkb3duLmNvbnRhaW5zID8KKyAgICBhZG93bi5jb250YWlucyggYnVwICkgOgorICAgIGEu
Y29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVw
ICkgJiAxNgorICAgICkpOworICAgIH0gOgorICAgIGZ1bmN0aW9uKCBhLCBiICkgeworICAgIGlm
ICggYiApIHsKKyAgICB3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKKyAgICBpZiAoIGIg
PT09IGEgKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworICAgIH07CisKKyAgICAvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisgICAg
c29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/CisgICAgZnVuY3Rp
b24oIGEsIGIgKSB7CisgICAgdmFyIGNvbXBhcmU7CisKKyAgICBpZiAoIGEgPT09IGIgKSB7Cisg
ICAgaGFzRHVwbGljYXRlID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAo
IChjb21wYXJlID0gYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVu
dFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSkgKSB7CisgICAgaWYg
KCBjb21wYXJlICYgMSB8fCBhLnBhcmVudE5vZGUgJiYgYS5wYXJlbnROb2RlLm5vZGVUeXBlID09
PSAxMSApIHsKKyAgICBpZiAoIGEgPT09IGRvYyB8fCBjb250YWlucyggcHJlZmVycmVkRG9jLCBh
ICkgKSB7CisgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIGIgPT09IGRvYyB8fCBjb250
YWlucyggcHJlZmVycmVkRG9jLCBiICkgKSB7CisgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJl
dHVybiAwOworICAgIH0KKyAgICByZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7CisgICAgfQor
CisgICAgcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyAtMSA6IDE7CisgICAgfSA6
CisgICAgZnVuY3Rpb24oIGEsIGIgKSB7CisgICAgdmFyIGN1ciwKKyAgICBpID0gMCwKKyAgICBh
dXAgPSBhLnBhcmVudE5vZGUsCisgICAgYnVwID0gYi5wYXJlbnROb2RlLAorICAgIGFwID0gWyBh
IF0sCisgICAgYnAgPSBbIGIgXTsKKworICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFy
ZSBpZGVudGljYWwKKyAgICBpZiAoIGEgPT09IGIgKSB7CisgICAgaGFzRHVwbGljYXRlID0gdHJ1
ZTsKKyAgICByZXR1cm4gMDsKKworICAgIC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBk
b2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisgICAgfSBlbHNlIGlmICggIWF1cCB8fCAhYnVwICkg
eworICAgIHJldHVybiBhID09PSBkb2MgPyAtMSA6CisgICAgYiA9PT0gZG9jID8gMSA6CisgICAg
YXVwID8gLTEgOgorICAgIGJ1cCA/IDEgOgorICAgIDA7CisKKyAgICAvLyBJZiB0aGUgbm9kZXMg
YXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVjaworICAgIH0gZWxzZSBpZiAoIGF1
cCA9PT0gYnVwICkgeworICAgIHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKKyAgICB9CisK
KyAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBm
b3IgY29tcGFyaXNvbgorICAgIGN1ciA9IGE7CisgICAgd2hpbGUgKCAoY3VyID0gY3VyLnBhcmVu
dE5vZGUpICkgeworICAgIGFwLnVuc2hpZnQoIGN1ciApOworICAgIH0KKyAgICBjdXIgPSBiOwor
ICAgIHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKKyAgICBicC51bnNoaWZ0KCBj
dXIgKTsKKyAgICB9CisKKyAgICAvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBk
aXNjcmVwYW5jeQorICAgIHdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgeworICAgIGkrKzsKKyAg
ICB9CisKKyAgICByZXR1cm4gaSA/CisgICAgLy8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBu
b2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yCisgICAgc2libGluZ0NoZWNrKCBhcFtpXSwgYnBb
aV0gKSA6CisKKyAgICAvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmly
c3QKKyAgICBhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgorICAgIGJwW2ldID09PSBwcmVm
ZXJyZWREb2MgPyAxIDoKKyAgICAwOworICAgIH07CisKKyAgICAvLyBBbHdheXMgYXNzdW1lIHRo
ZSBwcmVzZW5jZSBvZiBkdXBsaWNhdGVzIGlmIHNvcnQgZG9lc24ndAorICAgIC8vIHBhc3MgdGhl
bSB0byBvdXIgY29tcGFyaXNvbiBmdW5jdGlvbiAoYXMgaW4gR29vZ2xlIENocm9tZSkuCisgICAg
aGFzRHVwbGljYXRlID0gZmFsc2U7CisgICAgWzAsIDBdLnNvcnQoIHNvcnRPcmRlciApOworICAg
IHN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9IGhhc0R1cGxpY2F0ZTsKKworICAgIHJldHVybiBk
b2N1bWVudDsKK307CisKK1NpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRz
ICkgeworICAgIHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7Cit9
OworCitTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7Cisg
ICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisgICAgaWYgKCAoIGVsZW0ub3duZXJE
b2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgeworICAgIHNldERvY3VtZW50KCBlbGVt
ICk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBh
cmUgcXVvdGVkCisgICAgZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0n
JDEnXSIgKTsKKworICAgIC8vIHJidWdneVFTQSBhbHdheXMgY29udGFpbnMgOmZvY3VzLCBzbyBu
byBuZWVkIGZvciBhbiBleGlzdGVuY2UgY2hlY2sKKyAgICBpZiAoIHN1cHBvcnQubWF0Y2hlc1Nl
bGVjdG9yICYmICFkb2N1bWVudElzWE1MICYmICghcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0
Y2hlcy50ZXN0KGV4cHIpKSAmJiAhcmJ1Z2d5UVNBLnRlc3QoZXhwcikgKSB7CisgICAgdHJ5IHsK
KyAgICB2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7CisKKyAgICAvLyBJRSA5
J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzCisg
ICAgaWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fAorICAgIC8vIEFzIHdl
bGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50CisgICAg
Ly8gZnJhZ21lbnQgaW4gSUUgOQorICAgIGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5u
b2RlVHlwZSAhPT0gMTEgKSB7CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgfSBjYXRjaChl
KSB7fQorICAgIH0KKworICAgIHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBb
ZWxlbV0gKS5sZW5ndGggPiAwOworfTsKKworU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNv
bnRleHQsIGVsZW0gKSB7CisgICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisgICAg
aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkg
eworICAgIHNldERvY3VtZW50KCBjb250ZXh0ICk7CisgICAgfQorICAgIHJldHVybiBjb250YWlu
cyggY29udGV4dCwgZWxlbSApOworfTsKKworU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwg
bmFtZSApIHsKKyAgICB2YXIgdmFsOworCisgICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVl
ZGVkCisgICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50
ICkgeworICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQorCisgICAgaWYgKCAhZG9jdW1l
bnRJc1hNTCApIHsKKyAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0KKyAgICBp
ZiAoICh2YWwgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSkgKSB7CisgICAgcmV0dXJuIHZhbCgg
ZWxlbSApOworICAgIH0KKyAgICBpZiAoIGRvY3VtZW50SXNYTUwgfHwgc3VwcG9ydC5hdHRyaWJ1
dGVzICkgeworICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOworICAgIH0KKyAg
ICByZXR1cm4gKCAodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpIHx8IGVsZW0u
Z2V0QXR0cmlidXRlKCBuYW1lICkgKSAmJiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPworICAgIG5h
bWUgOgorICAgIHZhbCAmJiB2YWwuc3BlY2lmaWVkID8gdmFsLnZhbHVlIDogbnVsbDsKK307CisK
K1NpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCAi
U3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyApOworfTsKKwor
Ly8gRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlcworU2l6emxlLnVuaXF1
ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKKyAgICB2YXIgZWxlbSwKKyAgICBkdXBsaWNh
dGVzID0gW10sCisgICAgaSA9IDEsCisgICAgaiA9IDA7CisKKyAgICAvLyBVbmxlc3Mgd2UgKmtu
b3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlCisgICAg
aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlczsKKyAgICByZXN1bHRzLnNv
cnQoIHNvcnRPcmRlciApOworCisgICAgaWYgKCBoYXNEdXBsaWNhdGUgKSB7CisgICAgZm9yICgg
OyAoZWxlbSA9IHJlc3VsdHNbaV0pOyBpKysgKSB7CisgICAgaWYgKCBlbGVtID09PSByZXN1bHRz
WyBpIC0gMSBdICkgeworICAgIGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTsKKyAgICB9CisgICAg
fQorICAgIHdoaWxlICggai0tICkgeworICAgIHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBq
IF0sIDEgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdHM7Cit9OworCitmdW5j
dGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7CisgICAgdmFyIGN1ciA9IGIgJiYgYSwKKyAgICBk
aWZmID0gY3VyICYmICggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLSAoIH5hLnNv
dXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApOworCisgICAgLy8gVXNlIElFIHNvdXJjZUluZGV4
IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCisgICAgaWYgKCBkaWZmICkgeworICAgIHJldHVy
biBkaWZmOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGIgZm9sbG93cyBhCisgICAgaWYgKCBj
dXIgKSB7CisgICAgd2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHsKKyAgICBpZiAo
IGN1ciA9PT0gYiApIHsKKyAgICByZXR1cm4gLTE7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gYSA/IDEgOiAtMTsKK30KKworLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBp
biBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcworZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5
cGUgKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBuYW1lID0gZWxl
bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBuYW1lID09PSAiaW5wdXQiICYm
IGVsZW0udHlwZSA9PT0gdHlwZTsKKyAgICB9OworfQorCisvLyBSZXR1cm5zIGEgZnVuY3Rpb24g
dG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKK2Z1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVk
byggdHlwZSApIHsKKyAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgdmFyIG5hbWUg
PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIChuYW1lID09PSAiaW5w
dXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisgICAgfTsK
K30KKworLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlv
bmFscworZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7CisgICAgcmV0dXJu
IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7CisgICAgYXJndW1lbnQgPSArYXJn
dW1lbnQ7CisgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyAp
IHsKKyAgICB2YXIgaiwKKyAgICBtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBh
cmd1bWVudCApLAorICAgIGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOworCisgICAgLy8gTWF0Y2gg
ZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCisgICAgd2hpbGUgKCBpLS0g
KSB7CisgICAgaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKKyAgICBzZWVk
W2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAg
ICB9KTsKK30KKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0
ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2RlcworICogQHBhcmFtIHtBcnJheXxFbGVt
ZW50fSBlbGVtCisgKi8KK2dldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVt
ICkgeworICAgIHZhciBub2RlLAorICAgIHJldCA9ICIiLAorICAgIGkgPSAwLAorICAgIG5vZGVU
eXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAgIGlmICggIW5vZGVUeXBlICkgeworICAgIC8vIElm
IG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5CisgICAgZm9yICgg
OyAobm9kZSA9IGVsZW1baV0pOyBpKysgKSB7CisgICAgLy8gRG8gbm90IHRyYXZlcnNlIGNvbW1l
bnQgbm9kZXMKKyAgICByZXQgKz0gZ2V0VGV4dCggbm9kZSApOworICAgIH0KKyAgICB9IGVsc2Ug
aWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEg
KSB7CisgICAgLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cworICAgIC8vIGlubmVyVGV4
dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKHNlZSAjMTExNTMp
CisgICAgaWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gInN0cmluZyIgKSB7CisgICAg
cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAvLyBUcmF2ZXJzZSBp
dHMgY2hpbGRyZW4KKyAgICBmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVt
ID0gZWxlbS5uZXh0U2libGluZyApIHsKKyAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSApOworICAg
IH0KKyAgICB9CisgICAgfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09
IDQgKSB7CisgICAgcmV0dXJuIGVsZW0ubm9kZVZhbHVlOworICAgIH0KKyAgICAvLyBEbyBub3Qg
aW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXMKKworICAgIHJl
dHVybiByZXQ7Cit9OworCitFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKworICAgIC8vIENh
biBiZSBhZGp1c3RlZCBieSB0aGUgdXNlcgorICAgIGNhY2hlTGVuZ3RoOiA1MCwKKworICAgIGNy
ZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLAorCisgICAgbWF0Y2g6IG1hdGNoRXhwciwKKworICAg
IGZpbmQ6IHt9LAorCisgICAgcmVsYXRpdmU6IHsKKyAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9k
ZSIsIGZpcnN0OiB0cnVlIH0sCisgICAgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sCisgICAg
IisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCisgICAgIn4iOiB7
IGRpcjogInByZXZpb3VzU2libGluZyIgfQorICAgIH0sCisKKyAgICBwcmVGaWx0ZXI6IHsKKyAg
ICAiQVRUUiI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKyAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJl
cGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisKKyAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2
YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAorICAgIG1hdGNoWzNd
ID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVu
ZXNjYXBlICk7CisKKyAgICBpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworICAgIG1hdGNoWzNd
ID0gIiAiICsgbWF0Y2hbM10gKyAiICI7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoLnNsaWNl
KCAwLCA0ICk7CisgICAgfSwKKworICAgICJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKKyAg
ICAvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCisgICAgMSB0eXBlIChvbmx5fG50
aHwuLi4pCisgICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQorICAgIDMgYXJndW1lbnQgKGV2ZW58
b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCisgICAgNCB4bi1jb21wb25lbnQgb2YgeG4reSBh
cmd1bWVudCAoWystXT9cZCpufCkKKyAgICA1IHNpZ24gb2YgeG4tY29tcG9uZW50CisgICAgNiB4
IG9mIHhuLWNvbXBvbmVudAorICAgIDcgc2lnbiBvZiB5LWNvbXBvbmVudAorICAgIDggeSBvZiB5
LWNvbXBvbmVudAorICAgICovCisgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgp
OworCisgICAgaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKKyAgICAv
LyBudGgtKiByZXF1aXJlcyBhcmd1bWVudAorICAgIGlmICggIW1hdGNoWzNdICkgeworICAgIFNp
enpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKyAgICB9CisKKyAgICAvLyBudW1lcmljIHggYW5kIHkg
cGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTEQKKyAgICAvLyByZW1lbWJlciB0aGF0IGZh
bHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCisgICAgbWF0Y2hbNF0gPSArKCBtYXRj
aFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09ICJl
dmVuIiB8fCBtYXRjaFszXSA9PT0gIm9kZCIgKSApOworICAgIG1hdGNoWzVdID0gKyggKCBtYXRj
aFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09ICJvZGQiICk7CisKKyAgICAvLyBvdGhl
ciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMKKyAgICB9IGVsc2UgaWYgKCBtYXRjaFszXSApIHsK
KyAgICBTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNo
OworICAgIH0sCisKKyAgICAiUFNFVURPIjogZnVuY3Rpb24oIG1hdGNoICkgeworICAgIHZhciBl
eGNlc3MsCisgICAgdW5xdW90ZWQgPSAhbWF0Y2hbNV0gJiYgbWF0Y2hbMl07CisKKyAgICBpZiAo
IG1hdGNoRXhwclsiQ0hJTEQiXS50ZXN0KCBtYXRjaFswXSApICkgeworICAgIHJldHVybiBudWxs
OworICAgIH0KKworICAgIC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzCisgICAgaWYg
KCBtYXRjaFs0XSApIHsKKyAgICBtYXRjaFsyXSA9IG1hdGNoWzRdOworCisgICAgLy8gU3RyaXAg
ZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHMKKyAgICB9IGVsc2UgaWYg
KCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiYKKyAgICAvLyBHZXQgZXhj
ZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQorICAgIChleGNlc3MgPSB0b2tlbml6ZSgg
dW5xdW90ZWQsIHRydWUgKSkgJiYKKyAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3Npbmcg
cGFyZW50aGVzaXMKKyAgICAoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1b3Rl
ZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7CisKKyAgICAvLyBleGNl
c3MgaXMgYSBuZWdhdGl2ZSBpbmRleAorICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAs
IGV4Y2VzcyApOworICAgIG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwor
ICAgIH0KKworICAgIC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRv
IGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KQorICAgIHJldHVybiBtYXRjaC5zbGlj
ZSggMCwgMyApOworICAgIH0KKyAgICB9LAorCisgICAgZmlsdGVyOiB7CisKKyAgICAiVEFHIjog
ZnVuY3Rpb24oIG5vZGVOYW1lICkgeworICAgIGlmICggbm9kZU5hbWUgPT09ICIqIiApIHsKKyAg
ICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OworICAgIH0KKworICAgIG5vZGVO
YW1lID0gbm9kZU5hbWUucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2Fz
ZSgpOworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxlbS5ub2Rl
TmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lOworICAgIH07
CisgICAgfSwKKworICAgICJDTEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7CisgICAgdmFy
IHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKKworICAgIHJldHVybiBw
YXR0ZXJuIHx8CisgICAgKHBhdHRlcm4gPSBuZXcgUmVnRXhwKCAiKF58IiArIHdoaXRlc3BhY2Ug
KyAiKSIgKyBjbGFzc05hbWUgKyAiKCIgKyB3aGl0ZXNwYWNlICsgInwkKSIgKSkgJiYKKyAgICBj
bGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBwYXR0
ZXJuLnRlc3QoIGVsZW0uY2xhc3NOYW1lIHx8ICh0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09
IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgfHwgIiIgKTsKKyAg
ICB9KTsKKyAgICB9LAorCisgICAgIkFUVFIiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNo
ZWNrICkgeworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgcmVzdWx0ID0g
U2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTsKKworICAgIGlmICggcmVzdWx0ID09IG51bGwgKSB7
CisgICAgcmV0dXJuIG9wZXJhdG9yID09PSAiIT0iOworICAgIH0KKyAgICBpZiAoICFvcGVyYXRv
ciApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN1bHQgKz0gIiI7CisKKyAg
ICByZXR1cm4gb3BlcmF0b3IgPT09ICI9IiA/IHJlc3VsdCA9PT0gY2hlY2sgOgorICAgIG9wZXJh
dG9yID09PSAiIT0iID8gcmVzdWx0ICE9PSBjaGVjayA6CisgICAgb3BlcmF0b3IgPT09ICJePSIg
PyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6CisgICAgb3BlcmF0b3Ig
PT09ICIqPSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKyAgICBv
cGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCAp
ID09PSBjaGVjayA6CisgICAgb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiArIHJlc3VsdCArICIg
IiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CisgICAgb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1
bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBj
aGVjayArICItIiA6CisgICAgZmFsc2U7CisgICAgfTsKKyAgICB9LAorCisgICAgIkNISUxEIjog
ZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHsKKyAgICB2YXIg
c2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKKyAgICBmb3J3YXJkID0gdHlw
ZS5zbGljZSggLTQgKSAhPT0gImxhc3QiLAorICAgIG9mVHlwZSA9IHdoYXQgPT09ICJvZi10eXBl
IjsKKworICAgIHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID8KKworICAgIC8vIFNo
b3J0Y3V0IGZvciA6bnRoLSoobikKKyAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4g
ISFlbGVtLnBhcmVudE5vZGU7CisgICAgfSA6CisKKyAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4
dCwgeG1sICkgeworICAgIHZhciBjYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgZGlmZiwgbm9kZUlu
ZGV4LCBzdGFydCwKKyAgICBkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmci
IDogInByZXZpb3VzU2libGluZyIsCisgICAgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLAorICAg
IG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAorICAgIHVzZUNh
Y2hlID0gIXhtbCAmJiAhb2ZUeXBlOworCisgICAgaWYgKCBwYXJlbnQgKSB7CisKKyAgICAvLyA6
KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpCisgICAgaWYgKCBzaW1wbGUgKSB7Cisg
ICAgd2hpbGUgKCBkaXIgKSB7CisgICAgbm9kZSA9IGVsZW07CisgICAgd2hpbGUgKCAobm9kZSA9
IG5vZGVbIGRpciBdKSApIHsKKyAgICBpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dl
ckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CisgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKyAgICB9CisgICAgLy8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSog
KGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pCisgICAgc3RhcnQgPSBkaXIgPSB0eXBlID09PSAi
b25seSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisgICAgfQorICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBw
YXJlbnQubGFzdENoaWxkIF07CisKKyAgICAvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9y
ZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YAorICAgIGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSAp
IHsKKyAgICAvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXgKKyAg
ICBvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0g
e30pOworICAgIGNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdOworICAgIG5vZGVJbmRl
eCA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzFdOworICAgIGRpZmYgPSBjYWNoZVsw
XSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTsKKyAgICBub2RlID0gbm9kZUluZGV4ICYmIHBhcmVu
dC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTsKKworICAgIHdoaWxlICggKG5vZGUgPSArK25vZGVJ
bmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisKKyAgICAvLyBGYWxsYmFjayB0byBzZWVr
aW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorICAgIChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwg
c3RhcnQucG9wKCkpICkgeworCisgICAgLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBg
cGFyZW50YCBhbmQgYnJlYWsKKyAgICBpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZm
ICYmIG5vZGUgPT09IGVsZW0gKSB7CisgICAgb3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5z
LCBub2RlSW5kZXgsIGRpZmYgXTsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgLy8g
VXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCisgICAgfSBl
bHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsg
ZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKKyAg
ICBkaWZmID0gY2FjaGVbMV07CisKKyAgICAvLyB4bWwgOm50aC1jaGlsZCguLi4pIG9yIDpudGgt
bGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLikKKyAgICB9IGVsc2Ug
eworICAgIC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20g
dGhlIHN0YXJ0CisgICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9k
ZVsgZGlyIF0gfHwKKyAgICAoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSAp
IHsKKworICAgIGlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09
IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkgeworICAgIC8vIENhY2hl
IHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnQKKyAgICBpZiAoIHVzZUNhY2hl
ICkgeworICAgIChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5
cGUgXSA9IFsgZGlycnVucywgZGlmZiBdOworICAgIH0KKworICAgIGlmICggbm9kZSA9PT0gZWxl
bSApIHsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBJ
bmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQorICAg
IGRpZmYgLT0gbGFzdDsKKyAgICByZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmly
c3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsKKyAgICB9CisgICAgfTsKKyAgICB9LAor
CisgICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgeworICAgIC8vIHBz
ZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQorICAgIC8vIGh0dHA6Ly93d3cu
dzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXMKKyAgICAvLyBQcmlvcml0aXplIGJ5
IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1
cHBlcmNhc2UgbGV0dGVycworICAgIC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0
cyBmcm9tIHBzZXVkb3MKKyAgICB2YXIgYXJncywKKyAgICBmbiA9IEV4cHIucHNldWRvc1sgcHNl
dWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8CisgICAg
U2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CisKKyAgICAv
LyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CisgICAgLy8g
YXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KKyAgICAv
LyBqdXN0IGFzIFNpenpsZSBkb2VzCisgICAgaWYgKCBmblsgZXhwYW5kbyBdICkgeworICAgIHJl
dHVybiBmbiggYXJndW1lbnQgKTsKKyAgICB9CisKKyAgICAvLyBCdXQgbWFpbnRhaW4gc3VwcG9y
dCBmb3Igb2xkIHNpZ25hdHVyZXMKKyAgICBpZiAoIGZuLmxlbmd0aCA+IDEgKSB7CisgICAgYXJn
cyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOworICAgIHJldHVybiBFeHByLnNl
dEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPworICAgIG1h
cmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKKyAgICB2YXIgaWR4LAorICAg
IG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKKyAgICBpID0gbWF0Y2hlZC5sZW5ndGg7
CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRj
aGVkW2ldICk7CisgICAgc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRb
aV0gKTsKKyAgICB9CisgICAgfSkgOgorICAgIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVy
biBmbiggZWxlbSwgMCwgYXJncyApOworICAgIH07CisgICAgfQorCisgICAgcmV0dXJuIGZuOwor
ICAgIH0KKyAgICB9LAorCisgICAgcHNldWRvczogeworICAgIC8vIFBvdGVudGlhbGx5IGNvbXBs
ZXggcHNldWRvcworICAgICJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkg
eworICAgIC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCisgICAgLy8gdG8g
YXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICAvLyBzcGFjZXMgYXMgY29t
YmluYXRvcnMKKyAgICB2YXIgaW5wdXQgPSBbXSwKKyAgICByZXN1bHRzID0gW10sCisgICAgbWF0
Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICkgKTsKKworICAg
IHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gPworICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbigg
c2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgeworICAgIHZhciBlbGVtLAorICAgIHVubWF0
Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSwKKyAgICBpID0gc2VlZC5sZW5n
dGg7CisKKyAgICAvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgCisgICAg
d2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CisgICAg
c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pOworICAgIH0KKyAgICB9CisgICAgfSkgOgor
ICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgaW5wdXRbMF0gPSBlbGVt
OworICAgIG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKKyAgICByZXR1cm4g
IXJlc3VsdHMucG9wKCk7CisgICAgfTsKKyAgICB9KSwKKworICAgICJoYXMiOiBtYXJrRnVuY3Rp
b24oZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICByZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7CisgICAgfTsK
KyAgICB9KSwKKworICAgICJjb250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCAp
IHsKKyAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuICggZWxlbS50ZXh0
Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0
ZXh0ICkgPiAtMTsKKyAgICB9OworICAgIH0pLAorCisgICAgLy8gIldoZXRoZXIgYW4gZWxlbWVu
dCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3IKKyAgICAvLyBpcyBiYXNlZCBz
b2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIGJlaW5nIGVxdWFs
IHRvIHRoZSBpZGVudGlmaWVyIEMsCisgICAgLy8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50
aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAiLSIuCisgICAgLy8gVGhlIG1hdGNoaW5n
IG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBj
YXNlLWluc2Vuc2l0aXZlbHkuCisgICAgLy8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZl
IHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS4iCisgICAgLy8gaHR0cDovL3d3dy53My5vcmcv
VFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkbworICAgICJsYW5nIjogbWFya0Z1bmN0aW9uKCBmdW5j
dGlvbiggbGFuZyApIHsKKyAgICAvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlm
aWRlcgorICAgIGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCAiIikgKSB7CisgICAgU2l6
emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKKyAgICB9CisgICAgbGFu
ZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwor
ICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgZWxlbUxhbmc7CisgICAgZG8g
eworICAgIGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc1hNTCA/CisgICAgZWxlbS5nZXRBdHRy
aWJ1dGUoInhtbDpsYW5nIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSA6CisgICAgZWxl
bS5sYW5nKSApIHsKKworICAgIGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTsKKyAg
ICByZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICIt
IiApID09PSAwOworICAgIH0KKyAgICB9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUp
ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAg
ICB9KSwKKworICAgIC8vIE1pc2NlbGxhbmVvdXMKKyAgICAidGFyZ2V0IjogZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9u
Lmhhc2g7CisgICAgcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwor
ICAgIH0sCisKKyAgICAicm9vdCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBlbGVt
ID09PSBkb2NFbGVtOworICAgIH0sCisKKyAgICAiZm9jdXMiOiBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICByZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50
Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVt
LmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOworICAgIH0sCisKKyAgICAvLyBCb29sZWFuIHByb3Bl
cnRpZXMKKyAgICAiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiBlbGVt
LmRpc2FibGVkID09PSBmYWxzZTsKKyAgICB9LAorCisgICAgImRpc2FibGVkIjogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CisgICAgfSwKKwor
ICAgICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgLy8gSW4gQ1NTMywgOmNoZWNr
ZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCisgICAg
Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5Mjkv
I2NoZWNrZWQKKyAgICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7
CisgICAgcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwg
KG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOworICAgIH0sCisKKyAg
ICAic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAvLyBBY2Nlc3NpbmcgdGhpcyBw
cm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CisgICAgLy8gb3B0aW9ucyBpbiBTYWZh
cmkgd29yayBwcm9wZXJseQorICAgIGlmICggZWxlbS5wYXJlbnROb2RlICkgeworICAgIGVsZW0u
cGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworICAgIH0KKworICAgIHJldHVybiBlbGVtLnNlbGVj
dGVkID09PSB0cnVlOworICAgIH0sCisKKyAgICAvLyBDb250ZW50cworICAgICJlbXB0eSI6IGZ1
bmN0aW9uKCBlbGVtICkgeworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8j
ZW1wdHktcHNldWRvCisgICAgLy8gOmVtcHR5IGlzIG9ubHkgYWZmZWN0ZWQgYnkgZWxlbWVudCBu
b2RlcyBhbmQgY29udGVudCBub2RlcyhpbmNsdWRpbmcgdGV4dCgzKSwgY2RhdGEoNCkpLAorICAg
IC8vICAgbm90IGNvbW1lbnQsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBvciBvdGhlcnMKKyAg
ICAvLyBUaGFua3MgdG8gRGllZ28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXQKKyAg
ICAvLyAgIEdyZWF0ZXIgdGhhbiAiQCIgbWVhbnMgYWxwaGEgY2hhcmFjdGVycyAoc3BlY2lmaWNh
bGx5IG5vdCBzdGFydGluZyB3aXRoICIjIiBvciAiPyIpCisgICAgZm9yICggZWxlbSA9IGVsZW0u
Zmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7CisgICAgaWYgKCBl
bGVtLm5vZGVOYW1lID4gIkAiIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlw
ZSA9PT0gNCApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9LAorCisgICAgInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJl
dHVybiAhRXhwci5wc2V1ZG9zWyJlbXB0eSJdKCBlbGVtICk7CisgICAgfSwKKworICAgIC8vIEVs
ZW1lbnQvaW5wdXQgdHlwZXMKKyAgICAiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOworICAgIH0sCisKKyAgICAiaW5w
dXQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5v
ZGVOYW1lICk7CisgICAgfSwKKworICAgICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gbmFt
ZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0
b24iOworICAgIH0sCisKKyAgICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBh
dHRyOworICAgIC8vIElFNiBhbmQgNyB3aWxsIG1hcCBlbGVtLnR5cGUgdG8gJ3RleHQnIGZvciBu
ZXcgSFRNTDUgdHlwZXMgKHNlYXJjaCwgZXRjKQorICAgIC8vIHVzZSBnZXRBdHRyaWJ1dGUgaW5z
dGVhZCB0byB0ZXN0IHRoaXMgY2FzZQorICAgIHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJD
YXNlKCkgPT09ICJpbnB1dCIgJiYKKyAgICBlbGVtLnR5cGUgPT09ICJ0ZXh0IiAmJgorICAgICgg
KGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dl
ckNhc2UoKSA9PT0gZWxlbS50eXBlICk7CisgICAgfSwKKworICAgIC8vIFBvc2l0aW9uLWluLWNv
bGxlY3Rpb24KKyAgICAiZmlyc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiBbIDAgXTsKKyAgICB9KSwKKworICAgICJsYXN0IjogY3JlYXRlUG9zaXRp
b25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgcmV0dXJu
IFsgbGVuZ3RoIC0gMSBdOworICAgIH0pLAorCisgICAgImVxIjogY3JlYXRlUG9zaXRpb25hbFBz
ZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworICAgIHJl
dHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKKyAg
ICB9KSwKKworICAgICJldmVuIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0
Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgdmFyIGkgPSAwOworICAgIGZvciAoIDsgaSA8IGxl
bmd0aDsgaSArPSAyICkgeworICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgfQorICAg
IHJldHVybiBtYXRjaEluZGV4ZXM7CisgICAgfSksCisKKyAgICAib2RkIjogY3JlYXRlUG9zaXRp
b25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgdmFyIGkg
PSAxOworICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgeworICAgIG1hdGNoSW5kZXhl
cy5wdXNoKCBpICk7CisgICAgfQorICAgIHJldHVybiBtYXRjaEluZGV4ZXM7CisgICAgfSksCisK
KyAgICAibHQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMs
IGxlbmd0aCwgYXJndW1lbnQgKSB7CisgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVu
dCArIGxlbmd0aCA6IGFyZ3VtZW50OworICAgIGZvciAoIDsgLS1pID49IDA7ICkgeworICAgIG1h
dGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgfQorICAgIHJldHVybiBtYXRjaEluZGV4ZXM7Cisg
ICAgfSksCisKKyAgICAiZ3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRj
aEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7CisgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAg
PyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OworICAgIGZvciAoIDsgKytpIDwgbGVuZ3Ro
OyApIHsKKyAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOworICAgIH0KKyAgICByZXR1cm4gbWF0
Y2hJbmRleGVzOworICAgIH0pCisgICAgfQorfTsKKworLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBl
IHBzZXVkb3MKK2ZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6
IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgeworICAgIEV4cHIucHNldWRv
c1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTsKK30KK2ZvciAoIGkgaW4geyBzdWJtaXQ6
IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CisgICAgRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVC
dXR0b25Qc2V1ZG8oIGkgKTsKK30KKworZnVuY3Rpb24gdG9rZW5pemUoIHNlbGVjdG9yLCBwYXJz
ZU9ubHkgKSB7CisgICAgdmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsCisgICAgc29G
YXIsIGdyb3VwcywgcHJlRmlsdGVycywKKyAgICBjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3Rv
ciArICIgIiBdOworCisgICAgaWYgKCBjYWNoZWQgKSB7CisgICAgcmV0dXJuIHBhcnNlT25seSA/
IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTsKKyAgICB9CisKKyAgICBzb0ZhciA9IHNlbGVjdG9yOwor
ICAgIGdyb3VwcyA9IFtdOworICAgIHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKKworICAg
IHdoaWxlICggc29GYXIgKSB7CisKKyAgICAvLyBDb21tYSBhbmQgZmlyc3QgcnVuCisgICAgaWYg
KCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CisgICAgaWYg
KCBtYXRjaCApIHsKKyAgICAvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxp
ZAorICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOwor
ICAgIH0KKyAgICBncm91cHMucHVzaCggdG9rZW5zID0gW10gKTsKKyAgICB9CisKKyAgICBtYXRj
aGVkID0gZmFsc2U7CisKKyAgICAvLyBDb21iaW5hdG9ycworICAgIGlmICggKG1hdGNoID0gcmNv
bWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkgeworICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgp
OworICAgIHRva2Vucy5wdXNoKCB7CisgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgLy8gQ2FzdCBk
ZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCisgICAgdHlwZTogbWF0Y2hbMF0ucmVwbGFj
ZSggcnRyaW0sICIgIiApCisgICAgfSApOworICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNo
ZWQubGVuZ3RoICk7CisgICAgfQorCisgICAgLy8gRmlsdGVycworICAgIGZvciAoIHR5cGUgaW4g
RXhwci5maWx0ZXIgKSB7CisgICAgaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVj
KCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAorICAgIChtYXRjaCA9IHByZUZp
bHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgeworICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgp
OworICAgIHRva2Vucy5wdXNoKCB7CisgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgdHlwZTogdHlw
ZSwKKyAgICBtYXRjaGVzOiBtYXRjaAorICAgIH0gKTsKKyAgICBzb0ZhciA9IHNvRmFyLnNsaWNl
KCBtYXRjaGVkLmxlbmd0aCApOworICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFtYXRjaGVkICkg
eworICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBv
ZiB0aGUgaW52YWxpZCBleGNlc3MKKyAgICAvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmcKKyAgICAv
LyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnMKKyAgICByZXR1cm4g
cGFyc2VPbmx5ID8KKyAgICBzb0Zhci5sZW5ndGggOgorICAgIHNvRmFyID8KKyAgICBTaXp6bGUu
ZXJyb3IoIHNlbGVjdG9yICkgOgorICAgIC8vIENhY2hlIHRoZSB0b2tlbnMKKyAgICB0b2tlbkNh
Y2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKK30KKworZnVuY3Rpb24gdG9TZWxl
Y3RvciggdG9rZW5zICkgeworICAgIHZhciBpID0gMCwKKyAgICBsZW4gPSB0b2tlbnMubGVuZ3Ro
LAorICAgIHNlbGVjdG9yID0gIiI7CisgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAg
c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gc2VsZWN0b3I7
Cit9CisKK2Z1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2Ug
KSB7CisgICAgdmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLAorICAgIGNoZWNrTm9uRWxlbWVudHMg
PSBiYXNlICYmIGRpciA9PT0gInBhcmVudE5vZGUiLAorICAgIGRvbmVOYW1lID0gZG9uZSsrOwor
CisgICAgcmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgPworICAgIC8vIENoZWNrIGFnYWluc3QgY2xv
c2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudAorICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250
ZXh0LCB4bWwgKSB7CisgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBp
ZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICByZXR1
cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7CisgICAgfQorICAgIH0KKyAgICB9IDoK
KworICAgIC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwor
ICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGRhdGEsIGNhY2hl
LCBvdXRlckNhY2hlLAorICAgIGRpcmtleSA9IGRpcnJ1bnMgKyAiICIgKyBkb25lTmFtZTsKKwor
ICAgIC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkg
ZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nCisgICAgaWYgKCB4bWwgKSB7CisgICAgd2hp
bGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICBpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRl
eHQsIHhtbCApICkgeworICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAg
IH0gZWxzZSB7CisgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICBpZiAo
IGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICBvdXRlckNh
Y2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSk7CisgICAgaWYg
KCAoY2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiYgY2FjaGVbMF0gPT09IGRpcmtleSApIHsK
KyAgICBpZiAoIChkYXRhID0gY2FjaGVbMV0pID09PSB0cnVlIHx8IGRhdGEgPT09IGNhY2hlZHJ1
bnMgKSB7CisgICAgcmV0dXJuIGRhdGEgPT09IHRydWU7CisgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgY2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSA9IFsgZGlya2V5IF07CisgICAgY2FjaGVbMV0g
PSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB8fCBjYWNoZWRydW5zOworICAgIGlmICgg
Y2FjaGVbMV0gPT09IHRydWUgKSB7CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAg
ICB9CisgICAgfQorICAgIH0KKyAgICB9OworfQorCitmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcigg
bWF0Y2hlcnMgKSB7CisgICAgcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPworICAgIGZ1bmN0
aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7
CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRl
eHQsIHhtbCApICkgeworICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgfQorICAgIHJldHVy
biB0cnVlOworICAgIH0gOgorICAgIG1hdGNoZXJzWzBdOworfQorCitmdW5jdGlvbiBjb25kZW5z
ZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkgeworICAgIHZhciBlbGVt
LAorICAgIG5ld1VubWF0Y2hlZCA9IFtdLAorICAgIGkgPSAwLAorICAgIGxlbiA9IHVubWF0Y2hl
ZC5sZW5ndGgsCisgICAgbWFwcGVkID0gbWFwICE9IG51bGw7CisKKyAgICBmb3IgKCA7IGkgPCBs
ZW47IGkrKyApIHsKKyAgICBpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKKyAgICBpZiAo
ICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICBuZXdVbm1h
dGNoZWQucHVzaCggZWxlbSApOworICAgIGlmICggbWFwcGVkICkgeworICAgIG1hcC5wdXNoKCBp
ICk7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld1VubWF0Y2hl
ZDsKK30KKworZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hl
ciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgeworICAgIGlmICggcG9z
dEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkgeworICAgIHBvc3RGaWx0ZXIgPSBz
ZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7CisgICAgfQorICAgIGlmICggcG9zdEZpbmRlciAmJiAh
cG9zdEZpbmRlclsgZXhwYW5kbyBdICkgeworICAgIHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBw
b3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKKyAgICB9CisgICAgcmV0dXJuIG1hcmtGdW5jdGlv
bihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgeworICAgIHZhciB0ZW1w
LCBpLCBlbGVtLAorICAgIHByZU1hcCA9IFtdLAorICAgIHBvc3RNYXAgPSBbXSwKKyAgICBwcmVl
eGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLAorCisgICAgLy8gR2V0IGluaXRpYWwgZWxlbWVudHMg
ZnJvbSBzZWVkIG9yIGNvbnRleHQKKyAgICBlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0
cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250
ZXh0LCBbXSApLAorCisgICAgLy8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVz
ZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uCisgICAgbWF0Y2hl
ckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisgICAgY29uZGVuc2Uo
IGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorICAgIGVsZW1zLAor
CisgICAgbWF0Y2hlck91dCA9IG1hdGNoZXIgPworICAgIC8vIElmIHdlIGhhdmUgYSBwb3N0Rmlu
ZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0
aW5nIHJlc3VsdHMsCisgICAgcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVl
eGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPworCisgICAgLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nl
c3NpbmcgaXMgbmVjZXNzYXJ5CisgICAgW10gOgorCisgICAgLy8gLi4ub3RoZXJ3aXNlIHVzZSBy
ZXN1bHRzIGRpcmVjdGx5CisgICAgcmVzdWx0cyA6CisgICAgbWF0Y2hlckluOworCisgICAgLy8g
RmluZCBwcmltYXJ5IG1hdGNoZXMKKyAgICBpZiAoIG1hdGNoZXIgKSB7CisgICAgbWF0Y2hlcigg
bWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTsKKyAgICB9CisKKyAgICAvLyBB
cHBseSBwb3N0RmlsdGVyCisgICAgaWYgKCBwb3N0RmlsdGVyICkgeworICAgIHRlbXAgPSBjb25k
ZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApOworICAgIHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBj
b250ZXh0LCB4bWwgKTsKKworICAgIC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92
aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KKyAgICBpID0gdGVtcC5sZW5ndGg7CisgICAgd2hp
bGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgeworICAgIG1hdGNoZXJP
dXRbIHBvc3RNYXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKyAg
ICB9CisgICAgfQorICAgIH0KKworICAgIGlmICggc2VlZCApIHsKKyAgICBpZiAoIHBvc3RGaW5k
ZXIgfHwgcHJlRmlsdGVyICkgeworICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAgICAvLyBHZXQg
dGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRv
IHBvc3RGaW5kZXIgY29udGV4dHMKKyAgICB0ZW1wID0gW107CisgICAgaSA9IG1hdGNoZXJPdXQu
bGVuZ3RoOworICAgIHdoaWxlICggaS0tICkgeworICAgIGlmICggKGVsZW0gPSBtYXRjaGVyT3V0
W2ldKSApIHsKKyAgICAvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQg
YSBmaW5hbCBtYXRjaAorICAgIHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7Cisg
ICAgfQorICAgIH0KKyAgICBwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVt
cCwgeG1sICk7CisgICAgfQorCisgICAgLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2Vl
ZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKKyAgICBpID0gbWF0Y2hlck91
dC5sZW5ndGg7CisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgaWYgKCAoZWxlbSA9IG1hdGNoZXJP
dXRbaV0pICYmCisgICAgKHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZi5jYWxsKCBzZWVkLCBl
bGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CisKKyAgICBzZWVkW3RlbXBdID0gIShyZXN1bHRz
W3RlbXBdID0gZWxlbSk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgZWxlbWVu
dHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWQKKyAgICB9IGVsc2Ug
eworICAgIG1hdGNoZXJPdXQgPSBjb25kZW5zZSgKKyAgICBtYXRjaGVyT3V0ID09PSByZXN1bHRz
ID8KKyAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3Ro
ICkgOgorICAgIG1hdGNoZXJPdXQKKyAgICApOworICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAg
ICBwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKKyAgICB9IGVs
c2UgeworICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKKyAgICB9CisgICAg
fQorICAgIH0pOworfQorCitmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewor
ICAgIHZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosCisgICAgbGVuID0gdG9rZW5zLmxlbmd0
aCwKKyAgICBsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBd
LAorICAgIGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2
ZVsiICJdLAorICAgIGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCwKKworICAgIC8vIFRoZSBm
b3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBm
cm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCisgICAgbWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRv
ciggZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsK
KyAgICB9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCisgICAgbWF0Y2hBbnlDb250ZXh0ID0g
YWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGluZGV4T2YuY2Fs
bCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTsKKyAgICB9LCBpbXBsaWNpdFJlbGF0aXZlLCB0
cnVlICksCisgICAgbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7
CisgICAgcmV0dXJuICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBv
dXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoCisgICAgKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5v
ZGVUeXBlID8KKyAgICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoKKyAgICBt
YXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7CisgICAgfSBdOworCisgICAg
Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRp
dmVbIHRva2Vuc1tpXS50eXBlIF0pICkgeworICAgIG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9y
KGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdOworICAgIH0gZWxzZSB7Cisg
ICAgbWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0
b2tlbnNbaV0ubWF0Y2hlcyApOworCisgICAgLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcg
YSBwb3NpdGlvbmFsIG1hdGNoZXIKKyAgICBpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKKyAg
ICAvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIg
aGFuZGxpbmcKKyAgICBqID0gKytpOworICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgeworICAg
IGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKyAgICBicmVhazsKKyAg
ICB9CisgICAgfQorICAgIHJldHVybiBzZXRNYXRjaGVyKAorICAgIGkgPiAxICYmIGVsZW1lbnRN
YXRjaGVyKCBtYXRjaGVycyApLAorICAgIGkgPiAxICYmIHRvU2VsZWN0b3IoIHRva2Vucy5zbGlj
ZSggMCwgaSAtIDEgKSApLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCisgICAgbWF0Y2hlciwKKyAg
ICBpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKKyAg
ICBqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBq
ICkpICksCisgICAgaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQorICAgICk7CisgICAg
fQorICAgIG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTsKKyAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRjaGVyRnJv
bUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7CisgICAgLy8g
QSBjb3VudGVyIHRvIHNwZWNpZnkgd2hpY2ggZWxlbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgbWF0
Y2hlZAorICAgIHZhciBtYXRjaGVyQ2FjaGVkUnVucyA9IDAsCisgICAgYnlTZXQgPSBzZXRNYXRj
aGVycy5sZW5ndGggPiAwLAorICAgIGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGgg
PiAwLAorICAgIHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJl
c3VsdHMsIGV4cGFuZENvbnRleHQgKSB7CisgICAgdmFyIGVsZW0sIGosIG1hdGNoZXIsCisgICAg
c2V0TWF0Y2hlZCA9IFtdLAorICAgIG1hdGNoZWRDb3VudCA9IDAsCisgICAgaSA9ICIwIiwKKyAg
ICB1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAorICAgIG91dGVybW9zdCA9IGV4cGFuZENvbnRleHQg
IT0gbnVsbCwKKyAgICBjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKyAgICAvLyBX
ZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIGNvbnRleHQKKyAgICBl
bGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgZXhwYW5k
Q29udGV4dCAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCApLAorICAgIC8vIFVzZSBp
bnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisgICAgZGly
cnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRo
LnJhbmRvbSgpIHx8IDAuMSk7CisKKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBvdXRlcm1v
c3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKKyAgICBjYWNoZWRy
dW5zID0gbWF0Y2hlckNhY2hlZFJ1bnM7CisgICAgfQorCisgICAgLy8gQWRkIGVsZW1lbnRzIHBh
c3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKKyAgICAvLyBLZWVwIGBp
YCBhIHN0cmluZyBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgc28gYG1hdGNoZWRDb3VudGAgd2ls
bCBiZSAiMDAiIGJlbG93CisgICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBp
KysgKSB7CisgICAgaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKKyAgICBqID0gMDsKKyAgICB3
aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkgeworICAgIGlmICggbWF0
Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CisgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7
CisgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBk
aXJydW5zID0gZGlycnVuc1VuaXF1ZTsKKyAgICBjYWNoZWRydW5zID0gKyttYXRjaGVyQ2FjaGVk
UnVuczsKKyAgICB9CisgICAgfQorCisgICAgLy8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZv
ciBzZXQgZmlsdGVycworICAgIGlmICggYnlTZXQgKSB7CisgICAgLy8gVGhleSB3aWxsIGhhdmUg
Z29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycworICAgIGlmICggKGVsZW0gPSAhbWF0
Y2hlciAmJiBlbGVtKSApIHsKKyAgICBtYXRjaGVkQ291bnQtLTsKKyAgICB9CisKKyAgICAvLyBM
ZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CisgICAg
aWYgKCBzZWVkICkgeworICAgIHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7CisgICAgfQorICAgIH0K
KyAgICB9CisKKyAgICAvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHMK
KyAgICBtYXRjaGVkQ291bnQgKz0gaTsKKyAgICBpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRD
b3VudCApIHsKKyAgICBqID0gMDsKKyAgICB3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNb
aisrXSkgKSB7CisgICAgbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4
bWwgKTsKKyAgICB9CisKKyAgICBpZiAoIHNlZWQgKSB7CisgICAgLy8gUmVpbnRlZ3JhdGUgZWxl
bWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZworICAgIGlmICgg
bWF0Y2hlZENvdW50ID4gMCApIHsKKyAgICB3aGlsZSAoIGktLSApIHsKKyAgICBpZiAoICEodW5t
YXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgeworICAgIHNldE1hdGNoZWRbaV0gPSBwb3Au
Y2FsbCggcmVzdWx0cyApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gRGlzY2FyZCBp
bmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXMKKyAgICBz
ZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsKKyAgICB9CisKKyAgICAvLyBBZGQg
bWF0Y2hlcyB0byByZXN1bHRzCisgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCAp
OworCisgICAgLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNj
ZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nCisgICAgaWYgKCBvdXRlcm1vc3QgJiYg
IXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmCisgICAgKCBtYXRjaGVkQ291bnQgKyBz
ZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7CisKKyAgICBTaXp6bGUudW5pcXVlU29ydCggcmVz
dWx0cyApOworICAgIH0KKyAgICB9CisKKyAgICAvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2Yg
Z2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKKyAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICBk
aXJydW5zID0gZGlycnVuc1VuaXF1ZTsKKyAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJh
Y2t1cDsKKyAgICB9CisKKyAgICByZXR1cm4gdW5tYXRjaGVkOworICAgIH07CisKKyAgICByZXR1
cm4gYnlTZXQgPworICAgIG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOgorICAgIHN1cGVy
TWF0Y2hlcjsKK30KKworY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVj
dG9yLCBncm91cCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKKyAgICB2YXIgaSwKKyAgICBz
ZXRNYXRjaGVycyA9IFtdLAorICAgIGVsZW1lbnRNYXRjaGVycyA9IFtdLAorICAgIGNhY2hlZCA9
IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CisKKyAgICBpZiAoICFjYWNoZWQgKSB7
CisgICAgLy8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQg
Y2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50CisgICAgaWYgKCAhZ3JvdXAgKSB7Cisg
ICAgZ3JvdXAgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKKyAgICB9CisgICAgaSA9IGdyb3VwLmxl
bmd0aDsKKyAgICB3aGlsZSAoIGktLSApIHsKKyAgICBjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2Vu
cyggZ3JvdXBbaV0gKTsKKyAgICBpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgeworICAgIHNldE1h
dGNoZXJzLnB1c2goIGNhY2hlZCApOworICAgIH0gZWxzZSB7CisgICAgZWxlbWVudE1hdGNoZXJz
LnB1c2goIGNhY2hlZCApOworICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWNoZSB0aGUgY29tcGls
ZWQgZnVuY3Rpb24KKyAgICBjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hl
ckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKKyAg
ICB9CisgICAgcmV0dXJuIGNhY2hlZDsKK307CisKK2Z1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMo
IHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgbGVu
ID0gY29udGV4dHMubGVuZ3RoOworICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworICAgIFNp
enpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7CisgICAgfQorICAgIHJldHVy
biByZXN1bHRzOworfQorCitmdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1
bHRzLCBzZWVkICkgeworICAgIHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLAorICAg
IG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CisKKyAgICBpZiAoICFzZWVkICkgeworICAg
IC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3Vw
CisgICAgaWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7CisKKyAgICAvLyBUYWtlIGEgc2hvcnRj
dXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRAorICAg
IHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKKyAgICBpZiAoIHRva2Vu
cy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgorICAg
IGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWRvY3VtZW50SXNYTUwgJiYKKyAgICBFeHByLnJl
bGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgeworCisgICAgY29udGV4dCA9IEV4cHIuZmluZFsi
SUQiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLCBj
b250ZXh0IClbMF07CisgICAgaWYgKCAhY29udGV4dCApIHsKKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgICB9CisKKyAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52
YWx1ZS5sZW5ndGggKTsKKyAgICB9CisKKyAgICAvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdo
dC10by1sZWZ0IG1hdGNoaW5nCisgICAgaSA9IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVz
dCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoOworICAgIHdoaWxlICggaS0tICkgewor
ICAgIHRva2VuID0gdG9rZW5zW2ldOworCisgICAgLy8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmlu
YXRvcgorICAgIGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewor
ICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkg
eworICAgIC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBj
b21iaW5hdG9ycworICAgIGlmICggKHNlZWQgPSBmaW5kKAorICAgIHRva2VuLm1hdGNoZXNbMF0u
cmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSwKKyAgICByc2libGluZy50ZXN0KCB0b2tl
bnNbMF0udHlwZSApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0CisgICAgKSkgKSB7
CisKKyAgICAvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiBy
ZXR1cm4gZWFybHkKKyAgICB0b2tlbnMuc3BsaWNlKCBpLCAxICk7CisgICAgc2VsZWN0b3IgPSBz
ZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKKyAgICBpZiAoICFzZWxlY3RvciAp
IHsKKyAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKCBzZWVkLCAwICkgKTsKKyAg
ICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAg
IH0KKyAgICB9CisgICAgfQorCisgICAgLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmlu
ZyBmdW5jdGlvbgorICAgIC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlv
biBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKyAgICBjb21waWxlKCBzZWxlY3Rv
ciwgbWF0Y2ggKSgKKyAgICBzZWVkLAorICAgIGNvbnRleHQsCisgICAgZG9jdW1lbnRJc1hNTCwK
KyAgICByZXN1bHRzLAorICAgIHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkKKyAgICApOworICAg
IHJldHVybiByZXN1bHRzOworfQorCisvLyBEZXByZWNhdGVkCitFeHByLnBzZXVkb3NbIm50aCJd
ID0gRXhwci5wc2V1ZG9zWyJlcSJdOworCisvLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNl
dEZpbHRlcnMKK2Z1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQorRXhwci5maWx0ZXJzID0gc2V0Rmls
dGVycy5wcm90b3R5cGUgPSBFeHByLnBzZXVkb3M7CitFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0
RmlsdGVycygpOworCisvLyBJbml0aWFsaXplIHdpdGggdGhlIGRlZmF1bHQgZG9jdW1lbnQKK3Nl
dERvY3VtZW50KCk7CisKKy8vIE92ZXJyaWRlIHNpenpsZSBhdHRyaWJ1dGUgcmV0cmlldmFsCitT
aXp6bGUuYXR0ciA9IGpRdWVyeS5hdHRyOworalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnku
ZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIu
cHNldWRvczsKK2pRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0
ID0gU2l6emxlLmdldFRleHQ7CitqUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVl
cnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7CisKKworfSkoIHdpbmRvdyApOwordmFyIHJ1
bnRpbCA9IC9VbnRpbCQvLAorICAgIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86
VW50aWx8QWxsKSkvLAorICAgIGlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKKyAgICBybmVl
ZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LAorICAgIC8vIG1ldGhv
ZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20g
YSB1bmlxdWUgc2V0CisgICAgZ3VhcmFudGVlZFVuaXF1ZSA9IHsKKyAgICBjaGlsZHJlbjogdHJ1
ZSwKKyAgICBjb250ZW50czogdHJ1ZSwKKyAgICBuZXh0OiB0cnVlLAorICAgIHByZXY6IHRydWUK
KyAgICB9OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBmaW5kOiBmdW5jdGlvbiggc2VsZWN0
b3IgKSB7CisgICAgdmFyIGksIHJldCwgc2VsZiwKKyAgICBsZW4gPSB0aGlzLmxlbmd0aDsKKwor
ICAgIGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKyAgICBzZWxmID0gdGhp
czsKKyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIo
ZnVuY3Rpb24oKSB7CisgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBpZiAo
IGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CisgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIH0KKyAgICB9KSApOworICAgIH0KKworICAgIHJldCA9IFtdOworICAgIGZv
ciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0
aGlzWyBpIF0sIHJldCApOworICAgIH0KKworICAgIC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVj
dG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKQorICAg
IHJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiBy
ZXQgKTsKKyAgICByZXQuc2VsZWN0b3IgPSAoIHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9y
ICsgIiAiIDogIiIgKSArIHNlbGVjdG9yOworICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAg
IGhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKKyAgICB2YXIgaSwKKyAgICB0YXJnZXRzID0galF1
ZXJ5KCB0YXJnZXQsIHRoaXMgKSwKKyAgICBsZW4gPSB0YXJnZXRzLmxlbmd0aDsKKworICAgIHJl
dHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsg
aSsrICkgeworICAgIGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7
CisgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9KTsKKyAgICB9LAorCisgICAg
bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3
aW5ub3codGhpcywgc2VsZWN0b3IsIGZhbHNlKSApOworICAgIH0sCisKKyAgICBmaWx0ZXI6IGZ1
bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0
aGlzLCBzZWxlY3RvciwgdHJ1ZSkgKTsKKyAgICB9LAorCisgICAgaXM6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKKyAgICByZXR1cm4gISFzZWxlY3RvciAmJiAoCisgICAgdHlwZW9mIHNlbGVjdG9y
ID09PSAic3RyaW5nIiA/CisgICAgLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUg
c2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldAorICAgIC8vIHNv
ICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdp
dGggdHdvICJwIi4KKyAgICBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPworICAgIGpR
dWVyeSggc2VsZWN0b3IsIHRoaXMuY29udGV4dCApLmluZGV4KCB0aGlzWzBdICkgPj0gMCA6Cisg
ICAgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKKyAgICB0aGlz
LmZpbHRlciggc2VsZWN0b3IgKS5sZW5ndGggPiAwICk7CisgICAgfSwKKworICAgIGNsb3Nlc3Q6
IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CisgICAgdmFyIGN1ciwKKyAgICBpID0g
MCwKKyAgICBsID0gdGhpcy5sZW5ndGgsCisgICAgcmV0ID0gW10sCisgICAgcG9zID0gcm5lZWRz
Q29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5n
IiA/CisgICAgalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgor
ICAgIDA7CisKKyAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisgICAgY3VyID0gdGhpc1tpXTsK
KworICAgIHdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4
dCAmJiBjdXIubm9kZVR5cGUgIT09IDExICkgeworICAgIGlmICggcG9zID8gcG9zLmluZGV4KGN1
cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykgKSB7
CisgICAgcmV0LnB1c2goIGN1ciApOworICAgIGJyZWFrOworICAgIH0KKyAgICBjdXIgPSBjdXIu
cGFyZW50Tm9kZTsKKyAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBy
ZXQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7CisgICAgfSwKKwor
ICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KKyAgICAv
LyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKKyAgICBpbmRleDogZnVuY3Rpb24oIGVsZW0g
KSB7CisKKyAgICAvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudAorICAgIGlm
ICggIWVsZW0gKSB7CisgICAgcmV0dXJuICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUg
KSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CisgICAgfQorCisgICAgLy8g
aW5kZXggaW4gc2VsZWN0b3IKKyAgICBpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsK
KyAgICByZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7Cisg
ICAgfQorCisgICAgLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50
CisgICAgcmV0dXJuIGpRdWVyeS5pbkFycmF5KAorICAgIC8vIElmIGl0IHJlY2VpdmVzIGEgalF1
ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorICAgIGVsZW0uanF1ZXJ5ID8g
ZWxlbVswXSA6IGVsZW0sIHRoaXMgKTsKKyAgICB9LAorCisgICAgYWRkOiBmdW5jdGlvbiggc2Vs
ZWN0b3IsIGNvbnRleHQgKSB7CisgICAgdmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gInN0
cmluZyIgPworICAgIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CisgICAgalF1ZXJ5Lm1h
a2VBcnJheSggc2VsZWN0b3IgJiYgc2VsZWN0b3Iubm9kZVR5cGUgPyBbIHNlbGVjdG9yIF0gOiBz
ZWxlY3RvciApLAorICAgIGFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CisK
KyAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoYWxsKSApOworICAgIH0s
CisKKyAgICBhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgcmV0dXJuIHRoaXMu
YWRkKCBzZWxlY3RvciA9PSBudWxsID8KKyAgICB0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZP
YmplY3QuZmlsdGVyKHNlbGVjdG9yKQorICAgICk7CisgICAgfQorfSk7CisKK2pRdWVyeS5mbi5h
bmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7CisKK2Z1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGly
ICkgeworICAgIGRvIHsKKyAgICBjdXIgPSBjdXJbIGRpciBdOworICAgIH0gd2hpbGUgKCBjdXIg
JiYgY3VyLm5vZGVUeXBlICE9PSAxICk7CisKKyAgICByZXR1cm4gY3VyOworfQorCitqUXVlcnku
ZWFjaCh7CisgICAgcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICB2YXIgcGFyZW50ID0g
ZWxlbS5wYXJlbnROb2RlOworICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9
PSAxMSA/IHBhcmVudCA6IG51bGw7CisgICAgfSwKKyAgICBwYXJlbnRzOiBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiICk7CisgICAg
fSwKKyAgICBwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICBy
ZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOworICAgIH0sCisg
ICAgbmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJu
ZXh0U2libGluZyIgKTsKKyAgICB9LAorICAgIHByZXY6IGZ1bmN0aW9uKCBlbGVtICkgeworICAg
IHJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAgIH0sCisgICAg
bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0s
ICJuZXh0U2libGluZyIgKTsKKyAgICB9LAorICAgIHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAg
IH0sCisgICAgbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisgICAgcmV0
dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAg
ICBwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICByZXR1cm4galF1
ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAgICBz
aWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAo
IGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTsKKyAgICB9LAorICAg
IGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4galF1ZXJ5LnNpYmxpbmco
IGVsZW0uZmlyc3RDaGlsZCApOworICAgIH0sCisgICAgY29udGVudHM6IGZ1bmN0aW9uKCBlbGVt
ICkgeworICAgIHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgPworICAg
IGVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6Cisg
ICAgalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7CisgICAgfQorfSwgZnVuY3Rp
b24oIG5hbWUsIGZuICkgeworICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGls
LCBzZWxlY3RvciApIHsKKyAgICB2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGls
ICk7CisKKyAgICBpZiAoICFydW50aWwudGVzdCggbmFtZSApICkgeworICAgIHNlbGVjdG9yID0g
dW50aWw7CisgICAgfQorCisgICAgaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09
ICJzdHJpbmciICkgeworICAgIHJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsK
KyAgICB9CisKKyAgICByZXQgPSB0aGlzLmxlbmd0aCA+IDEgJiYgIWd1YXJhbnRlZWRVbmlxdWVb
IG5hbWUgXSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0OworCisgICAgaWYgKCB0aGlzLmxl
bmd0aCA+IDEgJiYgcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKKyAgICByZXQgPSByZXQu
cmV2ZXJzZSgpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7Cisg
ICAgfTsKK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKyAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBleHBy
LCBlbGVtcywgbm90ICkgeworICAgIGlmICggbm90ICkgeworICAgIGV4cHIgPSAiOm5vdCgiICsg
ZXhwciArICIpIjsKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KKyAg
ICBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoZWxlbXNbMF0sIGV4cHIpID8gWyBlbGVtc1sw
XSBdIDogW10gOgorICAgIGpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOworICAgIH0s
CisKKyAgICBkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgeworICAgIHZhciBtYXRj
aGVkID0gW10sCisgICAgY3VyID0gZWxlbVsgZGlyIF07CisKKyAgICB3aGlsZSAoIGN1ciAmJiBj
dXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBl
ICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKKyAgICBpZiAoIGN1ci5u
b2RlVHlwZSA9PT0gMSApIHsKKyAgICBtYXRjaGVkLnB1c2goIGN1ciApOworICAgIH0KKyAgICBj
dXIgPSBjdXJbZGlyXTsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoZWQ7CisgICAgfSwKKworICAg
IHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgeworICAgIHZhciByID0gW107CisKKyAgICBm
b3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgeworICAgIGlmICggbi5ub2RlVHlwZSA9PT0g
MSAmJiBuICE9PSBlbGVtICkgeworICAgIHIucHVzaCggbiApOworICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gcjsKKyAgICB9Cit9KTsKKworLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVu
Y3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QKK2Z1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMs
IHF1YWxpZmllciwga2VlcCApIHsKKworICAgIC8vIENhbid0IHBhc3MgbnVsbCBvciB1bmRlZmlu
ZWQgdG8gaW5kZXhPZiBpbiBGaXJlZm94IDQKKyAgICAvLyBTZXQgdG8gMCB0byBza2lwIHN0cmlu
ZyBjaGVjaworICAgIHF1YWxpZmllciA9IHF1YWxpZmllciB8fCAwOworCisgICAgaWYgKCBqUXVl
cnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5ncmVwKGVs
ZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKyAgICB2YXIgcmV0VmFsID0gISFxdWFsaWZp
ZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApOworICAgIHJldHVybiByZXRWYWwgPT09IGtlZXA7Cisg
ICAgfSk7CisKKyAgICB9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CisgICAgcmV0
dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4g
KCBlbGVtID09PSBxdWFsaWZpZXIgKSA9PT0ga2VlcDsKKyAgICB9KTsKKworICAgIH0gZWxzZSBp
ZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgeworICAgIHZhciBmaWx0ZXJlZCA9
IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4gZWxl
bS5ub2RlVHlwZSA9PT0gMTsKKyAgICB9KTsKKworICAgIGlmICggaXNTaW1wbGUudGVzdCggcXVh
bGlmaWVyICkgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5maWx0ZXIocXVhbGlmaWVyLCBmaWx0ZXJl
ZCwgIWtlZXApOworICAgIH0gZWxzZSB7CisgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlcigg
cXVhbGlmaWVyLCBmaWx0ZXJlZCApOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4galF1ZXJ5
LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiAoIGpRdWVyeS5p
bkFycmF5KCBlbGVtLCBxdWFsaWZpZXIgKSA+PSAwICkgPT09IGtlZXA7CisgICAgfSk7Cit9Citm
dW5jdGlvbiBjcmVhdGVTYWZlRnJhZ21lbnQoIGRvY3VtZW50ICkgeworICAgIHZhciBsaXN0ID0g
bm9kZU5hbWVzLnNwbGl0KCAifCIgKSwKKyAgICBzYWZlRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURv
Y3VtZW50RnJhZ21lbnQoKTsKKworICAgIGlmICggc2FmZUZyYWcuY3JlYXRlRWxlbWVudCApIHsK
KyAgICB3aGlsZSAoIGxpc3QubGVuZ3RoICkgeworICAgIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQo
CisgICAgbGlzdC5wb3AoKQorICAgICk7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FmZUZy
YWc7Cit9CisKK3ZhciBub2RlTmFtZXMgPSAiYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxj
YW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnwiICsK
KyAgICAiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlv
bnxzdW1tYXJ5fHRpbWV8dmlkZW8iLAorICAgIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0i
KD86bnVsbHxcZCspIi9nLAorICAgIHJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoIjwoPzoiICsg
bm9kZU5hbWVzICsgIilbXFxzLz5dIiwgImkiKSwKKyAgICBybGVhZGluZ1doaXRlc3BhY2UgPSAv
XlxzKy8sCisgICAgcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5w
dXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKKyAgICBydGFnTmFtZSA9
IC88KFtcdzpdKykvLAorICAgIHJ0Ym9keSA9IC88dGJvZHkvaSwKKyAgICByaHRtbCA9IC88fCYj
P1x3KzsvLAorICAgIHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksCisg
ICAgbWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlID0gL14oPzpjaGVja2JveHxyYWRpbykkL2ks
CisgICAgLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAorICAgIHJjaGVja2VkID0gL2No
ZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisgICAgcnNjcmlwdFR5cGUgPSAvXiR8
XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksCisgICAgcnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVc
LyguKikvLAorICAgIHJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/Olxd
XF18LS0pPlxzKiQvZywKKworICAgIC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBz
dXBwb3J0IFhIVE1MICgjMTMyMDApCisgICAgd3JhcE1hcCA9IHsKKyAgICBvcHRpb246IFsgMSwg
IjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAorICAgIGxlZ2Vu
ZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKKyAgICBhcmVhOiBbIDEsICI8
bWFwPiIsICI8L21hcD4iIF0sCisgICAgcGFyYW06IFsgMSwgIjxvYmplY3Q+IiwgIjwvb2JqZWN0
PiIgXSwKKyAgICB0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKyAgICB0cjog
WyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKyAgICBjb2w6IFsg
MiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJs
ZT4iIF0sCisgICAgdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+
PC90YWJsZT4iIF0sCisKKyAgICAvLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0
LCBzdHlsZSwgb3IgYW55IGh0bWw1IChOb1Njb3BlKSB0YWdzLAorICAgIC8vIHVubGVzcyB3cmFw
cGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQu
CisgICAgX2RlZmF1bHQ6IGpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbIDAsICIiLCAi
IiBdIDogWyAxLCAiWDxkaXY+IiwgIjwvZGl2PiIgIF0KKyAgICB9LAorICAgIHNhZmVGcmFnbWVu
dCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSwKKyAgICBmcmFnbWVudERpdiA9IHNh
ZmVGcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsK
Kword3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOword3JhcE1hcC50Ym9keSA9IHdy
YXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1h
cC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCitqUXVlcnkuZm4uZXh0ZW5kKHsK
KyAgICB0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3Mo
IHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5l
ZCA/CisgICAgalF1ZXJ5LnRleHQoIHRoaXMgKSA6CisgICAgdGhpcy5lbXB0eSgpLmFwcGVuZCgg
KCB0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRl
eHROb2RlKCB2YWx1ZSApICk7CisgICAgfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGgg
KTsKKyAgICB9LAorCisgICAgd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisgICAgaWYgKCBq
UXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgeworICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oaSkgeworICAgIGpRdWVyeSh0aGlzKS53cmFwQWxsKCBodG1sLmNhbGwodGhpcywgaSkgKTsK
KyAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoIHRoaXNbMF0gKSB7CisgICAgLy8gVGhlIGVsZW1l
bnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKKyAgICB2YXIgd3JhcCA9IGpRdWVyeSggaHRt
bCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CisKKyAgICBpZiAo
IHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKKyAgICB3cmFwLmluc2VydEJlZm9yZSggdGhpc1swXSAp
OworICAgIH0KKworICAgIHdyYXAubWFwKGZ1bmN0aW9uKCkgeworICAgIHZhciBlbGVtID0gdGhp
czsKKworICAgIHdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2Rl
VHlwZSA9PT0gMSApIHsKKyAgICBlbGVtID0gZWxlbS5maXJzdENoaWxkOworICAgIH0KKworICAg
IHJldHVybiBlbGVtOworICAgIH0pLmFwcGVuZCggdGhpcyApOworICAgIH0KKworICAgIHJldHVy
biB0aGlzOworICAgIH0sCisKKyAgICB3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAg
IGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKyAgICByZXR1cm4gdGhpcy5lYWNo
KGZ1bmN0aW9uKGkpIHsKKyAgICBqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhp
cywgaSkgKTsKKyAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9u
KCkgeworICAgIHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCisgICAgY29udGVudHMgPSBzZWxm
LmNvbnRlbnRzKCk7CisKKyAgICBpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKKyAgICBjb250ZW50
cy53cmFwQWxsKCBodG1sICk7CisKKyAgICB9IGVsc2UgeworICAgIHNlbGYuYXBwZW5kKCBodG1s
ICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAgICB3cmFwOiBmdW5jdGlvbiggaHRtbCAp
IHsKKyAgICB2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CisKKyAg
ICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKKyAgICBqUXVlcnkoIHRoaXMgKS53cmFw
QWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOworICAgIH0pOwor
ICAgIH0sCisKKyAgICB1bndyYXA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnBhcmVu
dCgpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAi
Ym9keSIgKSApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5v
ZGVzICk7CisgICAgfQorICAgIH0pLmVuZCgpOworICAgIH0sCisKKyAgICBhcHBlbmQ6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5
cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisgICAgdGhpcy5hcHBlbmRDaGls
ZCggZWxlbSApOworICAgIH0KKyAgICB9KTsKKyAgICB9LAorCisgICAgcHJlcGVuZDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlv
biggZWxlbSApIHsKKyAgICBpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlw
ZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKyAgICB0aGlzLmluc2VydEJlZm9y
ZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CisgICAgfQorICAgIH0pOworICAgIH0sCisKKyAg
ICBiZWZvcmU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVu
dHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSAp
IHsKKyAgICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisgICAg
fQorICAgIH0pOworICAgIH0sCisKKyAgICBhZnRlcjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgeworICAg
IGlmICggdGhpcy5wYXJlbnROb2RlICkgeworICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZv
cmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKyAgICB9CisgICAgfSk7CisgICAgfSwKKwor
ICAgIC8vIGtlZXBEYXRhIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS0tZG8gbm90IGRvY3VtZW50
CisgICAgcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgeworICAgIHZhciBl
bGVtLAorICAgIGkgPSAwOworCisgICAgZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7
IGkrKyApIHsKKyAgICBpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3Rvciwg
WyBlbGVtIF0gKS5sZW5ndGggPiAwICkgeworICAgIGlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9k
ZVR5cGUgPT09IDEgKSB7CisgICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTsK
KyAgICB9CisKKyAgICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICBpZiAoIGtlZXBEYXRh
ICYmIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7CisgICAg
c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7CisgICAgfQorICAgIGVs
ZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworICAgIH0KKyAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgZWxlbSwKKyAgICBpID0gMDsKKworICAgIGZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAh
PSBudWxsOyBpKysgKSB7CisgICAgLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQg
bWVtb3J5IGxlYWtzCisgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgIGpRdWVy
eS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOworICAgIH0KKworICAgIC8vIFJl
bW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCisgICAgd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7
CisgICAgZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJzdENoaWxkICk7CisgICAgfQorCisgICAg
Ly8gSWYgdGhpcyBpcyBhIHNlbGVjdCwgZW5zdXJlIHRoYXQgaXQgZGlzcGxheXMgZW1wdHkgKCMx
MjMzNikKKyAgICAvLyBTdXBwb3J0OiBJRTw5CisgICAgaWYgKCBlbGVtLm9wdGlvbnMgJiYgalF1
ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgeworICAgIGVsZW0ub3B0aW9ucy5sZW5n
dGggPSAwOworICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAg
Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKyAg
ICBkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5k
RXZlbnRzOworICAgIGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVs
bCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKKworICAgIHJldHVybiB0aGlz
Lm1hcCggZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFB
bmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CisgICAgfSk7CisgICAgfSwKKworICAgIGh0
bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywg
ZnVuY3Rpb24oIHZhbHVlICkgeworICAgIHZhciBlbGVtID0gdGhpc1swXSB8fCB7fSwKKyAgICBp
ID0gMCwKKyAgICBsID0gdGhpcy5sZW5ndGg7CisKKyAgICBpZiAoIHZhbHVlID09PSB1bmRlZmlu
ZWQgKSB7CisgICAgcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgPworICAgIGVsZW0uaW5uZXJI
VE1MLnJlcGxhY2UoIHJpbmxpbmVqUXVlcnksICIiICkgOgorICAgIHVuZGVmaW5lZDsKKyAgICB9
CisKKyAgICAvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5u
ZXJIVE1MCisgICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0
bWwudGVzdCggdmFsdWUgKSAmJgorICAgICggalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8
fCAhcm5vc2hpbWNhY2hlLnRlc3QoIHZhbHVlICkgICkgJiYKKyAgICAoIGpRdWVyeS5zdXBwb3J0
LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSAp
ICYmCisgICAgIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIiIsICIiXSAp
WzFdLnRvTG93ZXJDYXNlKCkgXSApIHsKKworICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSggcnho
dG1sVGFnLCAiPCQxPjwvJDI+IiApOworCisgICAgdHJ5IHsKKyAgICBmb3IgKDsgaSA8IGw7IGkr
KyApIHsKKyAgICAvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVh
a3MKKyAgICBlbGVtID0gdGhpc1tpXSB8fCB7fTsKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDEgKSB7CisgICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7Cisg
ICAgZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTsKKyAgICB9CisgICAgfQorCisgICAgZWxlbSA9IDA7
CisKKyAgICAvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRo
ZSBmYWxsYmFjayBtZXRob2QKKyAgICB9IGNhdGNoKGUpIHt9CisgICAgfQorCisgICAgaWYgKCBl
bGVtICkgeworICAgIHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CisgICAgfQorICAgIH0s
IG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7CisgICAgfSwKKworICAgIHJlcGxhY2VX
aXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgdmFyIGlzRnVuYyA9IGpRdWVyeS5pc0Z1bmN0
aW9uKCB2YWx1ZSApOworCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSBy
ZW1vdmVkIGZyb20gdGhlIERPTSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKKyAgICAvLyB0aGlz
IGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cworICAg
IGlmICggIWlzRnVuYyAmJiB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgeworICAgIHZhbHVl
ID0galF1ZXJ5KCB2YWx1ZSApLm5vdCggdGhpcyApLmRldGFjaCgpOworICAgIH0KKworICAgIHJl
dHVybiB0aGlzLmRvbU1hbmlwKCBbIHZhbHVlIF0sIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewor
ICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0U2libGluZywKKyAgICBwYXJlbnQgPSB0aGlzLnBhcmVu
dE5vZGU7CisKKyAgICBpZiAoIHBhcmVudCApIHsKKyAgICBqUXVlcnkoIHRoaXMgKS5yZW1vdmUo
KTsKKyAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKCBlbGVtLCBuZXh0ICk7CisgICAgfQorICAgIH0p
OworICAgIH0sCisKKyAgICBkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICByZXR1
cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7CisgICAgfSwKKworICAgIGRvbU1hbmlw
OiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgeworCisgICAgLy8gRmxhdHRlbiBh
bnkgbmVzdGVkIGFycmF5cworICAgIGFyZ3MgPSBjb3JlX2NvbmNhdC5hcHBseSggW10sIGFyZ3Mg
KTsKKworICAgIHZhciBmaXJzdCwgbm9kZSwgaGFzU2NyaXB0cywKKyAgICBzY3JpcHRzLCBkb2Ms
IGZyYWdtZW50LAorICAgIGkgPSAwLAorICAgIGwgPSB0aGlzLmxlbmd0aCwKKyAgICBzZXQgPSB0
aGlzLAorICAgIGlOb0Nsb25lID0gbCAtIDEsCisgICAgdmFsdWUgPSBhcmdzWzBdLAorICAgIGlz
RnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKKworICAgIC8vIFdlIGNhbid0
IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAorICAg
IGlmICggaXNGdW5jdGlvbiB8fCAhKCBsIDw9IDEgfHwgdHlwZW9mIHZhbHVlICE9PSAic3RyaW5n
IiB8fCBqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCB2YWx1ZSAp
ICkgKSB7CisgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7CisgICAgdmFy
IHNlbGYgPSBzZXQuZXEoIGluZGV4ICk7CisgICAgaWYgKCBpc0Z1bmN0aW9uICkgeworICAgIGFy
Z3NbMF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVu
ZGVmaW5lZCApOworICAgIH0KKyAgICBzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJh
Y2sgKTsKKyAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoIGwgKSB7CisgICAgZnJhZ21lbnQgPSBq
UXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNl
LCB0aGlzICk7CisgICAgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOworCisgICAgaWYgKCBm
cmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKKyAgICBmcmFnbWVudCA9IGZpcnN0
OworICAgIH0KKworICAgIGlmICggZmlyc3QgKSB7CisgICAgdGFibGUgPSB0YWJsZSAmJiBqUXVl
cnkubm9kZU5hbWUoIGZpcnN0LCAidHIiICk7CisgICAgc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdl
dEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKKyAgICBoYXNTY3Jp
cHRzID0gc2NyaXB0cy5sZW5ndGg7CisKKyAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50
IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVu
ZCB1cAorICAgIC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRp
b25zICgjODA3MCkuCisgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgIG5vZGUgPSBmcmFn
bWVudDsKKworICAgIGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CisgICAgbm9kZSA9IGpRdWVyeS5j
bG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisgICAgLy8gS2VlcCByZWZlcmVuY2VzIHRvIGNs
b25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvbgorICAgIGlmICggaGFzU2NyaXB0cyAp
IHsKKyAgICBqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgInNjcmlwdCIgKSAp
OworICAgIH0KKyAgICB9CisKKyAgICBjYWxsYmFjay5jYWxsKAorICAgIHRhYmxlICYmIGpRdWVy
eS5ub2RlTmFtZSggdGhpc1tpXSwgInRhYmxlIiApID8KKyAgICBmaW5kT3JBcHBlbmQoIHRoaXNb
aV0sICJ0Ym9keSIgKSA6CisgICAgdGhpc1tpXSwKKyAgICBub2RlLAorICAgIGkKKyAgICApOwor
ICAgIH0KKworICAgIGlmICggaGFzU2NyaXB0cyApIHsKKyAgICBkb2MgPSBzY3JpcHRzWyBzY3Jp
cHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50OworCisgICAgLy8gUmVlbmFibGUgc2NyaXB0
cworICAgIGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTsKKworICAgIC8vIEV2
YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KKyAg
ICBmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHsKKyAgICBub2RlID0gc2NyaXB0
c1sgaSBdOworICAgIGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkgJiYK
KyAgICAhalF1ZXJ5Ll9kYXRhKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJiBqUXVlcnkuY29udGFp
bnMoIGRvYywgbm9kZSApICkgeworCisgICAgaWYgKCBub2RlLnNyYyApIHsKKyAgICAvLyBIb3Bl
IGFqYXggaXMgYXZhaWxhYmxlLi4uCisgICAgalF1ZXJ5LmFqYXgoeworICAgIHVybDogbm9kZS5z
cmMsCisgICAgdHlwZTogIkdFVCIsCisgICAgZGF0YVR5cGU6ICJzY3JpcHQiLAorICAgIGFzeW5j
OiBmYWxzZSwKKyAgICBnbG9iYWw6IGZhbHNlLAorICAgICJ0aHJvd3MiOiB0cnVlCisgICAgfSk7
CisgICAgfSBlbHNlIHsKKyAgICBqUXVlcnkuZ2xvYmFsRXZhbCggKCBub2RlLnRleHQgfHwgbm9k
ZS50ZXh0Q29udGVudCB8fCBub2RlLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNj
cmlwdCwgIiIgKSApOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZpeCAj
MTE4MDk6IEF2b2lkIGxlYWtpbmcgbWVtb3J5CisgICAgZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7
CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0aGlzOworICAgIH0KK30pOworCitmdW5jdGlv
biBmaW5kT3JBcHBlbmQoIGVsZW0sIHRhZyApIHsKKyAgICByZXR1cm4gZWxlbS5nZXRFbGVtZW50
c0J5VGFnTmFtZSggdGFnIClbMF0gfHwgZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoIHRhZyApICk7Cit9CisKKy8vIFJlcGxhY2UvcmVzdG9yZSB0aGUg
dHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRp
b24KK2Z1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7CisgICAgdmFyIGF0dHIgPSBlbGVt
LmdldEF0dHJpYnV0ZU5vZGUoInR5cGUiKTsKKyAgICBlbGVtLnR5cGUgPSAoIGF0dHIgJiYgYXR0
ci5zcGVjaWZpZWQgKSArICIvIiArIGVsZW0udHlwZTsKKyAgICByZXR1cm4gZWxlbTsKK30KK2Z1
bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CisgICAgdmFyIG1hdGNoID0gcnNjcmlwdFR5
cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7CisgICAgaWYgKCBtYXRjaCApIHsKKyAgICBlbGVt
LnR5cGUgPSBtYXRjaFsxXTsKKyAgICB9IGVsc2UgeworICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRl
KCJ0eXBlIik7CisgICAgfQorICAgIHJldHVybiBlbGVtOworfQorCisvLyBNYXJrIHNjcmlwdHMg
YXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQKK2Z1bmN0aW9uIHNldEdsb2JhbEV2YWwo
IGVsZW1zLCByZWZFbGVtZW50cyApIHsKKyAgICB2YXIgZWxlbSwKKyAgICBpID0gMDsKKyAgICBm
b3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICBqUXVlcnkuX2Rh
dGEoIGVsZW0sICJnbG9iYWxFdmFsIiwgIXJlZkVsZW1lbnRzIHx8IGpRdWVyeS5fZGF0YSggcmVm
RWxlbWVudHNbaV0sICJnbG9iYWxFdmFsIiApICk7CisgICAgfQorfQorCitmdW5jdGlvbiBjbG9u
ZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgeworCisgICAgaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAx
IHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAg
IHZhciB0eXBlLCBpLCBsLAorICAgIG9sZERhdGEgPSBqUXVlcnkuX2RhdGEoIHNyYyApLAorICAg
IGN1ckRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QsIG9sZERhdGEgKSwKKyAgICBldmVudHMgPSBv
bGREYXRhLmV2ZW50czsKKworICAgIGlmICggZXZlbnRzICkgeworICAgIGRlbGV0ZSBjdXJEYXRh
LmhhbmRsZTsKKyAgICBjdXJEYXRhLmV2ZW50cyA9IHt9OworCisgICAgZm9yICggdHlwZSBpbiBl
dmVudHMgKSB7CisgICAgZm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkg
PCBsOyBpKysgKSB7CisgICAgalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0
eXBlIF1bIGkgXSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gbWFrZSB0aGUgY2xv
bmVkIHB1YmxpYyBkYXRhIG9iamVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKKyAgICBpZiAo
IGN1ckRhdGEuZGF0YSApIHsKKyAgICBjdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwg
Y3VyRGF0YS5kYXRhICk7CisgICAgfQorfQorCitmdW5jdGlvbiBmaXhDbG9uZU5vZGVJc3N1ZXMo
IHNyYywgZGVzdCApIHsKKyAgICB2YXIgbm9kZU5hbWUsIGUsIGRhdGE7CisKKyAgICAvLyBXZSBk
byBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3Igbm9uLUVsZW1lbnRzCisgICAgaWYgKCBkZXN0
Lm5vZGVUeXBlICE9PSAxICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlTmFtZSA9
IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKworICAgIC8vIElFNi04IGNvcGllcyBldmVu
dHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4gdXNpbmcgY2xvbmVOb2RlLgorICAgIGlmICgg
IWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCAmJiBkZXN0WyBqUXVlcnkuZXhwYW5kbyBdICkg
eworICAgIGRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QgKTsKKworICAgIGZvciAoIGUgaW4gZGF0
YS5ldmVudHMgKSB7CisgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBkZXN0LCBlLCBkYXRhLmhhbmRs
ZSApOworICAgIH0KKworICAgIC8vIEV2ZW50IGRhdGEgZ2V0cyByZWZlcmVuY2VkIGluc3RlYWQg
b2YgY29waWVkIGlmIHRoZSBleHBhbmRvIGdldHMgY29waWVkIHRvbworICAgIGRlc3QucmVtb3Zl
QXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApOworICAgIH0KKworICAgIC8vIElFIGJsYW5rcyBj
b250ZW50cyB3aGVuIGNsb25pbmcgc2NyaXB0cywgYW5kIHRyaWVzIHRvIGV2YWx1YXRlIG5ld2x5
LXNldCB0ZXh0CisgICAgaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9
PSBzcmMudGV4dCApIHsKKyAgICBkaXNhYmxlU2NyaXB0KCBkZXN0ICkudGV4dCA9IHNyYy50ZXh0
OworICAgIHJlc3RvcmVTY3JpcHQoIGRlc3QgKTsKKworICAgIC8vIElFNi0xMCBpbXByb3Blcmx5
IGNsb25lcyBjaGlsZHJlbiBvZiBvYmplY3QgZWxlbWVudHMgdXNpbmcgY2xhc3NpZC4KKyAgICAv
LyBJRTEwIHRocm93cyBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvciBpZiBwYXJlbnQgaXMgbnVs
bCwgIzEyMTMyLgorICAgIH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKKyAg
ICBpZiAoIGRlc3QucGFyZW50Tm9kZSApIHsKKyAgICBkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRl
ckhUTUw7CisgICAgfQorCisgICAgLy8gVGhpcyBwYXRoIGFwcGVhcnMgdW5hdm9pZGFibGUgZm9y
IElFOS4gV2hlbiBjbG9uaW5nIGFuIG9iamVjdAorICAgIC8vIGVsZW1lbnQgaW4gSUU5LCB0aGUg
b3V0ZXJIVE1MIHN0cmF0ZWd5IGFib3ZlIGlzIG5vdCBzdWZmaWNpZW50LgorICAgIC8vIElmIHRo
ZSBzcmMgaGFzIGlubmVySFRNTCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAorICAgIC8v
IGNvcHkgdGhlIHNyYy5pbm5lckhUTUwgaW50byB0aGUgZGVzdC5pbm5lckhUTUwuICMxMDMyNAor
ICAgIGlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSAmJiAoIHNyYy5pbm5lckhUTUwgJiYg
IWpRdWVyeS50cmltKGRlc3QuaW5uZXJIVE1MKSApICkgeworICAgIGRlc3QuaW5uZXJIVE1MID0g
c3JjLmlubmVySFRNTDsKKyAgICB9CisKKyAgICB9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlu
cHV0IiAmJiBtYW5pcHVsYXRpb25fcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsK
KyAgICAvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xv
bmVkIGNoZWNrYm94CisgICAgLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0
byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAorICAgIC8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlm
IHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAorCisgICAgZGVzdC5kZWZh
dWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkOworCisgICAgLy8gSUU2LTcg
Z2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWQKKyAg
ICAvLyBjaGVja2JveC9yYWRpbyBidXR0b24gdG8gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2Yg
Im9uIgorICAgIGlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVlICkgeworICAgIGRlc3QudmFs
dWUgPSBzcmMudmFsdWU7CisgICAgfQorCisgICAgLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRo
ZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKKyAgICAvLyBzdGF0ZSB3
aGVuIGNsb25pbmcgb3B0aW9ucworICAgIH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib3B0aW9u
IiApIHsKKyAgICBkZXN0LmRlZmF1bHRTZWxlY3RlZCA9IGRlc3Quc2VsZWN0ZWQgPSBzcmMuZGVm
YXVsdFNlbGVjdGVkOworCisgICAgLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFs
dWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgorICAgIC8vIGNsb25pbmcgb3RoZXIgdHlwZXMg
b2YgaW5wdXQgZmllbGRzCisgICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwg
bm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CisgICAgZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMu
ZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworalF1ZXJ5LmVhY2goeworICAgIGFwcGVuZFRvOiAi
YXBwZW5kIiwKKyAgICBwcmVwZW5kVG86ICJwcmVwZW5kIiwKKyAgICBpbnNlcnRCZWZvcmU6ICJi
ZWZvcmUiLAorICAgIGluc2VydEFmdGVyOiAiYWZ0ZXIiLAorICAgIHJlcGxhY2VBbGw6ICJyZXBs
YWNlV2l0aCIKK30sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKKyAgICBqUXVlcnkuZm5b
IG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICB2YXIgZWxlbXMsCisgICAgaSA9
IDAsCisgICAgcmV0ID0gW10sCisgICAgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAorICAg
IGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMTsKKworICAgIGZvciAoIDsgaSA8PSBsYXN0OyBpKysg
KSB7CisgICAgZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUodHJ1ZSk7Cisg
ICAgalF1ZXJ5KCBpbnNlcnRbaV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTsKKworICAgIC8vIE1v
ZGVybiBicm93c2VycyBjYW4gYXBwbHkgalF1ZXJ5IGNvbGxlY3Rpb25zIGFzIGFycmF5cywgYnV0
IG9sZElFIG5lZWRzIGEgLmdldCgpCisgICAgY29yZV9wdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdl
dCgpICk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKKyAgICB9
OworfSk7CisKK2Z1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgeworICAgIHZhciBlbGVt
cywgZWxlbSwKKyAgICBpID0gMCwKKyAgICBmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lICE9PSBjb3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoIHRhZyB8fCAiKiIgKSA6CisgICAgdHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3Rv
ckFsbCAhPT0gY29yZV9zdHJ1bmRlZmluZWQgPyBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRh
ZyB8fCAiKiIgKSA6CisgICAgdW5kZWZpbmVkOworCisgICAgaWYgKCAhZm91bmQgKSB7CisgICAg
Zm9yICggZm91bmQgPSBbXSwgZWxlbXMgPSBjb250ZXh0LmNoaWxkTm9kZXMgfHwgY29udGV4dDsg
KGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgeworICAgIGlmICggIXRhZyB8fCBqUXVl
cnkubm9kZU5hbWUoIGVsZW0sIHRhZyApICkgeworICAgIGZvdW5kLnB1c2goIGVsZW0gKTsKKyAg
ICB9IGVsc2UgeworICAgIGpRdWVyeS5tZXJnZSggZm91bmQsIGdldEFsbCggZWxlbSwgdGFnICkg
KTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8
fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/CisgICAgalF1ZXJ5Lm1l
cmdlKCBbIGNvbnRleHQgXSwgZm91bmQgKSA6CisgICAgZm91bmQ7Cit9CisKKy8vIFVzZWQgaW4g
YnVpbGRGcmFnbWVudCwgZml4ZXMgdGhlIGRlZmF1bHRDaGVja2VkIHByb3BlcnR5CitmdW5jdGlv
biBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKKyAgICBpZiAoIG1hbmlwdWxhdGlvbl9yY2hl
Y2thYmxlVHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHsKKyAgICBlbGVtLmRlZmF1bHRDaGVja2Vk
ID0gZWxlbS5jaGVja2VkOworICAgIH0KK30KKworalF1ZXJ5LmV4dGVuZCh7CisgICAgY2xvbmU6
IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKyAg
ICB2YXIgZGVzdEVsZW1lbnRzLCBub2RlLCBjbG9uZSwgaSwgc3JjRWxlbWVudHMsCisgICAgaW5Q
YWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAg
IGlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxlbSkg
fHwgIXJub3NoaW1jYWNoZS50ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsgIj4iICkgKSB7Cisg
ICAgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApOworCisgICAgLy8gSUU8PTggZG9lcyBu
b3QgcHJvcGVybHkgY2xvbmUgZGV0YWNoZWQsIHVua25vd24gZWxlbWVudCBub2RlcworICAgIH0g
ZWxzZSB7CisgICAgZnJhZ21lbnREaXYuaW5uZXJIVE1MID0gZWxlbS5vdXRlckhUTUw7CisgICAg
ZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCAp
OworICAgIH0KKworICAgIGlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpR
dWVyeS5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSAmJgorICAgIChlbGVtLm5vZGVUeXBlID09PSAx
IHx8IGVsZW0ubm9kZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgewor
CisgICAgLy8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBo
dHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKKyAgICBkZXN0RWxlbWVudHMgPSBn
ZXRBbGwoIGNsb25lICk7CisgICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKKworICAg
IC8vIEZpeCBhbGwgSUUgY2xvbmluZyBpc3N1ZXMKKyAgICBmb3IgKCBpID0gMDsgKG5vZGUgPSBz
cmNFbGVtZW50c1tpXSkgIT0gbnVsbDsgKytpICkgeworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBk
ZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NworICAgIGlmICggZGVzdEVs
ZW1lbnRzW2ldICkgeworICAgIGZpeENsb25lTm9kZUlzc3Vlcyggbm9kZSwgZGVzdEVsZW1lbnRz
W2ldICk7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJv
bSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCisgICAgaWYgKCBkYXRhQW5kRXZlbnRzICkgewor
ICAgIGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CisgICAgc3JjRWxlbWVudHMgPSBzcmNFbGVt
ZW50cyB8fCBnZXRBbGwoIGVsZW0gKTsKKyAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMg
fHwgZ2V0QWxsKCBjbG9uZSApOworCisgICAgZm9yICggaSA9IDA7IChub2RlID0gc3JjRWxlbWVu
dHNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICBjbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVs
ZW1lbnRzW2ldICk7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgY2xvbmVDb3B5RXZlbnQoIGVs
ZW0sIGNsb25lICk7CisgICAgfQorICAgIH0KKworICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFs
dWF0aW9uIGhpc3RvcnkKKyAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0
IiApOworICAgIGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CisgICAgc2V0R2xvYmFs
RXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSAp
OworICAgIH0KKworICAgIGRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7
CisKKyAgICAvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKKyAgICByZXR1cm4gY2xvbmU7CisgICAg
fSwKKworICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgc2NyaXB0
cywgc2VsZWN0aW9uICkgeworICAgIHZhciBqLCBlbGVtLCBjb250YWlucywKKyAgICB0bXAsIHRh
ZywgdGJvZHksIHdyYXAsCisgICAgbCA9IGVsZW1zLmxlbmd0aCwKKworICAgIC8vIEVuc3VyZSBh
IHNhZmUgZnJhZ21lbnQKKyAgICBzYWZlID0gY3JlYXRlU2FmZUZyYWdtZW50KCBjb250ZXh0ICks
CisKKyAgICBub2RlcyA9IFtdLAorICAgIGkgPSAwOworCisgICAgZm9yICggOyBpIDwgbDsgaSsr
ICkgeworICAgIGVsZW0gPSBlbGVtc1sgaSBdOworCisgICAgaWYgKCBlbGVtIHx8IGVsZW0gPT09
IDAgKSB7CisKKyAgICAvLyBBZGQgbm9kZXMgZGlyZWN0bHkKKyAgICBpZiAoIGpRdWVyeS50eXBl
KCBlbGVtICkgPT09ICJvYmplY3QiICkgeworICAgIGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0u
bm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKKworICAgIC8vIENvbnZlcnQgbm9uLWh0bWwg
aW50byBhIHRleHQgbm9kZQorICAgIH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7
CisgICAgbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CisKKyAg
ICAvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKKyAgICB9IGVsc2UgeworICAgIHRtcCA9
IHRtcCB8fCBzYWZlLmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7
CisKKyAgICAvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCisgICAgdGFn
ID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyIiLCAiIl0gKVsxXS50b0xvd2VyQ2FzZSgp
OworICAgIHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OworCisgICAg
dG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48
LyQyPiIgKSArIHdyYXBbMl07CisKKyAgICAvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8g
dGhlIHJpZ2h0IGNvbnRlbnQKKyAgICBqID0gd3JhcFswXTsKKyAgICB3aGlsZSAoIGotLSApIHsK
KyAgICB0bXAgPSB0bXAubGFzdENoaWxkOworICAgIH0KKworICAgIC8vIE1hbnVhbGx5IGFkZCBs
ZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZCBieSBJRQorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0
LmxlYWRpbmdXaGl0ZXNwYWNlICYmIHJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCBlbGVtICkgKSB7
CisgICAgbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggcmxlYWRpbmdXaGl0ZXNw
YWNlLmV4ZWMoIGVsZW0gKVswXSApICk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIElFJ3MgYXV0
b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKKyAgICBpZiAoICFqUXVlcnku
c3VwcG9ydC50Ym9keSApIHsKKworICAgIC8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBo
YXZlIHNwdXJpb3VzIDx0Ym9keT4KKyAgICBlbGVtID0gdGFnID09PSAidGFibGUiICYmICFydGJv
ZHkudGVzdCggZWxlbSApID8KKyAgICB0bXAuZmlyc3RDaGlsZCA6CisKKyAgICAvLyBTdHJpbmcg
d2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KKyAgICB3cmFwWzFdID09PSAiPHRhYmxlPiIg
JiYgIXJ0Ym9keS50ZXN0KCBlbGVtICkgPworICAgIHRtcCA6CisgICAgMDsKKworICAgIGogPSBl
bGVtICYmIGVsZW0uY2hpbGROb2Rlcy5sZW5ndGg7CisgICAgd2hpbGUgKCBqLS0gKSB7CisgICAg
aWYgKCBqUXVlcnkubm9kZU5hbWUoICh0Ym9keSA9IGVsZW0uY2hpbGROb2Rlc1tqXSksICJ0Ym9k
eSIgKSAmJiAhdGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggKSB7CisgICAgZWxlbS5yZW1vdmVDaGls
ZCggdGJvZHkgKTsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIGpRdWVyeS5tZXJnZSggbm9k
ZXMsIHRtcC5jaGlsZE5vZGVzICk7CisKKyAgICAvLyBGaXggIzEyMzkyIGZvciBXZWJLaXQgYW5k
IElFID4gOQorICAgIHRtcC50ZXh0Q29udGVudCA9ICIiOworCisgICAgLy8gRml4ICMxMjM5MiBm
b3Igb2xkSUUKKyAgICB3aGlsZSAoIHRtcC5maXJzdENoaWxkICkgeworICAgIHRtcC5yZW1vdmVD
aGlsZCggdG1wLmZpcnN0Q2hpbGQgKTsKKyAgICB9CisKKyAgICAvLyBSZW1lbWJlciB0aGUgdG9w
LWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVyIGNsZWFudXAKKyAgICB0bXAgPSBzYWZlLmxhc3RD
aGlsZDsKKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIEZpeCAjMTEzNTY6IENsZWFyIGVs
ZW1lbnRzIGZyb20gZnJhZ21lbnQKKyAgICBpZiAoIHRtcCApIHsKKyAgICBzYWZlLnJlbW92ZUNo
aWxkKCB0bXAgKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBkZWZhdWx0Q2hlY2tlZCBmb3IgYW55
IHJhZGlvcyBhbmQgY2hlY2tib3hlcworICAgIC8vIGFib3V0IHRvIGJlIGFwcGVuZGVkIHRvIHRo
ZSBET00gaW4gSUUgNi83ICgjODA2MCkKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRD
aGVja2VkICkgeworICAgIGpRdWVyeS5ncmVwKCBnZXRBbGwoIG5vZGVzLCAiaW5wdXQiICksIGZp
eERlZmF1bHRDaGVja2VkICk7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCAoZWxl
bSA9IG5vZGVzWyBpKysgXSkgKSB7CisKKyAgICAvLyAjNDA4NyAtIElmIG9yaWdpbiBhbmQgZGVz
dGluYXRpb24gZWxlbWVudHMgYXJlIHRoZSBzYW1lLCBhbmQgdGhpcyBpcworICAgIC8vIHRoYXQg
ZWxlbWVudCwgZG8gbm90IGRvIGFueXRoaW5nCisgICAgaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5
LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHsKKyAgICBjb250aW51ZTsKKyAg
ICB9CisKKyAgICBjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50
LCBlbGVtICk7CisKKyAgICAvLyBBcHBlbmQgdG8gZnJhZ21lbnQKKyAgICB0bXAgPSBnZXRBbGwo
IHNhZmUuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgInNjcmlwdCIgKTsKKworICAgIC8vIFByZXNlcnZl
IHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKKyAgICBpZiAoIGNvbnRhaW5zICkgeworICAgIHNl
dEdsb2JhbEV2YWwoIHRtcCApOworICAgIH0KKworICAgIC8vIENhcHR1cmUgZXhlY3V0YWJsZXMK
KyAgICBpZiAoIHNjcmlwdHMgKSB7CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoZWxlbSA9IHRt
cFsgaisrIF0pICkgeworICAgIGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIi
ICkgKSB7CisgICAgc2NyaXB0cy5wdXNoKCBlbGVtICk7CisgICAgfQorICAgIH0KKyAgICB9Cisg
ICAgfQorCisgICAgdG1wID0gbnVsbDsKKworICAgIHJldHVybiBzYWZlOworICAgIH0sCisKKyAg
ICBjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSAp
IHsKKyAgICB2YXIgZWxlbSwgdHlwZSwgaWQsIGRhdGEsCisgICAgaSA9IDAsCisgICAgaW50ZXJu
YWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKKyAgICBjYWNoZSA9IGpRdWVyeS5jYWNoZSwKKyAgICBk
ZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbywKKyAgICBzcGVjaWFs
ID0galF1ZXJ5LmV2ZW50LnNwZWNpYWw7CisKKyAgICBmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0p
ICE9IG51bGw7IGkrKyApIHsKKworICAgIGlmICggYWNjZXB0RGF0YSB8fCBqUXVlcnkuYWNjZXB0
RGF0YSggZWxlbSApICkgeworCisgICAgaWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdOworICAgIGRh
dGEgPSBpZCAmJiBjYWNoZVsgaWQgXTsKKworICAgIGlmICggZGF0YSApIHsKKyAgICBpZiAoIGRh
dGEuZXZlbnRzICkgeworICAgIGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CisgICAgaWYg
KCBzcGVjaWFsWyB0eXBlIF0gKSB7CisgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlw
ZSApOworCisgICAgLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5y
ZW1vdmUncyBvdmVyaGVhZAorICAgIH0gZWxzZSB7CisgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBl
bGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8g
UmVtb3ZlIGNhY2hlIG9ubHkgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHJlbW92ZWQgYnkgalF1ZXJ5
LmV2ZW50LnJlbW92ZQorICAgIGlmICggY2FjaGVbIGlkIF0gKSB7CisKKyAgICBkZWxldGUgY2Fj
aGVbIGlkIF07CisKKyAgICAvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5k
byBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsCisgICAgLy8gbm9yIGRvZXMgaXQgaGF2ZSBhIHJlbW92
ZUF0dHJpYnV0ZSBmdW5jdGlvbiBvbiBEb2N1bWVudCBub2RlczsKKyAgICAvLyB3ZSBtdXN0IGhh
bmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKKyAgICBpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7CisgICAg
ZGVsZXRlIGVsZW1bIGludGVybmFsS2V5IF07CisKKyAgICB9IGVsc2UgaWYgKCB0eXBlb2YgZWxl
bS5yZW1vdmVBdHRyaWJ1dGUgIT09IGNvcmVfc3RydW5kZWZpbmVkICkgeworICAgIGVsZW0ucmVt
b3ZlQXR0cmlidXRlKCBpbnRlcm5hbEtleSApOworCisgICAgfSBlbHNlIHsKKyAgICBlbGVtWyBp
bnRlcm5hbEtleSBdID0gbnVsbDsKKyAgICB9CisKKyAgICBjb3JlX2RlbGV0ZWRJZHMucHVzaCgg
aWQgKTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorfSk7Cit2YXIgaWZyYW1l
LCBnZXRTdHlsZXMsIGN1ckNTUywKKyAgICByYWxwaGEgPSAvYWxwaGFcKFteKV0qXCkvaSwKKyAg
ICByb3BhY2l0eSA9IC9vcGFjaXR5XHMqPVxzKihbXildKikvLAorICAgIHJwb3NpdGlvbiA9IC9e
KHRvcHxyaWdodHxib3R0b218bGVmdCkkLywKKyAgICAvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBp
cyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIs
IG9yICJ0YWJsZS1jYXB0aW9uIgorICAgIC8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczog
aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQorICAg
IHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLywKKyAgICBybWFyZ2lu
ID0gL15tYXJnaW4vLAorICAgIHJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3JlX3Bu
dW0gKyAiKSguKikkIiwgImkiICksCisgICAgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiAr
IGNvcmVfcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKSwKKyAgICBycmVsTnVtID0gbmV3
IFJlZ0V4cCggIl4oWystXSk9KCIgKyBjb3JlX3BudW0gKyAiKSIsICJpIiApLAorICAgIGVsZW1k
aXNwbGF5ID0geyBCT0RZOiAiYmxvY2siIH0sCisKKyAgICBjc3NTaG93ID0geyBwb3NpdGlvbjog
ImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKKyAg
ICBjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CisgICAgbGV0dGVyU3BhY2luZzogMCwKKyAgICBmb250
V2VpZ2h0OiA0MDAKKyAgICB9LAorCisgICAgY3NzRXhwYW5kID0gWyAiVG9wIiwgIlJpZ2h0Iiwg
IkJvdHRvbSIsICJMZWZ0IiBdLAorICAgIGNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk8iLCAi
TW96IiwgIm1zIiBdOworCisvLyByZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90
ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5CitmdW5jdGlvbiB2ZW5kb3JQcm9wTmFt
ZSggc3R5bGUsIG5hbWUgKSB7CisKKyAgICAvLyBzaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUg
bm90IHZlbmRvciBwcmVmaXhlZAorICAgIGlmICggbmFtZSBpbiBzdHlsZSApIHsKKyAgICByZXR1
cm4gbmFtZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVz
CisgICAgdmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5z
bGljZSgxKSwKKyAgICBvcmlnTmFtZSA9IG5hbWUsCisgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0
aDsKKworICAgIHdoaWxlICggaS0tICkgeworICAgIG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsg
Y2FwTmFtZTsKKyAgICBpZiAoIG5hbWUgaW4gc3R5bGUgKSB7CisgICAgcmV0dXJuIG5hbWU7Cisg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBvcmlnTmFtZTsKK30KKworZnVuY3Rpb24gaXNIaWRk
ZW4oIGVsZW0sIGVsICkgeworICAgIC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpR
dWVyeSNmaWx0ZXIgZnVuY3Rpb247CisgICAgLy8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwg
YmUgc2Vjb25kIGFyZ3VtZW50CisgICAgZWxlbSA9IGVsIHx8IGVsZW07CisgICAgcmV0dXJuIGpR
dWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSIgfHwgIWpRdWVyeS5jb250YWlu
cyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7Cit9CisKK2Z1bmN0aW9uIHNob3dIaWRlKCBl
bGVtZW50cywgc2hvdyApIHsKKyAgICB2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLAorICAgIHZh
bHVlcyA9IFtdLAorICAgIGluZGV4ID0gMCwKKyAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7
CisKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworICAgIGVsZW0gPSBl
bGVtZW50c1sgaW5kZXggXTsKKyAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgIGNvbnRpbnVl
OworICAgIH0KKworICAgIHZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgIm9s
ZGRpc3BsYXkiICk7CisgICAgZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKyAgICBpZiAo
IHNob3cgKSB7CisgICAgLy8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVu
dCB0byBsZWFybiBpZiBpdCBpcworICAgIC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxl
cyBvciBub3QKKyAgICBpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUi
ICkgeworICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOworICAgIH0KKworICAgIC8vIFNldCBl
bGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKKyAg
ICAvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHls
ZSBpcworICAgIC8vIGZvciBzdWNoIGFuIGVsZW1lbnQKKyAgICBpZiAoIGVsZW0uc3R5bGUuZGlz
cGxheSA9PT0gIiIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHsKKyAgICB2YWx1ZXNbIGluZGV4IF0g
PSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgY3NzX2RlZmF1bHREaXNwbGF5KGVs
ZW0ubm9kZU5hbWUpICk7CisgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICBpZiAoICF2YWx1ZXNb
IGluZGV4IF0gKSB7CisgICAgaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKKworICAgIGlmICgg
ZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKKyAgICBqUXVlcnku
X2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3Mo
IGVsZW0sICJkaXNwbGF5IiApICk7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAg
Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxv
b3AKKyAgICAvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisgICAgZm9yICggaW5kZXgg
PSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBlbGVtID0gZWxlbWVudHNbIGlu
ZGV4IF07CisgICAgaWYgKCAhZWxlbS5zdHlsZSApIHsKKyAgICBjb250aW51ZTsKKyAgICB9Cisg
ICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0
eWxlLmRpc3BsYXkgPT09ICIiICkgeworICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2
YWx1ZXNbIGluZGV4IF0gfHwgIiIgOiAibm9uZSI7CisgICAgfQorICAgIH0KKworICAgIHJldHVy
biBlbGVtZW50czsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgY3NzOiBmdW5jdGlvbigg
bmFtZSwgdmFsdWUgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9u
KCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKyAgICB2YXIgbGVuLCBzdHlsZXMsCisgICAgbWFwID0g
e30sCisgICAgaSA9IDA7CisKKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7Cisg
ICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7CisgICAgbGVuID0gbmFtZS5sZW5ndGg7CisK
KyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICBtYXBbIG5hbWVbIGkgXSBdID0galF1
ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7CisgICAgfQorCisgICAg
cmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/Cisg
ICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoKKyAgICBqUXVlcnkuY3NzKCBl
bGVtLCBuYW1lICk7CisgICAgfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7
CisgICAgfSwKKyAgICBzaG93OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gc2hvd0hpZGUoIHRo
aXMsIHRydWUgKTsKKyAgICB9LAorICAgIGhpZGU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBz
aG93SGlkZSggdGhpcyApOworICAgIH0sCisgICAgdG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7
CisgICAgdmFyIGJvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIjsKKworICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgaWYgKCBib29sID8gc3RhdGUgOiBpc0hpZGRl
biggdGhpcyApICkgeworICAgIGpRdWVyeSggdGhpcyApLnNob3coKTsKKyAgICB9IGVsc2Ugewor
ICAgIGpRdWVyeSggdGhpcyApLmhpZGUoKTsKKyAgICB9CisgICAgfSk7CisgICAgfQorfSk7CisK
K2pRdWVyeS5leHRlbmQoeworICAgIC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Ig
b3ZlcnJpZGluZyB0aGUgZGVmYXVsdAorICAgIC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNl
dHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQorICAgIGNzc0hvb2tzOiB7CisgICAgb3BhY2l0eTogewor
ICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgIGlmICggY29tcHV0ZWQg
KSB7CisgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNp
dHkKKyAgICB2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKKyAgICByZXR1cm4g
cmV0ID09PSAiIiA/ICIxIiA6IHJldDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9LAorCisg
ICAgLy8gRXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAorICAg
IGNzc051bWJlcjogeworICAgICJjb2x1bW5Db3VudCI6IHRydWUsCisgICAgImZpbGxPcGFjaXR5
IjogdHJ1ZSwKKyAgICAiZm9udFdlaWdodCI6IHRydWUsCisgICAgImxpbmVIZWlnaHQiOiB0cnVl
LAorICAgICJvcGFjaXR5IjogdHJ1ZSwKKyAgICAib3JwaGFucyI6IHRydWUsCisgICAgIndpZG93
cyI6IHRydWUsCisgICAgInpJbmRleCI6IHRydWUsCisgICAgInpvb20iOiB0cnVlCisgICAgfSwK
KworICAgIC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBi
ZWZvcmUKKyAgICAvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlCisgICAgY3NzUHJvcHM6
IHsKKyAgICAvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CisgICAgImZsb2F0IjogalF1
ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCisgICAgfSwK
KworICAgIC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCisg
ICAgc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7CisgICAgLy8g
RG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisgICAgaWYgKCAhZWxl
bSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0u
c3R5bGUgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdl
J3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorICAgIHZhciByZXQsIHR5cGUsIGhvb2tz
LAorICAgIG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorICAgIHN0eWxlID0g
ZWxlbS5zdHlsZTsKKworICAgIG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwg
KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9y
aWdOYW1lICkgKTsKKworICAgIC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24K
KyAgICAvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCisgICAgaG9va3MgPSBq
UXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisK
KyAgICAvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWUKKyAgICBpZiAoIHZhbHVlICE9
PSB1bmRlZmluZWQgKSB7CisgICAgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKworICAgIC8vIGNvbnZl
cnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJz
LiAjNzM0NQorICAgIGlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhl
YyggdmFsdWUgKSkgKSB7CisgICAgdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBh
cnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOworICAgIC8vIEZpeGVzIGJ1ZyAj
OTIzNworICAgIHR5cGUgPSAibnVtYmVyIjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhh
dCBOYU4gYW5kIG51bGwgdmFsdWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKKyAgICBpZiAoIHZh
bHVlID09IG51bGwgfHwgdHlwZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7Cisg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFk
ZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQorICAgIGlm
ICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7
CisgICAgdmFsdWUgKz0gInB4IjsKKyAgICB9CisKKyAgICAvLyBGaXhlcyAjODkwOCwgaXQgY2Fu
IGJlIGRvbmUgbW9yZSBjb3JyZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMgaW4gY3NzSG9va3Ms
CisgICAgLy8gYnV0IGl0IHdvdWxkIG1lYW4gdG8gZGVmaW5lIGVpZ2h0IChmb3IgZXZlcnkgcHJv
YmxlbWF0aWMgcHJvcGVydHkpIGlkZW50aWNhbCBmdW5jdGlvbnMKKyAgICBpZiAoICFqUXVlcnku
c3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZigi
YmFja2dyb3VuZCIpID09PSAwICkgeworICAgIHN0eWxlWyBuYW1lIF0gPSAiaW5oZXJpdCI7Cisg
ICAgfQorCisgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90
aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgaWYgKCAhaG9va3MgfHwg
ISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0
cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKworICAgIC8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBm
cm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkCisg
ICAgLy8gRml4ZXMgYnVnICM1NTA5CisgICAgdHJ5IHsKKyAgICBzdHlsZVsgbmFtZSBdID0gdmFs
dWU7CisgICAgfSBjYXRjaChlKSB7fQorICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgLy8gSWYg
YSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJl
CisgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBl
bGVtLCBmYWxzZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKyAgICByZXR1cm4gcmV0Owor
ICAgIH0KKworICAgIC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5
bGUgb2JqZWN0CisgICAgcmV0dXJuIHN0eWxlWyBuYW1lIF07CisgICAgfQorICAgIH0sCisKKyAg
ICBjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkgeworICAgIHZhciBu
dW0sIHZhbCwgaG9va3MsCisgICAgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7
CisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5h
bWUKKyAgICBuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNz
c1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1l
ICkgKTsKKworICAgIC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24KKyAgICAv
LyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCisgICAgaG9va3MgPSBqUXVlcnku
Y3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CisKKyAgICAv
LyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVy
ZQorICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgKSB7CisgICAgdmFsID0gaG9va3Mu
Z2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgaWYg
YSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CisgICAgaWYg
KCB2YWwgPT09IHVuZGVmaW5lZCApIHsKKyAgICB2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0
eWxlcyApOworICAgIH0KKworICAgIC8vY29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1
ZQorICAgIGlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9y
bSApIHsKKyAgICB2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsKKyAgICB9CisKKyAg
ICAvLyBSZXR1cm4sIGNvbnZlcnRpbmcgdG8gbnVtYmVyIGlmIGZvcmNlZCBvciBhIHF1YWxpZmll
ciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljCisgICAgaWYgKCBleHRyYSA9PT0g
IiIgfHwgZXh0cmEgKSB7CisgICAgbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CisgICAgcmV0dXJu
IGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2
YWw7CisgICAgfQorICAgIHJldHVybiB2YWw7CisgICAgfSwKKworICAgIC8vIEEgbWV0aG9kIGZv
ciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBj
YWxjdWxhdGlvbnMKKyAgICBzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ss
IGFyZ3MgKSB7CisgICAgdmFyIHJldCwgbmFtZSwKKyAgICBvbGQgPSB7fTsKKworICAgIC8vIFJl
bWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcworICAgIGZvciAo
IG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICBvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUg
XTsKKyAgICBlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CisgICAgfQorCisg
ICAgcmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTsKKworICAgIC8vIFJl
dmVydCB0aGUgb2xkIHZhbHVlcworICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICBl
bGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0
OworICAgIH0KK30pOworCisvLyBOT1RFOiB3ZSd2ZSBpbmNsdWRlZCB0aGUgIndpbmRvdyIgaW4g
d2luZG93LmdldENvbXB1dGVkU3R5bGUKKy8vIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxs
IGJyZWFrIHdpdGhvdXQgaXQuCitpZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkgeworICAg
IGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiB3aW5kb3cuZ2V0Q29t
cHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOworICAgIH07CisKKyAgICBjdXJDU1MgPSBmdW5jdGlv
biggZWxlbSwgbmFtZSwgX2NvbXB1dGVkICkgeworICAgIHZhciB3aWR0aCwgbWluV2lkdGgsIG1h
eFdpZHRoLAorICAgIGNvbXB1dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAor
CisgICAgLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVy
JykgaW4gSUU5LCBzZWUgIzEyNTM3CisgICAgcmV0ID0gY29tcHV0ZWQgPyBjb21wdXRlZC5nZXRQ
cm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKKyAg
ICBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKyAgICBpZiAoIGNvbXB1dGVkICkgeworCisgICAgaWYg
KCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxl
bSApICkgeworICAgIHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOworICAgIH0KKwor
ICAgIC8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCisg
ICAgLy8gQ2hyb21lIDwgMTcgYW5kIFNhZmFyaSA1LjAgdXNlcyAiY29tcHV0ZWQgdmFsdWUiIGlu
c3RlYWQgb2YgInVzZWQgdmFsdWUiIGZvciBtYXJnaW4tcmlnaHQKKyAgICAvLyBTYWZhcmkgNS4x
LjcgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1
ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMKKyAgICAvLyB0aGlzIGlz
IGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nz
c29tLyNyZXNvbHZlZC12YWx1ZXMKKyAgICBpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBy
bWFyZ2luLnRlc3QoIG5hbWUgKSApIHsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2
YWx1ZXMKKyAgICB3aWR0aCA9IHN0eWxlLndpZHRoOworICAgIG1pbldpZHRoID0gc3R5bGUubWlu
V2lkdGg7CisgICAgbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsKKworICAgIC8vIFB1dCBpbiB0
aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKyAgICBzdHlsZS5taW5X
aWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7CisgICAgcmV0ID0gY29t
cHV0ZWQud2lkdGg7CisKKyAgICAvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCisgICAgc3R5
bGUud2lkdGggPSB3aWR0aDsKKyAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOworICAgIHN0
eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CisgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7
CisgICAgfTsKK30gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5
bGUgKSB7CisgICAgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgcmV0dXJuIGVs
ZW0uY3VycmVudFN0eWxlOworICAgIH07CisKKyAgICBjdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwg
bmFtZSwgX2NvbXB1dGVkICkgeworICAgIHZhciBsZWZ0LCBycywgcnNMZWZ0LAorICAgIGNvbXB1
dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAorICAgIHJldCA9IGNvbXB1dGVk
ID8gY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKKyAgICBzdHlsZSA9IGVsZW0uc3R5bGU7
CisKKyAgICAvLyBBdm9pZCBzZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZQorICAgIC8v
IHNvIHdlIGRvbid0IGRlZmF1bHQgdG8gYXV0bworICAgIGlmICggcmV0ID09IG51bGwgJiYgc3R5
bGUgJiYgc3R5bGVbIG5hbWUgXSApIHsKKyAgICByZXQgPSBzdHlsZVsgbmFtZSBdOworICAgIH0K
KworICAgIC8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKKyAgICAvLyBo
dHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQt
MTAyMjkxCisKKyAgICAvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhl
bCBudW1iZXIKKyAgICAvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdl
IG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKKyAgICAvLyBidXQgbm90IHBvc2l0aW9uIGNz
cyBhdHRyaWJ1dGVzLCBhcyB0aG9zZSBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwYXJlbnQgZWxl
bWVudCBpbnN0ZWFkCisgICAgLy8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0
ZWFkIGJlY2F1c2UgaXQgbWlnaHQgdHJpZ2dlciBhICJzdGFja2luZyBkb2xscyIgcHJvYmxlbQor
ICAgIGlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmICFycG9zaXRpb24udGVzdCggbmFtZSAp
ICkgeworCisgICAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgIGxlZnQgPSBz
dHlsZS5sZWZ0OworICAgIHJzID0gZWxlbS5ydW50aW1lU3R5bGU7CisgICAgcnNMZWZ0ID0gcnMg
JiYgcnMubGVmdDsKKworICAgIC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21w
dXRlZCB2YWx1ZSBvdXQKKyAgICBpZiAoIHJzTGVmdCApIHsKKyAgICBycy5sZWZ0ID0gZWxlbS5j
dXJyZW50U3R5bGUubGVmdDsKKyAgICB9CisgICAgc3R5bGUubGVmdCA9IG5hbWUgPT09ICJmb250
U2l6ZSIgPyAiMWVtIiA6IHJldDsKKyAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwor
CisgICAgLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworICAgIHN0eWxlLmxlZnQgPSBsZWZ0
OworICAgIGlmICggcnNMZWZ0ICkgeworICAgIHJzLmxlZnQgPSByc0xlZnQ7CisgICAgfQorICAg
IH0KKworICAgIHJldHVybiByZXQgPT09ICIiID8gImF1dG8iIDogcmV0OworICAgIH07Cit9CisK
K2Z1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7Cisg
ICAgdmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTsKKyAgICByZXR1cm4gbWF0
Y2hlcyA/CisgICAgLy8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgInN1YnRyYWN0IiwgZS5nLiwg
d2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzCisgICAgTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAt
ICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgorICAgIHZh
bHVlOworfQorCitmdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0
cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7CisgICAgdmFyIGkgPSBleHRyYSA9PT0gKCBpc0Jv
cmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICkgPworICAgIC8vIElmIHdlIGFscmVhZHkg
aGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbgorICAgIDQgOgor
ICAgIC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHBy
b3BlcnRpZXMKKyAgICBuYW1lID09PSAid2lkdGgiID8gMSA6IDAsCisKKyAgICB2YWwgPSAwOwor
CisgICAgZm9yICggOyBpIDwgNDsgaSArPSAyICkgeworICAgIC8vIGJvdGggYm94IG1vZGVscyBl
eGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKKyAgICBpZiAoIGV4dHJhID09
PSAibWFyZ2luIiApIHsKKyAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NF
eHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CisgICAgfQorCisgICAgaWYgKCBpc0JvcmRlckJv
eCApIHsKKyAgICAvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBp
ZiB3ZSB3YW50IGNvbnRlbnQKKyAgICBpZiAoIGV4dHJhID09PSAiY29udGVudCIgKSB7CisgICAg
dmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVl
LCBzdHlsZXMgKTsKKyAgICB9CisKKyAgICAvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBi
b3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgorICAgIGlmICggZXh0cmEgIT09ICJt
YXJnaW4iICkgeworICAgIHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4
cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CisgICAgfQorICAgIH0gZWxzZSB7
CisgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRp
bmcKKyAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBp
IF0sIHRydWUsIHN0eWxlcyApOworCisgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3Qg
Y29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlcgorICAgIGlmICggZXh0cmEgIT09ICJw
YWRkaW5nIiApIHsKKyAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NF
eHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOworICAgIH0KKyAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIHZhbDsKK30KKworZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxl
bSwgbmFtZSwgZXh0cmEgKSB7CisKKyAgICAvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwg
d2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQorICAgIHZhciB2YWx1
ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKKyAgICB2YWwgPSBuYW1lID09PSAid2lkdGgiID8gZWxlbS5v
ZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0LAorICAgIHN0eWxlcyA9IGdldFN0eWxlcygg
ZWxlbSApLAorICAgIGlzQm9yZGVyQm94ID0galF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nICYmIGpR
dWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXIt
Ym94IjsKKworICAgIC8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBm
b3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZAorICAgIC8vIHN2ZyAt
IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NQorICAg
IC8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lk
PTQ5MTY2OAorICAgIGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7CisgICAgLy8gRmFs
bCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5CisgICAg
dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsKKyAgICBpZiAoIHZhbCA8IDAgfHwg
dmFsID09IG51bGwgKSB7CisgICAgdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOworICAgIH0KKwor
ICAgIC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4u
CisgICAgaWYgKCBybnVtbm9ucHgudGVzdCh2YWwpICkgeworICAgIHJldHVybiB2YWw7CisgICAg
fQorCisgICAgLy8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2Vy
IHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKKyAgICAvLyBmb3IgZ2V0Q29tcHV0ZWRT
dHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlCisgICAg
dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmICggalF1ZXJ5LnN1cHBvcnQuYm94U2l6
aW5nUmVsaWFibGUgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKKworICAgIC8vIE5v
cm1hbGl6ZSAiIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhCisgICAgdmFsID0gcGFyc2VG
bG9hdCggdmFsICkgfHwgMDsKKyAgICB9CisKKyAgICAvLyB1c2UgdGhlIGFjdGl2ZSBib3gtc2l6
aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlcworICAgIHJldHVybiAo
IHZhbCArCisgICAgYXVnbWVudFdpZHRoT3JIZWlnaHQoCisgICAgZWxlbSwKKyAgICBuYW1lLAor
ICAgIGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApLAorICAg
IHZhbHVlSXNCb3JkZXJCb3gsCisgICAgc3R5bGVzCisgICAgKQorICAgICkgKyAicHgiOworfQor
CisvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxl
bWVudAorZnVuY3Rpb24gY3NzX2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHsKKyAgICB2YXIg
ZG9jID0gZG9jdW1lbnQsCisgICAgZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdOwor
CisgICAgaWYgKCAhZGlzcGxheSApIHsKKyAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9k
ZU5hbWUsIGRvYyApOworCisgICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJv
bSBpbnNpZGUgYW4gaWZyYW1lCisgICAgaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgIWRpc3Bs
YXkgKSB7CisgICAgLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxl
CisgICAgaWZyYW1lID0gKCBpZnJhbWUgfHwKKyAgICBqUXVlcnkoIjxpZnJhbWUgZnJhbWVib3Jk
ZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKQorICAgIC5jc3MoICJjc3NUZXh0IiwgImRp
c3BsYXk6YmxvY2sgIWltcG9ydGFudCIgKQorICAgICkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVs
ZW1lbnQgKTsKKworICAgIC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdl
YmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQorICAgIGRvYyA9ICggaWZyYW1l
WzBdLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lWzBdLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50
OworICAgIGRvYy53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+Iik7CisgICAgZG9j
LmNsb3NlKCk7CisKKyAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyAp
OworICAgIGlmcmFtZS5kZXRhY2goKTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgY29ycmVj
dCBkZWZhdWx0IGRpc3BsYXkKKyAgICBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7
CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BsYXk7Cit9CisKKy8vIENhbGxlZCBPTkxZIGZyb20g
d2l0aGluIGNzc19kZWZhdWx0RGlzcGxheQorZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwg
ZG9jICkgeworICAgIHZhciBlbGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSAp
ICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksCisgICAgZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1b
MF0sICJkaXNwbGF5IiApOworICAgIGVsZW0ucmVtb3ZlKCk7CisgICAgcmV0dXJuIGRpc3BsYXk7
Cit9CisKK2pRdWVyeS5lYWNoKFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5h
bWUgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlv
biggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkgeworICAgIGlmICggY29tcHV0ZWQgKSB7CisgICAg
Ly8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2li
bHkgc2hvdyB0aGVtCisgICAgLy8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNw
bGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXMKKyAgICByZXR1cm4gZWxlbS5v
ZmZzZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwg
ImRpc3BsYXkiICkgKSA/CisgICAgalF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOwor
ICAgIH0pIDoKKyAgICBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAg
IH0KKyAgICB9LAorCisgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgewor
ICAgIHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTsKKyAgICByZXR1cm4g
c2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBleHRyYSA/CisgICAgYXVnbWVudFdpZHRo
T3JIZWlnaHQoCisgICAgZWxlbSwKKyAgICBuYW1lLAorICAgIGV4dHJhLAorICAgIGpRdWVyeS5z
dXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2Us
IHN0eWxlcyApID09PSAiYm9yZGVyLWJveCIsCisgICAgc3R5bGVzCisgICAgKSA6IDAKKyAgICAp
OworICAgIH0KKyAgICB9OworfSk7CisKK2lmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7
CisgICAgalF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxl
bSwgY29tcHV0ZWQgKSB7CisgICAgLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CisgICAg
cmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVs
ZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KKyAg
ICAoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgIiIgOgorICAgIGNvbXB1dGVk
ID8gIjEiIDogIiI7CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkg
eworICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCisgICAgY3VycmVudFN0eWxlID0gZWxlbS5j
dXJyZW50U3R5bGUsCisgICAgb3BhY2l0eSA9IGpRdWVyeS5pc051bWVyaWMoIHZhbHVlICkgPyAi
YWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIgOiAiIiwKKyAgICBmaWx0ZXIgPSBj
dXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmZpbHRlciB8fCBzdHlsZS5maWx0ZXIgfHwgIiI7
CisKKyAgICAvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2
ZSBsYXlvdXQKKyAgICAvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCisgICAg
c3R5bGUuem9vbSA9IDE7CisKKyAgICAvLyBpZiBzZXR0aW5nIG9wYWNpdHkgdG8gMSwgYW5kIG5v
IG90aGVyIGZpbHRlcnMgZXhpc3QgLSBhdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgYXR0cmlidXRl
ICM2NjUyCisgICAgLy8gaWYgdmFsdWUgPT09ICIiLCB0aGVuIHJlbW92ZSBpbmxpbmUgb3BhY2l0
eSAjMTI2ODUKKyAgICBpZiAoICggdmFsdWUgPj0gMSB8fCB2YWx1ZSA9PT0gIiIgKSAmJgorICAg
IGpRdWVyeS50cmltKCBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCAiIiApICkgPT09ICIiICYmCisg
ICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlICkgeworCisgICAgLy8gU2V0dGluZyBzdHlsZS5maWx0
ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0
CisgICAgLy8gaWYgImZpbHRlcjoiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUgaXMgZGlz
YWJsZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpcworICAgIC8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0
ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4uLgorICAg
IHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKKworICAgIC8vIGlmIHRoZXJlIGlz
IG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUgb3IgdW5zZXQgaW5saW5lIG9w
YWNpdHksIHdlIGFyZSBkb25lCisgICAgaWYgKCB2YWx1ZSA9PT0gIiIgfHwgY3VycmVudFN0eWxl
ICYmICFjdXJyZW50U3R5bGUuZmlsdGVyICkgeworICAgIHJldHVybjsKKyAgICB9CisgICAgfQor
CisgICAgLy8gb3RoZXJ3aXNlLCBzZXQgbmV3IGZpbHRlciB2YWx1ZXMKKyAgICBzdHlsZS5maWx0
ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPworICAgIGZpbHRlci5yZXBsYWNlKCByYWxwaGEs
IG9wYWNpdHkgKSA6CisgICAgZmlsdGVyICsgIiAiICsgb3BhY2l0eTsKKyAgICB9CisgICAgfTsK
K30KKworLy8gVGhlc2UgaG9va3MgY2Fubm90IGJlIGFkZGVkIHVudGlsIERPTSByZWFkeSBiZWNh
dXNlIHRoZSBzdXBwb3J0IHRlc3QKKy8vIGZvciBpdCBpcyBub3QgcnVuIHVudGlsIGFmdGVyIERP
TSByZWFkeQoralF1ZXJ5KGZ1bmN0aW9uKCkgeworICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LnJl
bGlhYmxlTWFyZ2luUmlnaHQgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0g
eworICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgIGlmICggY29tcHV0
ZWQgKSB7CisgICAgLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJu
cyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CisgICAgLy8gV29yayBhcm91bmQgYnkgdGVt
cG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCisgICAgcmV0
dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7ICJkaXNwbGF5IjogImlubGluZS1ibG9jayIgfSwKKyAg
ICBjdXJDU1MsIFsgZWxlbSwgIm1hcmdpblJpZ2h0IiBdICk7CisgICAgfQorICAgIH0KKyAgICB9
OworICAgIH0KKworICAgIC8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0yOTA4NAorICAgIC8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJj
ZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQKKyAgICAvLyByYXRo
ZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwg
d2UganVzdCBjaGVjayBmb3IgaXQgaGVyZQorICAgIGlmICggIWpRdWVyeS5zdXBwb3J0LnBpeGVs
UG9zaXRpb24gJiYgalF1ZXJ5LmZuLnBvc2l0aW9uICkgeworICAgIGpRdWVyeS5lYWNoKCBbICJ0
b3AiLCAibGVmdCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7CisgICAgalF1ZXJ5LmNzc0hvb2tz
WyBwcm9wIF0gPSB7CisgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAg
aWYgKCBjb21wdXRlZCApIHsKKyAgICBjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApOwor
ICAgIC8vIGlmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldAor
ICAgIHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CisgICAgalF1ZXJ5KCBlbGVt
ICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CisgICAgY29tcHV0ZWQ7CisgICAgfQorICAg
IH0KKyAgICB9OworICAgIH0pOworICAgIH0KKworfSk7CisKK2lmICggalF1ZXJ5LmV4cHIgJiYg
alF1ZXJ5LmV4cHIuZmlsdGVycyApIHsKKyAgICBqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9
IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIC8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyCisgICAg
Ly8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFu
IHplcm8gb24gc29tZSBlbGVtZW50cworICAgIHJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAg
JiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMCB8fAorICAgICghalF1ZXJ5LnN1cHBvcnQucmVsaWFi
bGVIaWRkZW5PZmZzZXRzICYmICgoZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkpIHx8
IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApKSA9PT0gIm5vbmUiKTsKKyAgICB9OworCisg
ICAgalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOworICAgIH07Cit9CisK
Ky8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXMK
K2pRdWVyeS5lYWNoKHsKKyAgICBtYXJnaW46ICIiLAorICAgIHBhZGRpbmc6ICIiLAorICAgIGJv
cmRlcjogIldpZHRoIgorfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgeworICAgIGpRdWVy
eS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7CisgICAgZXhwYW5kOiBmdW5jdGlvbigg
dmFsdWUgKSB7CisgICAgdmFyIGkgPSAwLAorICAgIGV4cGFuZGVkID0ge30sCisKKyAgICAvLyBh
c3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKKyAgICBwYXJ0cyA9IHR5cGVv
ZiB2YWx1ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBdOworCisg
ICAgZm9yICggOyBpIDwgNDsgaSsrICkgeworICAgIGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBh
bmRbIGkgXSArIHN1ZmZpeCBdID0KKyAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8
IHBhcnRzWyAwIF07CisgICAgfQorCisgICAgcmV0dXJuIGV4cGFuZGVkOworICAgIH0KKyAgICB9
OworCisgICAgaWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHsKKyAgICBqUXVlcnkuY3Nz
SG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOworICAgIH0K
K30pOwordmFyIHIyMCA9IC8lMjAvZywKKyAgICByYnJhY2tldCA9IC9cW1xdJC8sCisgICAgckNS
TEYgPSAvXHI/XG4vZywKKyAgICByc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258
aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksCisgICAgcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxl
Y3R8dGV4dGFyZWF8a2V5Z2VuKS9pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBzZXJpYWxp
emU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXpl
QXJyYXkoKSApOworICAgIH0sCisgICAgc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgeworICAg
IHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworICAgIC8vIENhbiBhZGQgcHJvcEhvb2sgZm9y
ICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCisgICAgdmFyIGVsZW1l
bnRzID0galF1ZXJ5LnByb3AoIHRoaXMsICJlbGVtZW50cyIgKTsKKyAgICByZXR1cm4gZWxlbWVu
dHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpczsKKyAgICB9KQorICAgIC5m
aWx0ZXIoZnVuY3Rpb24oKXsKKyAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKKyAgICAvLyBVc2Ug
LmlzKCI6ZGlzYWJsZWQiKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcworICAgIHJl
dHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCAiOmRpc2FibGVkIiApICYmCisg
ICAgcnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVz
LnRlc3QoIHR5cGUgKSAmJgorICAgICggdGhpcy5jaGVja2VkIHx8ICFtYW5pcHVsYXRpb25fcmNo
ZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7CisgICAgfSkKKyAgICAubWFwKGZ1bmN0aW9uKCBp
LCBlbGVtICl7CisgICAgdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOworCisgICAgcmV0
dXJuIHZhbCA9PSBudWxsID8KKyAgICBudWxsIDoKKyAgICBqUXVlcnkuaXNBcnJheSggdmFsICkg
PworICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApeworICAgIHJldHVybiB7IG5h
bWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKKyAg
ICB9KSA6CisgICAgeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYs
ICJcclxuIiApIH07CisgICAgfSkuZ2V0KCk7CisgICAgfQorfSk7CisKKy8vU2VyaWFsaXplIGFu
IGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKKy8va2V5L3ZhbHVlcyBpbnRvIGEg
cXVlcnkgc3RyaW5nCitqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7
CisgICAgdmFyIHByZWZpeCwKKyAgICBzID0gW10sCisgICAgYWRkID0gZnVuY3Rpb24oIGtleSwg
dmFsdWUgKSB7CisgICAgLy8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCBy
ZXR1cm4gaXRzIHZhbHVlCisgICAgdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/
IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7CisgICAgc1sgcy5sZW5n
dGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25l
bnQoIHZhbHVlICk7CisgICAgfTsKKworICAgIC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZv
ciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCisgICAgaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5k
ZWZpbmVkICkgeworICAgIHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVl
cnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOworICAgIH0KKworICAgIC8vIElmIGFuIGFycmF5
IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVu
dHMuCisgICAgaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVy
eS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxl
bWVudHMKKyAgICBqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisgICAgYWRkKCB0aGlzLm5h
bWUsIHRoaXMudmFsdWUgKTsKKyAgICB9KTsKKworICAgIH0gZWxzZSB7CisgICAgLy8gSWYgdHJh
ZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCisg
ICAgLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCisgICAg
Zm9yICggcHJlZml4IGluIGEgKSB7CisgICAgYnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4
IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRo
ZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgorICAgIHJldHVybiBzLmpvaW4oICImIiApLnJlcGxh
Y2UoIHIyMCwgIisiICk7Cit9OworCitmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmos
IHRyYWRpdGlvbmFsLCBhZGQgKSB7CisgICAgdmFyIG5hbWU7CisKKyAgICBpZiAoIGpRdWVyeS5p
c0FycmF5KCBvYmogKSApIHsKKyAgICAvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS4KKyAgICBqUXVl
cnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHsKKyAgICBpZiAoIHRyYWRpdGlvbmFsIHx8
IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgeworICAgIC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRl
bSBhcyBhIHNjYWxhci4KKyAgICBhZGQoIHByZWZpeCwgdiApOworCisgICAgfSBlbHNlIHsKKyAg
ICAvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVt
ZXJpYyBpbmRleC4KKyAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9
PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOworICAg
IH0KKyAgICB9KTsKKworICAgIH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlw
ZSggb2JqICkgPT09ICJvYmplY3QiICkgeworICAgIC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4K
KyAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKKyAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsi
ICsgbmFtZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICB9CisK
KyAgICB9IGVsc2UgeworICAgIC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KKyAgICBhZGQoIHBy
ZWZpeCwgb2JqICk7CisgICAgfQorfQoralF1ZXJ5LmVhY2goICgiYmx1ciBmb2N1cyBmb2N1c2lu
IGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgIiArCisg
ICAgIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vl
bnRlciBtb3VzZWxlYXZlICIgKworICAgICJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtl
eXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Iikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGks
IG5hbWUgKSB7CisKKyAgICAvLyBIYW5kbGUgZXZlbnQgYmluZGluZworICAgIGpRdWVyeS5mblsg
bmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgeworICAgIHJldHVybiBhcmd1bWVudHMubGVu
Z3RoID4gMCA/CisgICAgdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CisgICAgdGhp
cy50cmlnZ2VyKCBuYW1lICk7CisgICAgfTsKK30pOworCitqUXVlcnkuZm4uaG92ZXIgPSBmdW5j
dGlvbiggZm5PdmVyLCBmbk91dCApIHsKKyAgICByZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92
ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKK307Cit2YXIKKyAgICAvLyBEb2N1
bWVudCBsb2NhdGlvbgorICAgIGFqYXhMb2NQYXJ0cywKKyAgICBhamF4TG9jYXRpb24sCisgICAg
YWpheF9ub25jZSA9IGpRdWVyeS5ub3coKSwKKworICAgIGFqYXhfcnF1ZXJ5ID0gL1w/LywKKyAg
ICByaGFzaCA9IC8jLiokLywKKyAgICBydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCisgICAgcmhlYWRl
cnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLCAvLyBJRSBsZWF2ZXMgYW4gXHIg
Y2hhcmFjdGVyIGF0IEVPTAorICAgIC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3Rv
Y29sIGRldGVjdGlvbgorICAgIHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0
b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCisgICAgcm5vQ29udGVudCA9
IC9eKD86R0VUfEhFQUQpJC8sCisgICAgcnByb3RvY29sID0gL15cL1wvLywKKyAgICBydXJsID0g
L14oW1x3ListXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLAorCisgICAgLy8g
S2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAorICAgIF9sb2FkID0galF1ZXJ5LmZu
LmxvYWQsCisKKyAgICAvKiBQcmVmaWx0ZXJzCisgICAgICogMSkgVGhleSBhcmUgdXNlZnVsIHRv
IGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhh
bXBsZSkKKyAgICAgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOgorICAgICAqICAgIC0gQkVGT1JFIGFz
a2luZyBmb3IgYSB0cmFuc3BvcnQKKyAgICAgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRp
b24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCisgICAgICog
Mykga2V5IGlzIHRoZSBkYXRhVHlwZQorICAgICAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioi
IGNhbiBiZSB1c2VkCisgICAgICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3Bv
cnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCisgICAg
ICovCisgICAgcHJlZmlsdGVycyA9IHt9LAorCisgICAgLyogVHJhbnNwb3J0cyBiaW5kaW5ncwor
ICAgICAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKKyAgICAgKiAyKSB0aGUgY2F0Y2hhbGwgc3lt
Ym9sICIqIiBjYW4gYmUgdXNlZAorICAgICAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGgg
dHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKKyAgICAgKi8K
KyAgICB0cmFuc3BvcnRzID0ge30sCisKKyAgICAvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFy
IHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Np
b24KKyAgICBhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCIqIik7CisKKy8vICM4MTM4LCBJRSBtYXkg
dGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nCisvLyBhIGZpZWxkIGZyb20gd2luZG93
LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKK3RyeSB7CisgICAgYWph
eExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjsKK30gY2F0Y2goIGUgKSB7CisgICAgLy8gVXNlIHRo
ZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQKKyAgICAvLyBzaW5jZSBJRSB3aWxsIG1v
ZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbgorICAgIGFqYXhMb2NhdGlvbiA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOworICAgIGFqYXhMb2NhdGlvbi5ocmVmID0gIiI7Cisg
ICAgYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Cit9CisKKy8vIFNlZ21lbnQgbG9j
YXRpb24gaW50byBwYXJ0cworYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24u
dG9Mb3dlckNhc2UoKSApIHx8IFtdOworCisvLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVy
eS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAorZnVuY3Rpb24gYWRkVG9Q
cmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CisKKyAgICAvLyBkYXRhVHlwZUV4
cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgorICAgIHJldHVybiBmdW5j
dGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgeworCisgICAgaWYgKCB0eXBlb2YgZGF0
YVR5cGVFeHByZXNzaW9uICE9PSAic3RyaW5nIiApIHsKKyAgICBmdW5jID0gZGF0YVR5cGVFeHBy
ZXNzaW9uOworICAgIGRhdGFUeXBlRXhwcmVzc2lvbiA9ICIqIjsKKyAgICB9CisKKyAgICB2YXIg
ZGF0YVR5cGUsCisgICAgaSA9IDAsCisgICAgZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9u
LnRvTG93ZXJDYXNlKCkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107CisKKyAgICBpZiAo
IGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CisgICAgLy8gRm9yIGVhY2ggZGF0YVR5cGUg
aW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgorICAgIHdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5
cGVzW2krK10pICkgeworICAgIC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCisgICAgaWYgKCBkYXRh
VHlwZVswXSA9PT0gIisiICkgeworICAgIGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8
fCAiKiI7CisgICAgKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUg
XSB8fCBbXSkudW5zaGlmdCggZnVuYyApOworCisgICAgLy8gT3RoZXJ3aXNlIGFwcGVuZAorICAg
IH0gZWxzZSB7CisgICAgKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5
cGUgXSB8fCBbXSkucHVzaCggZnVuYyApOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH07Cit9
CisKKy8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNw
b3J0cworZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwg
b3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKKworICAgIHZhciBpbnNwZWN0ZWQg
PSB7fSwKKyAgICBzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMg
KTsKKworICAgIGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkgeworICAgIHZhciBzZWxlY3Rl
ZDsKKyAgICBpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOworICAgIGpRdWVyeS5lYWNoKCBz
dHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3Rv
cnkgKSB7CisgICAgdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3Rvcnko
IG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKKyAgICBpZiggdHlwZW9mIGRhdGFU
eXBlT3JUcmFuc3BvcnQgPT09ICJzdHJpbmciICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNw
ZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKKyAgICBvcHRpb25zLmRhdGFUeXBlcy51
bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CisgICAgaW5zcGVjdCggZGF0YVR5cGVPclRy
YW5zcG9ydCApOworICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCBzZWVraW5nVHJh
bnNwb3J0ICkgeworICAgIHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQg
KTsKKyAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHJl
dHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioi
IF0gJiYgaW5zcGVjdCggIioiICk7Cit9CisKKy8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXgg
b3B0aW9ucworLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0
ZW5kZWQpCisvLyBGaXhlcyAjOTg4NworZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMg
KSB7CisgICAgdmFyIGRlZXAsIGtleSwKKyAgICBmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0
dGluZ3MuZmxhdE9wdGlvbnMgfHwge307CisKKyAgICBmb3IgKCBrZXkgaW4gc3JjICkgeworICAg
IGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgeworICAgICggZmxhdE9wdGlvbnNbIGtl
eSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8IChkZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNbIGtl
eSBdOworICAgIH0KKyAgICB9CisgICAgaWYgKCBkZWVwICkgeworICAgIGpRdWVyeS5leHRlbmQo
IHRydWUsIHRhcmdldCwgZGVlcCApOworICAgIH0KKworICAgIHJldHVybiB0YXJnZXQ7Cit9CisK
K2pRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKyAg
ICBpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgeworICAgIHJldHVybiBf
bG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisgICAgfQorCisgICAgdmFyIHNlbGVjdG9y
LCByZXNwb25zZSwgdHlwZSwKKyAgICBzZWxmID0gdGhpcywKKyAgICBvZmYgPSB1cmwuaW5kZXhP
ZigiICIpOworCisgICAgaWYgKCBvZmYgPj0gMCApIHsKKyAgICBzZWxlY3RvciA9IHVybC5zbGlj
ZSggb2ZmLCB1cmwubGVuZ3RoICk7CisgICAgdXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTsKKyAg
ICB9CisKKyAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24KKyAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0
aW9uKCBwYXJhbXMgKSApIHsKKworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxi
YWNrCisgICAgY2FsbGJhY2sgPSBwYXJhbXM7CisgICAgcGFyYW1zID0gdW5kZWZpbmVkOworCisg
ICAgLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworICAgIH0gZWxzZSBpZiAoIHBh
cmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKKyAgICB0eXBlID0gIlBPU1Qi
OworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRo
ZSByZXF1ZXN0CisgICAgaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CisgICAgalF1ZXJ5LmFqYXgo
eworICAgIHVybDogdXJsLAorCisgICAgLy8gaWYgInR5cGUiIHZhcmlhYmxlIGlzIHVuZGVmaW5l
ZCwgdGhlbiAiR0VUIiBtZXRob2Qgd2lsbCBiZSB1c2VkCisgICAgdHlwZTogdHlwZSwKKyAgICBk
YXRhVHlwZTogImh0bWwiLAorICAgIGRhdGE6IHBhcmFtcworICAgIH0pLmRvbmUoZnVuY3Rpb24o
IHJlc3BvbnNlVGV4dCApIHsKKworICAgIC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21w
bGV0ZSBjYWxsYmFjaworICAgIHJlc3BvbnNlID0gYXJndW1lbnRzOworCisgICAgc2VsZi5odG1s
KCBzZWxlY3RvciA/CisKKyAgICAvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0
ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKKyAgICAvLyBFeGNsdWRlIHNjcmlw
dHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKKyAgICBqUXVlcnkoIjxk
aXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNl
bGVjdG9yICkgOgorCisgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHQKKyAgICBy
ZXNwb25zZVRleHQgKTsKKworICAgIH0pLmNvbXBsZXRlKCBjYWxsYmFjayAmJiBmdW5jdGlvbigg
anFYSFIsIHN0YXR1cyApIHsKKyAgICBzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBb
IGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CisgICAgfSk7CisgICAgfQor
CisgICAgcmV0dXJuIHRoaXM7Cit9OworCisvLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMg
Zm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cworalF1ZXJ5LmVhY2goIFsgImFqYXhTdGFy
dCIsICJhamF4U3RvcCIsICJhamF4Q29tcGxldGUiLCAiYWpheEVycm9yIiwgImFqYXhTdWNjZXNz
IiwgImFqYXhTZW5kIiBdLCBmdW5jdGlvbiggaSwgdHlwZSApeworICAgIGpRdWVyeS5mblsgdHlw
ZSBdID0gZnVuY3Rpb24oIGZuICl7CisgICAgcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cisg
ICAgfTsKK30pOworCitqUXVlcnkuZWFjaCggWyAiZ2V0IiwgInBvc3QiIF0sIGZ1bmN0aW9uKCBp
LCBtZXRob2QgKSB7CisgICAgalF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEs
IGNhbGxiYWNrLCB0eXBlICkgeworICAgIC8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3Vt
ZW50IHdhcyBvbWl0dGVkCisgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewor
ICAgIHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOworICAgIGNhbGxiYWNrID0gZGF0YTsKKyAgICBk
YXRhID0gdW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiBqUXVlcnkuYWpheCh7CisgICAg
dXJsOiB1cmwsCisgICAgdHlwZTogbWV0aG9kLAorICAgIGRhdGFUeXBlOiB0eXBlLAorICAgIGRh
dGE6IGRhdGEsCisgICAgc3VjY2VzczogY2FsbGJhY2sKKyAgICB9KTsKKyAgICB9OworfSk7CisK
K2pRdWVyeS5leHRlbmQoeworCisgICAgLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVy
IG9mIGFjdGl2ZSBxdWVyaWVzCisgICAgYWN0aXZlOiAwLAorCisgICAgLy8gTGFzdC1Nb2RpZmll
ZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAorICAgIGxhc3RNb2RpZmllZDoge30sCisg
ICAgZXRhZzoge30sCisKKyAgICBhamF4U2V0dGluZ3M6IHsKKyAgICB1cmw6IGFqYXhMb2NhdGlv
biwKKyAgICB0eXBlOiAiR0VUIiwKKyAgICBpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBh
amF4TG9jUGFydHNbIDEgXSApLAorICAgIGdsb2JhbDogdHJ1ZSwKKyAgICBwcm9jZXNzRGF0YTog
dHJ1ZSwKKyAgICBhc3luYzogdHJ1ZSwKKyAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gt
d3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisgICAgLyoKKyAgICB0aW1lb3V0
OiAwLAorICAgIGRhdGE6IG51bGwsCisgICAgZGF0YVR5cGU6IG51bGwsCisgICAgdXNlcm5hbWU6
IG51bGwsCisgICAgcGFzc3dvcmQ6IG51bGwsCisgICAgY2FjaGU6IG51bGwsCisgICAgdGhyb3dz
OiBmYWxzZSwKKyAgICB0cmFkaXRpb25hbDogZmFsc2UsCisgICAgaGVhZGVyczoge30sCisgICAg
Ki8KKworICAgIGFjY2VwdHM6IHsKKyAgICAiKiI6IGFsbFR5cGVzLAorICAgIHRleHQ6ICJ0ZXh0
L3BsYWluIiwKKyAgICBodG1sOiAidGV4dC9odG1sIiwKKyAgICB4bWw6ICJhcHBsaWNhdGlvbi94
bWwsIHRleHQveG1sIiwKKyAgICBqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2Ny
aXB0IgorICAgIH0sCisKKyAgICBjb250ZW50czogeworICAgIHhtbDogL3htbC8sCisgICAgaHRt
bDogL2h0bWwvLAorICAgIGpzb246IC9qc29uLworICAgIH0sCisKKyAgICByZXNwb25zZUZpZWxk
czogeworICAgIHhtbDogInJlc3BvbnNlWE1MIiwKKyAgICB0ZXh0OiAicmVzcG9uc2VUZXh0Igor
ICAgIH0sCisKKyAgICAvLyBEYXRhIGNvbnZlcnRlcnMKKyAgICAvLyBLZXlzIHNlcGFyYXRlIHNv
dXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmds
ZSBzcGFjZQorICAgIGNvbnZlcnRlcnM6IHsKKworICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8g
dGV4dAorICAgICIqIHRleHQiOiB3aW5kb3cuU3RyaW5nLAorCisgICAgLy8gVGV4dCB0byBodG1s
ICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCisgICAgInRleHQgaHRtbCI6IHRydWUsCisKKyAg
ICAvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCisgICAgInRleHQganNvbiI6
IGpRdWVyeS5wYXJzZUpTT04sCisKKyAgICAvLyBQYXJzZSB0ZXh0IGFzIHhtbAorICAgICJ0ZXh0
IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAorICAgIH0sCisKKyAgICAvLyBGb3Igb3B0aW9ucyB0aGF0
IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOgorICAgIC8vIHlvdSBjYW4gYWRkIHlvdXIgb3du
IGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKKyAgICAvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0
aGF0IHNob3VsZG4ndCBiZQorICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQor
ICAgIGZsYXRPcHRpb25zOiB7CisgICAgdXJsOiB0cnVlLAorICAgIGNvbnRleHQ6IHRydWUKKyAg
ICB9CisgICAgfSwKKworICAgIC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2Jq
ZWN0IGludG8gdGFyZ2V0CisgICAgLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGlu
Z3MgZmllbGRzLgorICAgIC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4
U2V0dGluZ3MuCisgICAgYWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsK
KyAgICByZXR1cm4gc2V0dGluZ3MgPworCisgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmpl
Y3QKKyAgICBhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGlu
Z3MgKSwgc2V0dGluZ3MgKSA6CisKKyAgICAvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisgICAg
YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7CisgICAgfSwKKworICAg
IGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyAp
LAorICAgIGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNw
b3J0cyApLAorCisgICAgLy8gTWFpbiBtZXRob2QKKyAgICBhamF4OiBmdW5jdGlvbiggdXJsLCBv
cHRpb25zICkgeworCisgICAgLy8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEu
NSBzaWduYXR1cmUKKyAgICBpZiAoIHR5cGVvZiB1cmwgPT09ICJvYmplY3QiICkgeworICAgIG9w
dGlvbnMgPSB1cmw7CisgICAgdXJsID0gdW5kZWZpbmVkOworICAgIH0KKworICAgIC8vIEZvcmNl
IG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisK
KyAgICB2YXIgLy8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzCisgICAgcGFydHMsCisgICAg
Ly8gTG9vcCB2YXJpYWJsZQorICAgIGksCisgICAgLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBw
YXJhbQorICAgIGNhY2hlVVJMLAorICAgIC8vIFJlc3BvbnNlIGhlYWRlcnMgYXMgc3RyaW5nCisg
ICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nLAorICAgIC8vIHRpbWVvdXQgaGFuZGxlCisgICAgdGlt
ZW91dFRpbWVyLAorCisgICAgLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBk
aXNwYXRjaGVkCisgICAgZmlyZUdsb2JhbHMsCisKKyAgICB0cmFuc3BvcnQsCisgICAgLy8gUmVz
cG9uc2UgaGVhZGVycworICAgIHJlc3BvbnNlSGVhZGVycywKKyAgICAvLyBDcmVhdGUgdGhlIGZp
bmFsIG9wdGlvbnMgb2JqZWN0CisgICAgcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25z
ICksCisgICAgLy8gQ2FsbGJhY2tzIGNvbnRleHQKKyAgICBjYWxsYmFja0NvbnRleHQgPSBzLmNv
bnRleHQgfHwgcywKKyAgICAvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNr
Q29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uCisgICAgZ2xv
YmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBl
IHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CisgICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRl
eHQgKSA6CisgICAgalF1ZXJ5LmV2ZW50LAorICAgIC8vIERlZmVycmVkcworICAgIGRlZmVycmVk
ID0galF1ZXJ5LkRlZmVycmVkKCksCisgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxs
YmFja3MoIm9uY2UgbWVtb3J5IiksCisgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MK
KyAgICBzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAorICAgIC8vIEhlYWRlcnMgKHRo
ZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCisgICAgcmVxdWVzdEhlYWRlcnMgPSB7fSwKKyAgICBy
ZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCisgICAgLy8gVGhlIGpxWEhSIHN0YXRlCisgICAgc3Rh
dGUgPSAwLAorICAgIC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQorICAgIHN0ckFib3J0ID0gImNh
bmNlbGVkIiwKKyAgICAvLyBGYWtlIHhocgorICAgIGpxWEhSID0geworICAgIHJlYWR5U3RhdGU6
IDAsCisKKyAgICAvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCisgICAgZ2V0
UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CisgICAgdmFyIG1hdGNoOworICAgIGlm
ICggc3RhdGUgPT09IDIgKSB7CisgICAgaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgeworICAgIHJl
c3BvbnNlSGVhZGVycyA9IHt9OworICAgIHdoaWxlICggKG1hdGNoID0gcmhlYWRlcnMuZXhlYygg
cmVzcG9uc2VIZWFkZXJzU3RyaW5nICkpICkgeworICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hb
MV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKKyAgICB9CisgICAgfQorICAgIG1hdGNo
ID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOworICAgIH0KKyAgICByZXR1
cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDsKKyAgICB9LAorCisgICAgLy8gUmF3IHN0
cmluZworICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKKyAgICB9LAorCisg
ICAgLy8gQ2FjaGVzIHRoZSBoZWFkZXIKKyAgICBzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbigg
bmFtZSwgdmFsdWUgKSB7CisgICAgdmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAg
IGlmICggIXN0YXRlICkgeworICAgIG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBd
ID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lOworICAgIHJlcXVlc3RIZWFk
ZXJzWyBuYW1lIF0gPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKwor
ICAgIC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCisgICAgb3ZlcnJp
ZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgaWYgKCAhc3RhdGUgKSB7CisgICAg
cy5taW1lVHlwZSA9IHR5cGU7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAg
ICAvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworICAgIHN0YXR1c0NvZGU6IGZ1bmN0aW9u
KCBtYXAgKSB7CisgICAgdmFyIGNvZGU7CisgICAgaWYgKCBtYXAgKSB7CisgICAgaWYgKCBzdGF0
ZSA8IDIgKSB7CisgICAgZm9yICggY29kZSBpbiBtYXAgKSB7CisgICAgLy8gTGF6eS1hZGQgdGhl
IG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lcworICAgIHN0YXR1
c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdOworICAg
IH0KKyAgICB9IGVsc2UgeworICAgIC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNr
cworICAgIGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOworICAgIH0KKyAgICB9
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8vIENhbmNlbCB0aGUgcmVxdWVzdAor
ICAgIGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKKyAgICB2YXIgZmluYWxUZXh0ID0g
c3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKKyAgICBpZiAoIHRyYW5zcG9ydCApIHsKKyAgICB0cmFu
c3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApOworICAgIH0KKyAgICBkb25lKCAwLCBmaW5hbFRleHQg
KTsKKyAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgfTsKKworICAgIC8vIEF0dGFjaCBkZWZl
cnJlZHMKKyAgICBkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVE
ZWZlcnJlZC5hZGQ7CisgICAganFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7CisgICAganFYSFIu
ZXJyb3IgPSBqcVhIUi5mYWlsOworCisgICAgLy8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUz
MTogYW5kIHN0cmluZyBwcm9tb3Rpb24pCisgICAgLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92
aWRlZCAoIzU4NjY6IElFNyBpc3N1ZSB3aXRoIHByb3RvY29sLWxlc3MgdXJscykKKyAgICAvLyBI
YW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVu
Y3kgd2l0aCBvbGQgc2lnbmF0dXJlKQorICAgIC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1l
dGVyIGlmIGF2YWlsYWJsZQorICAgIHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9j
YXRpb24gKSArICIiICkucmVwbGFjZSggcmhhc2gsICIiICkucmVwbGFjZSggcnByb3RvY29sLCBh
amF4TG9jUGFydHNbIDEgXSArICIvLyIgKTsKKworICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRpb24g
dG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNAorICAgIHMudHlwZSA9IG9wdGlvbnMubWV0aG9k
IHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7CisKKyAgICAvLyBFeHRyYWN0
IGRhdGFUeXBlcyBsaXN0CisgICAgcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlw
ZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFsiIl07
CisKKyAgICAvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2
ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaAorICAgIGlmICggcy5jcm9zc0RvbWFpbiA9
PSBudWxsICkgeworICAgIHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7
CisgICAgcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJgorICAgICggcGFydHNbIDEgXSAhPT0g
YWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwK
KyAgICAoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0NDMg
KSApICE9CisgICAgKCBhamF4TG9jUGFydHNbIDMgXSB8fCAoIGFqYXhMb2NQYXJ0c1sgMSBdID09
PSAiaHR0cDoiID8gODAgOiA0NDMgKSApICkKKyAgICApOworICAgIH0KKworICAgIC8vIENvbnZl
cnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZworICAgIGlmICggcy5kYXRhICYmIHMucHJv
Y2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CisgICAgcy5kYXRhID0g
alF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKKyAgICB9CisKKyAgICAvLyBB
cHBseSBwcmVmaWx0ZXJzCisgICAgaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZp
bHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7CisKKyAgICAvLyBJZiByZXF1ZXN0IHdhcyBhYm9y
dGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQorICAgIGlmICggc3RhdGUgPT09IDIg
KSB7CisgICAgcmV0dXJuIGpxWEhSOworICAgIH0KKworICAgIC8vIFdlIGNhbiBmaXJlIGdsb2Jh
bCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCisgICAgZmlyZUdsb2JhbHMgPSBzLmdsb2Jh
bDsKKworICAgIC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKKyAgICBpZiAoIGZp
cmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKKyAgICBqUXVlcnkuZXZlbnQu
dHJpZ2dlcigiYWpheFN0YXJ0Iik7CisgICAgfQorCisgICAgLy8gVXBwZXJjYXNlIHRoZSB0eXBl
CisgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CisKKyAgICAvLyBEZXRlcm1pbmUg
aWYgcmVxdWVzdCBoYXMgY29udGVudAorICAgIHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRl
c3QoIHMudHlwZSApOworCisgICAgLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5n
IHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCisgICAgLy8gYW5kL29yIElmLU5vbmUtTWF0Y2gg
aGVhZGVyIGxhdGVyIG9uCisgICAgY2FjaGVVUkwgPSBzLnVybDsKKworICAgIC8vIE1vcmUgb3B0
aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisgICAgaWYgKCAhcy5o
YXNDb250ZW50ICkgeworCisgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRh
IHRvIHVybAorICAgIGlmICggcy5kYXRhICkgeworICAgIGNhY2hlVVJMID0gKCBzLnVybCArPSAo
IGFqYXhfcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOwor
ICAgIC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZl
bnR1YWwgcmV0cnkKKyAgICBkZWxldGUgcy5kYXRhOworICAgIH0KKworICAgIC8vIEFkZCBhbnRp
LWNhY2hlIGluIHVybCBpZiBuZWVkZWQKKyAgICBpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkgewor
ICAgIHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPworCisgICAgLy8gSWYgdGhlcmUgaXMg
YWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWUKKyAgICBjYWNoZVVSTC5yZXBs
YWNlKCBydHMsICIkMV89IiArIGFqYXhfbm9uY2UrKyApIDoKKworICAgIC8vIE90aGVyd2lzZSBh
ZGQgb25lIHRvIHRoZSBlbmQKKyAgICBjYWNoZVVSTCArICggYWpheF9ycXVlcnkudGVzdCggY2Fj
aGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIGFqYXhfbm9uY2UrKzsKKyAgICB9CisgICAg
fQorCisgICAgLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRj
aCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKyAgICBpZiAoIHMuaWZNb2RpZmllZCAp
IHsKKyAgICBpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7CisgICAganFY
SFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU1vZGlmaWVkLVNpbmNlIiwgalF1ZXJ5Lmxhc3RNb2Rp
ZmllZFsgY2FjaGVVUkwgXSApOworICAgIH0KKyAgICBpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVS
TCBdICkgeworICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1
ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBj
b3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CisgICAgaWYgKCBzLmRhdGEgJiYg
cy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVu
dFR5cGUgKSB7CisgICAganFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMu
Y29udGVudFR5cGUgKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZv
ciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisgICAganFYSFIuc2V0UmVx
dWVzdEhlYWRlcigKKyAgICAiQWNjZXB0IiwKKyAgICBzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNj
ZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSA/CisgICAgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBd
ICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAu
MDEiIDogIiIgKSA6CisgICAgcy5hY2NlcHRzWyAiKiIgXQorICAgICk7CisKKyAgICAvLyBDaGVj
ayBmb3IgaGVhZGVycyBvcHRpb24KKyAgICBmb3IgKCBpIGluIHMuaGVhZGVycyApIHsKKyAgICBq
cVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOworICAgIH0KKworICAg
IC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKyAgICBp
ZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQs
IGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7CisgICAgLy8gQWJvcnQg
aWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCisgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7
CisgICAgfQorCisgICAgLy8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uCisg
ICAgc3RyQWJvcnQgPSAiYWJvcnQiOworCisgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVm
ZXJyZWRzCisgICAgZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTog
MSB9ICkgeworICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOworICAgIH0KKworICAgIC8vIEdldCB0
cmFuc3BvcnQKKyAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cygg
dHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworICAgIC8vIElmIG5vIHRyYW5zcG9y
dCwgd2UgYXV0by1hYm9ydAorICAgIGlmICggIXRyYW5zcG9ydCApIHsKKyAgICBkb25lKCAtMSwg
Ik5vIFRyYW5zcG9ydCIgKTsKKyAgICB9IGVsc2UgeworICAgIGpxWEhSLnJlYWR5U3RhdGUgPSAx
OworCisgICAgLy8gU2VuZCBnbG9iYWwgZXZlbnQKKyAgICBpZiAoIGZpcmVHbG9iYWxzICkgewor
ICAgIGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0g
KTsKKyAgICB9CisgICAgLy8gVGltZW91dAorICAgIGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQg
PiAwICkgeworICAgIHRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAg
anFYSFIuYWJvcnQoInRpbWVvdXQiKTsKKyAgICB9LCBzLnRpbWVvdXQgKTsKKyAgICB9CisKKyAg
ICB0cnkgeworICAgIHN0YXRlID0gMTsKKyAgICB0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRl
cnMsIGRvbmUgKTsKKyAgICB9IGNhdGNoICggZSApIHsKKyAgICAvLyBQcm9wYWdhdGUgZXhjZXB0
aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCisgICAgaWYgKCBzdGF0ZSA8IDIgKSB7CisgICAgZG9u
ZSggLTEsIGUgKTsKKyAgICAvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2UKKyAgICB9IGVsc2Ug
eworICAgIHRocm93IGU7CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxsYmFjayBm
b3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKKyAgICBmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5h
dGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHsKKyAgICB2YXIgaXNTdWNjZXNz
LCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAorICAgIHN0YXR1c1RleHQgPSBu
YXRpdmVTdGF0dXNUZXh0OworCisgICAgLy8gQ2FsbGVkIG9uY2UKKyAgICBpZiAoIHN0YXRlID09
PSAyICkgeworICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTdGF0ZSBpcyAiZG9uZSIgbm93
CisgICAgc3RhdGUgPSAyOworCisgICAgLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKKyAg
ICBpZiAoIHRpbWVvdXRUaW1lciApIHsKKyAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciAp
OworICAgIH0KKworICAgIC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFn
ZSBjb2xsZWN0aW9uCisgICAgLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0
IHdpbGwgYmUgdXNlZCkKKyAgICB0cmFuc3BvcnQgPSB1bmRlZmluZWQ7CisKKyAgICAvLyBDYWNo
ZSByZXNwb25zZSBoZWFkZXJzCisgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8
fCAiIjsKKworICAgIC8vIFNldCByZWFkeVN0YXRlCisgICAganFYSFIucmVhZHlTdGF0ZSA9IHN0
YXR1cyA+IDAgPyA0IDogMDsKKworICAgIC8vIEdldCByZXNwb25zZSBkYXRhCisgICAgaWYgKCBy
ZXNwb25zZXMgKSB7CisgICAgcmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhI
UiwgcmVzcG9uc2VzICk7CisgICAgfQorCisgICAgLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5
cGUgY2hhaW5pbmcKKyAgICBpZiAoIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0
YXR1cyA9PT0gMzA0ICkgeworCisgICAgLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQv
b3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KKyAgICBpZiAo
IHMuaWZNb2RpZmllZCApIHsKKyAgICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVy
KCJMYXN0LU1vZGlmaWVkIik7CisgICAgaWYgKCBtb2RpZmllZCApIHsKKyAgICBqUXVlcnkubGFz
dE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7CisgICAgfQorICAgIG1vZGlmaWVkID0g
anFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKTsKKyAgICBpZiAoIG1vZGlmaWVkICkgewor
ICAgIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7CisgICAgfQorICAgIH0KKwor
ICAgIC8vIGlmIG5vIGNvbnRlbnQKKyAgICBpZiAoIHN0YXR1cyA9PT0gMjA0ICkgeworICAgIGlz
U3VjY2VzcyA9IHRydWU7CisgICAgc3RhdHVzVGV4dCA9ICJub2NvbnRlbnQiOworCisgICAgLy8g
aWYgbm90IG1vZGlmaWVkCisgICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7CisgICAg
aXNTdWNjZXNzID0gdHJ1ZTsKKyAgICBzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKKworICAg
IC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAorICAgIH0gZWxzZSB7CisgICAg
aXNTdWNjZXNzID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICk7CisgICAgc3RhdHVzVGV4dCA9
IGlzU3VjY2Vzcy5zdGF0ZTsKKyAgICBzdWNjZXNzID0gaXNTdWNjZXNzLmRhdGE7CisgICAgZXJy
b3IgPSBpc1N1Y2Nlc3MuZXJyb3I7CisgICAgaXNTdWNjZXNzID0gIWVycm9yOworICAgIH0KKyAg
ICB9IGVsc2UgeworICAgIC8vIFdlIGV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0CisgICAg
Ly8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVzIGZvciBub24tYWJvcnRzCisg
ICAgZXJyb3IgPSBzdGF0dXNUZXh0OworICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkg
eworICAgIHN0YXR1c1RleHQgPSAiZXJyb3IiOworICAgIGlmICggc3RhdHVzIDwgMCApIHsKKyAg
ICBzdGF0dXMgPSAwOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGRhdGEgZm9y
IHRoZSBmYWtlIHhociBvYmplY3QKKyAgICBqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CisgICAganFY
SFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsK
KworICAgIC8vIFN1Y2Nlc3MvRXJyb3IKKyAgICBpZiAoIGlzU3VjY2VzcyApIHsKKyAgICBkZWZl
cnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQs
IGpxWEhSIF0gKTsKKyAgICB9IGVsc2UgeworICAgIGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxi
YWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOworICAgIH0KKworICAg
IC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisgICAganFYSFIuc3RhdHVzQ29kZSggc3Rh
dHVzQ29kZSApOworICAgIHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CisKKyAgICBpZiAoIGZpcmVH
bG9iYWxzICkgeworICAgIGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAi
YWpheFN1Y2Nlc3MiIDogImFqYXhFcnJvciIsCisgICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8g
c3VjY2VzcyA6IGVycm9yIF0gKTsKKyAgICB9CisKKyAgICAvLyBDb21wbGV0ZQorICAgIGNvbXBs
ZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4
dCBdICk7CisKKyAgICBpZiAoIGZpcmVHbG9iYWxzICkgeworICAgIGdsb2JhbEV2ZW50Q29udGV4
dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CisgICAgLy8gSGFuZGxl
IHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisgICAgaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSAp
IHsKKyAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTsKKyAgICB9CisgICAgfQor
ICAgIH0KKworICAgIHJldHVybiBqcVhIUjsKKyAgICB9LAorCisgICAgZ2V0U2NyaXB0OiBmdW5j
dGlvbiggdXJsLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRl
ZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOworICAgIH0sCisKKyAgICBnZXRKU09OOiBmdW5j
dGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdldCggdXJs
LCBkYXRhLCBjYWxsYmFjaywgImpzb24iICk7CisgICAgfQorfSk7CisKKy8qIEhhbmRsZXMgcmVz
cG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDoKKyAqIC0gc2V0cyBhbGwgcmVzcG9uc2VYWFggZmll
bGRzIGFjY29yZGluZ2x5CisgKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMg
YmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQorICogLSByZXR1cm5z
IHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgKi8KK2Z1bmN0aW9uIGFqYXhIYW5kbGVSZXNw
b25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CisgICAgdmFyIGZpcnN0RGF0YVR5cGUsIGN0
LCBmaW5hbERhdGFUeXBlLCB0eXBlLAorICAgIGNvbnRlbnRzID0gcy5jb250ZW50cywKKyAgICBk
YXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKKyAgICByZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VG
aWVsZHM7CisKKyAgICAvLyBGaWxsIHJlc3BvbnNlWFhYIGZpZWxkcworICAgIGZvciAoIHR5cGUg
aW4gcmVzcG9uc2VGaWVsZHMgKSB7CisgICAgaWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKKyAg
ICBqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOworICAg
IH0KKyAgICB9CisKKyAgICAvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQt
dHlwZSBpbiB0aGUgcHJvY2VzcworICAgIHdoaWxlKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkg
eworICAgIGRhdGFUeXBlcy5zaGlmdCgpOworICAgIGlmICggY3QgPT09IHVuZGVmaW5lZCApIHsK
KyAgICBjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQt
VHlwZSIpOworICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdp
dGggYSBrbm93biBjb250ZW50LXR5cGUKKyAgICBpZiAoIGN0ICkgeworICAgIGZvciAoIHR5cGUg
aW4gY29udGVudHMgKSB7CisgICAgaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0
eXBlIF0udGVzdCggY3QgKSApIHsKKyAgICBkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworICAg
IGJyZWFrOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdl
IGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisgICAgaWYgKCBkYXRh
VHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CisgICAgZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBl
c1sgMCBdOworICAgIH0gZWxzZSB7CisgICAgLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwor
ICAgIGZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgeworICAgIGlmICggIWRhdGFUeXBlc1sgMCBd
IHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgeworICAgIGZp
bmFsRGF0YVR5cGUgPSB0eXBlOworICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoICFmaXJzdERh
dGFUeXBlICkgeworICAgIGZpcnN0RGF0YVR5cGUgPSB0eXBlOworICAgIH0KKyAgICB9CisgICAg
Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lCisgICAgZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5
cGUgfHwgZmlyc3REYXRhVHlwZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIGRhdGFU
eXBlCisgICAgLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKKyAg
ICAvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgICAgaWYgKCBmaW5h
bERhdGFUeXBlICkgeworICAgIGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0g
KSB7CisgICAgZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKKyAgICB9CisgICAg
cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdOworICAgIH0KK30KKworLy8gQ2hhaW4g
Y29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQor
ZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICkgeworICAgIHZhciBjb252MiwgY3Vy
cmVudCwgY29udiwgdG1wLAorICAgIGNvbnZlcnRlcnMgPSB7fSwKKyAgICBpID0gMCwKKyAgICAv
LyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5
IGl0IGZvciBjb252ZXJzaW9uCisgICAgZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKSwK
KyAgICBwcmV2ID0gZGF0YVR5cGVzWyAwIF07CisKKyAgICAvLyBBcHBseSB0aGUgZGF0YUZpbHRl
ciBpZiBwcm92aWRlZAorICAgIGlmICggcy5kYXRhRmlsdGVyICkgeworICAgIHJlc3BvbnNlID0g
cy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOworICAgIH0KKworICAgIC8vIENy
ZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cworICAgIGlmICggZGF0YVR5
cGVzWyAxIF0gKSB7CisgICAgZm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CisgICAgY29u
dmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKKyAg
ICB9CisgICAgfQorCisgICAgLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUs
IHRvbGVyYXRpbmcgbGlzdCBtb2RpZmljYXRpb24KKyAgICBmb3IgKCA7IChjdXJyZW50ID0gZGF0
YVR5cGVzWysraV0pOyApIHsKKworICAgIC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1
cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG8KKyAgICBpZiAoIGN1cnJlbnQgIT09ICIqIiApIHsK
KworICAgIC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBh
bmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKKyAgICBpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9
PSBjdXJyZW50ICkgeworCisgICAgLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKKyAgICBjb252
ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAi
ICsgY3VycmVudCBdOworCisgICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKKyAgICBp
ZiAoICFjb252ICkgeworICAgIGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CisKKyAgICAv
LyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnQKKyAgICB0bXAgPSBjb252Mi5zcGxpdCgiICIpOwor
ICAgIGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CisKKyAgICAvLyBJZiBwcmV2IGNhbiBi
ZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQKKyAgICBjb252ID0gY29udmVydGVyc1sgcHJl
diArICIgIiArIHRtcFsgMCBdIF0gfHwKKyAgICBjb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0g
XTsKKyAgICBpZiAoIGNvbnYgKSB7CisgICAgLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVy
dGVycworICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsKKyAgICBjb252ID0gY29udmVydGVyc1sg
Y29udjIgXTsKKworICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0
YVR5cGUKKyAgICB9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewor
ICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKKyAgICBkYXRhVHlwZXMuc3BsaWNlKCBpLS0sIDAsIGN1
cnJlbnQgKTsKKyAgICB9CisKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9
CisKKyAgICAvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKKyAgICBp
ZiAoIGNvbnYgIT09IHRydWUgKSB7CisKKyAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2Vk
IHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtCisgICAgaWYgKCBjb252ICYmIHNbInRo
cm93cyJdICkgeworICAgIHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKKyAgICB9IGVsc2Ug
eworICAgIHRyeSB7CisgICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOworICAgIH0gY2F0
Y2ggKCBlICkgeworICAgIHJldHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3IiLCBlcnJvcjogY29u
diA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudCB9
OworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSBwcmV2IGZvciBu
ZXh0IGl0ZXJhdGlvbgorICAgIHByZXYgPSBjdXJyZW50OworICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9OworfQorLy8gSW5zdGFs
bCBzY3JpcHQgZGF0YVR5cGUKK2pRdWVyeS5hamF4U2V0dXAoeworICAgIGFjY2VwdHM6IHsKKyAg
ICBzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxp
Y2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKKyAgICB9LAorICAg
IGNvbnRlbnRzOiB7CisgICAgc2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC8KKyAgICB9LAor
ICAgIGNvbnZlcnRlcnM6IHsKKyAgICAidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsK
KyAgICBqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApOworICAgIHJldHVybiB0ZXh0OworICAgIH0K
KyAgICB9Cit9KTsKKworLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBnbG9iYWwK
K2pRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CisgICAgaWYg
KCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CisgICAgcy5jYWNoZSA9IGZhbHNlOworICAgIH0K
KyAgICBpZiAoIHMuY3Jvc3NEb21haW4gKSB7CisgICAgcy50eXBlID0gIkdFVCI7CisgICAgcy5n
bG9iYWwgPSBmYWxzZTsKKyAgICB9Cit9KTsKKworLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJh
bnNwb3J0CitqUXVlcnkuYWpheFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKHMpIHsKKwor
ICAgIC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVz
dHMKKyAgICBpZiAoIHMuY3Jvc3NEb21haW4gKSB7CisKKyAgICB2YXIgc2NyaXB0LAorICAgIGhl
YWQgPSBkb2N1bWVudC5oZWFkIHx8IGpRdWVyeSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3Vt
ZW50RWxlbWVudDsKKworICAgIHJldHVybiB7CisKKyAgICBzZW5kOiBmdW5jdGlvbiggXywgY2Fs
bGJhY2sgKSB7CisKKyAgICBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQi
KTsKKworICAgIHNjcmlwdC5hc3luYyA9IHRydWU7CisKKyAgICBpZiAoIHMuc2NyaXB0Q2hhcnNl
dCApIHsKKyAgICBzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKyAgICB9CisKKyAg
ICBzY3JpcHQuc3JjID0gcy51cmw7CisKKyAgICAvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBi
cm93c2VycworICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0g
ZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CisKKyAgICBpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5y
ZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkg
KSB7CisKKyAgICAvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKKyAgICBzY3JpcHQub25sb2Fk
ID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisKKyAgICAvLyBSZW1vdmUgdGhl
IHNjcmlwdAorICAgIGlmICggc2NyaXB0LnBhcmVudE5vZGUgKSB7CisgICAgc2NyaXB0LnBhcmVu
dE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworICAgIH0KKworICAgIC8vIERlcmVmZXJlbmNl
IHRoZSBzY3JpcHQKKyAgICBzY3JpcHQgPSBudWxsOworCisgICAgLy8gQ2FsbGJhY2sgaWYgbm90
IGFib3J0CisgICAgaWYgKCAhaXNBYm9ydCApIHsKKyAgICBjYWxsYmFjayggMjAwLCAic3VjY2Vz
cyIgKTsKKyAgICB9CisgICAgfQorICAgIH07CisKKyAgICAvLyBDaXJjdW12ZW50IElFNiBidWdz
IHdpdGggYmFzZSBlbGVtZW50cyAoIzI3MDkgYW5kICM0Mzc4KSBieSBwcmVwZW5kaW5nCisgICAg
Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFY
IHRyaWNrZXJ5CisgICAgaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxk
ICk7CisgICAgfSwKKworICAgIGFib3J0OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIHNjcmlwdCAp
IHsKKyAgICBzY3JpcHQub25sb2FkKCB1bmRlZmluZWQsIHRydWUgKTsKKyAgICB9CisgICAgfQor
ICAgIH07CisgICAgfQorfSk7Cit2YXIgb2xkQ2FsbGJhY2tzID0gW10sCisgICAgcmpzb25wID0g
Lyg9KVw/KD89JnwkKXxcP1w/LzsKKworLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncworalF1ZXJ5
LmFqYXhTZXR1cCh7CisgICAganNvbnA6ICJjYWxsYmFjayIsCisgICAganNvbnBDYWxsYmFjazog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICgg
alF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIGFqYXhfbm9uY2UrKyApICk7CisgICAgdGhpc1sgY2Fs
bGJhY2sgXSA9IHRydWU7CisgICAgcmV0dXJuIGNhbGxiYWNrOworICAgIH0KK30pOworCisvLyBE
ZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAg
cmVxdWVzdHMKK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBz
LCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKKworICAgIHZhciBjYWxsYmFja05hbWUsIG92
ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwKKyAgICBqc29uUHJvcCA9IHMuanNvbnAgIT09
IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgPworICAgICJ1cmwiIDoKKyAgICB0eXBl
b2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkuaW5kZXhP
ZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikgJiYgcmpzb25wLnRlc3QoIHMu
ZGF0YSApICYmICJkYXRhIgorICAgICk7CisKKyAgICAvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3Rl
ZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldAorICAg
IGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKKworICAg
IC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3Nv
Y2lhdGVkIHdpdGggaXQKKyAgICBjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVl
cnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgPworICAgIHMuanNvbnBDYWxsYmFjaygp
IDoKKyAgICBzLmpzb25wQ2FsbGJhY2s7CisKKyAgICAvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1
cmwgb3IgZm9ybSBkYXRhCisgICAgaWYgKCBqc29uUHJvcCApIHsKKyAgICBzWyBqc29uUHJvcCBd
ID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsK
KyAgICB9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKKyAgICBzLnVybCArPSAoIGFq
YXhfcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyAiJiIgOiAiPyIgKSArIHMuanNvbnAgKyAiPSIgKyBj
YWxsYmFja05hbWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJp
ZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgorICAgIHMuY29udmVydGVyc1sic2NyaXB0
IGpzb24iXSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewor
ICAgIGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKKyAg
ICB9CisgICAgcmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07CisgICAgfTsKKworICAgIC8v
IGZvcmNlIGpzb24gZGF0YVR5cGUKKyAgICBzLmRhdGFUeXBlc1sgMCBdID0gImpzb24iOworCisg
ICAgLy8gSW5zdGFsbCBjYWxsYmFjaworICAgIG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFj
a05hbWUgXTsKKyAgICB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CisgICAg
cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7CisgICAgfTsKKworICAgIC8vIENsZWFuLXVw
IGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQorICAgIGpxWEhSLmFsd2F5cyhmdW5j
dGlvbigpIHsKKyAgICAvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCisgICAgd2luZG93WyBj
YWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuOworCisgICAgLy8gU2F2ZSBiYWNrIGFzIGZyZWUK
KyAgICBpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgeworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJl
LXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAorICAgIHMuanNv
bnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKKworICAgIC8vIHNh
dmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKKyAgICBvbGRDYWxsYmFja3MucHVz
aCggY2FsbGJhY2tOYW1lICk7CisgICAgfQorCisgICAgLy8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5j
dGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlCisgICAgaWYgKCByZXNwb25zZUNvbnRhaW5lciAm
JiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKKyAgICBvdmVyd3JpdHRlbigg
cmVzcG9uc2VDb250YWluZXJbIDAgXSApOworICAgIH0KKworICAgIHJlc3BvbnNlQ29udGFpbmVy
ID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7CisgICAgfSk7CisKKyAgICAvLyBEZWxlZ2F0ZSB0
byBzY3JpcHQKKyAgICByZXR1cm4gInNjcmlwdCI7CisgICAgfQorfSk7Cit2YXIgeGhyQ2FsbGJh
Y2tzLCB4aHJTdXBwb3J0ZWQsCisgICAgeGhySWQgPSAwLAorICAgIC8vICM1MjgwOiBJbnRlcm5l
dCBFeHBsb3JlciB3aWxsIGtlZXAgY29ubmVjdGlvbnMgYWxpdmUgaWYgd2UgZG9uJ3QgYWJvcnQg
b24gdW5sb2FkCisgICAgeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ICYm
IGZ1bmN0aW9uKCkgeworICAgIC8vIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzCisgICAgdmFy
IGtleTsKKyAgICBmb3IgKCBrZXkgaW4geGhyQ2FsbGJhY2tzICkgeworICAgIHhockNhbGxiYWNr
c1sga2V5IF0oIHVuZGVmaW5lZCwgdHJ1ZSApOworICAgIH0KKyAgICB9OworCisvLyBGdW5jdGlv
bnMgdG8gY3JlYXRlIHhocnMKK2Z1bmN0aW9uIGNyZWF0ZVN0YW5kYXJkWEhSKCkgeworICAgIHRy
eSB7CisgICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKKyAgICB9IGNhdGNo
KCBlICkge30KK30KKworZnVuY3Rpb24gY3JlYXRlQWN0aXZlWEhSKCkgeworICAgIHRyeSB7Cisg
ICAgcmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsK
KyAgICB9IGNhdGNoKCBlICkge30KK30KKworLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAor
Ly8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBj
b21wYXRpYmlsaXR5KQoralF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9i
amVjdCA/CisgICAgLyogTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQorICAgICAqIGltcGxl
bWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVz
KSwKKyAgICAgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFi
bGUKKyAgICAgKiBBZGRpdGlvbmFsbHkgWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIGlu
IElFNy9JRTggc28KKyAgICAgKiB3ZSBuZWVkIGEgZmFsbGJhY2suCisgICAgICovCisgICAgZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuICF0aGlzLmlzTG9jYWwgJiYgY3JlYXRlU3RhbmRhcmRYSFIo
KSB8fCBjcmVhdGVBY3RpdmVYSFIoKTsKKyAgICB9IDoKKyAgICAvLyBGb3IgYWxsIG90aGVyIGJy
b3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorICAgIGNyZWF0
ZVN0YW5kYXJkWEhSOworCisvLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCit4aHJTdXBw
b3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpOworalF1ZXJ5LnN1cHBvcnQuY29ycyA9
ICEheGhyU3VwcG9ydGVkICYmICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyU3VwcG9ydGVkICk7
Cit4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuc3VwcG9ydC5hamF4ID0gISF4aHJTdXBwb3J0ZWQ7CisK
Ky8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCitp
ZiAoIHhoclN1cHBvcnRlZCApIHsKKworICAgIGpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9u
KCBzICkgeworICAgIC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRo
cm91Z2ggWE1MSHR0cFJlcXVlc3QKKyAgICBpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5z
dXBwb3J0LmNvcnMgKSB7CisKKyAgICB2YXIgY2FsbGJhY2s7CisKKyAgICByZXR1cm4geworICAg
IHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKKworICAgIC8vIEdldCBhIG5l
dyB4aHIKKyAgICB2YXIgaGFuZGxlLCBpLAorICAgIHhociA9IHMueGhyKCk7CisKKyAgICAvLyBP
cGVuIHRoZSBzb2NrZXQKKyAgICAvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBh
IGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKKyAgICBpZiAoIHMudXNlcm5hbWUgKSB7Cisg
ICAgeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dv
cmQgKTsKKyAgICB9IGVsc2UgeworICAgIHhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5j
ICk7CisgICAgfQorCisgICAgLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAorICAg
IGlmICggcy54aHJGaWVsZHMgKSB7CisgICAgZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsKKyAg
ICB4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CisgICAgfQorICAgIH0KKworICAgIC8vIE92
ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKKyAgICBpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92
ZXJyaWRlTWltZVR5cGUgKSB7CisgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUg
KTsKKyAgICB9CisKKyAgICAvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgorICAgIC8vIEZvciBj
cm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdo
dCBhcmUKKyAgICAvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNl
dCBpdCB0byBiZSBzdXJlLgorICAgIC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1y
ZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQorICAgIC8vIEZvciBzYW1lLWRv
bWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgor
ICAgIGlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSAp
IHsKKyAgICBoZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gPSAiWE1MSHR0cFJlcXVlc3QiOwor
ICAgIH0KKworICAgIC8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4g
cmVxdWVzdHMgaW4gRmlyZWZveCAzCisgICAgdHJ5IHsKKyAgICBmb3IgKCBpIGluIGhlYWRlcnMg
KSB7CisgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApOworICAgIH0K
KyAgICB9IGNhdGNoKCBlcnIgKSB7fQorCisgICAgLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAorICAg
IC8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQorICAgIC8v
IGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQorICAgIHhoci5z
ZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CisKKyAgICAvLyBMaXN0
ZW5lcgorICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CisgICAgdmFyIHN0
YXR1cywgcmVzcG9uc2VIZWFkZXJzLCBzdGF0dXNUZXh0LCByZXNwb25zZXM7CisKKyAgICAvLyBG
aXJlZm94IHRocm93cyBleGNlcHRpb25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMKKyAgICAv
LyBvZiBhbiB4aHIgd2hlbiBhIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQKKyAgICAvLyBodHRwOi8v
aGVscGZ1bC5rbm9icy1kaWFscy5jb20vaW5kZXgucGhwL0NvbXBvbmVudF9yZXR1cm5lZF9mYWls
dXJlX2NvZGU6XzB4ODAwNDAxMTFfKE5TX0VSUk9SX05PVF9BVkFJTEFCTEUpCisgICAgdHJ5IHsK
KworICAgIC8vIFdhcyBuZXZlciBjYWxsZWQgYW5kIGlzIGFib3J0ZWQgb3IgY29tcGxldGUKKyAg
ICBpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkg
eworCisgICAgLy8gT25seSBjYWxsZWQgb25jZQorICAgIGNhbGxiYWNrID0gdW5kZWZpbmVkOwor
CisgICAgLy8gRG8gbm90IGtlZXAgYXMgYWN0aXZlIGFueW1vcmUKKyAgICBpZiAoIGhhbmRsZSAp
IHsKKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CisgICAgaWYgKCB4
aHJPblVubG9hZEFib3J0ICkgeworICAgIGRlbGV0ZSB4aHJDYWxsYmFja3NbIGhhbmRsZSBdOwor
ICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBpdCdzIGFuIGFib3J0CisgICAgaWYgKCBpc0Fib3J0
ICkgeworICAgIC8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAorICAgIGlmICggeGhyLnJl
YWR5U3RhdGUgIT09IDQgKSB7CisgICAgeGhyLmFib3J0KCk7CisgICAgfQorICAgIH0gZWxzZSB7
CisgICAgcmVzcG9uc2VzID0ge307CisgICAgc3RhdHVzID0geGhyLnN0YXR1czsKKyAgICByZXNw
b25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisKKyAgICAvLyBXaGVu
IHJlcXVlc3RpbmcgYmluYXJ5IGRhdGEsIElFNi05IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCisg
ICAgLy8gb24gYW55IGF0dGVtcHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAoIzExNDI2KQorICAg
IGlmICggdHlwZW9mIHhoci5yZXNwb25zZVRleHQgPT09ICJzdHJpbmciICkgeworICAgIHJlc3Bv
bnNlcy50ZXh0ID0geGhyLnJlc3BvbnNlVGV4dDsKKyAgICB9CisKKyAgICAvLyBGaXJlZm94IHRo
cm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKKyAgICAvLyBzdGF0dXNUZXh0IGZvciBm
YXVsdHkgY3Jvc3MtZG9tYWluIHJlcXVlc3RzCisgICAgdHJ5IHsKKyAgICBzdGF0dXNUZXh0ID0g
eGhyLnN0YXR1c1RleHQ7CisgICAgfSBjYXRjaCggZSApIHsKKyAgICAvLyBXZSBub3JtYWxpemUg
d2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHQKKyAgICBzdGF0dXNUZXh0ID0g
IiI7CisgICAgfQorCisgICAgLy8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2
aW9ycworCisgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTog
YXNzdW1lIGEgc3VjY2VzcworICAgIC8vIChzdWNjZXNzIHdpdGggbm8gZGF0YSB3b24ndCBnZXQg
bm90aWZpZWQsIHRoYXQncyB0aGUgYmVzdCB3ZQorICAgIC8vIGNhbiBkbyBnaXZlbiBjdXJyZW50
IGltcGxlbWVudGF0aW9ucykKKyAgICBpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNy
b3NzRG9tYWluICkgeworICAgIHN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0Owor
ICAgIC8vIElFIC0gIzE0NTA6IHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQg
YmUgMjA0CisgICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAxMjIzICkgeworICAgIHN0YXR1cyA9
IDIwNDsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9IGNhdGNoKCBmaXJlZm94QWNjZXNzRXhj
ZXB0aW9uICkgeworICAgIGlmICggIWlzQWJvcnQgKSB7CisgICAgY29tcGxldGUoIC0xLCBmaXJl
Zm94QWNjZXNzRXhjZXB0aW9uICk7CisgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgY29tcGxl
dGUgaWYgbmVlZGVkCisgICAgaWYgKCByZXNwb25zZXMgKSB7CisgICAgY29tcGxldGUoIHN0YXR1
cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCByZXNwb25zZUhlYWRlcnMgKTsKKyAgICB9CisgICAg
fTsKKworICAgIGlmICggIXMuYXN5bmMgKSB7CisgICAgLy8gaWYgd2UncmUgaW4gc3luYyBtb2Rl
IHdlIGZpcmUgdGhlIGNhbGxiYWNrCisgICAgY2FsbGJhY2soKTsKKyAgICB9IGVsc2UgaWYgKCB4
aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKKyAgICAvLyAoSUU2ICYgSUU3KSBpZiBpdCdzIGluIGNh
Y2hlIGFuZCBoYXMgYmVlbgorICAgIC8vIHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZp
cmUgdGhlIGNhbGxiYWNrCisgICAgc2V0VGltZW91dCggY2FsbGJhY2sgKTsKKyAgICB9IGVsc2Ug
eworICAgIGhhbmRsZSA9ICsreGhySWQ7CisgICAgaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewor
ICAgIC8vIENyZWF0ZSB0aGUgYWN0aXZlIHhocnMgY2FsbGJhY2tzIGxpc3QgaWYgbmVlZGVkCisg
ICAgLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKKyAgICBpZiAoICF4aHJDYWxsYmFj
a3MgKSB7CisgICAgeGhyQ2FsbGJhY2tzID0ge307CisgICAgalF1ZXJ5KCB3aW5kb3cgKS51bmxv
YWQoIHhock9uVW5sb2FkQWJvcnQgKTsKKyAgICB9CisgICAgLy8gQWRkIHRvIGxpc3Qgb2YgYWN0
aXZlIHhocnMgY2FsbGJhY2tzCisgICAgeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXSA9IGNhbGxiYWNr
OworICAgIH0KKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gY2FsbGJhY2s7CisgICAgfQor
ICAgIH0sCisKKyAgICBhYm9ydDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCBjYWxsYmFjayApIHsK
KyAgICBjYWxsYmFjayggdW5kZWZpbmVkLCB0cnVlICk7CisgICAgfQorICAgIH0KKyAgICB9Owor
ICAgIH0KKyAgICB9KTsKK30KK3ZhciBmeE5vdywgdGltZXJJZCwKKyAgICByZnh0eXBlcyA9IC9e
KD86dG9nZ2xlfHNob3d8aGlkZSkkLywKKyAgICByZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/Oihb
Ky1dKT18KSgiICsgY29yZV9wbnVtICsgIikoW2EteiVdKikkIiwgImkiICksCisgICAgcnJ1biA9
IC9xdWV1ZUhvb2tzJC8sCisgICAgYW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZp
bHRlciBdLAorICAgIHR3ZWVuZXJzID0geworICAgICIqIjogW2Z1bmN0aW9uKCBwcm9wLCB2YWx1
ZSApIHsKKyAgICB2YXIgZW5kLCB1bml0LAorICAgIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2Vlbigg
cHJvcCwgdmFsdWUgKSwKKyAgICBwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLAorICAgIHRh
cmdldCA9IHR3ZWVuLmN1cigpLAorICAgIHN0YXJ0ID0gK3RhcmdldCB8fCAwLAorICAgIHNjYWxl
ID0gMSwKKyAgICBtYXhJdGVyYXRpb25zID0gMjA7CisKKyAgICBpZiAoIHBhcnRzICkgeworICAg
IGVuZCA9ICtwYXJ0c1syXTsKKyAgICB1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVt
YmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKKworICAgIC8vIFdlIG5lZWQgdG8gY29tcHV0ZSBz
dGFydGluZyB2YWx1ZQorICAgIGlmICggdW5pdCAhPT0gInB4IiAmJiBzdGFydCApIHsKKyAgICAv
LyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAor
ICAgIC8vIFByZWZlciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0aGlzIHByb2Nlc3Mg
d2lsbCBiZSB0cml2aWFsIGlmIGl0IHVzZXMgdGhlIHNhbWUgdW5pdHMKKyAgICAvLyBGYWxsYmFj
ayB0byBlbmQgb3IgYSBzaW1wbGUgY29uc3RhbnQKKyAgICBzdGFydCA9IGpRdWVyeS5jc3MoIHR3
ZWVuLmVsZW0sIHByb3AsIHRydWUgKSB8fCBlbmQgfHwgMTsKKworICAgIGRvIHsKKyAgICAvLyBJ
ZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29t
ZXRoaW5nKgorICAgIC8vIFVzZSBhIHN0cmluZyBmb3IgZG91YmxpbmcgZmFjdG9yIHNvIHdlIGRv
bid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93CisgICAgc2NhbGUg
PSBzY2FsZSB8fCAiLjUiOworCisgICAgLy8gQWRqdXN0IGFuZCBhcHBseQorICAgIHN0YXJ0ID0g
c3RhcnQgLyBzY2FsZTsKKyAgICBqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0
ICsgdW5pdCApOworCisgICAgLy8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFO
IGZyb20gdHdlZW4uY3VyKCkKKyAgICAvLyBBbmQgYnJlYWtpbmcgdGhlIGxvb3AgaWYgc2NhbGUg
aXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3ZlIGp1c3QgaGFkIGVub3VnaAorICAg
IH0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNj
YWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApOworICAgIH0KKworICAgIHR3ZWVuLnVuaXQg
PSB1bml0OworICAgIHR3ZWVuLnN0YXJ0ID0gc3RhcnQ7CisgICAgLy8gSWYgYSArPS8tPSB0b2tl
biB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisgICAgdHdl
ZW4uZW5kID0gcGFydHNbMV0gPyBzdGFydCArICggcGFydHNbMV0gKyAxICkgKiBlbmQgOiBlbmQ7
CisgICAgfQorICAgIHJldHVybiB0d2VlbjsKKyAgICB9XQorICAgIH07CisKKy8vIEFuaW1hdGlv
bnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKK2Z1bmN0aW9u
IGNyZWF0ZUZ4Tm93KCkgeworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgZnhOb3cg
PSB1bmRlZmluZWQ7CisgICAgfSk7CisgICAgcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkg
KTsKK30KKworZnVuY3Rpb24gY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICkgeworICAg
IGpRdWVyeS5lYWNoKCBwcm9wcywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgeworICAgIHZhciBj
b2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sg
IioiIF0gKSwKKyAgICBpbmRleCA9IDAsCisgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7
CisgICAgZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBpZiAoIGNvbGxl
Y3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgeworCisgICAg
Ly8gd2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHkKKyAgICByZXR1cm47CisgICAgfQorICAg
IH0KKyAgICB9KTsKK30KKworZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBv
cHRpb25zICkgeworICAgIHZhciByZXN1bHQsCisgICAgc3RvcHBlZCwKKyAgICBpbmRleCA9IDAs
CisgICAgbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCisgICAgZGVmZXJyZWQg
PSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgeworICAgIC8vIGRvbid0IG1h
dGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgorICAgIGRlbGV0ZSB0aWNrLmVsZW07
CisgICAgfSksCisgICAgdGljayA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggc3RvcHBlZCApIHsK
KyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8
IGNyZWF0ZUZ4Tm93KCksCisgICAgcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5z
dGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAorICAgIC8vIGFy
Y2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSAxIC0gKCAwLjUgfHwgMCApICgj
MTI0OTcpCisgICAgdGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLAor
ICAgIHBlcmNlbnQgPSAxIC0gdGVtcCwKKyAgICBpbmRleCA9IDAsCisgICAgbGVuZ3RoID0gYW5p
bWF0aW9uLnR3ZWVucy5sZW5ndGg7CisKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5k
ZXgrKyApIHsKKyAgICBhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApOwor
ICAgIH0KKworICAgIGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJj
ZW50LCByZW1haW5pbmcgXSk7CisKKyAgICBpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsK
KyAgICByZXR1cm4gcmVtYWluaW5nOworICAgIH0gZWxzZSB7CisgICAgZGVmZXJyZWQucmVzb2x2
ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIH0sCisgICAgYW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7CisgICAgZWxlbTogZWxl
bSwKKyAgICBwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSwKKyAgICBvcHRz
OiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSwK
KyAgICBvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCisgICAgb3JpZ2luYWxPcHRpb25z
OiBvcHRpb25zLAorICAgIHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKKyAgICBk
dXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwKKyAgICB0d2VlbnM6IFtdLAorICAgIGNyZWF0ZVR3
ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgeworICAgIHZhciB0d2VlbiA9IGpRdWVyeS5Ud2Vl
biggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKKyAgICBhbmltYXRpb24ub3B0cy5z
cGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CisgICAgYW5p
bWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApOworICAgIHJldHVybiB0d2VlbjsKKyAgICB9LAor
ICAgIHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgeworICAgIHZhciBpbmRleCA9IDAsCisgICAg
Ly8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdl
ZW5zCisgICAgLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CisgICAgbGVuZ3RoID0gZ290
b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKKyAgICBpZiAoIHN0b3BwZWQgKSB7
CisgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHN0b3BwZWQgPSB0cnVlOworICAgIGZvciAo
IDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgIGFuaW1hdGlvbi50d2VlbnNbIGlu
ZGV4IF0ucnVuKCAxICk7CisgICAgfQorCisgICAgLy8gcmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0
aGUgbGFzdCBmcmFtZQorICAgIC8vIG90aGVyd2lzZSwgcmVqZWN0CisgICAgaWYgKCBnb3RvRW5k
ICkgeworICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0Vu
ZCBdICk7CisgICAgfSBlbHNlIHsKKyAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFu
aW1hdGlvbiwgZ290b0VuZCBdICk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICAgIH0KKyAg
ICB9KSwKKyAgICBwcm9wcyA9IGFuaW1hdGlvbi5wcm9wczsKKworICAgIHByb3BGaWx0ZXIoIHBy
b3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CisKKyAgICBmb3IgKCA7IGluZGV4
IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKKyAgICByZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJz
WyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7
CisgICAgaWYgKCByZXN1bHQgKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgfQor
CisgICAgY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICk7CisKKyAgICBpZiAoIGpRdWVy
eS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgeworICAgIGFuaW1hdGlvbi5v
cHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOworICAgIH0KKworICAgIGpRdWVyeS5m
eC50aW1lcigKKyAgICBqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7CisgICAgZWxlbTogZWxlbSwKKyAg
ICBhbmltOiBhbmltYXRpb24sCisgICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCisgICAg
fSkKKyAgICApOworCisgICAgLy8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKKyAgICBy
ZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCisgICAg
LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKKyAg
ICAuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApCisgICAgLmFsd2F5cyggYW5pbWF0aW9uLm9w
dHMuYWx3YXlzICk7Cit9CisKK2Z1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFz
aW5nICkgeworICAgIHZhciB2YWx1ZSwgbmFtZSwgaW5kZXgsIGVhc2luZywgaG9va3M7CisKKyAg
ICAvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKKyAg
ICBmb3IgKCBpbmRleCBpbiBwcm9wcyApIHsKKyAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSgg
aW5kZXggKTsKKyAgICBlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07CisgICAgdmFsdWUg
PSBwcm9wc1sgaW5kZXggXTsKKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewor
ICAgIGVhc2luZyA9IHZhbHVlWyAxIF07CisgICAgdmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZh
bHVlWyAwIF07CisgICAgfQorCisgICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKyAgICBwcm9w
c1sgbmFtZSBdID0gdmFsdWU7CisgICAgZGVsZXRlIHByb3BzWyBpbmRleCBdOworICAgIH0KKwor
ICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CisgICAgaWYgKCBob29rcyAmJiAi
ZXhwYW5kIiBpbiBob29rcyApIHsKKyAgICB2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsK
KyAgICBkZWxldGUgcHJvcHNbIG5hbWUgXTsKKworICAgIC8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwg
dGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KKyAgICAvLyBhbHNvIC0g
cmV1c2luZyAnaW5kZXgnIGZyb20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJu
YW1lIgorICAgIGZvciAoIGluZGV4IGluIHZhbHVlICkgeworICAgIGlmICggISggaW5kZXggaW4g
cHJvcHMgKSApIHsKKyAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdOworICAgIHNw
ZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7CisgICAgfQorICAgIH0KKyAgICB9IGVsc2Ug
eworICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKKyAgICB9CisgICAgfQorfQor
CitqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CisKKyAgICB0
d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgeworICAgIGlmICggalF1ZXJ5Lmlz
RnVuY3Rpb24oIHByb3BzICkgKSB7CisgICAgY2FsbGJhY2sgPSBwcm9wczsKKyAgICBwcm9wcyA9
IFsgIioiIF07CisgICAgfSBlbHNlIHsKKyAgICBwcm9wcyA9IHByb3BzLnNwbGl0KCIgIik7Cisg
ICAgfQorCisgICAgdmFyIHByb3AsCisgICAgaW5kZXggPSAwLAorICAgIGxlbmd0aCA9IHByb3Bz
Lmxlbmd0aDsKKworICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAg
IHByb3AgPSBwcm9wc1sgaW5kZXggXTsKKyAgICB0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNb
IHByb3AgXSB8fCBbXTsKKyAgICB0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7
CisgICAgfQorICAgIH0sCisKKyAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJl
cGVuZCApIHsKKyAgICBpZiAoIHByZXBlbmQgKSB7CisgICAgYW5pbWF0aW9uUHJlZmlsdGVycy51
bnNoaWZ0KCBjYWxsYmFjayApOworICAgIH0gZWxzZSB7CisgICAgYW5pbWF0aW9uUHJlZmlsdGVy
cy5wdXNoKCBjYWxsYmFjayApOworICAgIH0KKyAgICB9Cit9KTsKKworZnVuY3Rpb24gZGVmYXVs
dFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7CisgICAgLypqc2hpbnQgdmFsaWR0aGlz
OnRydWUgKi8KKyAgICB2YXIgcHJvcCwgaW5kZXgsIGxlbmd0aCwKKyAgICB2YWx1ZSwgZGF0YVNo
b3csIHRvZ2dsZSwKKyAgICB0d2VlbiwgaG9va3MsIG9sZGZpcmUsCisgICAgYW5pbSA9IHRoaXMs
CisgICAgc3R5bGUgPSBlbGVtLnN0eWxlLAorICAgIG9yaWcgPSB7fSwKKyAgICBoYW5kbGVkID0g
W10sCisgICAgaGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApOworCisg
ICAgLy8gaGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlcworICAgIGlmICggIW9wdHMucXVldWUg
KSB7CisgICAgaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sICJmeCIgKTsKKyAgICBp
ZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7CisgICAgaG9va3MudW5xdWV1ZWQgPSAwOwor
ICAgIG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOworICAgIGhvb2tzLmVtcHR5LmZpcmUgPSBm
dW5jdGlvbigpIHsKKyAgICBpZiAoICFob29rcy51bnF1ZXVlZCApIHsKKyAgICBvbGRmaXJlKCk7
CisgICAgfQorICAgIH07CisgICAgfQorICAgIGhvb2tzLnVucXVldWVkKys7CisKKyAgICBhbmlt
LmFsd2F5cyhmdW5jdGlvbigpIHsKKyAgICAvLyBkb2luZyB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0
aGUgY29tcGxldGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorICAgIC8vIGJlZm9yZSB0aGlzIGNv
bXBsZXRlcworICAgIGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgeworICAgIGhvb2tzLnVucXVldWVk
LS07CisgICAgaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkgeworICAg
IGhvb2tzLmVtcHR5LmZpcmUoKTsKKyAgICB9CisgICAgfSk7CisgICAgfSk7CisgICAgfQorCisg
ICAgLy8gaGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3MKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUg
PT09IDEgJiYgKCAiaGVpZ2h0IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7Cisg
ICAgLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisgICAgLy8gUmVjb3JkIGFs
bCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAorICAgIC8vIGNoYW5n
ZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAorICAgIC8vIG92ZXJm
bG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlCisgICAgb3B0cy5vdmVyZmxvdyA9IFsgc3R5
bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CisKKyAgICAv
LyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAor
ICAgIC8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0
aC9oZWlnaHQgYW5pbWF0ZWQKKyAgICBpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiAp
ID09PSAiaW5saW5lIiAmJgorICAgIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5v
bmUiICkgeworCisgICAgLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxv
Y2s7CisgICAgLy8gYmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBs
YXlvdXQKKyAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0IHx8
IGNzc19kZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApID09PSAiaW5saW5lIiApIHsKKyAg
ICBzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CisKKyAgICB9IGVsc2UgeworICAgIHN0
eWxlLnpvb20gPSAxOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgaWYgKCBvcHRzLm92ZXJm
bG93ICkgeworICAgIHN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisgICAgaWYgKCAhalF1ZXJ5
LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsKKyAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigp
IHsKKyAgICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKKyAgICBzdHlsZS5v
dmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07CisgICAgc3R5bGUub3ZlcmZsb3dZID0gb3B0
cy5vdmVyZmxvd1sgMiBdOworICAgIH0pOworICAgIH0KKyAgICB9CisKKworICAgIC8vIHNob3cv
aGlkZSBwYXNzCisgICAgZm9yICggaW5kZXggaW4gcHJvcHMgKSB7CisgICAgdmFsdWUgPSBwcm9w
c1sgaW5kZXggXTsKKyAgICBpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7CisgICAgZGVs
ZXRlIHByb3BzWyBpbmRleCBdOworICAgIHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRv
Z2dsZSI7CisgICAgaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSAp
IHsKKyAgICBjb250aW51ZTsKKyAgICB9CisgICAgaGFuZGxlZC5wdXNoKCBpbmRleCApOworICAg
IH0KKyAgICB9CisKKyAgICBsZW5ndGggPSBoYW5kbGVkLmxlbmd0aDsKKyAgICBpZiAoIGxlbmd0
aCApIHsKKyAgICBkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIgKSB8fCBq
UXVlcnkuX2RhdGEoIGVsZW0sICJmeHNob3ciLCB7fSApOworICAgIGlmICggImhpZGRlbiIgaW4g
ZGF0YVNob3cgKSB7CisgICAgaGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOworICAgIH0KKworICAg
IC8vIHN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkg
dG8gInJldmVyc2UiCisgICAgaWYgKCB0b2dnbGUgKSB7CisgICAgZGF0YVNob3cuaGlkZGVuID0g
IWhpZGRlbjsKKyAgICB9CisgICAgaWYgKCBoaWRkZW4gKSB7CisgICAgalF1ZXJ5KCBlbGVtICku
c2hvdygpOworICAgIH0gZWxzZSB7CisgICAgYW5pbS5kb25lKGZ1bmN0aW9uKCkgeworICAgIGpR
dWVyeSggZWxlbSApLmhpZGUoKTsKKyAgICB9KTsKKyAgICB9CisgICAgYW5pbS5kb25lKGZ1bmN0
aW9uKCkgeworICAgIHZhciBwcm9wOworICAgIGpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwgImZ4
c2hvdyIgKTsKKyAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAgalF1ZXJ5LnN0eWxlKCBl
bGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKKyAgICB9CisgICAgfSk7CisgICAgZm9yICggaW5k
ZXggPSAwIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgIHByb3AgPSBoYW5kbGVk
WyBpbmRleCBdOworICAgIHR3ZWVuID0gYW5pbS5jcmVhdGVUd2VlbiggcHJvcCwgaGlkZGVuID8g
ZGF0YVNob3dbIHByb3AgXSA6IDAgKTsKKyAgICBvcmlnWyBwcm9wIF0gPSBkYXRhU2hvd1sgcHJv
cCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApOworCisgICAgaWYgKCAhKCBwcm9wIGlu
IGRhdGFTaG93ICkgKSB7CisgICAgZGF0YVNob3dbIHByb3AgXSA9IHR3ZWVuLnN0YXJ0OworICAg
IGlmICggaGlkZGVuICkgeworICAgIHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0OworICAgIHR3ZWVu
LnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0IiA/IDEgOiAwOwor
ICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KK30KKworZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9w
dGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkgeworICAgIHJldHVybiBuZXcgVHdlZW4ucHJvdG90
eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7Cit9CitqUXVlcnku
VHdlZW4gPSBUd2VlbjsKKworVHdlZW4ucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBU
d2VlbiwKKyAgICBpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNp
bmcsIHVuaXQgKSB7CisgICAgdGhpcy5lbGVtID0gZWxlbTsKKyAgICB0aGlzLnByb3AgPSBwcm9w
OworICAgIHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8ICJzd2luZyI7CisgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKKyAgICB0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOworICAg
IHRoaXMuZW5kID0gZW5kOworICAgIHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVt
YmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKKyAgICB9LAorICAgIGN1cjogZnVuY3Rpb24oKSB7
CisgICAgdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKKworICAgIHJl
dHVybiBob29rcyAmJiBob29rcy5nZXQgPworICAgIGhvb2tzLmdldCggdGhpcyApIDoKKyAgICBU
d2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7CisgICAgfSwKKyAgICBydW46IGZ1
bmN0aW9uKCBwZXJjZW50ICkgeworICAgIHZhciBlYXNlZCwKKyAgICBob29rcyA9IFR3ZWVuLnBy
b3BIb29rc1sgdGhpcy5wcm9wIF07CisKKyAgICBpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAp
IHsKKyAgICB0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgK
KyAgICBwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlz
Lm9wdGlvbnMuZHVyYXRpb24KKyAgICApOworICAgIH0gZWxzZSB7CisgICAgdGhpcy5wb3MgPSBl
YXNlZCA9IHBlcmNlbnQ7CisgICAgfQorICAgIHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMu
c3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKKworICAgIGlmICggdGhpcy5vcHRpb25zLnN0
ZXAgKSB7CisgICAgdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywg
dGhpcyApOworICAgIH0KKworICAgIGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkgeworICAgIGhv
b2tzLnNldCggdGhpcyApOworICAgIH0gZWxzZSB7CisgICAgVHdlZW4ucHJvcEhvb2tzLl9kZWZh
dWx0LnNldCggdGhpcyApOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9OworCitU
d2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CisKK1R3ZWVu
LnByb3BIb29rcyA9IHsKKyAgICBfZGVmYXVsdDogeworICAgIGdldDogZnVuY3Rpb24oIHR3ZWVu
ICkgeworICAgIHZhciByZXN1bHQ7CisKKyAgICBpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3Ag
XSAhPSBudWxsICYmCisgICAgKCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVb
IHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKKyAgICByZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4u
cHJvcCBdOworICAgIH0KKworICAgIC8vIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3Jk
IHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQorICAgIC8vIGF0dGVtcHQgYSBw
YXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMKKyAg
ICAvLyBzbywgc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0
LgorICAgIC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVy
bmVkIGFzIGlzLgorICAgIHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnBy
b3AsICIiICk7CisgICAgLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0
byIgYXJlIGNvbnZlcnRlZCB0byAwLgorICAgIHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0g
ImF1dG8iID8gMCA6IHJlc3VsdDsKKyAgICB9LAorICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkg
eworICAgIC8vIHVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0IC0gdXNlIGNzc0hvb2sgaWYg
aXRzIHRoZXJlIC0gdXNlIC5zdHlsZSBpZiBpdHMKKyAgICAvLyBhdmFpbGFibGUgYW5kIHVzZSBw
bGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZQorICAgIGlmICggalF1ZXJ5LmZ4LnN0ZXBb
IHR3ZWVuLnByb3AgXSApIHsKKyAgICBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2Vl
biApOworICAgIH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0uc3R5bGUgJiYgKCB0d2Vlbi5lbGVtLnN0
eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3AgXSBdICE9IG51bGwgfHwgalF1ZXJ5LmNz
c0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKKyAgICBqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0s
IHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTsKKyAgICB9IGVsc2UgeworICAg
IHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKKyAgICB9CisgICAgfQorICAg
IH0KK307CisKKy8vIFJlbW92ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJh
c2VkIGFwcHJvYWNoCisvLyB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMK
KworVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0
ID0geworICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgeworICAgIGlmICggdHdlZW4uZWxlbS5u
b2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CisgICAgdHdlZW4uZWxlbVsgdHdl
ZW4ucHJvcCBdID0gdHdlZW4ubm93OworICAgIH0KKyAgICB9Cit9OworCitqUXVlcnkuZWFjaChb
ICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICB2
YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1
bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKyAgICByZXR1cm4gc3BlZWQgPT0g
bnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiA/CisgICAgY3NzRm4uYXBwbHkoIHRo
aXMsIGFyZ3VtZW50cyApIDoKKyAgICB0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICks
IHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisgICAgfTsKK30pOworCitqUXVlcnkuZm4uZXh0
ZW5kKHsKKyAgICBmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sg
KSB7CisKKyAgICAvLyBzaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFj
aXR5IHRvIDAKKyAgICByZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0
eSIsIDAgKS5zaG93KCkKKworICAgIC8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAor
ICAgIC5lbmQoKS5hbmltYXRlKHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2sgKTsKKyAgICB9LAorICAgIGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5n
LCBjYWxsYmFjayApIHsKKyAgICB2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJv
cCApLAorICAgIG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sg
KSwKKyAgICBkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgIC8vIE9wZXJhdGUgb24gYSBj
b3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CisgICAgdmFy
IGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFs
bCApOworICAgIGRvQW5pbWF0aW9uLmZpbmlzaCA9IGZ1bmN0aW9uKCkgeworICAgIGFuaW0uc3Rv
cCggdHJ1ZSApOworICAgIH07CisgICAgLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5n
IHJlc29sdmVzIGltbWVkaWF0ZWx5CisgICAgaWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRo
aXMsICJmaW5pc2giICkgKSB7CisgICAgYW5pbS5zdG9wKCB0cnVlICk7CisgICAgfQorICAgIH07
CisgICAgZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CisKKyAgICByZXR1cm4gZW1w
dHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/CisgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlv
biApIDoKKyAgICB0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7CisgICAg
fSwKKyAgICBzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKKyAg
ICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgeworICAgIHZhciBzdG9wID0gaG9v
a3Muc3RvcDsKKyAgICBkZWxldGUgaG9va3Muc3RvcDsKKyAgICBzdG9wKCBnb3RvRW5kICk7Cisg
ICAgfTsKKworICAgIGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgeworICAgIGdvdG9F
bmQgPSBjbGVhclF1ZXVlOworICAgIGNsZWFyUXVldWUgPSB0eXBlOworICAgIHR5cGUgPSB1bmRl
ZmluZWQ7CisgICAgfQorICAgIGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHsK
KyAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7CisgICAgfQorCisgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICB2YXIgZGVxdWV1ZSA9IHRydWUsCisgICAgaW5k
ZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArICJxdWV1ZUhvb2tzIiwKKyAgICB0aW1lcnMgPSBq
UXVlcnkudGltZXJzLAorICAgIGRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKTsKKworICAgIGlm
ICggaW5kZXggKSB7CisgICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3Rv
cCApIHsKKyAgICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKyAgICB9CisgICAgfSBlbHNl
IHsKKyAgICBmb3IgKCBpbmRleCBpbiBkYXRhICkgeworICAgIGlmICggZGF0YVsgaW5kZXggXSAm
JiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkgeworICAgIHN0b3BR
dWV1ZSggZGF0YVsgaW5kZXggXSApOworICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZm9yICgg
aW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKyAgICBpZiAoIHRpbWVyc1sgaW5k
ZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1
ZXVlID09PSB0eXBlKSApIHsKKyAgICB0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5k
ICk7CisgICAgZGVxdWV1ZSA9IGZhbHNlOworICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7
CisgICAgfQorICAgIH0KKworICAgIC8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0
aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKyAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwg
Y2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQorICAgIC8v
IGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kCisgICAgaWYgKCBkZXF1ZXVlIHx8ICFnb3Rv
RW5kICkgeworICAgIGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisgICAgfQorICAgIH0p
OworICAgIH0sCisgICAgZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHsKKyAgICBpZiAoIHR5cGUg
IT09IGZhbHNlICkgeworICAgIHR5cGUgPSB0eXBlIHx8ICJmeCI7CisgICAgfQorICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgdmFyIGluZGV4LAorICAgIGRhdGEgPSBqUXVl
cnkuX2RhdGEoIHRoaXMgKSwKKyAgICBxdWV1ZSA9IGRhdGFbIHR5cGUgKyAicXVldWUiIF0sCisg
ICAgaG9va3MgPSBkYXRhWyB0eXBlICsgInF1ZXVlSG9va3MiIF0sCisgICAgdGltZXJzID0galF1
ZXJ5LnRpbWVycywKKyAgICBsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7CisKKyAg
ICAvLyBlbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhCisgICAgZGF0YS5maW5p
c2ggPSB0cnVlOworCisgICAgLy8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0CisgICAgalF1ZXJ5LnF1
ZXVlKCB0aGlzLCB0eXBlLCBbXSApOworCisgICAgaWYgKCBob29rcyAmJiBob29rcy5jdXIgJiYg
aG9va3MuY3VyLmZpbmlzaCApIHsKKyAgICBob29rcy5jdXIuZmluaXNoLmNhbGwoIHRoaXMgKTsK
KyAgICB9CisKKyAgICAvLyBsb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5p
c2ggdGhlbQorICAgIGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7Cisg
ICAgaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0u
cXVldWUgPT09IHR5cGUgKSB7CisgICAgdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSAp
OworICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisgICAgfQorICAgIH0KKworICAgIC8v
IGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVt
CisgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICBp
ZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKKyAgICBxdWV1
ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOworICAgIH0KKyAgICB9CisKKyAgICAvLyB0
dXJuIG9mZiBmaW5pc2hpbmcgZmxhZworICAgIGRlbGV0ZSBkYXRhLmZpbmlzaDsKKyAgICB9KTsK
KyAgICB9Cit9KTsKKworLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFy
ZCBhbmltYXRpb24KK2Z1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7CisgICAg
dmFyIHdoaWNoLAorICAgIGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSwKKyAgICBpID0gMDsKKwor
ICAgIC8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3Nz
RXhwYW5kIHZhbHVlcywKKyAgICAvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVwIHZh
bHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0CisgICAgaW5jbHVkZVdpZHRoID0g
aW5jbHVkZVdpZHRoPyAxIDogMDsKKyAgICBmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRl
V2lkdGggKSB7CisgICAgd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKKyAgICBhdHRyc1sgIm1hcmdp
biIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOworICAgIH0K
KworICAgIGlmICggaW5jbHVkZVdpZHRoICkgeworICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53
aWR0aCA9IHR5cGU7CisgICAgfQorCisgICAgcmV0dXJuIGF0dHJzOworfQorCisvLyBHZW5lcmF0
ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCh7CisgICAgc2xp
ZGVEb3duOiBnZW5GeCgic2hvdyIpLAorICAgIHNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCisgICAg
c2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiKSwKKyAgICBmYWRlSW46IHsgb3BhY2l0eTogInNo
b3ciIH0sCisgICAgZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKKyAgICBmYWRlVG9nZ2xl
OiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKKyAg
ICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayAp
IHsKKyAgICByZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2sgKTsKKyAgICB9OworfSk7CisKK2pRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFz
aW5nLCBmbiApIHsKKyAgICB2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2Jq
ZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogeworICAgIGNvbXBsZXRlOiBmbiB8
fCAhZm4gJiYgZWFzaW5nIHx8CisgICAgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3Bl
ZWQsCisgICAgZHVyYXRpb246IHNwZWVkLAorICAgIGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVh
c2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZworICAgIH07CisK
KyAgICBvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRp
b24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKKyAgICBvcHQuZHVyYXRpb24gaW4galF1
ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5
LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVl
L3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKKyAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9w
dC5xdWV1ZSA9PT0gdHJ1ZSApIHsKKyAgICBvcHQucXVldWUgPSAiZngiOworICAgIH0KKworICAg
IC8vIFF1ZXVlaW5nCisgICAgb3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTsKKworICAgIG9wdC5jb21w
bGV0ZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQg
KSApIHsKKyAgICBvcHQub2xkLmNhbGwoIHRoaXMgKTsKKyAgICB9CisKKyAgICBpZiAoIG9wdC5x
dWV1ZSApIHsKKyAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CisgICAgfQor
ICAgIH07CisKKyAgICByZXR1cm4gb3B0OworfTsKKworalF1ZXJ5LmVhc2luZyA9IHsKKyAgICBs
aW5lYXI6IGZ1bmN0aW9uKCBwICkgeworICAgIHJldHVybiBwOworICAgIH0sCisgICAgc3dpbmc6
IGZ1bmN0aW9uKCBwICkgeworICAgIHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkg
LyAyOworICAgIH0KK307CisKK2pRdWVyeS50aW1lcnMgPSBbXTsKK2pRdWVyeS5meCA9IFR3ZWVu
LnByb3RvdHlwZS5pbml0OworalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIg
dGltZXIsCisgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKKyAgICBpID0gMDsKKworICAgIGZ4
Tm93ID0galF1ZXJ5Lm5vdygpOworCisgICAgZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsr
ICkgeworICAgIHRpbWVyID0gdGltZXJzWyBpIF07CisgICAgLy8gQ2hlY2tzIHRoZSB0aW1lciBo
YXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkCisgICAgaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNb
IGkgXSA9PT0gdGltZXIgKSB7CisgICAgdGltZXJzLnNwbGljZSggaS0tLCAxICk7CisgICAgfQor
ICAgIH0KKworICAgIGlmICggIXRpbWVycy5sZW5ndGggKSB7CisgICAgalF1ZXJ5LmZ4LnN0b3Ao
KTsKKyAgICB9CisgICAgZnhOb3cgPSB1bmRlZmluZWQ7Cit9OworCitqUXVlcnkuZngudGltZXIg
PSBmdW5jdGlvbiggdGltZXIgKSB7CisgICAgaWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMu
cHVzaCggdGltZXIgKSApIHsKKyAgICBqUXVlcnkuZnguc3RhcnQoKTsKKyAgICB9Cit9OworCitq
UXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKKworalF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7
CisgICAgaWYgKCAhdGltZXJJZCApIHsKKyAgICB0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVy
eS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKKyAgICB9Cit9OworCitqUXVlcnkuZngu
c3RvcCA9IGZ1bmN0aW9uKCkgeworICAgIGNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKyAgICB0
aW1lcklkID0gbnVsbDsKK307CisKK2pRdWVyeS5meC5zcGVlZHMgPSB7CisgICAgc2xvdzogNjAw
LAorICAgIGZhc3Q6IDIwMCwKKyAgICAvLyBEZWZhdWx0IHNwZWVkCisgICAgX2RlZmF1bHQ6IDQw
MAorfTsKKworLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnQKK2pRdWVyeS5meC5z
dGVwID0ge307CisKK2lmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsK
KyAgICBqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgcmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKyAg
ICByZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKKyAgICB9KS5sZW5ndGg7CisgICAgfTsKK30KK2pR
dWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKKyAgICBpZiAoIGFyZ3VtZW50
cy5sZW5ndGggKSB7CisgICAgcmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CisgICAgdGhp
cyA6CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgeworICAgIGpRdWVyeS5vZmZzZXQuc2V0
T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7CisgICAgfSk7CisgICAgfQorCisgICAgdmFyIGRv
Y0VsZW0sIHdpbiwKKyAgICBib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAgIGVsZW0gPSB0
aGlzWyAwIF0sCisgICAgZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKyAgICBp
ZiAoICFkb2MgKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvY0VsZW0gPSBkb2MuZG9j
dW1lbnRFbGVtZW50OworCisgICAgLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVk
IERPTSBub2RlCisgICAgaWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7
CisgICAgcmV0dXJuIGJveDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGdCQ1Is
IGp1c3QgdXNlIDAsMCByYXRoZXIgdGhhbiBlcnJvcgorICAgIC8vIEJsYWNrQmVycnkgNSwgaU9T
IDMgKG9yaWdpbmFsIGlQaG9uZSkKKyAgICBpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xp
ZW50UmVjdCAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7CisgICAgYm94ID0gZWxlbS5nZXRCb3Vu
ZGluZ0NsaWVudFJlY3QoKTsKKyAgICB9CisgICAgd2luID0gZ2V0V2luZG93KCBkb2MgKTsKKyAg
ICByZXR1cm4geworICAgIHRvcDogYm94LnRvcCAgKyAoIHdpbi5wYWdlWU9mZnNldCB8fCBkb2NF
bGVtLnNjcm9sbFRvcCApICAtICggZG9jRWxlbS5jbGllbnRUb3AgIHx8IDAgKSwKKyAgICBsZWZ0
OiBib3gubGVmdCArICggd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCApIC0g
KCBkb2NFbGVtLmNsaWVudExlZnQgfHwgMCApCisgICAgfTsKK307CisKK2pRdWVyeS5vZmZzZXQg
PSB7CisKKyAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgeworICAg
IHZhciBwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKTsKKworICAgIC8v
IHNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3Rh
dGljIGVsZW0KKyAgICBpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKKyAgICBlbGVtLnN0
eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKyAgICB9CisKKyAgICB2YXIgY3VyRWxlbSA9IGpR
dWVyeSggZWxlbSApLAorICAgIGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksCisgICAgY3Vy
Q1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKKyAgICBjdXJDU1NMZWZ0ID0galF1
ZXJ5LmNzcyggZWxlbSwgImxlZnQiICksCisgICAgY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0
aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYgalF1ZXJ5Lmlu
QXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKKyAgICBwcm9wcyA9
IHt9LCBjdXJQb3NpdGlvbiA9IHt9LCBjdXJUb3AsIGN1ckxlZnQ7CisKKyAgICAvLyBuZWVkIHRv
IGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBh
dXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKKyAgICBpZiAoIGNh
bGN1bGF0ZVBvc2l0aW9uICkgeworICAgIGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigp
OworICAgIGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDsKKyAgICBjdXJMZWZ0ID0gY3VyUG9zaXRp
b24ubGVmdDsKKyAgICB9IGVsc2UgeworICAgIGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1Rv
cCApIHx8IDA7CisgICAgY3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwOwor
ICAgIH0KKworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKKyAgICBv
cHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBjdXJPZmZzZXQgKTsKKyAgICB9CisKKyAg
ICBpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7CisgICAgcHJvcHMudG9wID0gKCBvcHRpb25z
LnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKKyAgICB9CisgICAgaWYgKCBvcHRpb25z
LmxlZnQgIT0gbnVsbCApIHsKKyAgICBwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJP
ZmZzZXQubGVmdCApICsgY3VyTGVmdDsKKyAgICB9CisKKyAgICBpZiAoICJ1c2luZyIgaW4gb3B0
aW9ucyApIHsKKyAgICBvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7CisgICAgfSBl
bHNlIHsKKyAgICBjdXJFbGVtLmNzcyggcHJvcHMgKTsKKyAgICB9CisgICAgfQorfTsKKworCitq
UXVlcnkuZm4uZXh0ZW5kKHsKKworICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICBpZiAo
ICF0aGlzWyAwIF0gKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBvZmZzZXRQYXJl
bnQsIG9mZnNldCwKKyAgICBwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAg
IGVsZW0gPSB0aGlzWyAwIF07CisKKyAgICAvLyBmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZy
b20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlz
IGl0J3Mgb25seSBvZmZzZXQgcGFyZW50CisgICAgaWYgKCBqUXVlcnkuY3NzKCBlbGVtLCAicG9z
aXRpb24iICkgPT09ICJmaXhlZCIgKSB7CisgICAgLy8gd2UgYXNzdW1lIHRoYXQgZ2V0Qm91bmRp
bmdDbGllbnRSZWN0IGlzIGF2YWlsYWJsZSB3aGVuIGNvbXB1dGVkIHBvc2l0aW9uIGlzIGZpeGVk
CisgICAgb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICB9IGVsc2Ug
eworICAgIC8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisgICAgb2Zmc2V0UGFyZW50ID0gdGhp
cy5vZmZzZXRQYXJlbnQoKTsKKworICAgIC8vIEdldCBjb3JyZWN0IG9mZnNldHMKKyAgICBvZmZz
ZXQgPSB0aGlzLm9mZnNldCgpOworICAgIGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFy
ZW50WyAwIF0sICJodG1sIiApICkgeworICAgIHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5v
ZmZzZXQoKTsKKyAgICB9CisKKyAgICAvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKyAgICBw
YXJlbnRPZmZzZXQudG9wICArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJvcmRl
clRvcFdpZHRoIiwgdHJ1ZSApOworICAgIHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3Mo
IG9mZnNldFBhcmVudFsgMCBdLCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOworICAgIH0KKwor
ICAgIC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnMKKyAgICAv
LyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBh
bmQgbWFyZ2luTGVmdAorICAgIC8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZz
ZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCisgICAgcmV0dXJuIHsKKyAgICB0b3A6ICBvZmZz
ZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9w
IiwgdHJ1ZSApLAorICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBq
UXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUpCisgICAgfTsKKyAgICB9LAorCisg
ICAgb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rp
b24oKSB7CisgICAgdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVl
cnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgImh0bWwiICkgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0
UGFyZW50LCAicG9zaXRpb24iKSA9PT0gInN0YXRpYyIgKSApIHsKKyAgICBvZmZzZXRQYXJlbnQg
PSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0UGFy
ZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICB9KTsKKyAgICB9Cit9KTsKKwor
CisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNo
KCB7c2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQifSwg
ZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHsKKyAgICB2YXIgdG9wID0gL1kvLnRlc3QoIHByb3Ag
KTsKKworICAgIGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkgeworICAgIHJl
dHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7
CisgICAgdmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOworCisgICAgaWYgKCB2YWwgPT09IHVu
ZGVmaW5lZCApIHsKKyAgICByZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBd
IDoKKyAgICB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSA6CisgICAgZWxl
bVsgbWV0aG9kIF07CisgICAgfQorCisgICAgaWYgKCB3aW4gKSB7CisgICAgd2luLnNjcm9sbFRv
KAorICAgICF0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbExlZnQoKSwKKyAgICB0b3Ag
PyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbFRvcCgpCisgICAgKTsKKworICAgIH0gZWxzZSB7
CisgICAgZWxlbVsgbWV0aG9kIF0gPSB2YWw7CisgICAgfQorICAgIH0sIG1ldGhvZCwgdmFsLCBh
cmd1bWVudHMubGVuZ3RoLCBudWxsICk7CisgICAgfTsKK30pOworCitmdW5jdGlvbiBnZXRXaW5k
b3coIGVsZW0gKSB7CisgICAgcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8KKyAgICBl
bGVtIDoKKyAgICBlbGVtLm5vZGVUeXBlID09PSA5ID8KKyAgICBlbGVtLmRlZmF1bHRWaWV3IHx8
IGVsZW0ucGFyZW50V2luZG93IDoKKyAgICBmYWxzZTsKK30KKy8vIENyZWF0ZSBpbm5lckhlaWdo
dCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGgg
bWV0aG9kcworalF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVpZ2h0IiwgV2lkdGg6ICJ3aWR0aCIg
fSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7CisgICAgalF1ZXJ5LmVhY2goIHsgcGFkZGluZzog
ImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LCBmdW5j
dGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHsKKyAgICAvLyBtYXJnaW4gaXMgb25seSBm
b3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKKyAgICBqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBm
dW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKKyAgICB2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRz
Lmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSAiYm9vbGVhbiIg
KSwKKyAgICBleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1
ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKKworICAgIHJldHVybiBqUXVlcnku
YWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CisgICAgdmFyIGRv
YzsKKworICAgIGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisgICAgLy8gQXMgb2Yg
NS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2Fm
YXJpLCBidXQgdGhlcmUKKyAgICAvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBw
dWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246CisgICAgLy8gaHR0cHM6Ly9n
aXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjQKKyAgICByZXR1cm4gZWxlbS5kb2N1bWVu
dC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOworICAgIH0KKworICAgIC8vIEdl
dCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKKyAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkg
KSB7CisgICAgZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICAvLyBFaXRoZXIgc2Ny
b2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRo
L0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVzdAorICAgIC8vIHVuZm9ydHVuYXRlbHksIHRo
aXMgY2F1c2VzIGJ1ZyAjMzgzOCBpbiBJRTYvOCBvbmx5LCBidXQgdGhlcmUgaXMgY3VycmVudGx5
IG5vIGdvb2QsIHNtYWxsIHdheSB0byBmaXggaXQuCisgICAgcmV0dXJuIE1hdGgubWF4KAorICAg
IGVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisg
ICAgZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwK
KyAgICBkb2NbICJjbGllbnQiICsgbmFtZSBdCisgICAgKTsKKyAgICB9CisKKyAgICByZXR1cm4g
dmFsdWUgPT09IHVuZGVmaW5lZCA/CisgICAgLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUg
ZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAorICAgIGpRdWVy
eS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOgorCisgICAgLy8gU2V0IHdpZHRoIG9yIGhlaWdo
dCBvbiB0aGUgZWxlbWVudAorICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4
dHJhICk7CisgICAgfSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFp
bmFibGUsIG51bGwgKTsKKyAgICB9OworICAgIH0pOworfSk7CisvLyBMaW1pdCBzY29wZSBwb2xs
dXRpb24gZnJvbSBhbnkgZGVwcmVjYXRlZCBBUEkKKy8vIChmdW5jdGlvbigpIHsKKworLy8gfSko
KTsKKy8vIEV4cG9zZSBqUXVlcnkgdG8gdGhlIGdsb2JhbCBvYmplY3QKK3dpbmRvdy5qUXVlcnkg
PSB3aW5kb3cuJCA9IGpRdWVyeTsKKworLy8gRXhwb3NlIGpRdWVyeSBhcyBhbiBBTUQgbW9kdWxl
LCBidXQgb25seSBmb3IgQU1EIGxvYWRlcnMgdGhhdAorLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVz
IHdpdGggbG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnkKKy8vIGluIGEgcGFnZSB0
aGF0IGFsbCBtaWdodCBjYWxsIGRlZmluZSgpLiBUaGUgbG9hZGVyIHdpbGwgaW5kaWNhdGUKKy8v
IHRoZXkgaGF2ZSBzcGVjaWFsIGFsbG93YW5jZXMgZm9yIG11bHRpcGxlIGpRdWVyeSB2ZXJzaW9u
cyBieQorLy8gc3BlY2lmeWluZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFz
IGEgbmFtZWQgbW9kdWxlLAorLy8gc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0
aCBvdGhlciBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLAorLy8gYnV0IG5vdCB1c2UgYSBwcm9w
ZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdCB1bmRlcnN0YW5kcyBhbm9ueW1vdXMKKy8vIEFN
RCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byBy
ZWdpc3Rlci4KKy8vIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUg
bmFtZXMgYXJlIGRlcml2ZWQgZnJvbQorLy8gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3Jt
YWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2UgZmlsZSBuYW1lLgorLy8gRG8gdGhpcyBhZnRl
ciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBj
YWxsCisvLyBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2ls
bCB3b3JrLgoraWYgKCB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQg
JiYgZGVmaW5lLmFtZC5qUXVlcnkgKSB7CisgICAgZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0
aW9uICgpIHsgcmV0dXJuIGpRdWVyeTsgfSApOworfQorCit9KSggd2luZG93ICk7ClwgTm8gbmV3
bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkv
Ym93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQ
ZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29t
bW9uL2Jhc2UuY3NzCShyZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0
ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVl
cnkvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDU1NSBAQAoraHRtbCwKK2JvZHkgeworICAgIG1hcmdpbjogMDsKKyAgICBw
YWRkaW5nOiAwOworfQorCitidXR0b24geworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAw
OworICAgIGJvcmRlcjogMDsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworICAgIGZvbnQtc2l6ZTog
MTAwJTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgZm9udC1mYW1pbHk6IGlu
aGVyaXQ7CisgICAgY29sb3I6IGluaGVyaXQ7CisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25l
OworICAgIC8qLW1vei1hcHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFwcGVhcmFuY2U6IG5v
bmU7CisgICAgLW8tYXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQor
Citib2R5IHsKKyAgICBmb250OiAxNHB4ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJp
YWwsIHNhbnMtc2VyaWY7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJhY2tncm91bmQ6
ICNlYWVhZWEgdXJsKCdiZy5wbmcnKTsKKyAgICBjb2xvcjogIzRkNGQ0ZDsKKyAgICB3aWR0aDog
NTUwcHg7CisgICAgbWFyZ2luOiAwIGF1dG87CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzog
YW50aWFsaWFzZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAg
LW1zLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGluZzog
YW50aWFsaWFzZWQ7CisgICAgZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisjdG9k
b2FwcCB7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwg
MjU1LCAyNTUsIDAuOSk7CisgICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBib3JkZXI6
IDFweCBzb2xpZCAjY2NjOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBib3JkZXItdG9w
LWxlZnQtcmFkaXVzOiAycHg7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKKyAg
ICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAgMCAyNXB4
IDUwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUpOworfQorCisjdG9kb2FwcDpiZWZvcmUgeworICAg
IGNvbnRlbnQ6ICcnOworICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y1ZDZkNjsKKyAgICBi
b3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjVkNmQ2OworICAgIHdpZHRoOiAycHg7CisgICAgcG9z
aXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICBsZWZ0OiA0MHB4OworICAgIGhlaWdo
dDogMTAwJTsKK30KKworI3RvZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIg
eworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworI3RvZG9hcHAgaW5wdXQ6Oi1tb3otcGxh
Y2Vob2xkZXIgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBjb2xvcjogI2E5YTlhOTsK
K30KKworI3RvZG9hcHAgaDEgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0x
MjBweDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDcwcHg7CisgICAgZm9udC13
ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGNvbG9yOiAjYjNiM2Iz
OworICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CisgICAgdGV4dC1zaGFkb3c6
IC0xcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC10ZXh0LXJlbmRlcmlu
Zzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXpl
TGVnaWJpbGl0eTsKKyAgICAtbXMtdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsK
KyAgICAtby10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQtcmVu
ZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7Cit9CisKKyNoZWFkZXIgeworICAgIHBhZGRpbmct
dG9wOiAxNXB4OworICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7Cit9CisKKyNoZWFkZXI6YmVm
b3JlIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9w
OiAwOworICAgIHJpZ2h0OiAwOworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiAxNXB4OworICAg
IHotaW5kZXg6IDI7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2YzYxNWM7CisgICAg
YmFja2dyb3VuZDogIzhkN2Q3NzsKKyAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxp
bmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44
KSksdG8ocmdiYSgxMDEsIDg0LCA3NiwgMC44KSkpOworICAgIGJhY2tncm91bmQ6IC13ZWJraXQt
bGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwg
ODQsIDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3As
IHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSwgcmdiYSgxMDEsIDg0LCA3NiwgMC44KSk7CisgICAg
YmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAw
LjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFy
LWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2
LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDEzMiwg
MTEwLCAxMDAsIDAuOCksIHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpOworICAgIGZpbHRlcjogcHJv
Z2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLFN0
YXJ0Q29sb3JTdHI9JyM5ZDhiODMnLCBFbmRDb2xvclN0cj0nIzg0NzY3MCcpOworICAgIGJvcmRl
ci10b3AtbGVmdC1yYWRpdXM6IDFweDsKKyAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMXB4
OworfQorCisjbmV3LXRvZG8sCisuZWRpdCB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAg
IG1hcmdpbjogMDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDI0cHg7CisgICAg
Zm9udC1mYW1pbHk6IGluaGVyaXQ7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJvcmRl
cjogMDsKKyAgICBvdXRsaW5lOiBub25lOworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHBhZGRp
bmc6IDZweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAgIGJveC1zaGFkb3c6IGlu
c2V0IDAgLTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC1ib3gtc2l6
aW5nOiBib3JkZXItYm94OworICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAt
bXMtYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAtby1ib3gtc2l6aW5nOiBib3JkZXItYm94
OworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgLXdlYmtpdC1mb250LXNtb290aGlu
ZzogYW50aWFsaWFzZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Cisg
ICAgLW1zLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGlu
ZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisj
bmV3LXRvZG8geworICAgIHBhZGRpbmc6IDE2cHggMTZweCAxNnB4IDYwcHg7CisgICAgYm9yZGVy
OiBub25lOworICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMik7CisgICAgei1pbmRl
eDogMjsKKyAgICBib3gtc2hhZG93OiBub25lOworfQorCisjbWFpbiB7CisgICAgcG9zaXRpb246
IHJlbGF0aXZlOworICAgIHotaW5kZXg6IDI7CisgICAgYm9yZGVyLXRvcDogMXB4IGRvdHRlZCAj
YWRhZGFkOworfQorCitsYWJlbFtmb3I9J3RvZ2dsZS1hbGwnXSB7CisgICAgZGlzcGxheTogbm9u
ZTsKK30KKworI3RvZ2dsZS1hbGwgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6
IC00MnB4OworICAgIGxlZnQ6IC00cHg7CisgICAgd2lkdGg6IDQwcHg7CisgICAgdGV4dC1hbGln
bjogY2VudGVyOworICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQorCisj
dG9nZ2xlLWFsbDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICfCuyc7CisgICAgZm9udC1zaXplOiAy
OHB4OworICAgIGNvbG9yOiAjZDlkOWQ5OworICAgIHBhZGRpbmc6IDAgMjVweCA3cHg7Cit9CisK
KyN0b2dnbGUtYWxsOmNoZWNrZWQ6YmVmb3JlIHsKKyAgICBjb2xvcjogIzczNzM3MzsKK30KKwor
I3RvZG8tbGlzdCB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1z
dHlsZTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZl
OworICAgIGZvbnQtc2l6ZTogMjRweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNj
Y2M7Cit9CisKKyN0b2RvLWxpc3QgbGk6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbTog
bm9uZTsKK30KKworI3RvZG8tbGlzdCBsaS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9tOiBu
b25lOworICAgIHBhZGRpbmc6IDA7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRpdCB7
CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6IDEz
cHggMTdweCAxMnB4IDE3cHg7CisgICAgbWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9kby1s
aXN0IGxpLmVkaXRpbmcgLnZpZXcgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2RvLWxp
c3QgbGkgLnRvZ2dsZSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0MHB4
OworICAgIC8qIGF1dG8sIHNpbmNlIG5vbi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBwb3J0
IGlucHV0IHN0eWxpbmcgKi8KKyAgICBoZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFic29s
dXRlOworICAgIHRvcDogMDsKKyAgICBib3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7Cisg
ICAgYm9yZGVyOiBub25lOyAvKiBNb2JpbGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBlYXJh
bmNlOiBub25lOworICAgIC8qLW1vei1hcHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFwcGVh
cmFuY2U6IG5vbmU7CisgICAgLW8tYXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBu
b25lOworfQorCisjdG9kby1saXN0IGxpIC50b2dnbGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfi
nJQnOworICAgIGxpbmUtaGVpZ2h0OiA0M3B4OyAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVscyB2
aXN1YWwgYWRqdXN0bWVudCAqLworICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICBjb2xvcjogI2Q5
ZDlkOTsKKyAgICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgI2JmYmZiZjsKK30KKworI3RvZG8tbGlz
dCBsaSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgeworICAgIGNvbG9yOiAjODVhZGE3OworICAgIHRl
eHQtc2hhZG93OiAwIDFweCAwICM2Njk5OTE7CisgICAgYm90dG9tOiAxcHg7CisgICAgcG9zaXRp
b246IHJlbGF0aXZlOworfQorCisjdG9kby1saXN0IGxpIGxhYmVsIHsKKyAgICB3b3JkLWJyZWFr
OiBicmVhay13b3JkOworICAgIHBhZGRpbmc6IDE1cHg7CisgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7
CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICAtd2Via2l0
LXRyYW5zaXRpb246IGNvbG9yIDAuNHM7CisgICAgLW1vei10cmFuc2l0aW9uOiBjb2xvciAwLjRz
OworICAgIC1tcy10cmFuc2l0aW9uOiBjb2xvciAwLjRzOworICAgIC1vLXRyYW5zaXRpb246IGNv
bG9yIDAuNHM7CisgICAgdHJhbnNpdGlvbjogY29sb3IgMC40czsKK30KKworI3RvZG8tbGlzdCBs
aS5jb21wbGV0ZWQgbGFiZWwgeworICAgIGNvbG9yOiAjYTlhOWE5OworICAgIHRleHQtZGVjb3Jh
dGlvbjogbGluZS10aHJvdWdoOworfQorCisjdG9kby1saXN0IGxpIC5kZXN0cm95IHsKKyAgICBk
aXNwbGF5OiBub25lOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7CisgICAg
cmlnaHQ6IDEwcHg7CisgICAgYm90dG9tOiAwOworICAgIHdpZHRoOiA0MHB4OworICAgIGhlaWdo
dDogNDBweDsKKyAgICBtYXJnaW46IGF1dG8gMDsKKyAgICBmb250LXNpemU6IDIycHg7CisgICAg
Y29sb3I6ICNhODhhOGE7CisgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICAt
bW96LXRyYW5zaXRpb246IGFsbCAwLjJzOworICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yczsK
KyAgICAtby10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsK
K30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3ZlciB7CisgICAgdGV4dC1zaGFkb3c6IDAg
MCAxcHggIzAwMCwKKyAgICAgMCAwIDEwcHggcmdiYSgxOTksIDEwNywgMTA3LCAwLjgpOworICAg
IC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjMpOworICAgIC1tb3otdHJhbnNmb3JtOiBzY2Fs
ZSgxLjMpOworICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMyk7CisgICAgLW8tdHJhbnNmb3Jt
OiBzY2FsZSgxLjMpOworICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zKTsKK30KKworI3RvZG8tbGlz
dCBsaSAuZGVzdHJveTphZnRlciB7CisgICAgY29udGVudDogJ+Kclic7Cit9CisKKyN0b2RvLWxp
c3QgbGk6aG92ZXIgLmRlc3Ryb3kgeworICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisjdG9kby1s
aXN0IGxpIC5lZGl0IHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9kby1saXN0IGxpLmVk
aXRpbmc6bGFzdC1jaGlsZCB7CisgICAgbWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworI2Zvb3Rl
ciB7CisgICAgY29sb3I6ICM3Nzc7CisgICAgcGFkZGluZzogMCAxNXB4OworICAgIHBvc2l0aW9u
OiBhYnNvbHV0ZTsKKyAgICByaWdodDogMDsKKyAgICBib3R0b206IC0zMXB4OworICAgIGxlZnQ6
IDA7CisgICAgaGVpZ2h0OiAyMHB4OworICAgIHotaW5kZXg6IDE7CisgICAgdGV4dC1hbGlnbjog
Y2VudGVyOworfQorCisjZm9vdGVyOmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgcG9z
aXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAwOworICAgIGJvdHRvbTogMzFweDsKKyAgICBs
ZWZ0OiAwOworICAgIGhlaWdodDogNTBweDsKKyAgICB6LWluZGV4OiAtMTsKKyAgICBib3gtc2hh
ZG93OiAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjMpLAorICAgIDAgNnB4IDAgLTNweCByZ2Jh
KDI1NSwgMjU1LCAyNTUsIDAuOCksCisgICAgMCA3cHggMXB4IC0zcHggcmdiYSgwLCAwLCAwLCAw
LjMpLAorICAgIDAgNDNweCAwIC02cHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpLAorICAgIDAg
NDRweCAycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsKKyAg
ICBmbG9hdDogbGVmdDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisjZmlsdGVycyB7Cisg
ICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAg
ICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgcmlnaHQ6IDA7CisgICAgbGVmdDogMDsKK30KKwor
I2ZpbHRlcnMgbGkgeworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2ZpbHRlcnMgbGkgYSB7
CisgICAgY29sb3I6ICM4Mzc1NmY7CisgICAgbWFyZ2luOiAycHg7CisgICAgdGV4dC1kZWNvcmF0
aW9uOiBub25lOworfQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkIHsKKyAgICBmb250LXdlaWdo
dDogYm9sZDsKK30KKworI2NsZWFyLWNvbXBsZXRlZCB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAg
IHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBsaW5lLWhlaWdodDogMjBweDsKKyAgICB0ZXh0LWRl
Y29yYXRpb246IG5vbmU7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjEpOworICAg
IGZvbnQtc2l6ZTogMTFweDsKKyAgICBwYWRkaW5nOiAwIDEwcHg7CisgICAgYm9yZGVyLXJhZGl1
czogM3B4OworICAgIGJveC1zaGFkb3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjIpOwor
fQorCisjY2xlYXItY29tcGxldGVkOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAs
IDAsIDAuMTUpOworICAgIGJveC1zaGFkb3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjMp
OworfQorCisjaW5mbyB7CisgICAgbWFyZ2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjogI2E2
YTZhNjsKKyAgICBmb250LXNpemU6IDEycHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdi
YSgyNTUsIDI1NSwgMjU1LCAwLjcpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworI2lu
Zm8gYSB7CisgICAgY29sb3I6IGluaGVyaXQ7Cit9CisKKy8qCisgICAgSGFjayB0byByZW1vdmUg
YmFja2dyb3VuZCBmcm9tIE1vYmlsZSBTYWZhcmkuCisgICAgQ2FuJ3QgdXNlIGl0IGdsb2JhbGx5
IHNpbmNlIGl0IGRlc3Ryb3lzIGNoZWNrYm94ZXMgaW4gRmlyZWZveCBhbmQgT3BlcmEKKyovCitA
bWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsKKyAg
ICAjdG9nZ2xlLWFsbCwKKyAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgeworICAgIGJhY2tncm91
bmQ6IG5vbmU7CisgICAgfQorCisgICAgI3RvZG8tbGlzdCBsaSAudG9nZ2xlIHsKKyAgICBoZWln
aHQ6IDQwcHg7CisgICAgfQorCisgICAgI3RvZ2dsZS1hbGwgeworICAgIHRvcDogLTU2cHg7Cisg
ICAgbGVmdDogLTE1cHg7CisgICAgd2lkdGg6IDY1cHg7CisgICAgaGVpZ2h0OiA0MXB4OworICAg
IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOworICAgIHRyYW5zZm9ybTogcm90YXRl
KDkwZGVnKTsKKyAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgICAgYXBwZWFyYW5jZTog
bm9uZTsKKyAgICB9Cit9CisKKy5oaWRkZW57CisgICAgZGlzcGxheTpub25lOworfQorCitociB7
CisgICAgbWFyZ2luOiAyMHB4IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci10b3A6IDFw
eCBkYXNoZWQgI0M1QzVDNTsKKyAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNGN0Y3Rjc7
Cit9CisKKy5sZWFybiBhIHsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQtZGVj
b3JhdGlvbjogbm9uZTsKKyAgICBjb2xvcjogI2I4M2Y0NTsKK30KKworLmxlYXJuIGE6aG92ZXIg
eworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIGNvbG9yOiAjNzg3ZTdlOwor
fQorCisubGVhcm4gaDMsCisubGVhcm4gaDQsCisubGVhcm4gaDUgeworICAgIG1hcmdpbjogMTBw
eCAwOworICAgIGZvbnQtd2VpZ2h0OiA1MDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICBj
b2xvcjogIzAwMDsKK30KKworLmxlYXJuIGgzIHsKKyAgICBmb250LXNpemU6IDI0cHg7Cit9CisK
Ky5sZWFybiBoNCB7CisgICAgZm9udC1zaXplOiAxOHB4OworfQorCisubGVhcm4gaDUgeworICAg
IG1hcmdpbi1ib3R0b206IDA7CisgICAgZm9udC1zaXplOiAxNHB4OworfQorCisubGVhcm4gdWwg
eworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OworfQorCisubGVh
cm4gbGkgeworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorCisubGVhcm4gcCB7CisgICAgZm9u
dC1zaXplOiAxNXB4OworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgbGluZS1oZWlnaHQ6IDEu
MzsKKyAgICBtYXJnaW4tdG9wOiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5xdW90
ZSB7CisgICAgYm9yZGVyOiBub25lOworICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKK30KKwor
LnF1b3RlIHAgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLnF1b3RlIHA6YmVmb3Jl
IHsKKyAgICBjb250ZW50OiAn4oCcJzsKKyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3BhY2l0
eTogLjE1OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0yMHB4OworICAgIGxl
ZnQ6IDNweDsKK30KKworLnF1b3RlIHA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfigJ0nOworICAg
IGZvbnQtc2l6ZTogNTBweDsKKyAgICBvcGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFic29s
dXRlOworICAgIGJvdHRvbTogLTQycHg7CisgICAgcmlnaHQ6IDNweDsKK30KKworLnF1b3RlIGZv
b3RlciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGJvdHRvbTogLTQwcHg7CisgICAg
cmlnaHQ6IDA7Cit9CisKKy5xdW90ZSBmb290ZXIgaW1nIHsKKyAgICBib3JkZXItcmFkaXVzOiAz
cHg7Cit9CisKKy5xdW90ZSBmb290ZXIgYSB7CisgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICB2
ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuc3BlZWNoLWJ1YmJsZSB7CisgICAgcG9zaXRp
b246IHJlbGF0aXZlOworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYmFja2dyb3VuZDogcmdiYSgw
LCAwLCAwLCAuMDQpOworICAgIGJvcmRlci1yYWRpdXM6IDVweDsKK30KKworLnNwZWVjaC1idWJi
bGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAg
ICB0b3A6IDEwMCU7CisgICAgcmlnaHQ6IDMwcHg7CisgICAgYm9yZGVyOiAxM3B4IHNvbGlkIHRy
YW5zcGFyZW50OworICAgIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsKK30K
KworLyoqYm9keSovLmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgcG9zaXRpb246IGFic29sdXRl
OworICAgIHdpZHRoOiAyNzJweDsKKyAgICB0b3A6IDhweDsKKyAgICBsZWZ0OiAtMzAwcHg7Cisg
ICAgcGFkZGluZzogMTBweDsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7CisgICAgYmFja2dyb3Vu
ZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAuNik7CisgICAgdHJhbnNpdGlvbi1wcm9wZXJ0
eTogbGVmdDsKKyAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKK30KKworQG1lZGlhICht
aW4td2lkdGg6IDg5OXB4KSB7CisgICAgLyoqYm9keSovLmxlYXJuLWJhciB7CisgICAgd2lkdGg6
IGF1dG87CisgICAgbWFyZ2luOiAwIDAgMCAzMDBweDsKKyAgICB9CisgICAgLyoqYm9keSovLmxl
YXJuLWJhciA+IC5sZWFybiB7CisgICAgbGVmdDogOHB4OworICAgIH0KKyAgICAvKipib2R5Ki8u
bGVhcm4tYmFyICN0b2RvYXBwIHsKKyAgICB3aWR0aDogNTUwcHg7CisgICAgbWFyZ2luOiAxMzBw
eCBhdXRvIDQwcHggYXV0bzsKKyAgICB9Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENv
bXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2pxdWVyeS9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93ZXJfY29tcG9uZW50cy90b2Rv
bXZjLWNvbW1vbi9iYXNlLmpzCShyZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RD
b21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9qcXVlcnkvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMjA5IEBACisoZnVuY3Rpb24gKCkgeworICAgICd1c2Ugc3RyaWN0
JzsKKworICAgIC8vIFVuZGVyc2NvcmUncyBUZW1wbGF0ZSBNb2R1bGUKKyAgICAvLyBDb3VydGVz
eSBvZiB1bmRlcnNjb3JlanMub3JnCisgICAgdmFyIF8gPSAoZnVuY3Rpb24gKF8pIHsKKyAgICBf
LmRlZmF1bHRzID0gZnVuY3Rpb24gKG9iamVjdCkgeworICAgIGlmICghb2JqZWN0KSB7CisgICAg
cmV0dXJuIG9iamVjdDsKKyAgICB9CisgICAgZm9yICh2YXIgYXJnc0luZGV4ID0gMSwgYXJnc0xl
bmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGg7IGFyZ3NJbmRl
eCsrKSB7CisgICAgdmFyIGl0ZXJhYmxlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07CisgICAgaWYg
KGl0ZXJhYmxlKSB7CisgICAgZm9yICh2YXIga2V5IGluIGl0ZXJhYmxlKSB7CisgICAgaWYgKG9i
amVjdFtrZXldID09IG51bGwpIHsKKyAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxlW2tleV07Cisg
ICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisg
ICAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzIEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxp
bWl0ZXJzLCBjaGFuZ2UgdGhlCisgICAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRv
IHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgorICAgIF8udGVtcGxhdGVTZXR0aW5ncyA9IHsK
KyAgICBldmFsdWF0ZSAgICA6IC88JShbXHNcU10rPyklPi9nLAorICAgIGludGVycG9sYXRlIDog
LzwlPShbXHNcU10rPyklPi9nLAorICAgIGVzY2FwZSAgICAgIDogLzwlLShbXHNcU10rPyklPi9n
CisgICAgfTsKKworICAgIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBp
ZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW4KKyAgICAvLyBpbnRlcnBvbGF0aW9uLCBldmFs
dWF0aW9uIG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBuZWVkIG9uZSB0aGF0IGlzCisgICAgLy8gZ3Vh
cmFudGVlZCBub3QgdG8gbWF0Y2guCisgICAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87CisKKyAgICAv
LyBDZXJ0YWluIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkIHNvIHRoYXQgdGhleSBjYW4g
YmUgcHV0IGludG8gYQorICAgIC8vIHN0cmluZyBsaXRlcmFsLgorICAgIHZhciBlc2NhcGVzID0g
eworICAgICInIjogICAgICAiJyIsCisgICAgJ1xcJzogICAgICdcXCcsCisgICAgJ1xyJzogICAg
ICdyJywKKyAgICAnXG4nOiAgICAgJ24nLAorICAgICdcdCc6ICAgICAndCcsCisgICAgJ1x1MjAy
OCc6ICd1MjAyOCcsCisgICAgJ1x1MjAyOSc6ICd1MjAyOScKKyAgICB9OworCisgICAgdmFyIGVz
Y2FwZXIgPSAvXFx8J3xccnxcbnxcdHxcdTIwMjh8XHUyMDI5L2c7CisKKyAgICAvLyBKYXZhU2Ny
aXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0
aW9uLgorICAgIC8vIFVuZGVyc2NvcmUgdGVtcGxhdGluZyBoYW5kbGVzIGFyYml0cmFyeSBkZWxp
bWl0ZXJzLCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSwKKyAgICAvLyBhbmQgY29ycmVjdGx5IGVzY2Fw
ZXMgcXVvdGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQgY29kZS4KKyAgICBfLnRlbXBsYXRlID0gZnVu
Y3Rpb24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKKyAgICB2YXIgcmVuZGVyOworICAgIHNldHRp
bmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7CisKKyAg
ICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBh
bHRlcm5hdGlvbi4KKyAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoWworICAgIChzZXR0aW5n
cy5lc2NhcGUgfHwgbm9NYXRjaCkuc291cmNlLAorICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8
fCBub01hdGNoKS5zb3VyY2UsCisgICAgKHNldHRpbmdzLmV2YWx1YXRlIHx8IG5vTWF0Y2gpLnNv
dXJjZQorICAgIF0uam9pbignfCcpICsgJ3wkJywgJ2cnKTsKKworICAgIC8vIENvbXBpbGUgdGhl
IHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVyYWxzIGFwcHJvcHJpYXRlbHku
CisgICAgdmFyIGluZGV4ID0gMDsKKyAgICB2YXIgc291cmNlID0gIl9fcCs9JyI7CisgICAgdGV4
dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBl
dmFsdWF0ZSwgb2Zmc2V0KSB7CisgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNl
dCkKKyAgICAucmVwbGFjZShlc2NhcGVyLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gJ1xcJyAr
IGVzY2FwZXNbbWF0Y2hdOyB9KTsKKworICAgIGlmIChlc2NhcGUpIHsKKyAgICBzb3VyY2UgKz0g
IicrXG4oKF9fdD0oIiArIGVzY2FwZSArICIpKT09bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcbici
OworICAgIH0KKyAgICBpZiAoaW50ZXJwb2xhdGUpIHsKKyAgICBzb3VyY2UgKz0gIicrXG4oKF9f
dD0oIiArIGludGVycG9sYXRlICsgIikpPT1udWxsPycnOl9fdCkrXG4nIjsKKyAgICB9CisgICAg
aWYgKGV2YWx1YXRlKSB7CisgICAgc291cmNlICs9ICInO1xuIiArIGV2YWx1YXRlICsgIlxuX19w
Kz0nIjsKKyAgICB9CisgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7CisgICAgcmV0
dXJuIG1hdGNoOworICAgIH0pOworICAgIHNvdXJjZSArPSAiJztcbiI7CisKKyAgICAvLyBJZiBh
IHZhcmlhYmxlIGlzIG5vdCBzcGVjaWZpZWQsIHBsYWNlIGRhdGEgdmFsdWVzIGluIGxvY2FsIHNj
b3BlLgorICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9ianx8e30p
e1xuJyArIHNvdXJjZSArICd9XG4nOworCisgICAgc291cmNlID0gInZhciBfX3QsX19wPScnLF9f
aj1BcnJheS5wcm90b3R5cGUuam9pbiwiICsKKyAgICAicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9f
ai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcbiIgKworICAgIHNvdXJjZSArICJyZXR1cm4gX19wO1xu
IjsKKworICAgIHRyeSB7CisgICAgcmVuZGVyID0gbmV3IEZ1bmN0aW9uKHNldHRpbmdzLnZhcmlh
YmxlIHx8ICdvYmonLCAnXycsIHNvdXJjZSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgIGUuc291
cmNlID0gc291cmNlOworICAgIHRocm93IGU7CisgICAgfQorCisgICAgaWYgKGRhdGEpIHJldHVy
biByZW5kZXIoZGF0YSwgXyk7CisgICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkgewor
ICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTsKKyAgICB9OworCisgICAgLy8g
UHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24gc291cmNlIGFzIGEgY29udmVuaWVuY2UgZm9y
IHByZWNvbXBpbGF0aW9uLgorICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNl
dHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsKKworICAg
IHJldHVybiB0ZW1wbGF0ZTsKKyAgICB9OworCisgICAgcmV0dXJuIF87CisgICAgfSkoe30pOwor
CisgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09PSAndG9kb212Yy5jb20nKSB7CisgICAgd2lu
ZG93Ll9nYXEgPSBbWydfc2V0QWNjb3VudCcsJ1VBLTMxMDgxMDYyLTEnXSxbJ190cmFja1BhZ2V2
aWV3J11dOyhmdW5jdGlvbihkLHQpe3ZhciBnPWQuY3JlYXRlRWxlbWVudCh0KSxzPWQuZ2V0RWxl
bWVudHNCeVRhZ05hbWUodClbMF07Zy5zcmM9Jy8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2dh
LmpzJztzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcscyl9KGRvY3VtZW50LCdzY3JpcHQnKSk7
CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVkaXJlY3QoKSB7CisgICAgaWYgKGxvY2F0aW9uLmhv
c3RuYW1lID09PSAndGFzdGVqcy5naXRodWIuaW8nKSB7CisgICAgbG9jYXRpb24uaHJlZiA9IGxv
Y2F0aW9uLmhyZWYucmVwbGFjZSgndGFzdGVqcy5naXRodWIuaW8vdG9kb212YycsICd0b2RvbXZj
LmNvbScpOworICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaW5kUm9vdCgpIHsKKyAgICB2
YXIgYmFzZTsKKworICAgIFsvbGFicy8sIC9cdyotZXhhbXBsZXMvXS5mb3JFYWNoKGZ1bmN0aW9u
IChocmVmKSB7CisgICAgdmFyIG1hdGNoID0gbG9jYXRpb24uaHJlZi5tYXRjaChocmVmKTsKKwor
ICAgIGlmICghYmFzZSAmJiBtYXRjaCkgeworICAgIGJhc2UgPSBsb2NhdGlvbi5ocmVmLmluZGV4
T2YobWF0Y2gpOworICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLnN1
YnN0cigwLCBiYXNlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBnZXRGaWxlKGZpbGUsIGNhbGxi
YWNrKSB7CisgICAgaWYgKCFsb2NhdGlvbi5ob3N0KSB7CisgICAgcmV0dXJuIGNvbnNvbGUuaW5m
bygnTWlzcyB0aGUgaW5mbyBiYXI/IFJ1biBUb2RvTVZDIGZyb20gYSBzZXJ2ZXIgdG8gYXZvaWQg
YSBjcm9zcy1vcmlnaW4gZXJyb3IuJyk7CisgICAgfQorCisgICAgdmFyIHhociA9IG5ldyBYTUxI
dHRwUmVxdWVzdCgpOworCisgICAgeGhyLm9wZW4oJ0dFVCcsIGZpbmRSb290KCkgKyBmaWxlLCB0
cnVlKTsKKyAgICB4aHIuc2VuZCgpOworCisgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsK
KyAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIGNhbGxiYWNrKSB7CisgICAgY2FsbGJhY2so
eGhyLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICAgIH07CisgICAgfQorCisgICAgZnVuY3Rpb24g
TGVhcm4obGVhcm5KU09OLCBjb25maWcpIHsKKyAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGVh
cm4pKSB7CisgICAgcmV0dXJuIG5ldyBMZWFybihsZWFybkpTT04sIGNvbmZpZyk7CisgICAgfQor
CisgICAgdmFyIHRlbXBsYXRlLCBmcmFtZXdvcms7CisKKyAgICBpZiAodHlwZW9mIGxlYXJuSlNP
TiAhPT0gJ29iamVjdCcpIHsKKyAgICB0cnkgeworICAgIGxlYXJuSlNPTiA9IEpTT04ucGFyc2Uo
bGVhcm5KU09OKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgcmV0dXJuOworICAgIH0KKyAgICB9
CisKKyAgICBpZiAoY29uZmlnKSB7CisgICAgdGVtcGxhdGUgPSBjb25maWcudGVtcGxhdGU7Cisg
ICAgZnJhbWV3b3JrID0gY29uZmlnLmZyYW1ld29yazsKKyAgICB9CisKKyAgICBpZiAoIXRlbXBs
YXRlICYmIGxlYXJuSlNPTi50ZW1wbGF0ZXMpIHsKKyAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNPTi50
ZW1wbGF0ZXMudG9kb212YzsKKyAgICB9CisKKyAgICBpZiAoIWZyYW1ld29yayAmJiBkb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdvcmtdJykpIHsKKyAgICBmcmFtZXdvcmsgPSBk
b2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdvcmtdJykuZ2V0QXR0cmlidXRlKCdk
YXRhLWZyYW1ld29yaycpOworICAgIH0KKworCisgICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNP
TltmcmFtZXdvcmtdKSB7CisgICAgdGhpcy5mcmFtZXdvcmtKU09OID0gbGVhcm5KU09OW2ZyYW1l
d29ya107CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworCisgICAgdGhpcy5hcHBlbmQo
KTsKKyAgICB9CisgICAgfQorCisgICAgTGVhcm4ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB2YXIgYXNpZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhc2lkZScpOwor
ICAgIGFzaWRlLmlubmVySFRNTCA9IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhpcy5mcmFt
ZXdvcmtKU09OKTsKKyAgICBhc2lkZS5jbGFzc05hbWUgPSAnbGVhcm4nOworCisgICAgLy8gTG9j
YWxpemUgZGVtbyBsaW5rcworICAgIHZhciBkZW1vTGlua3MgPSBhc2lkZS5xdWVyeVNlbGVjdG9y
QWxsKCcuZGVtby1saW5rJyk7CisgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkZW1v
TGlua3MsIGZ1bmN0aW9uIChkZW1vTGluaykgeworICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0ZSgn
aHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7CisgICAg
fSk7CisKKyAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IChkb2N1bWVudC5ib2R5LmNsYXNz
TmFtZSArICcgbGVhcm4tYmFyJykudHJpbSgpOworICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRq
YWNlbnRIVE1MKCdhZnRlckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsKKyAgICB9OworCisgICAg
cmVkaXJlY3QoKTsKKyAgICBnZXRGaWxlKCdsZWFybi5qc29uJywgTGVhcm4pOworfSkoKTsKSW5k
ZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Nzcy9hcHAuY3NzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Nzcy9hcHAuY3NzCShyZXZpc2lvbiAw
KQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvY3NzL2FwcC5jc3MJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0IEBACisjbWFpbiwKKyNmb290ZXIgeworICAgIGRpc3BsYXk6IG5v
bmU7Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RP
TUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2pxdWVyeS9qcy9hcHAuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01C
ZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvanMvYXBwLmpzCShyZXZp
c2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01C
ZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvanMvYXBwLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTg3IEBACisvKmdsb2JhbCBqUXVlcnksIEhhbmRsZWJhcnMg
Ki8KK2pRdWVyeShmdW5jdGlvbiAoJCkgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIHZhciBV
dGlscyA9IHsKKyAgICB1dWlkOiBmdW5jdGlvbiAoKSB7CisgICAgLypqc2hpbnQgYml0d2lzZTpm
YWxzZSAqLworICAgIHZhciBpLCByYW5kb207CisgICAgdmFyIHV1aWQgPSAnJzsKKworICAgIGZv
ciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIDE2
IHwgMDsKKyAgICBpZiAoaSA9PT0gOCB8fCBpID09PSAxMiB8fCBpID09PSAxNiB8fCBpID09PSAy
MCkgeworICAgIHV1aWQgKz0gJy0nOworICAgIH0KKyAgICB1dWlkICs9IChpID09PSAxMiA/IDQg
OiAoaSA9PT0gMTYgPyAocmFuZG9tICYgMyB8IDgpIDogcmFuZG9tKSkudG9TdHJpbmcoMTYpOwor
ICAgIH0KKworICAgIHJldHVybiB1dWlkOworICAgIH0sCisgICAgcGx1cmFsaXplOiBmdW5jdGlv
biAoY291bnQsIHdvcmQpIHsKKyAgICByZXR1cm4gY291bnQgPT09IDEgPyB3b3JkIDogd29yZCAr
ICdzJzsKKyAgICB9LAorICAgIHN0b3JlOiBmdW5jdGlvbiAobmFtZXNwYWNlLCBkYXRhKSB7Cisg
ICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5z
ZXRJdGVtKG5hbWVzcGFjZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpOworICAgIH0gZWxzZSB7Cisg
ICAgdmFyIHN0b3JlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZXNwYWNlKTsKKyAgICByZXR1
cm4gKHN0b3JlICYmIEpTT04ucGFyc2Uoc3RvcmUpKSB8fCBbXTsKKyAgICB9CisgICAgfQorICAg
IH07CisKKyAgICB2YXIgQXBwID0geworICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlz
LkVOVEVSX0tFWSA9IDEzOworICAgIHRoaXMudG9kb3MgPSBVdGlscy5zdG9yZSgndG9kb3MtanF1
ZXJ5Jyk7CisgICAgdGhpcy5jYWNoZUVsZW1lbnRzKCk7CisgICAgdGhpcy5iaW5kRXZlbnRzKCk7
CisgICAgdGhpcy5yZW5kZXIoKTsKKyAgICB9LAorICAgIGNhY2hlRWxlbWVudHM6IGZ1bmN0aW9u
ICgpIHsKKyAgICB0aGlzLnRvZG9UZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZSgkKCcjdG9k
by10ZW1wbGF0ZScpLmh0bWwoKSk7CisgICAgdGhpcy5mb290ZXJUZW1wbGF0ZSA9IEhhbmRsZWJh
cnMuY29tcGlsZSgkKCcjZm9vdGVyLXRlbXBsYXRlJykuaHRtbCgpKTsKKyAgICB0aGlzLiR0b2Rv
QXBwID0gJCgnI3RvZG9hcHAnKTsKKyAgICB0aGlzLiRoZWFkZXIgPSB0aGlzLiR0b2RvQXBwLmZp
bmQoJyNoZWFkZXInKTsKKyAgICB0aGlzLiRtYWluID0gdGhpcy4kdG9kb0FwcC5maW5kKCcjbWFp
bicpOworICAgIHRoaXMuJGZvb3RlciA9IHRoaXMuJHRvZG9BcHAuZmluZCgnI2Zvb3RlcicpOwor
ICAgIHRoaXMuJG5ld1RvZG8gPSB0aGlzLiRoZWFkZXIuZmluZCgnI25ldy10b2RvJyk7CisgICAg
dGhpcy4kdG9nZ2xlQWxsID0gdGhpcy4kbWFpbi5maW5kKCcjdG9nZ2xlLWFsbCcpOworICAgIHRo
aXMuJHRvZG9MaXN0ID0gdGhpcy4kbWFpbi5maW5kKCcjdG9kby1saXN0Jyk7CisgICAgdGhpcy4k
Y291bnQgPSB0aGlzLiRmb290ZXIuZmluZCgnI3RvZG8tY291bnQnKTsKKyAgICB0aGlzLiRjbGVh
ckJ0biA9IHRoaXMuJGZvb3Rlci5maW5kKCcjY2xlYXItY29tcGxldGVkJyk7CisgICAgfSwKKyAg
ICBiaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGxpc3QgPSB0aGlzLiR0b2RvTGlz
dDsKKyAgICB0aGlzLiRuZXdUb2RvLm9uKCdrZXl1cCcsIHRoaXMuY3JlYXRlKTsKKyAgICB0aGlz
LiR0b2dnbGVBbGwub24oJ2NoYW5nZScsIHRoaXMudG9nZ2xlQWxsKTsKKyAgICB0aGlzLiRmb290
ZXIub24oJ2NsaWNrJywgJyNjbGVhci1jb21wbGV0ZWQnLCB0aGlzLmRlc3Ryb3lDb21wbGV0ZWQp
OworICAgIGxpc3Qub24oJ2NoYW5nZScsICcudG9nZ2xlJywgdGhpcy50b2dnbGUpOworICAgIGxp
c3Qub24oJ2RibGNsaWNrJywgJ2xhYmVsJywgdGhpcy5lZGl0KTsKKyAgICBsaXN0Lm9uKCdrZXlw
cmVzcycsICcuZWRpdCcsIHRoaXMuYmx1ck9uRW50ZXIpOworICAgIGxpc3Qub24oJ2JsdXInLCAn
LmVkaXQnLCB0aGlzLnVwZGF0ZSk7CisgICAgbGlzdC5vbignY2xpY2snLCAnLmRlc3Ryb3knLCB0
aGlzLmRlc3Ryb3kpOworICAgIH0sCisgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7CisgICAgdGhp
cy4kdG9kb0xpc3QuaHRtbCh0aGlzLnRvZG9UZW1wbGF0ZSh0aGlzLnRvZG9zKSk7CisgICAgdGhp
cy4kbWFpbi50b2dnbGUoISF0aGlzLnRvZG9zLmxlbmd0aCk7CisgICAgdGhpcy4kdG9nZ2xlQWxs
LnByb3AoJ2NoZWNrZWQnLCAhdGhpcy5hY3RpdmVUb2RvQ291bnQoKSk7CisgICAgdGhpcy5yZW5k
ZXJGb290ZXIoKTsKKyAgICBVdGlscy5zdG9yZSgndG9kb3MtanF1ZXJ5JywgdGhpcy50b2Rvcyk7
CisgICAgfSwKKyAgICByZW5kZXJGb290ZXI6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgdG9kb0Nv
dW50ID0gdGhpcy50b2Rvcy5sZW5ndGg7CisgICAgdmFyIGFjdGl2ZVRvZG9Db3VudCA9IHRoaXMu
YWN0aXZlVG9kb0NvdW50KCk7CisgICAgdmFyIGZvb3RlciA9IHsKKyAgICBhY3RpdmVUb2RvQ291
bnQ6IGFjdGl2ZVRvZG9Db3VudCwKKyAgICBhY3RpdmVUb2RvV29yZDogVXRpbHMucGx1cmFsaXpl
KGFjdGl2ZVRvZG9Db3VudCwgJ2l0ZW0nKSwKKyAgICBjb21wbGV0ZWRUb2RvczogdG9kb0NvdW50
IC0gYWN0aXZlVG9kb0NvdW50CisgICAgfTsKKworICAgIHRoaXMuJGZvb3Rlci50b2dnbGUoISF0
b2RvQ291bnQpOworICAgIHRoaXMuJGZvb3Rlci5odG1sKHRoaXMuZm9vdGVyVGVtcGxhdGUoZm9v
dGVyKSk7CisgICAgfSwKKyAgICB0b2dnbGVBbGw6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgaXND
aGVja2VkID0gJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk7CisKKyAgICAkLmVhY2goQXBwLnRvZG9z
LCBmdW5jdGlvbiAoaSwgdmFsKSB7CisgICAgdmFsLmNvbXBsZXRlZCA9IGlzQ2hlY2tlZDsKKyAg
ICB9KTsKKworICAgIEFwcC5yZW5kZXIoKTsKKyAgICB9LAorICAgIGFjdGl2ZVRvZG9Db3VudDog
ZnVuY3Rpb24gKCkgeworICAgIHZhciBjb3VudCA9IDA7CisKKyAgICAkLmVhY2godGhpcy50b2Rv
cywgZnVuY3Rpb24gKGksIHZhbCkgeworICAgIGlmICghdmFsLmNvbXBsZXRlZCkgeworICAgIGNv
dW50Kys7CisgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIGNvdW50OworICAgIH0sCisgICAg
ZGVzdHJveUNvbXBsZXRlZDogZnVuY3Rpb24gKCkgeworICAgIHZhciB0b2RvcyA9IEFwcC50b2Rv
czsKKyAgICB2YXIgbCA9IHRvZG9zLmxlbmd0aDsKKworICAgIHdoaWxlIChsLS0pIHsKKyAgICBp
ZiAodG9kb3NbbF0uY29tcGxldGVkKSB7CisgICAgdG9kb3Muc3BsaWNlKGwsIDEpOworICAgIH0K
KyAgICB9CisKKyAgICBBcHAucmVuZGVyKCk7CisgICAgfSwKKyAgICAvLyBhY2NlcHRzIGFuIGVs
ZW1lbnQgZnJvbSBpbnNpZGUgdGhlIGAuaXRlbWAgZGl2IGFuZAorICAgIC8vIHJldHVybnMgdGhl
IGNvcnJlc3BvbmRpbmcgdG9kbyBpbiB0aGUgdG9kb3MgYXJyYXkKKyAgICBnZXRUb2RvOiBmdW5j
dGlvbiAoZWxlbSwgY2FsbGJhY2spIHsKKyAgICB2YXIgaWQgPSAkKGVsZW0pLmNsb3Nlc3QoJ2xp
JykuZGF0YSgnaWQnKTsKKworICAgICQuZWFjaCh0aGlzLnRvZG9zLCBmdW5jdGlvbiAoaSwgdmFs
KSB7CisgICAgaWYgKHZhbC5pZCA9PT0gaWQpIHsKKyAgICBjYWxsYmFjay5hcHBseShBcHAsIGFy
Z3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB9KTsKKyAgICB9LAorICAg
IGNyZWF0ZTogZnVuY3Rpb24gKGUpIHsKKyAgICB2YXIgJGlucHV0ID0gJCh0aGlzKTsKKyAgICB2
YXIgdmFsID0gJC50cmltKCRpbnB1dC52YWwoKSk7CisKKyAgICBpZiAoZS53aGljaCAhPT0gQXBw
LkVOVEVSX0tFWSB8fCAhdmFsKSB7CisgICAgcmV0dXJuOworICAgIH0KKworICAgIEFwcC50b2Rv
cy5wdXNoKHsKKyAgICBpZDogVXRpbHMudXVpZCgpLAorICAgIHRpdGxlOiB2YWwsCisgICAgY29t
cGxldGVkOiBmYWxzZQorICAgIH0pOworCisgICAgJGlucHV0LnZhbCgnJyk7CisgICAgQXBwLnJl
bmRlcigpOworICAgIH0sCisgICAgdG9nZ2xlOiBmdW5jdGlvbiAoKSB7CisgICAgQXBwLmdldFRv
ZG8odGhpcywgZnVuY3Rpb24gKGksIHZhbCkgeworICAgIHZhbC5jb21wbGV0ZWQgPSAhdmFsLmNv
bXBsZXRlZDsKKyAgICB9KTsKKyAgICBBcHAucmVuZGVyKCk7CisgICAgfSwKKyAgICBlZGl0OiBm
dW5jdGlvbiAoKSB7CisgICAgdmFyICRpbnB1dCA9ICQodGhpcykuY2xvc2VzdCgnbGknKS5hZGRD
bGFzcygnZWRpdGluZycpLmZpbmQoJy5lZGl0Jyk7CisgICAgdmFyIHZhbCA9ICRpbnB1dC52YWwo
KTsKKworICAgICRpbnB1dC52YWwodmFsKS5mb2N1cygpOworICAgIH0sCisgICAgYmx1ck9uRW50
ZXI6IGZ1bmN0aW9uIChlKSB7CisgICAgaWYgKGUud2hpY2ggPT09IEFwcC5FTlRFUl9LRVkpIHsK
KyAgICBlLnRhcmdldC5ibHVyKCk7CisgICAgfQorICAgIH0sCisgICAgdXBkYXRlOiBmdW5jdGlv
biAoKSB7CisgICAgdmFyIHZhbCA9ICQudHJpbSgkKHRoaXMpLnJlbW92ZUNsYXNzKCdlZGl0aW5n
JykudmFsKCkpOworCisgICAgQXBwLmdldFRvZG8odGhpcywgZnVuY3Rpb24gKGkpIHsKKyAgICBp
ZiAodmFsKSB7CisgICAgdGhpcy50b2Rvc1tpXS50aXRsZSA9IHZhbDsKKyAgICB9IGVsc2Ugewor
ICAgIHRoaXMudG9kb3Muc3BsaWNlKGksIDEpOworICAgIH0KKyAgICB0aGlzLnJlbmRlcigpOwor
ICAgIH0pOworICAgIH0sCisgICAgZGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgIEFwcC5nZXRU
b2RvKHRoaXMsIGZ1bmN0aW9uIChpKSB7CisgICAgdGhpcy50b2Rvcy5zcGxpY2UoaSwgMSk7Cisg
ICAgdGhpcy5yZW5kZXIoKTsKKyAgICB9KTsKKyAgICB9CisgICAgfTsKKworICAgIHdpbmRvdy5h
cHAgPSBBcHA7CisgICAgVXRpbHMuc3RvcmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfQor
CisgICAgQXBwLmluaXQoKTsKK30pOwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0
ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpz
L2Jvd2VyLmpzb24KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2Jv
d2VyLmpzb24JKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlV
bnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvYm93
ZXIuanNvbgkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICAibmFtZSI6ICJ0
b2RvbXZjLXZhbmlsbGFqcyIsCisgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICJkZXBlbmRl
bmNpZXMiOiB7CisgICAgInRvZG9tdmMtY29tbW9uIjogIn4wLjEuNCIKKyAgICB9Cit9CkluZGV4
OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9t
dmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvaW5kZXguaHRtbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQ
ZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
dmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvaW5kZXguaHRtbAkocmV2aXNpb24gMCkKKysrIFBl
cmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92
YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9pbmRleC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTMgQEAKKzwhZG9jdHlwZSBodG1sPgorPGh0bWwgbGFuZz0iZW4iIGRhdGEtZnJhbWV3
b3JrPSJqYXZhc2NyaXB0Ij4KKyAgICA8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+
CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdl
Ij4KKyAgICA8dGl0bGU+VmFuaWxsYUpTIOKAoiBUb2RvTVZDPC90aXRsZT4KKyAgICA8bGluayBy
ZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFz
ZS5jc3MiPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICA8c2VjdGlvbiBpZD0idG9kb2Fw
cCI+CisgICAgPGhlYWRlciBpZD0iaGVhZGVyIj4KKyAgICA8aDE+dG9kb3M8L2gxPgorICAgIDxp
bnB1dCBpZD0ibmV3LXRvZG8iIHBsYWNlaG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/IiBh
dXRvZm9jdXM+CisgICAgPC9oZWFkZXI+CisgICAgPHNlY3Rpb24gaWQ9Im1haW4iPgorICAgIDxp
bnB1dCBpZD0idG9nZ2xlLWFsbCIgdHlwZT0iY2hlY2tib3giPgorICAgIDxsYWJlbCBmb3I9InRv
Z2dsZS1hbGwiPk1hcmsgYWxsIGFzIGNvbXBsZXRlPC9sYWJlbD4KKyAgICA8dWwgaWQ9InRvZG8t
bGlzdCI+PC91bD4KKyAgICA8L3NlY3Rpb24+CisgICAgPGZvb3RlciBpZD0iZm9vdGVyIj4KKyAg
ICA8c3BhbiBpZD0idG9kby1jb3VudCI+PC9zcGFuPgorICAgIDx1bCBpZD0iZmlsdGVycyI+Cisg
ICAgPGxpPgorICAgIDxhIGhyZWY9IiMvIj5BbGw8L2E+CisgICAgPC9saT4KKyAgICA8bGk+Cisg
ICAgPGEgaHJlZj0iIy9hY3RpdmUiPkFjdGl2ZTwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAg
ICA8YSBocmVmPSIjL2NvbXBsZXRlZCI+Q29tcGxldGVkPC9hPgorICAgIDwvbGk+CisgICAgPC91
bD4KKyAgICA8YnV0dG9uIGlkPSJjbGVhci1jb21wbGV0ZWQiPkNsZWFyIGNvbXBsZXRlZDwvYnV0
dG9uPgorICAgIDwvZm9vdGVyPgorICAgIDwvc2VjdGlvbj4KKyAgICA8Zm9vdGVyIGlkPSJpbmZv
Ij4KKyAgICA8cD5Eb3VibGUtY2xpY2sgdG8gZWRpdCBhIHRvZG88L3A+CisgICAgPHA+Q3JlYXRl
ZCBieSA8YSBocmVmPSJodHRwOi8vdHdpdHRlci5jb20vb3NjYXJnb2Rzb24iPk9zY2FyIEdvZHNv
bjwvYT48L3A+CisgICAgPHA+UGFydCBvZiA8YSBocmVmPSJodHRwOi8vdG9kb212Yy5jb20iPlRv
ZG9NVkM8L2E+PC9wPgorICAgIDwvZm9vdGVyPgorICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21w
b25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQ+Cisg
ICAgLy8gQm9vdHN0cmFwIGFwcCBkYXRhCisgICAgd2luZG93LmFwcCA9IHt9OworICAgIDwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSJqcy9oZWxwZXJzLmpzIj48L3NjcmlwdD4KKyAgICA8c2Ny
aXB0IHNyYz0ianMvc3RvcmUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJqcy9tb2Rl
bC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXcuanMiPjwvc2NyaXB0Pgor
ICAgIDxzY3JpcHQgc3JjPSJqcy9jb250cm9sbGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0ianMvYXBwLmpzIj48L3NjcmlwdD4KKyAgICA8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBQ
ZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
dmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvcmVhZG1lLm1kCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZv
cm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5p
bGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9yZWFkbWUubWQJKHJldmlzaW9uIDApCisrKyBQZXJmb3Jt
YW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxs
YS1leGFtcGxlcy92YW5pbGxhanMvcmVhZG1lLm1kCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NSBAQAorIyBWYW5pbGxhIEphdmFTY3JpcHQgVG9kb01WQyBFeGFtcGxlCisKKz4gSmF2YVNjcmlw
dMKuIChvZnRlbiBzaG9ydGVuZWQgdG8gSlMpIGlzIGEgbGlnaHR3ZWlnaHQsIGludGVycHJldGVk
LCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2Ugd2l0aCBmaXJzdC1jbGFzcyBmdW5jdGlvbnMsIG1v
c3Qga25vd24gYXMgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBmb3IgV2ViIHBhZ2VzLCBidXQgdXNl
ZCBpbiBtYW55IG5vbi1icm93c2VyIGVudmlyb25tZW50cyBhcyB3ZWxsIHN1Y2ggYXMgbm9kZS5q
cyBvciBBcGFjaGUgQ291Y2hEQi4KKworPiBfW0phdmFTY3JpcHQgLSBkZXZlbG9wZXIubW96aWxs
YS5vcmddKGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0
KQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5j
aC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2Jvd2VyX2NvbXBvbmVudHMvdG9k
b212Yy1jb21tb24vYmFzZS5jc3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RD
b21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFu
aWxsYWpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MJKHJldmlzaW9u
IDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvYm93ZXJfY29tcG9uZW50cy90b2Rv
bXZjLWNvbW1vbi9iYXNlLmNzcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU1NSBAQAoraHRt
bCwKK2JvZHkgeworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorCitidXR0b24g
eworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGJvcmRlcjogMDsKKyAgICBi
YWNrZ3JvdW5kOiBub25lOworICAgIGZvbnQtc2l6ZTogMTAwJTsKKyAgICB2ZXJ0aWNhbC1hbGln
bjogYmFzZWxpbmU7CisgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CisgICAgY29sb3I6IGluaGVy
aXQ7CisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAgIC8qLW1vei1hcHBlYXJhbmNl
OiBub25lOyovCisgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7CisgICAgLW8tYXBwZWFyYW5jZTog
bm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQorCitib2R5IHsKKyAgICBmb250OiAxNHB4
ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgICAgbGlu
ZS1oZWlnaHQ6IDEuNGVtOworICAgIGJhY2tncm91bmQ6ICNlYWVhZWEgdXJsKCdiZy5wbmcnKTsK
KyAgICBjb2xvcjogIzRkNGQ0ZDsKKyAgICB3aWR0aDogNTUwcHg7CisgICAgbWFyZ2luOiAwIGF1
dG87CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1vei1m
b250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1zLWZvbnQtc21vb3RoaW5nOiBhbnRp
YWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC1z
bW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisjdG9kb2FwcCB7CisgICAgYmFja2dyb3VuZDog
I2ZmZjsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CisgICAgbWFy
Z2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICAgIHBv
c2l0aW9uOiByZWxhdGl2ZTsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7CisgICAg
Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKKyAgICBib3gtc2hhZG93OiAwIDJweCA2cHgg
MCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAgMCAyNXB4IDUwcHggMCByZ2JhKDAsIDAsIDAsIDAu
MTUpOworfQorCisjdG9kb2FwcDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICcnOworICAgIGJvcmRl
ci1sZWZ0OiAxcHggc29saWQgI2Y1ZDZkNjsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAj
ZjVkNmQ2OworICAgIHdpZHRoOiAycHg7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRv
cDogMDsKKyAgICBsZWZ0OiA0MHB4OworICAgIGhlaWdodDogMTAwJTsKK30KKworI3RvZG9hcHAg
aW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeworICAgIGZvbnQtc3R5bGU6IGl0YWxp
YzsKK30KKworI3RvZG9hcHAgaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIgeworICAgIGZvbnQtc3R5
bGU6IGl0YWxpYzsKKyAgICBjb2xvcjogI2E5YTlhOTsKK30KKworI3RvZG9hcHAgaDEgeworICAg
IHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0xMjBweDsKKyAgICB3aWR0aDogMTAwJTsK
KyAgICBmb250LXNpemU6IDcwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1h
bGlnbjogY2VudGVyOworICAgIGNvbG9yOiAjYjNiM2IzOworICAgIGNvbG9yOiByZ2JhKDI1NSwg
MjU1LCAyNTUsIDAuMyk7CisgICAgdGV4dC1zaGFkb3c6IC0xcHggLTFweCByZ2JhKDAsIDAsIDAs
IDAuMik7CisgICAgLXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5Owor
ICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKKyAgICAtbXMtdGV4
dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKKyAgICAtby10ZXh0LXJlbmRlcmluZzog
b3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxp
dHk7Cit9CisKKyNoZWFkZXIgeworICAgIHBhZGRpbmctdG9wOiAxNXB4OworICAgIGJvcmRlci1y
YWRpdXM6IGluaGVyaXQ7Cit9CisKKyNoZWFkZXI6YmVmb3JlIHsKKyAgICBjb250ZW50OiAnJzsK
KyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworICAgIHJpZ2h0OiAwOworICAg
IGxlZnQ6IDA7CisgICAgaGVpZ2h0OiAxNXB4OworICAgIHotaW5kZXg6IDI7CisgICAgYm9yZGVy
LWJvdHRvbTogMXB4IHNvbGlkICM2YzYxNWM7CisgICAgYmFja2dyb3VuZDogIzhkN2Q3NzsKKyAg
ICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90
dG9tLCBmcm9tKHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSksdG8ocmdiYSgxMDEsIDg0LCA3Niwg
MC44KSkpOworICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdi
YSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKKyAgICBiYWNr
Z3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44
KSwgcmdiYSgxMDEsIDg0LCA3NiwgMC44KSk7CisgICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdy
YWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAw
LjgpKTsKKyAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIs
IDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKKyAgICBiYWNrZ3JvdW5k
OiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDEzMiwgMTEwLCAxMDAsIDAuOCksIHJnYmEoMTAx
LCA4NCwgNzYsIDAuOCkpOworICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWlj
cm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0wLFN0YXJ0Q29sb3JTdHI9JyM5ZDhiODMnLCBF
bmRDb2xvclN0cj0nIzg0NzY3MCcpOworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDFweDsK
KyAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMXB4OworfQorCisjbmV3LXRvZG8sCisuZWRp
dCB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbjogMDsKKyAgICB3aWR0aDog
MTAwJTsKKyAgICBmb250LXNpemU6IDI0cHg7CisgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cisg
ICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJvcmRlcjogMDsKKyAgICBvdXRsaW5lOiBub25l
OworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHBhZGRpbmc6IDZweDsKKyAgICBib3JkZXI6IDFw
eCBzb2xpZCAjOTk5OworICAgIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCA1cHggMCByZ2JhKDAs
IDAsIDAsIDAuMik7CisgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIC1t
b3otYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAtbXMtYm94LXNpemluZzogYm9yZGVyLWJv
eDsKKyAgICAtby1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIGJveC1zaXppbmc6IGJvcmRl
ci1ib3g7CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1v
ei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1zLWZvbnQtc21vb3RoaW5nOiBh
bnRpYWxpYXNlZDsKKyAgICAtby1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9u
dC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworfQorCisjbmV3LXRvZG8geworICAgIHBhZGRpbmc6
IDE2cHggMTZweCAxNnB4IDYwcHg7CisgICAgYm9yZGVyOiBub25lOworICAgIGJhY2tncm91bmQ6
IHJnYmEoMCwgMCwgMCwgMC4wMik7CisgICAgei1pbmRleDogMjsKKyAgICBib3gtc2hhZG93OiBu
b25lOworfQorCisjbWFpbiB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHotaW5kZXg6
IDI7CisgICAgYm9yZGVyLXRvcDogMXB4IGRvdHRlZCAjYWRhZGFkOworfQorCitsYWJlbFtmb3I9
J3RvZ2dsZS1hbGwnXSB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworI3RvZ2dsZS1hbGwgewor
ICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC00MnB4OworICAgIGxlZnQ6IC00cHg7
CisgICAgd2lkdGg6IDQwcHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGJvcmRlcjog
bm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQorCisjdG9nZ2xlLWFsbDpiZWZvcmUgeworICAg
IGNvbnRlbnQ6ICfCuyc7CisgICAgZm9udC1zaXplOiAyOHB4OworICAgIGNvbG9yOiAjZDlkOWQ5
OworICAgIHBhZGRpbmc6IDAgMjVweCA3cHg7Cit9CisKKyN0b2dnbGUtYWxsOmNoZWNrZWQ6YmVm
b3JlIHsKKyAgICBjb2xvcjogIzczNzM3MzsKK30KKworI3RvZG8tbGlzdCB7CisgICAgbWFyZ2lu
OiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKK30KKworI3RvZG8t
bGlzdCBsaSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGZvbnQtc2l6ZTogMjRweDsK
KyAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNjY2M7Cit9CisKKyN0b2RvLWxpc3QgbGk6
bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBs
aS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIHBhZGRpbmc6IDA7Cit9
CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRpdCB7CisgICAgZGlzcGxheTogYmxvY2s7Cisg
ICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6IDEzcHggMTdweCAxMnB4IDE3cHg7CisgICAg
bWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmcgLnZpZXcgewor
ICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkgLnRvZ2dsZSB7CisgICAgdGV4
dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0MHB4OworICAgIC8qIGF1dG8sIHNpbmNlIG5v
bi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBwb3J0IGlucHV0IHN0eWxpbmcgKi8KKyAgICBo
ZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICBi
b3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7CisgICAgYm9yZGVyOiBub25lOyAvKiBNb2Jp
bGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAgIC8qLW1vei1h
cHBlYXJhbmNlOiBub25lOyovCisgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7CisgICAgLW8tYXBw
ZWFyYW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQorCisjdG9kby1saXN0IGxp
IC50b2dnbGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfinJQnOworICAgIGxpbmUtaGVpZ2h0OiA0
M3B4OyAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVscyB2aXN1YWwgYWRqdXN0bWVudCAqLworICAg
IGZvbnQtc2l6ZTogMjBweDsKKyAgICBjb2xvcjogI2Q5ZDlkOTsKKyAgICB0ZXh0LXNoYWRvdzog
MCAtMXB4IDAgI2JmYmZiZjsKK30KKworI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmNoZWNrZWQ6YWZ0
ZXIgeworICAgIGNvbG9yOiAjODVhZGE3OworICAgIHRleHQtc2hhZG93OiAwIDFweCAwICM2Njk5
OTE7CisgICAgYm90dG9tOiAxcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjdG9k
by1saXN0IGxpIGxhYmVsIHsKKyAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOworICAgIHBhZGRp
bmc6IDE1cHg7CisgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7CisgICAgZGlzcGxheTogYmxvY2s7Cisg
ICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIDAuNHM7
CisgICAgLW1vei10cmFuc2l0aW9uOiBjb2xvciAwLjRzOworICAgIC1tcy10cmFuc2l0aW9uOiBj
b2xvciAwLjRzOworICAgIC1vLXRyYW5zaXRpb246IGNvbG9yIDAuNHM7CisgICAgdHJhbnNpdGlv
bjogY29sb3IgMC40czsKK30KKworI3RvZG8tbGlzdCBsaS5jb21wbGV0ZWQgbGFiZWwgeworICAg
IGNvbG9yOiAjYTlhOWE5OworICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOworfQor
CisjdG9kby1saXN0IGxpIC5kZXN0cm95IHsKKyAgICBkaXNwbGF5OiBub25lOworICAgIHBvc2l0
aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7CisgICAgcmlnaHQ6IDEwcHg7CisgICAgYm90dG9t
OiAwOworICAgIHdpZHRoOiA0MHB4OworICAgIGhlaWdodDogNDBweDsKKyAgICBtYXJnaW46IGF1
dG8gMDsKKyAgICBmb250LXNpemU6IDIycHg7CisgICAgY29sb3I6ICNhODhhOGE7CisgICAgLXdl
YmtpdC10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjJz
OworICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yczsKKyAgICAtby10cmFuc2l0aW9uOiBhbGwg
MC4yczsKKyAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVz
dHJveTpob3ZlciB7CisgICAgdGV4dC1zaGFkb3c6IDAgMCAxcHggIzAwMCwKKyAgICAgMCAwIDEw
cHggcmdiYSgxOTksIDEwNywgMTA3LCAwLjgpOworICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2Fs
ZSgxLjMpOworICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjMpOworICAgIC1tcy10cmFuc2Zv
cm06IHNjYWxlKDEuMyk7CisgICAgLW8tdHJhbnNmb3JtOiBzY2FsZSgxLjMpOworICAgIHRyYW5z
Zm9ybTogc2NhbGUoMS4zKTsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveTphZnRlciB7Cisg
ICAgY29udGVudDogJ+Kclic7Cit9CisKKyN0b2RvLWxpc3QgbGk6aG92ZXIgLmRlc3Ryb3kgewor
ICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisjdG9kby1saXN0IGxpIC5lZGl0IHsKKyAgICBkaXNw
bGF5OiBub25lOworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1jaGlsZCB7CisgICAg
bWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworI2Zvb3RlciB7CisgICAgY29sb3I6ICM3Nzc7Cisg
ICAgcGFkZGluZzogMCAxNXB4OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDog
MDsKKyAgICBib3R0b206IC0zMXB4OworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiAyMHB4Owor
ICAgIHotaW5kZXg6IDE7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisjZm9vdGVyOmJl
Zm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJp
Z2h0OiAwOworICAgIGJvdHRvbTogMzFweDsKKyAgICBsZWZ0OiAwOworICAgIGhlaWdodDogNTBw
eDsKKyAgICB6LWluZGV4OiAtMTsKKyAgICBib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgwLCAw
LCAwLCAwLjMpLAorICAgIDAgNnB4IDAgLTNweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCksCisg
ICAgMCA3cHggMXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjMpLAorICAgIDAgNDNweCAwIC02cHgg
cmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpLAorICAgIDAgNDRweCAycHggLTZweCByZ2JhKDAsIDAs
IDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB0ZXh0
LWFsaWduOiBsZWZ0OworfQorCisjZmlsdGVycyB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRp
bmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7Cisg
ICAgcmlnaHQ6IDA7CisgICAgbGVmdDogMDsKK30KKworI2ZpbHRlcnMgbGkgeworICAgIGRpc3Bs
YXk6IGlubGluZTsKK30KKworI2ZpbHRlcnMgbGkgYSB7CisgICAgY29sb3I6ICM4Mzc1NmY7Cisg
ICAgbWFyZ2luOiAycHg7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisjZmlsdGVy
cyBsaSBhLnNlbGVjdGVkIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworI2NsZWFyLWNv
bXBsZXRlZCB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAg
ICBsaW5lLWhlaWdodDogMjBweDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgYmFj
a2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjEpOworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBw
YWRkaW5nOiAwIDEwcHg7CisgICAgYm9yZGVyLXJhZGl1czogM3B4OworICAgIGJveC1zaGFkb3c6
IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjIpOworfQorCisjY2xlYXItY29tcGxldGVkOmhv
dmVyIHsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAgIGJveC1zaGFk
b3c6IDAgLTFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjMpOworfQorCisjaW5mbyB7CisgICAgbWFy
Z2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjogI2E2YTZhNjsKKyAgICBmb250LXNpemU6IDEy
cHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwor
ICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworI2luZm8gYSB7CisgICAgY29sb3I6IGluaGVy
aXQ7Cit9CisKKy8qCisgICAgSGFjayB0byByZW1vdmUgYmFja2dyb3VuZCBmcm9tIE1vYmlsZSBT
YWZhcmkuCisgICAgQ2FuJ3QgdXNlIGl0IGdsb2JhbGx5IHNpbmNlIGl0IGRlc3Ryb3lzIGNoZWNr
Ym94ZXMgaW4gRmlyZWZveCBhbmQgT3BlcmEKKyovCitAbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtp
dC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsKKyAgICAjdG9nZ2xlLWFsbCwKKyAgICAjdG9k
by1saXN0IGxpIC50b2dnbGUgeworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgfQorCisgICAg
I3RvZG8tbGlzdCBsaSAudG9nZ2xlIHsKKyAgICBoZWlnaHQ6IDQwcHg7CisgICAgfQorCisgICAg
I3RvZ2dsZS1hbGwgeworICAgIHRvcDogLTU2cHg7CisgICAgbGVmdDogLTE1cHg7CisgICAgd2lk
dGg6IDY1cHg7CisgICAgaGVpZ2h0OiA0MXB4OworICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3Rh
dGUoOTBkZWcpOworICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAgICAtd2Via2l0LWFw
cGVhcmFuY2U6IG5vbmU7CisgICAgYXBwZWFyYW5jZTogbm9uZTsKKyAgICB9Cit9CisKKy5oaWRk
ZW57CisgICAgZGlzcGxheTpub25lOworfQorCitociB7CisgICAgbWFyZ2luOiAyMHB4IDA7Cisg
ICAgYm9yZGVyOiAwOworICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI0M1QzVDNTsKKyAgICBi
b3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNGN0Y3Rjc7Cit9CisKKy5sZWFybiBhIHsKKyAgICBm
b250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBjb2xv
cjogI2I4M2Y0NTsKK30KKworLmxlYXJuIGE6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjog
dW5kZXJsaW5lOworICAgIGNvbG9yOiAjNzg3ZTdlOworfQorCisubGVhcm4gaDMsCisubGVhcm4g
aDQsCisubGVhcm4gaDUgeworICAgIG1hcmdpbjogMTBweCAwOworICAgIGZvbnQtd2VpZ2h0OiA1
MDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICBjb2xvcjogIzAwMDsKK30KKworLmxlYXJu
IGgzIHsKKyAgICBmb250LXNpemU6IDI0cHg7Cit9CisKKy5sZWFybiBoNCB7CisgICAgZm9udC1z
aXplOiAxOHB4OworfQorCisubGVhcm4gaDUgeworICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAg
Zm9udC1zaXplOiAxNHB4OworfQorCisubGVhcm4gdWwgeworICAgIHBhZGRpbmc6IDA7CisgICAg
bWFyZ2luOiAwIDAgMzBweCAyNXB4OworfQorCisubGVhcm4gbGkgeworICAgIGxpbmUtaGVpZ2h0
OiAyMHB4OworfQorCisubGVhcm4gcCB7CisgICAgZm9udC1zaXplOiAxNXB4OworICAgIGZvbnQt
d2VpZ2h0OiAzMDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMzsKKyAgICBtYXJnaW4tdG9wOiAwOwor
ICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5xdW90ZSB7CisgICAgYm9yZGVyOiBub25lOwor
ICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKK30KKworLnF1b3RlIHAgeworICAgIGZvbnQtc3R5
bGU6IGl0YWxpYzsKK30KKworLnF1b3RlIHA6YmVmb3JlIHsKKyAgICBjb250ZW50OiAn4oCcJzsK
KyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3BhY2l0eTogLjE1OworICAgIHBvc2l0aW9uOiBh
YnNvbHV0ZTsKKyAgICB0b3A6IC0yMHB4OworICAgIGxlZnQ6IDNweDsKK30KKworLnF1b3RlIHA6
YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfigJ0nOworICAgIGZvbnQtc2l6ZTogNTBweDsKKyAgICBv
cGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGJvdHRvbTogLTQycHg7
CisgICAgcmlnaHQ6IDNweDsKK30KKworLnF1b3RlIGZvb3RlciB7CisgICAgcG9zaXRpb246IGFi
c29sdXRlOworICAgIGJvdHRvbTogLTQwcHg7CisgICAgcmlnaHQ6IDA7Cit9CisKKy5xdW90ZSBm
b290ZXIgaW1nIHsKKyAgICBib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKy5xdW90ZSBmb290ZXIg
YSB7CisgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwor
fQorCisuc3BlZWNoLWJ1YmJsZSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHBhZGRp
bmc6IDEwcHg7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpOworICAgIGJvcmRl
ci1yYWRpdXM6IDVweDsKK30KKworLnNwZWVjaC1idWJibGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6
ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDEwMCU7CisgICAgcmlnaHQ6
IDMwcHg7CisgICAgYm9yZGVyOiAxM3B4IHNvbGlkIHRyYW5zcGFyZW50OworICAgIGJvcmRlci10
b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsKK30KKworLyoqYm9keSovLmxlYXJuLWJhciA+
IC5sZWFybiB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHdpZHRoOiAyNzJweDsKKyAg
ICB0b3A6IDhweDsKKyAgICBsZWZ0OiAtMzAwcHg7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBi
b3JkZXItcmFkaXVzOiA1cHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwg
MjU1LCAuNik7CisgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogbGVmdDsKKyAgICB0cmFuc2l0aW9u
LWR1cmF0aW9uOiA1MDBtczsKK30KKworQG1lZGlhIChtaW4td2lkdGg6IDg5OXB4KSB7CisgICAg
LyoqYm9keSovLmxlYXJuLWJhciB7CisgICAgd2lkdGg6IGF1dG87CisgICAgbWFyZ2luOiAwIDAg
MCAzMDBweDsKKyAgICB9CisgICAgLyoqYm9keSovLmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAg
bGVmdDogOHB4OworICAgIH0KKyAgICAvKipib2R5Ki8ubGVhcm4tYmFyICN0b2RvYXBwIHsKKyAg
ICB3aWR0aDogNTUwcHg7CisgICAgbWFyZ2luOiAxMzBweCBhdXRvIDQwcHggYXV0bzsKKyAgICB9
Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJl
bmNoL3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvYm93ZXJfY29tcG9uZW50cy90
b2RvbXZjLWNvbW1vbi9iYXNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3Zh
bmlsbGFqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMJKHJldmlzaW9u
IDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNo
L3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvYm93ZXJfY29tcG9uZW50cy90b2Rv
bXZjLWNvbW1vbi9iYXNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjA5IEBACisoZnVu
Y3Rpb24gKCkgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8vIFVuZGVyc2NvcmUncyBUZW1w
bGF0ZSBNb2R1bGUKKyAgICAvLyBDb3VydGVzeSBvZiB1bmRlcnNjb3JlanMub3JnCisgICAgdmFy
IF8gPSAoZnVuY3Rpb24gKF8pIHsKKyAgICBfLmRlZmF1bHRzID0gZnVuY3Rpb24gKG9iamVjdCkg
eworICAgIGlmICghb2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisgICAgZm9y
ICh2YXIgYXJnc0luZGV4ID0gMSwgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGFyZ3NJ
bmRleCA8IGFyZ3NMZW5ndGg7IGFyZ3NJbmRleCsrKSB7CisgICAgdmFyIGl0ZXJhYmxlID0gYXJn
dW1lbnRzW2FyZ3NJbmRleF07CisgICAgaWYgKGl0ZXJhYmxlKSB7CisgICAgZm9yICh2YXIga2V5
IGluIGl0ZXJhYmxlKSB7CisgICAgaWYgKG9iamVjdFtrZXldID09IG51bGwpIHsKKyAgICBvYmpl
Y3Rba2V5XSA9IGl0ZXJhYmxlW2tleV07CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAg
IHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1
c2VzIEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCisgICAgLy8gZm9s
bG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgor
ICAgIF8udGVtcGxhdGVTZXR0aW5ncyA9IHsKKyAgICBldmFsdWF0ZSAgICA6IC88JShbXHNcU10r
PyklPi9nLAorICAgIGludGVycG9sYXRlIDogLzwlPShbXHNcU10rPyklPi9nLAorICAgIGVzY2Fw
ZSAgICAgIDogLzwlLShbXHNcU10rPyklPi9nCisgICAgfTsKKworICAgIC8vIFdoZW4gY3VzdG9t
aXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW4K
KyAgICAvLyBpbnRlcnBvbGF0aW9uLCBldmFsdWF0aW9uIG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBu
ZWVkIG9uZSB0aGF0IGlzCisgICAgLy8gZ3VhcmFudGVlZCBub3QgdG8gbWF0Y2guCisgICAgdmFy
IG5vTWF0Y2ggPSAvKC4pXi87CisKKyAgICAvLyBDZXJ0YWluIGNoYXJhY3RlcnMgbmVlZCB0byBi
ZSBlc2NhcGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcHV0IGludG8gYQorICAgIC8vIHN0cmluZyBs
aXRlcmFsLgorICAgIHZhciBlc2NhcGVzID0geworICAgICInIjogICAgICAiJyIsCisgICAgJ1xc
JzogICAgICdcXCcsCisgICAgJ1xyJzogICAgICdyJywKKyAgICAnXG4nOiAgICAgJ24nLAorICAg
ICdcdCc6ICAgICAndCcsCisgICAgJ1x1MjAyOCc6ICd1MjAyOCcsCisgICAgJ1x1MjAyOSc6ICd1
MjAyOScKKyAgICB9OworCisgICAgdmFyIGVzY2FwZXIgPSAvXFx8J3xccnxcbnxcdHxcdTIwMjh8
XHUyMDI5L2c7CisKKyAgICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIg
dG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLgorICAgIC8vIFVuZGVyc2NvcmUgdGVtcGxh
dGluZyBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSwK
KyAgICAvLyBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVvdGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQg
Y29kZS4KKyAgICBfLnRlbXBsYXRlID0gZnVuY3Rpb24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsK
KyAgICB2YXIgcmVuZGVyOworICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3Ms
IF8udGVtcGxhdGVTZXR0aW5ncyk7CisKKyAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBv
bmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi4KKyAgICB2YXIgbWF0Y2hlciA9
IG5ldyBSZWdFeHAoWworICAgIChzZXR0aW5ncy5lc2NhcGUgfHwgbm9NYXRjaCkuc291cmNlLAor
ICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsCisgICAgKHNldHRp
bmdzLmV2YWx1YXRlIHx8IG5vTWF0Y2gpLnNvdXJjZQorICAgIF0uam9pbignfCcpICsgJ3wkJywg
J2cnKTsKKworICAgIC8vIENvbXBpbGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3Ry
aW5nIGxpdGVyYWxzIGFwcHJvcHJpYXRlbHkuCisgICAgdmFyIGluZGV4ID0gMDsKKyAgICB2YXIg
c291cmNlID0gIl9fcCs9JyI7CisgICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1h
dGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7CisgICAgc291cmNl
ICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkKKyAgICAucmVwbGFjZShlc2NhcGVyLCBmdW5j
dGlvbihtYXRjaCkgeyByZXR1cm4gJ1xcJyArIGVzY2FwZXNbbWF0Y2hdOyB9KTsKKworICAgIGlm
IChlc2NhcGUpIHsKKyAgICBzb3VyY2UgKz0gIicrXG4oKF9fdD0oIiArIGVzY2FwZSArICIpKT09
bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcbiciOworICAgIH0KKyAgICBpZiAoaW50ZXJwb2xhdGUp
IHsKKyAgICBzb3VyY2UgKz0gIicrXG4oKF9fdD0oIiArIGludGVycG9sYXRlICsgIikpPT1udWxs
PycnOl9fdCkrXG4nIjsKKyAgICB9CisgICAgaWYgKGV2YWx1YXRlKSB7CisgICAgc291cmNlICs9
ICInO1xuIiArIGV2YWx1YXRlICsgIlxuX19wKz0nIjsKKyAgICB9CisgICAgaW5kZXggPSBvZmZz
ZXQgKyBtYXRjaC5sZW5ndGg7CisgICAgcmV0dXJuIG1hdGNoOworICAgIH0pOworICAgIHNvdXJj
ZSArPSAiJztcbiI7CisKKyAgICAvLyBJZiBhIHZhcmlhYmxlIGlzIG5vdCBzcGVjaWZpZWQsIHBs
YWNlIGRhdGEgdmFsdWVzIGluIGxvY2FsIHNjb3BlLgorICAgIGlmICghc2V0dGluZ3MudmFyaWFi
bGUpIHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xuJyArIHNvdXJjZSArICd9XG4nOworCisgICAg
c291cmNlID0gInZhciBfX3QsX19wPScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbiwiICsKKyAg
ICAicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcbiIgKwor
ICAgIHNvdXJjZSArICJyZXR1cm4gX19wO1xuIjsKKworICAgIHRyeSB7CisgICAgcmVuZGVyID0g
bmV3IEZ1bmN0aW9uKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonLCAnXycsIHNvdXJjZSk7Cisg
ICAgfSBjYXRjaCAoZSkgeworICAgIGUuc291cmNlID0gc291cmNlOworICAgIHRocm93IGU7Cisg
ICAgfQorCisgICAgaWYgKGRhdGEpIHJldHVybiByZW5kZXIoZGF0YSwgXyk7CisgICAgdmFyIHRl
bXBsYXRlID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBk
YXRhLCBfKTsKKyAgICB9OworCisgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24g
c291cmNlIGFzIGEgY29udmVuaWVuY2UgZm9yIHByZWNvbXBpbGF0aW9uLgorICAgIHRlbXBsYXRl
LnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcp
e1xuJyArIHNvdXJjZSArICd9JzsKKworICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgICB9OworCisg
ICAgcmV0dXJuIF87CisgICAgfSkoe30pOworCisgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09
PSAndG9kb212Yy5jb20nKSB7CisgICAgd2luZG93Ll9nYXEgPSBbWydfc2V0QWNjb3VudCcsJ1VB
LTMxMDgxMDYyLTEnXSxbJ190cmFja1BhZ2V2aWV3J11dOyhmdW5jdGlvbihkLHQpe3ZhciBnPWQu
Y3JlYXRlRWxlbWVudCh0KSxzPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodClbMF07Zy5zcmM9Jy8v
d3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJztzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3Jl
KGcscyl9KGRvY3VtZW50LCdzY3JpcHQnKSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVkaXJl
Y3QoKSB7CisgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09PSAndGFzdGVqcy5naXRodWIuaW8n
KSB7CisgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgndGFzdGVqcy5n
aXRodWIuaW8vdG9kb212YycsICd0b2RvbXZjLmNvbScpOworICAgIH0KKyAgICB9CisKKyAgICBm
dW5jdGlvbiBmaW5kUm9vdCgpIHsKKyAgICB2YXIgYmFzZTsKKworICAgIFsvbGFicy8sIC9cdyot
ZXhhbXBsZXMvXS5mb3JFYWNoKGZ1bmN0aW9uIChocmVmKSB7CisgICAgdmFyIG1hdGNoID0gbG9j
YXRpb24uaHJlZi5tYXRjaChocmVmKTsKKworICAgIGlmICghYmFzZSAmJiBtYXRjaCkgeworICAg
IGJhc2UgPSBsb2NhdGlvbi5ocmVmLmluZGV4T2YobWF0Y2gpOworICAgIH0KKyAgICB9KTsKKwor
ICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLnN1YnN0cigwLCBiYXNlKTsKKyAgICB9CisKKyAgICBm
dW5jdGlvbiBnZXRGaWxlKGZpbGUsIGNhbGxiYWNrKSB7CisgICAgaWYgKCFsb2NhdGlvbi5ob3N0
KSB7CisgICAgcmV0dXJuIGNvbnNvbGUuaW5mbygnTWlzcyB0aGUgaW5mbyBiYXI/IFJ1biBUb2Rv
TVZDIGZyb20gYSBzZXJ2ZXIgdG8gYXZvaWQgYSBjcm9zcy1vcmlnaW4gZXJyb3IuJyk7CisgICAg
fQorCisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworCisgICAgeGhyLm9wZW4o
J0dFVCcsIGZpbmRSb290KCkgKyBmaWxlLCB0cnVlKTsKKyAgICB4aHIuc2VuZCgpOworCisgICAg
eGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYm
IGNhbGxiYWNrKSB7CisgICAgY2FsbGJhY2soeGhyLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICAg
IH07CisgICAgfQorCisgICAgZnVuY3Rpb24gTGVhcm4obGVhcm5KU09OLCBjb25maWcpIHsKKyAg
ICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGVhcm4pKSB7CisgICAgcmV0dXJuIG5ldyBMZWFybihs
ZWFybkpTT04sIGNvbmZpZyk7CisgICAgfQorCisgICAgdmFyIHRlbXBsYXRlLCBmcmFtZXdvcms7
CisKKyAgICBpZiAodHlwZW9mIGxlYXJuSlNPTiAhPT0gJ29iamVjdCcpIHsKKyAgICB0cnkgewor
ICAgIGxlYXJuSlNPTiA9IEpTT04ucGFyc2UobGVhcm5KU09OKTsKKyAgICB9IGNhdGNoIChlKSB7
CisgICAgcmV0dXJuOworICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZmlnKSB7CisgICAgdGVt
cGxhdGUgPSBjb25maWcudGVtcGxhdGU7CisgICAgZnJhbWV3b3JrID0gY29uZmlnLmZyYW1ld29y
azsKKyAgICB9CisKKyAgICBpZiAoIXRlbXBsYXRlICYmIGxlYXJuSlNPTi50ZW1wbGF0ZXMpIHsK
KyAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNPTi50ZW1wbGF0ZXMudG9kb212YzsKKyAgICB9CisKKyAg
ICBpZiAoIWZyYW1ld29yayAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mcmFtZXdv
cmtdJykpIHsKKyAgICBmcmFtZXdvcmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1m
cmFtZXdvcmtdJykuZ2V0QXR0cmlidXRlKCdkYXRhLWZyYW1ld29yaycpOworICAgIH0KKworCisg
ICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNPTltmcmFtZXdvcmtdKSB7CisgICAgdGhpcy5mcmFt
ZXdvcmtKU09OID0gbGVhcm5KU09OW2ZyYW1ld29ya107CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRl
bXBsYXRlOworCisgICAgdGhpcy5hcHBlbmQoKTsKKyAgICB9CisgICAgfQorCisgICAgTGVhcm4u
cHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgYXNpZGUgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdhc2lkZScpOworICAgIGFzaWRlLmlubmVySFRNTCA9IF8udGVtcGxh
dGUodGhpcy50ZW1wbGF0ZSwgdGhpcy5mcmFtZXdvcmtKU09OKTsKKyAgICBhc2lkZS5jbGFzc05h
bWUgPSAnbGVhcm4nOworCisgICAgLy8gTG9jYWxpemUgZGVtbyBsaW5rcworICAgIHZhciBkZW1v
TGlua3MgPSBhc2lkZS5xdWVyeVNlbGVjdG9yQWxsKCcuZGVtby1saW5rJyk7CisgICAgQXJyYXku
cHJvdG90eXBlLmZvckVhY2guY2FsbChkZW1vTGlua3MsIGZ1bmN0aW9uIChkZW1vTGluaykgewor
ICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGluay5n
ZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7CisgICAgfSk7CisKKyAgICBkb2N1bWVudC5ib2R5LmNsYXNz
TmFtZSA9IChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSArICcgbGVhcm4tYmFyJykudHJpbSgpOwor
ICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlckJlZ2luJywgYXNpZGUu
b3V0ZXJIVE1MKTsKKyAgICB9OworCisgICAgcmVkaXJlY3QoKTsKKyAgICBnZXRGaWxlKCdsZWFy
bi5qc29uJywgTGVhcm4pOworfSkoKTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxl
dGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFq
cy9qcy9hcHAuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5
VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pz
L2FwcC5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVu
cmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9qcy9h
cHAuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NCBAQAorLypnbG9iYWwgU3RvcmUsIE1v
ZGVsLCBWaWV3LCBDb250cm9sbGVyLCAkJCAqLworKGZ1bmN0aW9uICgpIHsKKyAgICAndXNlIHN0
cmljdCc7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIGEgYnJhbmQgbmV3IFRvZG8gbGlzdC4K
KyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHlvdXIgbmV3
IHRvIGRvIGxpc3QuCisgICAgICovCisgICAgZnVuY3Rpb24gVG9kbyhuYW1lKSB7CisgICAgdGhp
cy5zdG9yYWdlID0gbmV3IGFwcC5TdG9yZShuYW1lKTsKKyAgICB0aGlzLm1vZGVsID0gbmV3IGFw
cC5Nb2RlbCh0aGlzLnN0b3JhZ2UpOworICAgIHRoaXMudmlldyA9IG5ldyBhcHAuVmlldygpOwor
ICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBhcHAuQ29udHJvbGxlcih0aGlzLm1vZGVsLCB0aGlz
LnZpZXcpOworICAgIH0KKworICAgIHZhciB0b2RvID0gbmV3IFRvZG8oJ3RvZG9zLXZhbmlsbGFq
cycpOworCisgICAgd2luZG93LnRvZG8gPSB0b2RvOyAvLyBCZW5jaG1hcmsgbW9kaWZpY2F0aW9u
OyBFeHBvc2UgdG9kbyBzbyB0aGF0IHdlIGNhbiBjYWxsIG1ldGhvZHMgb24gaXQuCisKKyAgICAv
KioKKyAgICAgKiBGaW5kcyB0aGUgbW9kZWwgSUQgb2YgdGhlIGNsaWNrZWQgRE9NIGVsZW1lbnQK
KyAgICAgKgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgVGhlIHN0YXJ0aW5nIHBvaW50
IGluIHRoZSBET00gZm9yIGl0IHRvIHRyeSB0byBmaW5kCisgICAgICogdGhlIElEIG9mIHRoZSBt
b2RlbC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBsb29rdXBJZCh0YXJnZXQpIHsKKyAgICB2YXIg
bG9va3VwID0gdGFyZ2V0OworCisgICAgd2hpbGUgKGxvb2t1cC5ub2RlTmFtZSAhPT0gJ0xJJykg
eworICAgIGxvb2t1cCA9IGxvb2t1cC5wYXJlbnROb2RlOworICAgIH0KKworICAgIHJldHVybiBs
b29rdXAuZGF0YXNldC5pZDsKKyAgICB9CisKKyAgICAvLyBXaGVuIHRoZSBlbnRlciBrZXkgaXMg
cHJlc3NlZCBmaXJlIHRoZSBhZGRJdGVtIG1ldGhvZC4KKyAgICAkJCgnI25ldy10b2RvJykuYWRk
RXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBmdW5jdGlvbiAoZSkgeworICAgIHRvZG8uY29udHJv
bGxlci5hZGRJdGVtKGUpOworICAgIH0pOworCisgICAgLy8gQSBkZWxlZ2F0aW9uIGV2ZW50LiBX
aWxsIGNoZWNrIHdoYXQgaXRlbSB3YXMgY2xpY2tlZCB3aGVuZXZlciB5b3UgY2xpY2sgb24gYW55
CisgICAgLy8gcGFydCBvZiBhIGxpc3QgaXRlbS4KKyAgICAkJCgnI3RvZG8tbGlzdCcpLmFkZEV2
ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKKyAgICB2YXIgdGFyZ2V0ID0gZS50
YXJnZXQ7CisKKyAgICAvLyBJZiB5b3UgY2xpY2sgYSBkZXN0cm95IGJ1dHRvbgorICAgIGlmICh0
YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ2Rlc3Ryb3knKSA+IC0xKSB7CisgICAgdG9kby5jb250
cm9sbGVyLnJlbW92ZUl0ZW0obG9va3VwSWQodGFyZ2V0KSk7CisgICAgfQorCisgICAgLy8gSWYg
eW91IGNsaWNrIHRoZSBjaGVja21hcmsKKyAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9m
KCd0b2dnbGUnKSA+IC0xKSB7CisgICAgdG9kby5jb250cm9sbGVyLnRvZ2dsZUNvbXBsZXRlKGxv
b2t1cElkKHRhcmdldCksIHRhcmdldCk7CisgICAgfQorCisgICAgfSk7CisKKyAgICAkJCgnI3Rv
ZG8tbGlzdCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgZnVuY3Rpb24gKGUpIHsKKyAg
ICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7CisKKyAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lID09PSAn
TEFCRUwnKSB7CisgICAgdG9kby5jb250cm9sbGVyLmVkaXRJdGVtKGxvb2t1cElkKHRhcmdldCks
IHRhcmdldCk7CisgICAgfQorICAgIH0pOworCisgICAgJCQoJyN0b2dnbGUtYWxsJykuYWRkRXZl
bnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgeworICAgIHRvZG8uY29udHJvbGxlci50
b2dnbGVBbGwoZSk7CisgICAgfSk7CisKKyAgICAkJCgnI2NsZWFyLWNvbXBsZXRlZCcpLmFkZEV2
ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeworICAgIHRvZG8uY29udHJvbGxlci5y
ZW1vdmVDb21wbGV0ZWRJdGVtcygpOworICAgIH0pOworfSkoKTsKSW5kZXg6IFBlcmZvcm1hbmNl
VGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4
YW1wbGVzL3ZhbmlsbGFqcy9qcy9jb250cm9sbGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxh
LWV4YW1wbGVzL3ZhbmlsbGFqcy9qcy9jb250cm9sbGVyLmpzCShyZXZpc2lvbiAwKQorKysgUGVy
Zm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3Zh
bmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pzL2NvbnRyb2xsZXIuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzMzAgQEAKKy8qZ2xvYmFsICQkLCAkICovCisoZnVuY3Rpb24gKHdpbmRvdykg
eworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8qKgorICAgICAqIFRha2VzIGEgbW9kZWwgYW5k
IHZpZXcgYW5kIGFjdHMgYXMgdGhlIGNvbnRyb2xsZXIgYmV0d2VlbiB0aGVtCisgICAgICoKKyAg
ICAgKiBAY29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWwgVGhlIG1vZGVs
IGNvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIHtvYmplY3R9IHZpZXcgVGhlIHZpZXcgY29uc3Ry
dWN0b3IKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBDb250cm9sbGVyKG1vZGVsLCB2aWV3KSB7Cisg
ICAgdGhpcy5tb2RlbCA9IG1vZGVsOworICAgIHRoaXMudmlldyA9IHZpZXc7CisKKyAgICB0aGlz
LkVOVEVSX0tFWSA9IDEzOworICAgIHRoaXMuRVNDQVBFX0tFWSA9IDI3OworCisgICAgdGhpcy4k
bWFpbiA9ICQkKCcjbWFpbicpOworICAgIHRoaXMuJHRvZ2dsZUFsbCA9ICQkKCcjdG9nZ2xlLWFs
bCcpOworICAgIHRoaXMuJHRvZG9MaXN0ID0gJCQoJyN0b2RvLWxpc3QnKTsKKyAgICB0aGlzLiR0
b2RvSXRlbUNvdW50ZXIgPSAkJCgnI3RvZG8tY291bnQnKTsKKyAgICB0aGlzLiRjbGVhckNvbXBs
ZXRlZCA9ICQkKCcjY2xlYXItY29tcGxldGVkJyk7CisgICAgdGhpcy4kZm9vdGVyID0gJCQoJyNm
b290ZXInKTsKKworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24g
KCkgeworICAgIHRoaXMuX3VwZGF0ZUZpbHRlclN0YXRlKCk7CisgICAgfS5iaW5kKHRoaXMpKTsK
KworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZnVuY3Rpb24gKCkg
eworICAgIHRoaXMuX3VwZGF0ZUZpbHRlclN0YXRlKCk7CisgICAgfS5iaW5kKHRoaXMpKTsKKyAg
ICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBldmVudCB0byBmaXJlIG9uIGxvYWQuIFdpbGwgZ2V0
IGFsbCBpdGVtcyBhbmQgZGlzcGxheSB0aGVtIGluIHRoZQorICAgICAqIHRvZG8tbGlzdAorICAg
ICAqLworICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnNob3dBbGwgPSBmdW5jdGlvbiAoKSB7Cisg
ICAgdGhpcy5tb2RlbC5yZWFkKGZ1bmN0aW9uIChkYXRhKSB7CisgICAgdGhpcy4kdG9kb0xpc3Qu
aW5uZXJIVE1MID0gdGhpcy52aWV3LnNob3coZGF0YSk7CisgICAgfS5iaW5kKHRoaXMpKTsKKyAg
ICB9OworCisgICAgLyoqCisgICAgICogUmVuZGVycyBhbGwgYWN0aXZlIHRhc2tzCisgICAgICov
CisgICAgQ29udHJvbGxlci5wcm90b3R5cGUuc2hvd0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICB0aGlzLm1vZGVsLnJlYWQoeyBjb21wbGV0ZWQ6IDAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAg
ICB0aGlzLiR0b2RvTGlzdC5pbm5lckhUTUwgPSB0aGlzLnZpZXcuc2hvdyhkYXRhKTsKKyAgICB9
LmJpbmQodGhpcykpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIGFsbCBjb21w
bGV0ZWQgdGFza3MKKyAgICAgKi8KKyAgICBDb250cm9sbGVyLnByb3RvdHlwZS5zaG93Q29tcGxl
dGVkID0gZnVuY3Rpb24gKCkgeworICAgIHRoaXMubW9kZWwucmVhZCh7IGNvbXBsZXRlZDogMSB9
LCBmdW5jdGlvbiAoZGF0YSkgeworICAgIHRoaXMuJHRvZG9MaXN0LmlubmVySFRNTCA9IHRoaXMu
dmlldy5zaG93KGRhdGEpOworICAgIH0uYmluZCh0aGlzKSk7CisgICAgfTsKKworICAgIC8qKgor
ICAgICAqIEFuIGV2ZW50IHRvIGZpcmUgd2hlbmV2ZXIgeW91IHdhbnQgdG8gYWRkIGFuIGl0ZW0u
IFNpbXBseSBwYXNzIGluIHRoZSBldmVudAorICAgICAqIG9iamVjdCBhbmQgaXQnbGwgaGFuZGxl
IHRoZSBET00gaW5zZXJ0aW9uIGFuZCBzYXZpbmcgb2YgdGhlIG5ldyBpdGVtLgorICAgICAqCisg
ICAgICogQHBhcmFtIHtvYmplY3R9IGUgVGhlIGV2ZW50IG9iamVjdAorICAgICAqLworICAgIENv
bnRyb2xsZXIucHJvdG90eXBlLmFkZEl0ZW0gPSBmdW5jdGlvbiAoZSkgeworICAgIHZhciBpbnB1
dCA9ICQkKCcjbmV3LXRvZG8nKTsKKyAgICB2YXIgdGl0bGUgPSB0aXRsZSB8fCAnJzsKKworICAg
IGlmIChlLmtleUNvZGUgPT09IHRoaXMuRU5URVJfS0VZKSB7CisgICAgaWYgKGUudGFyZ2V0LnZh
bHVlLnRyaW0oKSA9PT0gJycpIHsKKyAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5tb2Rl
bC5jcmVhdGUoZS50YXJnZXQudmFsdWUsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgaW5wdXQudmFs
dWUgPSAnJzsKKyAgICB0aGlzLl9maWx0ZXIodHJ1ZSk7CisgICAgfS5iaW5kKHRoaXMpKTsKKyAg
ICB9CisKKyAgICB9OworCisgICAgLyoqCisgICAgICogSGlkZXMgdGhlIGxhYmVsIHRleHQgYW5k
IGNyZWF0ZXMgYW4gaW5wdXQgdG8gZWRpdCB0aGUgdGl0bGUgb2YgdGhlIGl0ZW0uCisgICAgICog
V2hlbiB5b3UgaGl0IGVudGVyIG9yIGJsdXIgb3V0IG9mIHRoZSBpbnB1dCBpdCBzYXZlcyBpdCBh
bmTCoHVwZGF0ZXMgdGhlIFVJCisgICAgICogd2l0aCB0aGUgbmV3IG5hbWUuCisgICAgICoKKyAg
ICAgKiBAcGFyYW0ge251bWJlcn0gaWQgVGhlIGlkIG9mIHRoZSBpdGVtIHRvIGVkaXQKKyAgICAg
KiBAcGFyYW0ge29iamVjdH0gbGFiZWwgVGhlIGxhYmVsIHlvdSB3YW50IHRvIGVkaXQgdGhlIHRl
eHQgb2YKKyAgICAgKi8KKyAgICBDb250cm9sbGVyLnByb3RvdHlwZS5lZGl0SXRlbSA9IGZ1bmN0
aW9uIChpZCwgbGFiZWwpIHsKKyAgICB2YXIgbGkgPSAgbGFiZWw7CisKKyAgICAvLyBUaGlzIGZp
bmRzIHRoZSA8bGFiZWw+J3MgcGFyZW50IDxsaT4KKyAgICB3aGlsZSAobGkubm9kZU5hbWUgIT09
ICdMSScpIHsKKyAgICBsaSA9IGxpLnBhcmVudE5vZGU7CisgICAgfQorCisgICAgdmFyIG9uU2F2
ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHZhbHVlID0gaW5wdXQudmFsdWUudHJp
bSgpOworICAgIHZhciBkaXNjYXJkaW5nID0gaW5wdXQuZGF0YXNldC5kaXNjYXJkOworCisgICAg
aWYgKHZhbHVlLmxlbmd0aCAmJiAhZGlzY2FyZGluZykgeworICAgIHRoaXMubW9kZWwudXBkYXRl
KGlkLCB7IHRpdGxlOiBpbnB1dC52YWx1ZSB9KTsKKworICAgIC8vIEluc3RlYWQgb2YgcmUtcmVu
ZGVyaW5nIHRoZSB3aG9sZSB2aWV3IGp1c3QgdXBkYXRlCisgICAgLy8gdGhpcyBwaWVjZSBvZiBp
dAorICAgIGxhYmVsLmlubmVySFRNTCA9IHZhbHVlOworICAgIH0gZWxzZSBpZiAodmFsdWUubGVu
Z3RoID09PSAwKSB7CisgICAgLy8gTm8gdmFsdWUgd2FzIGVudGVyZWQgaW4gdGhlIGlucHV0LiBX
ZSdsbCByZW1vdmUgdGhlIHRvZG8gaXRlbS4KKyAgICB0aGlzLnJlbW92ZUl0ZW0oaWQpOworICAg
IH0KKworICAgIC8vIFJlbW92ZSB0aGUgaW5wdXQgc2luY2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgaXQK
KyAgICAvLyBMZXNzIERPTSBtZWFucyBmYXN0ZXIgcmVuZGVyaW5nCisgICAgbGkucmVtb3ZlQ2hp
bGQoaW5wdXQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBlZGl0aW5nIGNsYXNzCisgICAgbGkuY2xh
c3NOYW1lID0gbGkuY2xhc3NOYW1lLnJlcGxhY2UoJ2VkaXRpbmcnLCAnJyk7CisgICAgfS5iaW5k
KHRoaXMpOworCisgICAgLy8gQXBwZW5kIHRoZSBlZGl0aW5nIGNsYXNzCisgICAgbGkuY2xhc3NO
YW1lID0gbGkuY2xhc3NOYW1lICsgJyBlZGl0aW5nJzsKKworICAgIHZhciBpbnB1dCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CisgICAgaW5wdXQuY2xhc3NOYW1lID0gJ2VkaXQn
OworCisgICAgLy8gR2V0IHRoZSBpbm5lckhUTUwgb2YgdGhlIGxhYmVsIGluc3RlYWQgb2YgcmVx
dWVzdGluZyB0aGUgZGF0YSBmcm9tIHRoZQorICAgIC8vIE9STS4gSWYgdGhpcyB3ZXJlIGEgcmVh
bCBEQiB0aGlzIHdvdWxkIHNhdmUgYSBsb3Qgb2YgdGltZSBhbmQgd291bGQgYXZvaWQKKyAgICAv
LyBhIHNwaW5uZXIgZ2lmLgorICAgIGlucHV0LnZhbHVlID0gbGFiZWwuaW5uZXJIVE1MOworCisg
ICAgbGkuYXBwZW5kQ2hpbGQoaW5wdXQpOworCisgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcign
Ymx1cicsIG9uU2F2ZUhhbmRsZXIpOworCisgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5
cHJlc3MnLCBmdW5jdGlvbiAoZSkgeworICAgIGlmIChlLmtleUNvZGUgPT09IHRoaXMuRU5URVJf
S0VZKSB7CisgICAgLy8gUmVtb3ZlIHRoZSBjdXJzb3IgZnJvbSB0aGUgaW5wdXQgd2hlbiB5b3Ug
aGl0IGVudGVyIGp1c3QgbGlrZSBpZiBpdAorICAgIC8vIHdlcmUgYSByZWFsIGZvcm0KKyAgICBp
bnB1dC5ibHVyKCk7CisgICAgfQorCisgICAgaWYgKGUua2V5Q29kZSA9PT0gdGhpcy5FU0NBUEVf
S0VZKSB7CisgICAgLy8gRGlzY2FyZCB0aGUgY2hhbmdlcworICAgIGlucHV0LmRhdGFzZXQuZGlz
Y2FyZCA9IHRydWU7CisgICAgaW5wdXQuYmx1cigpOworICAgIH0KKyAgICB9LmJpbmQodGhpcykp
OworCisgICAgaW5wdXQuZm9jdXMoKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQnkgZ2l2
aW5nIGl0IGFuIElEIGl0J2xsIGZpbmQgdGhlIERPTSBlbGVtZW50IG1hdGNoaW5nIHRoYXQgSUQs
CisgICAgICogcmVtb3ZlIGl0IGZyb20gdGhlIERPTSBhbmQgYWxzbyByZW1vdmUgaXQgZnJvbSBz
dG9yYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkIFRoZSBJRCBvZiB0aGUg
aXRlbSB0byByZW1vdmUgZnJvbSB0aGUgRE9NIGFuZAorICAgICAqIHN0b3JhZ2UKKyAgICAgKi8K
KyAgICBDb250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24gKGlkKSB7Cisg
ICAgdGhpcy5tb2RlbC5yZW1vdmUoaWQsIGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLiR0b2RvTGlz
dC5yZW1vdmVDaGlsZCgkJCgnW2RhdGEtaWQ9IicgKyBpZCArICciXScpKTsKKyAgICB9LmJpbmQo
dGhpcykpOworCisgICAgdGhpcy5fZmlsdGVyKCk7CisgICAgfTsKKworICAgIC8qKgorICAgICAq
IFdpbGwgcmVtb3ZlIGFsbCBjb21wbGV0ZWQgaXRlbXMgZnJvbSB0aGUgRE9NIGFuZCBzdG9yYWdl
LgorICAgICAqLworICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnJlbW92ZUNvbXBsZXRlZEl0ZW1z
ID0gZnVuY3Rpb24gKCkgeworICAgIHRoaXMubW9kZWwucmVhZCh7IGNvbXBsZXRlZDogMSB9LCBm
dW5jdGlvbiAoZGF0YSkgeworICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgeworICAg
IHRoaXMucmVtb3ZlSXRlbShpdGVtLmlkKTsKKyAgICB9LmJpbmQodGhpcykpOworICAgIH0uYmlu
ZCh0aGlzKSk7CisKKyAgICB0aGlzLl9maWx0ZXIoKTsKKyAgICB9OworCisgICAgLyoqCisgICAg
ICogR2l2ZSBpdCBhbiBJRCBvZiBhIG1vZGVsIGFuZCBhIGNoZWNrYm94IGFuZCBpdCB3aWxsIHVw
ZGF0ZSB0aGUgaXRlbQorICAgICAqIGluIHN0b3JhZ2UgYmFzZWQgb24gdGhlIGNoZWNrYm94J3Mg
c3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gaWQgVGhlIElEIG9mIHRoZSBl
bGVtZW50IHRvIGNvbXBsZXRlIG9yIHVuY29tcGxldGUKKyAgICAgKiBAcGFyYW0ge29iamVjdH0g
Y2hlY2tib3ggVGhlIGNoZWNrYm94IHRvIGNoZWNrIHRoZSBzdGF0ZSBvZiBjb21wbGV0ZQorICAg
ICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QKKyAgICAgKiBAcGFyYW0ge2Jvb2xl
YW58dW5kZWZpbmVkfSBzaWxlbnQgUHJldmVudCByZS1maWx0ZXJpbmcgdGhlIHRvZG8gaXRlbXMK
KyAgICAgKi8KKyAgICBDb250cm9sbGVyLnByb3RvdHlwZS50b2dnbGVDb21wbGV0ZSA9IGZ1bmN0
aW9uIChpZCwgY2hlY2tib3gsIHNpbGVudCkgeworICAgIHZhciBjb21wbGV0ZWQgPSBjaGVja2Jv
eC5jaGVja2VkID8gMSA6IDA7CisKKyAgICB0aGlzLm1vZGVsLnVwZGF0ZShpZCwgeyBjb21wbGV0
ZWQ6IGNvbXBsZXRlZCB9LCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGxpc3RJdGVtID0gJCQoJ1tk
YXRhLWlkPSInICsgaWQgKyAnIl0nKTsKKworICAgIGlmICghbGlzdEl0ZW0pIHsKKyAgICByZXR1
cm47CisgICAgfQorCisgICAgbGlzdEl0ZW0uY2xhc3NOYW1lID0gY29tcGxldGVkID8gJ2NvbXBs
ZXRlZCcgOiAnJzsKKworICAgIC8vIEluIGNhc2UgaXQgd2FzIHRvZ2dsZWQgZnJvbSBhbiBldmVu
dCBhbmQgbm90IGJ5IGNsaWNraW5nIHRoZSBjaGVja2JveAorICAgIGxpc3RJdGVtLnF1ZXJ5U2Vs
ZWN0b3IoJ2lucHV0JykuY2hlY2tlZCA9IGNvbXBsZXRlZDsKKyAgICB9KTsKKworICAgIGlmICgh
c2lsZW50KSB7CisgICAgdGhpcy5fZmlsdGVyKCk7CisgICAgfQorICAgIH07CisKKyAgICAvKioK
KyAgICAgKiBXaWxsIHRvZ2dsZSBBTEwgY2hlY2tib3hlJ3Mgb24vb2ZmIHN0YXRlIGFuZCBjb21w
bGV0ZW5lc3Mgb2YgbW9kZWxzLgorICAgICAqIEp1c3QgcGFzcyBpbiB0aGUgZXZlbnQgb2JqZWN0
LgorICAgICAqCisgICAgICogQHBhcmFtIHtvYmplY3R9IGUgVGhlIGV2ZW50IG9iamVjdAorICAg
ICAqLworICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnRvZ2dsZUFsbCA9IGZ1bmN0aW9uIChlKSB7
CisgICAgdmFyIGNvbXBsZXRlZCA9IGUudGFyZ2V0LmNoZWNrZWQgPyAxIDogMDsKKyAgICB2YXIg
cXVlcnkgPSAwOworCisgICAgaWYgKGNvbXBsZXRlZCA9PT0gMCkgeworICAgIHF1ZXJ5ID0gMTsK
KyAgICB9CisKKyAgICB0aGlzLm1vZGVsLnJlYWQoeyBjb21wbGV0ZWQ6IHF1ZXJ5IH0sIGZ1bmN0
aW9uIChkYXRhKSB7CisgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgdGhp
cy50b2dnbGVDb21wbGV0ZShpdGVtLmlkLCBlLnRhcmdldCwgdHJ1ZSk7CisgICAgfS5iaW5kKHRo
aXMpKTsKKyAgICB9LmJpbmQodGhpcykpOworCisgICAgdGhpcy5fZmlsdGVyKCk7CisgICAgfTsK
KworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIHBpZWNlcyBvZiB0aGUgcGFnZSB3aGljaCBj
aGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSByZW1haW5pbmcKKyAgICAgKiBudW1iZXIgb2YgdG9kb3Mu
CisgICAgICovCisgICAgQ29udHJvbGxlci5wcm90b3R5cGUuX3VwZGF0ZUNvdW50ID0gZnVuY3Rp
b24gKCkgeworICAgIHZhciB0b2RvcyA9IHRoaXMubW9kZWwuZ2V0Q291bnQoKTsKKworICAgIHRo
aXMuJHRvZG9JdGVtQ291bnRlci5pbm5lckhUTUwgPSB0aGlzLnZpZXcuaXRlbUNvdW50ZXIodG9k
b3MuYWN0aXZlKTsKKworICAgIHRoaXMuJGNsZWFyQ29tcGxldGVkLmlubmVySFRNTCA9IHRoaXMu
dmlldy5jbGVhckNvbXBsZXRlZEJ1dHRvbih0b2Rvcy5jb21wbGV0ZWQpOworICAgIHRoaXMuJGNs
ZWFyQ29tcGxldGVkLnN0eWxlLmRpc3BsYXkgPSB0b2Rvcy5jb21wbGV0ZWQgPiAwID8gJ2Jsb2Nr
JyA6ICdub25lJzsKKworICAgIHRoaXMuJHRvZ2dsZUFsbC5jaGVja2VkID0gdG9kb3MuY29tcGxl
dGVkID09PSB0b2Rvcy50b3RhbDsKKworICAgIHRoaXMuX3RvZ2dsZUZyYW1lKHRvZG9zKTsKKyAg
ICB9OworCisgICAgLyoqCisgICAgICogVGhlIG1haW4gYm9keSBhbmQgZm9vdGVyIGVsZW1lbnRz
IHNob3VsZCBub3QgYmUgdmlzaWJsZSB3aGVuIHRoZXJlIGFyZSBubworICAgICAqIHRvZG9zIGxl
ZnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gdG9kb3MgQ29udGFpbnMgYSBjb3Vu
dCBvZiBhbGwgdG9kb3MsIGFuZCB0aGVpciBzdGF0dXNlcy4KKyAgICAgKi8KKyAgICBDb250cm9s
bGVyLnByb3RvdHlwZS5fdG9nZ2xlRnJhbWUgPSBmdW5jdGlvbiAodG9kb3MpIHsKKyAgICB2YXIg
ZnJhbWVEaXNwbGF5ID0gdGhpcy4kbWFpbi5zdHlsZS5kaXNwbGF5OworICAgIHZhciBmcmFtZVZp
c2libGUgPSBmcmFtZURpc3BsYXkgPT09ICdibG9jaycgfHwgZnJhbWVEaXNwbGF5ID09PSAnJzsK
KworICAgIGlmICh0b2Rvcy50b3RhbCA9PT0gMCAmJiBmcmFtZVZpc2libGUpIHsKKyAgICB0aGlz
LiRtYWluLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgdGhpcy4kZm9vdGVyLnN0eWxlLmRp
c3BsYXkgPSAnbm9uZSc7CisgICAgfQorCisgICAgaWYgKHRvZG9zLnRvdGFsID4gMCAmJiAhZnJh
bWVWaXNpYmxlKSB7CisgICAgdGhpcy4kbWFpbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKKyAg
ICB0aGlzLiRmb290ZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CisgICAgfQorICAgIH07CisK
KyAgICAvKioKKyAgICAgKiBSZS1maWx0ZXJzIHRoZSB0b2RvIGl0ZW1zLCBiYXNlZCBvbiB0aGUg
YWN0aXZlIHJvdXRlLgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGZvcmNlICBm
b3JjZXMgYSByZS1wYWludGluZyBvZiB0b2RvIGl0ZW1zLgorICAgICAqLworICAgIENvbnRyb2xs
ZXIucHJvdG90eXBlLl9maWx0ZXIgPSBmdW5jdGlvbiAoZm9yY2UpIHsKKyAgICB2YXIgYWN0aXZl
Um91dGUgPSB0aGlzLl9hY3RpdmVSb3V0ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMu
X2FjdGl2ZVJvdXRlLnN1YnN0cigxKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgZWxlbWVudHMgb24g
dGhlIHBhZ2UsIHdoaWNoIGNoYW5nZSB3aXRoIGVhY2ggY29tcGxldGVkIHRvZG8KKyAgICB0aGlz
Ll91cGRhdGVDb3VudCgpOworCisgICAgLy8gSWYgdGhlIGxhc3QgYWN0aXZlIHJvdXRlIGlzbid0
ICJBbGwiLCBvciB3ZSdyZSBzd2l0Y2hpbmcgcm91dGVzLCB3ZQorICAgIC8vIHJlLWNyZWF0ZSB0
aGUgdG9kbyBpdGVtIGVsZW1lbnRzLCBjYWxsaW5nOgorICAgIC8vICAgdGhpcy5zaG93W0FsbHxB
Y3RpdmV8Q29tcGxldGVkXSgpOworICAgIGlmIChmb3JjZSB8fCB0aGlzLl9sYXN0QWN0aXZlUm91
dGUgIT09ICdBbGwnIHx8IHRoaXMuX2xhc3RBY3RpdmVSb3V0ZSAhPT0gYWN0aXZlUm91dGUpIHsK
KyAgICB0aGlzWydzaG93JyArIGFjdGl2ZVJvdXRlXSgpOworICAgIH0KKworICAgIHRoaXMuX2xh
c3RBY3RpdmVSb3V0ZSA9IGFjdGl2ZVJvdXRlOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBT
aW1wbHkgdXBkYXRlcyB0aGUgZmlsdGVyIG5hdidzIHNlbGVjdGVkIHN0YXRlcworICAgICAqLwor
ICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl91cGRhdGVGaWx0ZXJTdGF0ZSA9IGZ1bmN0aW9uICgp
IHsKKyAgICB2YXIgY3VycmVudFBhZ2UgPSB0aGlzLl9nZXRDdXJyZW50UGFnZSgpIHx8ICcnOwor
CisgICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGFjdGl2ZSByb3V0ZSwgYWxsb3dpbmcg
dXMgdG8gcmUtZmlsdGVyIHRvZG8KKyAgICAvLyBpdGVtcyBhcyB0aGV5IGFyZSBtYXJrZWQgY29t
cGxldGUgb3IgaW5jb21wbGV0ZS4KKyAgICB0aGlzLl9hY3RpdmVSb3V0ZSA9IGN1cnJlbnRQYWdl
OworCisgICAgaWYgKGN1cnJlbnRQYWdlID09PSAnJykgeworICAgIHRoaXMuX2FjdGl2ZVJvdXRl
ID0gJ0FsbCc7CisgICAgfQorCisgICAgdGhpcy5fZmlsdGVyKCk7CisKKyAgICAvLyBSZW1vdmUg
YWxsIG90aGVyIHNlbGVjdGVkIHN0YXRlcy4gV2UgbG9vcCB0aHJvdWdoIGFsbCBvZiB0aGVtIGlu
IGNhc2UgdGhlCisgICAgLy8gVUkgZ2V0cyBpbiBhIGZ1bmt5IHN0YXRlIHdpdGggdHdvIHNlbGVj
dGVkLgorICAgICQoJyNmaWx0ZXJzIC5zZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24gKGl0ZW0pIHsK
KyAgICBpdGVtLmNsYXNzTmFtZSA9ICcnOworICAgIH0pOworCisgICAgJCQoJyNmaWx0ZXJzIFto
cmVmPSIjLycgKyBjdXJyZW50UGFnZSArICciXScpLmNsYXNzTmFtZSA9ICdzZWxlY3RlZCc7Cisg
ICAgfTsKKworICAgIC8qKgorICAgICAqIEEgZ2V0dGVyIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50
IHBhZ2UKKyAgICAgKi8KKyAgICBDb250cm9sbGVyLnByb3RvdHlwZS5fZ2V0Q3VycmVudFBhZ2Ug
PSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGRvY3VtZW50LmxvY2F0aW9uLmhhc2guc3BsaXQo
Jy8nKVsxXTsKKyAgICB9OworCisgICAgLy8gRXhwb3J0IHRvIHdpbmRvdworICAgIHdpbmRvdy5h
cHAuQ29udHJvbGxlciA9IENvbnRyb2xsZXI7Cit9KSh3aW5kb3cpOwpJbmRleDogUGVyZm9ybWFu
Y2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEt
ZXhhbXBsZXMvdmFuaWxsYWpzL2pzL2hlbHBlcnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFu
Y2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEt
ZXhhbXBsZXMvdmFuaWxsYWpzL2pzL2hlbHBlcnMuanMJKHJldmlzaW9uIDApCisrKyBQZXJmb3Jt
YW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxs
YS1leGFtcGxlcy92YW5pbGxhanMvanMvaGVscGVycy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE3IEBACisoZnVuY3Rpb24gKHdpbmRvdykgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAg
IC8vIENhY2hlIHRoZSBxdWVyeVNlbGVjdG9yL0FsbCBmb3IgZWFzaWVyIGFuZCBmYXN0ZXIgcmV1
c2UKKyAgICB3aW5kb3cuJCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwuYmluZChkb2N1bWVu
dCk7CisgICAgd2luZG93LiQkID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvci5iaW5kKGRvY3VtZW50
KTsKKworICAgIC8vIEFsbG93IGZvciBsb29waW5nIG9uIE9iamVjdHMgYnkgY2hhaW5pbmc6Cisg
ICAgLy8gJCgnLmZvbycpLmVhY2goZnVuY3Rpb24gKCkge30pCisgICAgT2JqZWN0LnByb3RvdHlw
ZS5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgZm9yICh2YXIgeCBpbiB0aGlzKSB7
CisgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoeCkpIHsKKyAgICBjYWxsYmFjay5jYWxsKHRo
aXMsIHRoaXNbeF0pOworICAgIH0KKyAgICB9CisgICAgfTsKK30pKHdpbmRvdyk7CkluZGV4OiBQ
ZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMv
dmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvanMvbW9kZWwuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVy
Zm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3Zh
bmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pzL21vZGVsLmpzCShyZXZpc2lvbiAwKQorKysgUGVy
Zm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3Zh
bmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pzL21vZGVsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTE5IEBACisoZnVuY3Rpb24gKHdpbmRvdykgeworICAgICd1c2Ugc3RyaWN0JzsKKwor
ICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTW9kZWwgaW5zdGFuY2UgYW5kIGhvb2tzIHVw
IHRoZSBzdG9yYWdlLgorICAgICAqCisgICAgICogQGNvbnN0cnVjdG9yCisgICAgICogQHBhcmFt
IHtvYmplY3R9IHN0b3JhZ2UgQSByZWZlcmVuY2UgdG8gdGhlIGNsaWVudCBzaWRlIHN0b3JhZ2Ug
Y2xhc3MKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBNb2RlbChzdG9yYWdlKSB7CisgICAgdGhpcy5z
dG9yYWdlID0gc3RvcmFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3
IHRvZG8gbW9kZWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGl0bGVdIFRoZSB0
aXRsZSBvZiB0aGUgdGFzaworICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gVGhl
IGNhbGxiYWNrIHRvIGZpcmUgYWZ0ZXIgdGhlIG1vZGVsIGlzIGNyZWF0ZWQKKyAgICAgKi8KKyAg
ICBNb2RlbC5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKHRpdGxlLCBjYWxsYmFjaykgewor
ICAgIHRpdGxlID0gdGl0bGUgfHwgJyc7CisgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5j
dGlvbiAoKSB7fTsKKworICAgIHZhciBuZXdJdGVtID0geworICAgIHRpdGxlOiB0aXRsZS50cmlt
KCksCisgICAgY29tcGxldGVkOiAwCisgICAgfTsKKworICAgIHRoaXMuc3RvcmFnZS5zYXZlKG5l
d0l0ZW0sIGNhbGxiYWNrKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRmluZHMgYW5kIHJl
dHVybnMgYSBtb2RlbCBpbiBzdG9yYWdlLiBJZiBubyBxdWVyeSBpcyBnaXZlbiBpdCdsbCBzaW1w
bHkKKyAgICAgKiByZXR1cm4gZXZlcnl0aGluZy4gSWYgeW91IHBhc3MgaW4gYSBzdHJpbmcgb3Ig
bnVtYmVyIGl0J2xsIGxvb2sgdGhhdCB1cCBhcworICAgICAqIHRoZSBJRCBvZsKgdGhlIG1vZGVs
IHRvIGZpbmQuIExhc3RseSwgeW91IGNhbiBwYXNzIGl0IGFuIG9iamVjdCB0byBtYXRjaAorICAg
ICAqIGFnYWluc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8b2JqZWN0
fSBbcXVlcnldIEEgcXVlcnkgdG8gbWF0Y2ggbW9kZWxzIGFnYWluc3QKKyAgICAgKiBAcGFyYW0g
e2Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBjYWxsYmFjayB0byBmaXJlIGFmdGVyIHRoZSBtb2Rl
bCBpcyBmb3VuZAorICAgICAqCisgICAgICogQGV4YW1wbGUKKyAgICAgKiBtb2RlbC5yZWFkKDEs
IGZ1bmMpOyAvLyBXaWxsIGZpbmQgdGhlIG1vZGVsIHdpdGggYW4gSUQgb2YgMQorICAgICAqIG1v
ZGVsLnJlYWQoJzEnKTsgLy8gU2FtZSBhcyBhYm92ZQorICAgICAqIC8vQmVsb3cgd2lsbCBmaW5k
IGEgbW9kZWwgd2l0aCBmb28gZXF1YWxsaW5nIGJhciBhbmQgaGVsbG8gZXF1YWxsaW5nIHdvcmxk
LgorICAgICAqIG1vZGVsLnJlYWQoeyBmb286ICdiYXInLCBoZWxsbzogJ3dvcmxkJyB9KTsKKyAg
ICAgKi8KKyAgICBNb2RlbC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChxdWVyeSwgY2FsbGJh
Y2spIHsKKyAgICB2YXIgcXVlcnlUeXBlID0gdHlwZW9mIHF1ZXJ5OworICAgIGNhbGxiYWNrID0g
Y2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CisKKyAgICBpZiAocXVlcnlUeXBlID09PSAnZnVu
Y3Rpb24nKSB7CisgICAgY2FsbGJhY2sgPSBxdWVyeTsKKyAgICByZXR1cm4gdGhpcy5zdG9yYWdl
LmZpbmRBbGwoY2FsbGJhY2spOworICAgIH0gZWxzZSBpZiAocXVlcnlUeXBlID09PSAnc3RyaW5n
JyB8fCBxdWVyeVR5cGUgPT09ICdudW1iZXInKSB7CisgICAgdGhpcy5zdG9yYWdlLmZpbmQoeyBp
ZDogcXVlcnkgfSwgY2FsbGJhY2spOworICAgIH0gZWxzZSB7CisgICAgdGhpcy5zdG9yYWdlLmZp
bmQocXVlcnksIGNhbGxiYWNrKTsKKyAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFVw
ZGF0ZXMgYSBtb2RlbCBieSBnaXZpbmcgaXQgYW4gSUQsIGRhdGEgdG8gdXBkYXRlLCBhbmQgYSBj
YWxsYmFjayB0byBmaXJlIHdoZW4KKyAgICAgKiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLgorICAg
ICAqCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkIFRoZSBpZCBvZiB0aGUgbW9kZWwgdG8gdXBk
YXRlCisgICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIHByb3BlcnRpZXMgdG8gdXBkYXRl
IGFuZCB0aGVpciBuZXcgdmFsdWUKKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBU
aGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuCisgICAgICov
CisgICAgTW9kZWwucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChpZCwgZGF0YSwgY2FsbGJh
Y2spIHsKKyAgICB0aGlzLnN0b3JhZ2Uuc2F2ZShpZCwgZGF0YSwgY2FsbGJhY2spOworICAgIH07
CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbW9kZWwgZnJvbSBzdG9yYWdlCisgICAgICoK
KyAgICAgKiBAcGFyYW0ge251bWJlcn0gaWQgVGhlIElEIG9mIHRoZSBtb2RlbCB0byByZW1vdmUK
KyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3
aGVuIHRoZSByZW1vdmFsIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIE1vZGVsLnByb3RvdHlw
ZS5yZW1vdmUgPSBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrKSB7CisgICAgdGhpcy5zdG9yYWdlLnJl
bW92ZShpZCwgY2FsbGJhY2spOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBXQVJOSU5HOiBX
aWxsIHJlbW92ZSBBTEwgZGF0YSBmcm9tIHN0b3JhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0g
e2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBzdG9yYWdl
IGlzIHdpcGVkLgorICAgICAqLworICAgIE1vZGVsLnByb3RvdHlwZS5yZW1vdmVBbGwgPSBmdW5j
dGlvbiAoY2FsbGJhY2spIHsKKyAgICB0aGlzLnN0b3JhZ2UuZHJvcChjYWxsYmFjayk7CisgICAg
fTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb3VudCBvZiBhbGwgdG9kb3MKKyAgICAg
Ki8KKyAgICBNb2RlbC5wcm90b3R5cGUuZ2V0Q291bnQgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFy
IHRvZG9zID0geworICAgIGFjdGl2ZTogMCwKKyAgICBjb21wbGV0ZWQ6IDAsCisgICAgdG90YWw6
IDAKKyAgICB9OworCisgICAgdGhpcy5zdG9yYWdlLmZpbmRBbGwoZnVuY3Rpb24gKGRhdGEpIHsK
KyAgICBkYXRhLmVhY2goZnVuY3Rpb24gKHRvZG8pIHsKKyAgICBpZiAodG9kby5jb21wbGV0ZWQg
PT09IDEpIHsKKyAgICB0b2Rvcy5jb21wbGV0ZWQrKzsKKyAgICB9IGVsc2UgeworICAgIHRvZG9z
LmFjdGl2ZSsrOworICAgIH0KKworICAgIHRvZG9zLnRvdGFsKys7CisgICAgfSk7CisgICAgfSk7
CisKKyAgICByZXR1cm4gdG9kb3M7CisgICAgfTsKKworICAgIC8vIEV4cG9ydCB0byB3aW5kb3cK
KyAgICB3aW5kb3cuYXBwLk1vZGVsID0gTW9kZWw7Cit9KSh3aW5kb3cpOwpJbmRleDogUGVyZm9y
bWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3Zhbmls
bGEtZXhhbXBsZXMvdmFuaWxsYWpzL2pzL3N0b3JlLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxh
LWV4YW1wbGVzL3ZhbmlsbGFqcy9qcy9zdG9yZS5qcwkocmV2aXNpb24gMCkKKysrIFBlcmZvcm1h
bmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxh
LWV4YW1wbGVzL3ZhbmlsbGFqcy9qcy9zdG9yZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE0NCBAQAorLypqc2hpbnQgZXFlcWVxOmZhbHNlICovCisoZnVuY3Rpb24gKHdpbmRvdykgewor
ICAgICd1c2Ugc3RyaWN0JzsKKworICAgIHZhciBsb2NhbFN0b3JhZ2UgPSB7fTsgLy8gQmVuY2ht
YXJrIG1vZGlmaWNhdGlvbjogQXZvaWQgZGlzayBhY2Nlc3MuCisKKyAgICAvKioKKyAgICAgKiBD
cmVhdGVzIGEgbmV3IGNsaWVudCBzaWRlIHN0b3JhZ2Ugb2JqZWN0IGFuZCB3aWxsIGNyZWF0ZSBh
biBlbXB0eQorICAgICAqIGNvbGxlY3Rpb24gaWYgbm8gY29sbGVjdGlvbiBhbHJlYWR5IGV4aXN0
cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIG91ciBE
QiB3ZSB3YW50IHRvIHVzZQorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIE91ciBm
YWtlIERCIHVzZXMgY2FsbGJhY2tzIGJlY2F1c2UgaW4KKyAgICAgKiByZWFsIGxpZmUgeW91IHBy
b2JhYmx5IHdvdWxkIGJlIG1ha2luZyBBSkFYIGNhbGxzCisgICAgICovCisgICAgZnVuY3Rpb24g
U3RvcmUobmFtZSwgY2FsbGJhY2spIHsKKyAgICB2YXIgZGF0YTsKKyAgICB2YXIgZGJOYW1lOwor
CisgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKKworICAgIGRiTmFt
ZSA9IHRoaXMuX2RiTmFtZSA9IG5hbWU7CisKKyAgICBpZiAoIWxvY2FsU3RvcmFnZVtkYk5hbWVd
KSB7CisgICAgZGF0YSA9IHsKKyAgICB0b2RvczogW10KKyAgICB9OworCisgICAgbG9jYWxTdG9y
YWdlW2RiTmFtZV0gPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKKyAgICB9CisKKyAgICBjYWxsYmFj
ay5jYWxsKHRoaXMsIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlW2RiTmFtZV0pKTsKKyAgICB9CisK
KyAgICAvKioKKyAgICAgKiBGaW5kcyBpdGVtcyBiYXNlZCBvbiBhIHF1ZXJ5IGdpdmVuIGFzIGEg
SlMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gcXVlcnkgVGhlIHF1ZXJ5
IHRvIG1hdGNoIGFnYWluc3QgKGkuZS4ge2ZvbzogJ2Jhcid9KQorICAgICAqIEBwYXJhbSB7ZnVu
Y3Rpb259IGNhbGxiYWNrICAgICBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBxdWVyeSBo
YXMKKyAgICAgKiBjb21wbGV0ZWQgcnVubmluZworICAgICAqCisgICAgICogQGV4YW1wbGUKKyAg
ICAgKiBkYi5maW5kKHtmb286ICdiYXInLCBoZWxsbzogJ3dvcmxkJ30sIGZ1bmN0aW9uIChkYXRh
KSB7CisgICAgICogICAgIC8vIGRhdGEgd2lsbCByZXR1cm4gYW55IGl0ZW1zIHRoYXQgaGF2ZSBm
b286IGJhciBhbmQKKyAgICAgKiAgICAgLy8gaGVsbG86IHdvcmxkIGluIHRoZWlyIHByb3BlcnRp
ZXMKKyAgICAgKiB9KTsKKyAgICAgKi8KKyAgICBTdG9yZS5wcm90b3R5cGUuZmluZCA9IGZ1bmN0
aW9uIChxdWVyeSwgY2FsbGJhY2spIHsKKyAgICBpZiAoIWNhbGxiYWNrKSB7CisgICAgcmV0dXJu
OworICAgIH0KKworICAgIHZhciB0b2RvcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlW3RoaXMu
X2RiTmFtZV0pLnRvZG9zOworCisgICAgY2FsbGJhY2suY2FsbCh0aGlzLCB0b2Rvcy5maWx0ZXIo
ZnVuY3Rpb24gKHRvZG8pIHsKKyAgICBmb3IgKHZhciBxIGluIHF1ZXJ5KSB7CisgICAgcmV0dXJu
IHF1ZXJ5W3FdID09PSB0b2RvW3FdOworICAgIH0KKyAgICB9KSk7CisgICAgfTsKKworICAgIC8q
KgorICAgICAqIFdpbGwgcmV0cmlldmUgYWxsIGRhdGEgZnJvbSB0aGUgY29sbGVjdGlvbgorICAg
ICAqCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGZp
cmUgdXBvbiByZXRyaWV2aW5nIGRhdGEKKyAgICAgKi8KKyAgICBTdG9yZS5wcm90b3R5cGUuZmlu
ZEFsbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeworICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwg
ZnVuY3Rpb24gKCkge307CisgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBKU09OLnBhcnNlKGxvY2Fs
U3RvcmFnZVt0aGlzLl9kYk5hbWVdKS50b2Rvcyk7CisgICAgfTsKKworICAgIC8qKgorICAgICAq
IFdpbGwgc2F2ZSB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgREIuIElmIG5vIGl0ZW0gZXhpc3RzIGl0
IHdpbGwgY3JlYXRlIGEgbmV3CisgICAgICogaXRlbSwgb3RoZXJ3aXNlIGl0J2xsIHNpbXBseSB1
cGRhdGUgYW4gZXhpc3RpbmcgaXRlbSdzIHByb3BlcnRpZXMKKyAgICAgKgorICAgICAqIEBwYXJh
bSB7bnVtYmVyfSBpZCBBbiBvcHRpb25hbCBwYXJhbSB0byBlbnRlciBhbiBJRCBvZiBhbiBpdGVt
IHRvIHVwZGF0ZQorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIHNhdmUg
YmFjayBpbnRvIHRoZSBEQgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIFRoZSBj
YWxsYmFjayB0byBmaXJlIGFmdGVyIHNhdmluZworICAgICAqLworICAgIFN0b3JlLnByb3RvdHlw
ZS5zYXZlID0gZnVuY3Rpb24gKGlkLCB1cGRhdGVEYXRhLCBjYWxsYmFjaykgeworICAgIHZhciBk
YXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VbdGhpcy5fZGJOYW1lXSk7CisgICAgdmFyIHRv
ZG9zID0gZGF0YS50b2RvczsKKworICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24g
KCkge307CisKKyAgICAvLyBJZiBhbiBJRCB3YXMgYWN0dWFsbHkgZ2l2ZW4sIGZpbmQgdGhlIGl0
ZW0gYW5kIHVwZGF0ZSBlYWNoIHByb3BlcnR5CisgICAgaWYgKHR5cGVvZiBpZCAhPT0gJ29iamVj
dCcpIHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvZG9zLmxlbmd0aDsgaSsrKSB7CisgICAg
aWYgKHRvZG9zW2ldLmlkID09IGlkKSB7CisgICAgZm9yICh2YXIgeCBpbiB1cGRhdGVEYXRhKSB7
CisgICAgdG9kb3NbaV1beF0gPSB1cGRhdGVEYXRhW3hdOworICAgIH0KKyAgICB9CisgICAgfQor
CisgICAgbG9jYWxTdG9yYWdlW3RoaXMuX2RiTmFtZV0gPSBKU09OLnN0cmluZ2lmeShkYXRhKTsK
KyAgICBjYWxsYmFjay5jYWxsKHRoaXMsIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlW3RoaXMuX2Ri
TmFtZV0pLnRvZG9zKTsKKyAgICB9IGVsc2UgeworICAgIGNhbGxiYWNrID0gdXBkYXRlRGF0YTsK
KworICAgIHVwZGF0ZURhdGEgPSBpZDsKKworICAgIC8vIEdlbmVyYXRlIGFuIElECisgICAgdXBk
YXRlRGF0YS5pZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworCisgICAgdG9kb3MucHVzaCh1cGRh
dGVEYXRhKTsKKyAgICBsb2NhbFN0b3JhZ2VbdGhpcy5fZGJOYW1lXSA9IEpTT04uc3RyaW5naWZ5
KGRhdGEpOworICAgIGNhbGxiYWNrLmNhbGwodGhpcywgW3VwZGF0ZURhdGFdKTsKKyAgICB9Cisg
ICAgfTsKKworICAgIC8qKgorICAgICAqIFdpbGwgcmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgU3Rv
cmUgYmFzZWQgb24gaXRzIElECisgICAgICoKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gaWQgVGhl
IElEIG9mIHRoZSBpdGVtIHlvdSB3YW50IHRvIHJlbW92ZQorICAgICAqIEBwYXJhbSB7ZnVuY3Rp
b259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBmaXJlIGFmdGVyIHNhdmluZworICAgICAqLwor
ICAgIFN0b3JlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrKSB7Cisg
ICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZVt0aGlzLl9kYk5hbWVdKTsKKyAg
ICB2YXIgdG9kb3MgPSBkYXRhLnRvZG9zOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2Rv
cy5sZW5ndGg7IGkrKykgeworICAgIGlmICh0b2Rvc1tpXS5pZCA9PSBpZCkgeworICAgIHRvZG9z
LnNwbGljZShpLCAxKTsKKyAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgbG9jYWxTdG9y
YWdlW3RoaXMuX2RiTmFtZV0gPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKKyAgICBjYWxsYmFjay5j
YWxsKHRoaXMsIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlW3RoaXMuX2RiTmFtZV0pLnRvZG9zKTsK
KyAgICB9OworCisgICAgLyoqCisgICAgICogV2lsbCBkcm9wIGFsbCBzdG9yYWdlIGFuZCBzdGFy
dCBmcmVzaAorICAgICAqCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNh
bGxiYWNrIHRvIGZpcmUgYWZ0ZXIgZHJvcHBpbmcgdGhlIGRhdGEKKyAgICAgKi8KKyAgICBTdG9y
ZS5wcm90b3R5cGUuZHJvcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeworICAgIGxvY2FsU3RvcmFn
ZVt0aGlzLl9kYk5hbWVdID0gSlNPTi5zdHJpbmdpZnkoe3RvZG9zOiBbXX0pOworICAgIGNhbGxi
YWNrLmNhbGwodGhpcywgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VbdGhpcy5fZGJOYW1lXSkudG9k
b3MpOworICAgIH07CisKKyAgICAvLyBFeHBvcnQgdG8gd2luZG93CisgICAgd2luZG93LmFwcC5T
dG9yZSA9IFN0b3JlOworfSkod2luZG93KTsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29t
cGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3Zhbmls
bGFqcy9qcy92aWV3LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxl
dGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFq
cy9qcy92aWV3LmpzCShyZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0
ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFuaWxsYWpz
L2pzL3ZpZXcuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5MSBAQAorLypqc2hpbnQgbGF4
YnJlYWs6dHJ1ZSAqLworKGZ1bmN0aW9uICh3aW5kb3cpIHsKKyAgICAndXNlIHN0cmljdCc7CisK
KyAgICAvKioKKyAgICAgKiBTZXRzIHVwIGRlZmF1bHRzIGZvciBhbGwgdGhlIFZpZXcgbWV0aG9k
cyBzdWNoIGFzIGEgZGVmYXVsdCB0ZW1wbGF0ZQorICAgICAqCisgICAgICogQGNvbnN0cnVjdG9y
CisgICAgICovCisgICAgZnVuY3Rpb24gVmlldygpIHsKKyAgICB0aGlzLmRlZmF1bHRUZW1wbGF0
ZQorICAgID0gICAgJzxsaSBkYXRhLWlkPSJ7e2lkfX0iIGNsYXNzPSJ7e2NvbXBsZXRlZH19Ij4n
CisgICAgKyAgICAgICAgJzxkaXYgY2xhc3M9InZpZXciPicKKyAgICArICAgICAgICAgICAgJzxp
bnB1dCBjbGFzcz0idG9nZ2xlIiB0eXBlPSJjaGVja2JveCIge3tjaGVja2VkfX0+JworICAgICsg
ICAgICAgICAgICAnPGxhYmVsPnt7dGl0bGV9fTwvbGFiZWw+JworICAgICsgICAgICAgICAgICAn
PGJ1dHRvbiBjbGFzcz0iZGVzdHJveSI+PC9idXR0b24+JworICAgICsgICAgICAgICc8L2Rpdj4n
CisgICAgKyAgICAnPC9saT4nOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4g
PGxpPiBIVE1MIHN0cmluZyBhbmQgcmV0dXJucyBpdCBmb3IgcGxhY2VtZW50IGluIHlvdXIgYXBw
LgorICAgICAqCisgICAgICogTk9URTogSW4gcmVhbCBsaWZlIHlvdSBzaG91bGQgYmUgdXNpbmcg
YSB0ZW1wbGF0aW5nIGVuZ2luZSBzdWNoIGFzIE11c3RhY2hlCisgICAgICogb3IgSGFuZGxlYmFy
cywgaG93ZXZlciwgdGhpcyBpcyBhIHZhbmlsbGEgSlMgZXhhbXBsZS4KKyAgICAgKgorICAgICAq
IEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBvYmplY3QgY29udGFpbmluZyBrZXlzIHlvdSB3YW50
IHRvIGZpbmQgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgdG8g
cmVwbGFjZS4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIVE1MIFN0cmluZyBvZiBhbiA8bGk+
IGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBleGFtcGxlCisgICAgICogdmlldy5zaG93KHsKKyAg
ICAgKiAgICBpZDogMSwKKyAgICAgKiAgICB0aXRsZTogIkhlbGxvIFdvcmxkIiwKKyAgICAgKiAg
ICBjb21wbGV0ZWQ6IDAsCisgICAgICogfSk7CisgICAgICovCisgICAgVmlldy5wcm90b3R5cGUu
c2hvdyA9IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgdmFyIGksIGw7CisgICAgdmFyIHZpZXcgPSAn
JzsKKworICAgIGZvciAoaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
IHZhciB0ZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdFRlbXBsYXRlOworICAgIHZhciBjb21wbGV0ZWQg
PSAnJzsKKyAgICB2YXIgY2hlY2tlZCA9ICcnOworCisgICAgaWYgKGRhdGFbaV0uY29tcGxldGVk
ID09PSAxKSB7CisgICAgY29tcGxldGVkID0gJ2NvbXBsZXRlZCc7CisgICAgY2hlY2tlZCA9ICdj
aGVja2VkJzsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoJ3t7aWR9
fScsIGRhdGFbaV0uaWQpOworICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgne3t0aXRs
ZX19JywgZGF0YVtpXS50aXRsZSk7CisgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKCd7
e2NvbXBsZXRlZH19JywgY29tcGxldGVkKTsKKyAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxh
Y2UoJ3t7Y2hlY2tlZH19JywgY2hlY2tlZCk7CisKKyAgICB2aWV3ID0gdmlldyArIHRlbXBsYXRl
OworICAgIH0KKworICAgIHJldHVybiB2aWV3OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBE
aXNwbGF5cyBhIGNvdW50ZXIgb2YgaG93IG1hbnkgdG8gZG9zIGFyZSBsZWZ0IHRvIGNvbXBsZXRl
CisgICAgICoKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gYWN0aXZlVG9kb3MgVGhlIG51bWJlciBv
ZiBhY3RpdmUgdG9kb3MuCisgICAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIGNvbnRhaW5p
bmcgdGhlIGNvdW50CisgICAgICovCisgICAgVmlldy5wcm90b3R5cGUuaXRlbUNvdW50ZXIgPSBm
dW5jdGlvbiAoYWN0aXZlVG9kb3MpIHsKKyAgICB2YXIgcGx1cmFsID0gYWN0aXZlVG9kb3MgPT09
IDEgPyAnJyA6ICdzJzsKKworICAgIHJldHVybiAnPHN0cm9uZz4nICsgYWN0aXZlVG9kb3MgKyAn
PC9zdHJvbmc+IGl0ZW0nICsgcGx1cmFsICsgJyBsZWZ0JzsKKyAgICB9OworCisgICAgLyoqCisg
ICAgICogVXBkYXRlcyB0aGUgdGV4dCB3aXRoaW4gdGhlICJDbGVhciBjb21wbGV0ZWQiIGJ1dHRv
bgorICAgICAqCisgICAgICogQHBhcmFtICB7W3R5cGVdfSBjb21wbGV0ZWRUb2RvcyBUaGUgbnVt
YmVyIG9mIGNvbXBsZXRlZCB0b2Rvcy4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcg
Y29udGFpbmluZyB0aGUgY291bnQKKyAgICAgKi8KKyAgICBWaWV3LnByb3RvdHlwZS5jbGVhckNv
bXBsZXRlZEJ1dHRvbiA9IGZ1bmN0aW9uIChjb21wbGV0ZWRUb2RvcykgeworICAgIGlmIChjb21w
bGV0ZWRUb2RvcyA+IDApIHsKKyAgICByZXR1cm4gJ0NsZWFyIGNvbXBsZXRlZCAoJyArIGNvbXBs
ZXRlZFRvZG9zICsgJyknOworICAgIH0gZWxzZSB7CisgICAgcmV0dXJuICcnOworICAgIH0KKyAg
ICB9OworCisgICAgLy8gRXhwb3J0IHRvIHdpbmRvdworICAgIHdpbmRvdy5hcHAuVmlldyA9IFZp
ZXc7Cit9KSh3aW5kb3cpOwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5y
ZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9iYWNrYm9uZS9i
b3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2JnLnBuZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBk
aXNwbGF5OiBmaWxlIG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gaW1h
Z2UvcG5nCkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RP
TUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBv
bmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVz
dHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvYmFja2JvbmUvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcJ
KHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2Nv
bXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCSh3b3JraW5nIGNvcHkpCgpQcm9wZXJ0eSBj
aGFuZ2VzIG9uOiBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJl
bmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2JhY2tib25lL2Jvd2VyX2NvbXBvbmVu
dHMvdG9kb212Yy1jb21tb24vYmcucG5nCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjptaW1lLXR5cGUK
IyMgLTAsMCArMSAjIworaW1hZ2UvcG5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVydHkK
CmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFHUUFBQUJrQWdNQUFBQU5qSDNIQUFBQURGQk1WRVh1
N3U3cjYrdm01dWJmMzkrdDN6WnoKQUFBSC9VbEVRVlI0WG5XVzBXcmlpaGFHbDBIRlNLY2tRU1VK
clpoZ0pBbldaMmk4bWoxVXFibmFVNm9ZNzZaVW4wRURaNWdPVXpGaAp6akFXbFNUTUdkcWllWVk2
dEtYMVNzVks5YW9WbGNhbk9KNjcyWHYzUE1IUDR2L1d0eGIwcHBmZDhXTHhkUE92MjZ2NXJEdVpQ
enZPCmkvTnJXZ2RhOEhBK2tmY2liczZGb1NFUlIvQVlobmw1R3Q3dVpPMjlqYjNtdTdmaHkrTk9Z
eU94MTJtVEo4MzZJYkNZcTFDVERDWFAKWUhrSlk4cVZ2SkkzZEt1TXdPMW9lRDIvbnVxci9zM0Q0
RjU3bnQyWFY0dlY4NU1GbmxnQUNJRm5VUzlIdThpQW14VUVGOFNFYUJEKwpQTnFKYnpiYjVNV1gx
c1Zacm5YY2FWSzVSR0t6RXdhcm91Vk54Y3dyU1JsbkpWbVI4Vm8rWTJvNkFYUG52ank3L200K2ZG
Mm4vTHp1CmpjeUhkZkxqNHhBQTV6MCttbVlwb0dqQlIzSWNSOUVCM2h1S3dZYnRTKzhrU20vakY1
c2J4VlE4dlplNlNIUTJzdGt0MENVc285UXcKQ1ZGd3BxSXdlVU0xb0tCYkVRU1cwN3RCZnp4eUZ1
YjFiREg4ZFQyNW1ZN3JaOTlYSDRIM2MySUlEYm9JVHFSNTBSTVRJNEVZNXhVaQpNZWdjYlorUnpV
VEpUcVIzTnNQRlAvWTI5dzRhdVM5ZkxrRFhqRWhHU3liTHV1cktRM2svcjhoTXpiV3I1bUU1dWhv
Nkw3T1QyOFcwCit6aTZ0aHluZTdWMDVnOUxFR0l4bnZmRW9uVElqUk1zUW1NMEh2TVRqT2lITjZu
THNGQXNWVXRvc2RRV2pwcXRackgwL2pLY2JVQk4KMVF2Sm1xN0pHc09xbVNTTFNMcWtFVVlGZ2J1
SHordCtWcy96MVhJNm1BMjEzdkRuWUx4Y09YT0lzdEVJN1JWUmtjS2lBa0ZDRENXRApVZEpEQ2RE
NjhQNDhmbGJ0cE91SHhXeXBrYVBlTmNMTjdHYXFBN0pzYWVXTWJNTCt1cVdNWE11dmN5Tkp4SldC
M3Qzejh1eXpjemxkClRwOXU2N2V6cTlYNHFydDZ1djRHUkN5SytMR0lOMEM0bzI2YUVERlBFRWR4
aGtWaHI5RSt2dXhzTmRvbkI4M1dkdnR6Ni95eXZaTkkKMlNYQXdDb2JyTVNxMHU1dTJhVVJDbU1V
akVoUzB1RFZXUmJmSGxkQW95NmVScndDZ3BHWUtCS3hXSVNNNElDTEhCeHZ4RGQzN1BCcApGczN0
Sk1KeE81Vkk4SWQyc1ZvRXF5QkxqTUhxbVlLUnJGVjJ5MFlaVkt0UVF6QzRXWTNOaVhreVhLNW04
MW4vZVRuNmVqVy91Ymg1CnVRTXE1RjdUakFUUUtDZUlva0I1UWpRZEMrRjhGUDdDc24vNzRHSW52
SkhJZHY2d1FaSlZrMUgyTlZhV3BZSW1XWWFpN2pNNFVhakIKYXFKTjdoYy82cld2bzk1ZzNGOCtq
bDVPNWpObk1BZkd4WGxvSDAvektJNUhpUWlOMERFQmphQ0lEOExoOE9hcmJNUHJTMnBvRml4Zgp6
cDJUKytGcTJuT2VCNC9EOFhTNW1CaExjekVGMU9jV2ZMU1hwc1VZSHFBWVFSUUVHdkZRZ1NqWWgv
WjIrMVA4b0hGdUh6VlB5VlJMClBFelFaNVJkaGRlUVZsVkRqMEIvTlI3WEY4NTQ1U3h2SnRadHIv
OHdjUjdOYnJjUEJPckZQYlFZOEFUWmdJQUtIcEdMMFV5SXd0elEKMmpwKzAwbGs5ejdFbTRlTmV2
aDlybE5OVnhPbjlpSFVETGFjQnlWWnJ1V3hTc0ZFVEVYUlphMWc2ZEI5dkIydmV2M3h3M1R5bjUr
OQp3YTNWdXg5MkgvVDVEZmpSd05wcXBDZnE1bEJhOEdPb3kwdGhoQXNQd0xiZE9FdVIyV0tEVEcw
V3Q0V1REOEp4dTlyZU9EcURncHlSCmtGMFh3eHFLZ1ZzNGdVZ1JhMS9CMVF3OGpBYmZ2djNvZjF3
T2wxUDFkemxBMU9ObG9tZ285bzg5Z3RiQk8vTGtxTlM1K05UeWIvcFAKUzZlWDJiZUhwK2xxRlJq
Q1VCQk5MKy9YeW12ZURNVzBMQVdYZEVLSHY3alRtZC9VSzA1dlBQemUrd2xrS0NpdTUyRjV0eGhs
ZVMvaApDWkloWUdpTWhXSzZkYkNWVG1UajhWUWoyL2xRdjZpZWwxbzd4NmN0VU1DcVdSbEZyUkF5
enJKcWhGMkg1ckdDcGtDOU8reDlYQXh2Cmxvdm54Y25ML0g0eHVia2JkN3ZMTVFoTU1PWVB4U2dS
RXltY1Fya29oUVVDZmp5RVFkVzIzNkF0dTVuN24zQ3FIYnZaMlRyT3BkdloKRkJoSlFpdlVLbENS
elhKNTMyVkpoR2JXYW9xSndXSzh2TCtmalFaM3Y0YnovdUxhTWJ1UGpyV1kzSDhIbmd1RldENUNv
MFRJQXh3bAp1bjF1Q2dHYTVhSCt0bG5xZk1udHZUdHMybzNPUm1PcjJIekRiMVBwRDVEVWt4bTFu
RW51QTZIS2lNdUs3Rm9WWFZGTkdSNWZ0SVU1CnRNNHQxWEFteThydHhiZlJEK3QyK0xDQWRVaVE1
V0wvMUNra0xrdk5vM2JPM3Fpbmp6NDNxNlg0SCtIRDB6L2I2VDFnOVJxR0ZIUkoKTG1STWk3QXMy
Y2lZR1VSVE1QZzFINTcvK0hwOWR6VVpMSWRuSDFmcTlYd3lldmwyTlFZY3hXTnVmNEFKcmdWSGtn
VFFsSi9rZmJUQQp3Ti9QYVBaTHFwM2FMb2tuVUs1WU9wWjNtV3htVjRsbyt6V05XRXRWVGFvc0RD
K2NaVy9nekM1NzNhZkJ4ZE5JZlpqT3I2N3ZSei9nCmIvSVVPWkdKc0VMVVEwRzhLalJPaXJudFQv
RmNZK3MwamRxbGpmaFJ2SDNjaElodXlNeSthN2RtNUMwVHF4a1ZXZE54UTlVTkdEOFAKLzkxL21p
d0dZNzE3TlhpNXVadE9aNU9yeWRRQmxrY0ZQK2x4c3lRUHJHOE5IVTl4aUY4ay9HREhiU0hjZVNV
Tk1tWEprUEFDVzVGWgp1YUFYQ21wWkxraG1Yc0poOVBYL0VBZWlHTUVvVVFnS1FpakVpN1JBNDE1
UFZQUUVDT2g4SmcrLzIvWlp3ajV2blA4T0JlQTZwckVGCmkwMHlDS0ZJdThpdVhKUExaVE9UaExP
cm14K2o4MTlQeTd1dmZ6MUZFQk1Semt0ekxwL1hUWkFobjV1aC9KU0hGWUlFVk1uajZtRnUKTDc3
WENpZitQTTFtVTlTSG81U3ZWRXlBU2NpR2dqT2dsNU95b2lpNytWM0UzTSs0cEF6ODFraGw5Yk0z
dWZvMTcwMjduK29URUhBMgp4UEJpME04R0NJNE9zUXlFQkRmdERTRndHbSsrYVdWVEc5L3Q5d2Ri
djhzYkN2bXlLZTNxY3Q2eVFETlZnNUVZSkdJd2xnc1d0NVBwCnczVGxQSS92bm1mcnQyQTZ2dXYz
NXg5NzUrQUZtdUFDWGdJTm9pak9CVVV5eXJNOHpmbG9LSDR1dGhxdlNRNklTdVYxSmZ3WGI3YjkK
NEM2NXA1QUFBQUFBU1VWT1JLNUNZSUk9CgpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21w
bGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
Q2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5
cGUgPSBpbWFnZS9wbmcKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVh
bGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dl
cl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2JnLnBuZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3Jt
YW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9i
Zy5wbmcJKHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJl
YWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93
ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcJKHdvcmtpbmcgY29weSkKClByb3Bl
cnR5IGNoYW5nZXMgb246IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21w
b25lbnRzL3RvZG9tdmMtY29tbW9uL2JnLnBuZwpfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46bWltZS10
eXBlCiMjIC0wLDAgKzEgIyMKK2ltYWdlL3BuZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3Bl
cnR5CgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBR1FBQUFCa0FnTUFBQUFOakgzSEFBQUFERkJN
VkVYdTd1N3I2K3ZtNXViZjM5K3Qzelp6CkFBQUgvVWxFUVZSNFhuV1cwV3JpaWhhR2wwSEZTS2Nr
UVNVSnJaaGdKQW5XWjJpOG1qMVVxYm5hVTZvWTc2WlVuMEVEWjVnT1V6RmgKempBV2xTVE1HZHFp
ZVlZNnRLWDFTc1ZLOWFvVmxjYW5PSjY3Mlh2M1BNSFA0di9XdHhiMHBwZmQ4V0x4ZFBPdjI2djVy
RHVaUHp2TwppL05yV2dkYThIQStrZmNpYnM2Rm9TRVJSL0FZaG5sNUd0N3VaTzI5amIzbXU3Zmh5
K05PWXlPeDEybVRKODM2SWJDWXExQ1REQ1hQCllIa0pZOHFWdkpJM2RLdU13TzFvZUQyL251cXIv
czNENEY1N250MlhWNHZWODVNRm5sZ0FDSUZuVVM5SHU4aUFteFVFRjhTRWFCRCsKUE5xSmJ6YmI1
TVdYMXNWWnJuWGNhVks1UkdLekV3YXJvdVZOeGN3clNSbG5KVm1SOFZvK1kybzZBWFBudmp5Ny9t
NCtmRjJuL0x6dQpqY3lIZGZMajR4QUE1ejArbW1ZcG9HakJSM0ljUjlFQjNodUt3WWJ0Uys4a1Nt
L2pGNXNieFZROHZaZTZTSFEyc3RrdDBDVXNvOVF3CkNWRndwcUl3ZVVNMW9LQmJFUVNXMDd0QmZ6
eHlGdWIxYkRIOGRUMjVtWTdyWjk5WEg0SDNjMklJRGJvSVRxUjUwUk1USTRFWTV4VWkKTWVnY2Ja
K1J6VVRKVHFSM05zUEZQL1kyOXc0YXVTOWZMa0RYakVoR1N5Ykx1dXJLUTNrL3I4aE16YldyNW1F
NXVobzZMN09UMjhXMAoremk2dGh5bmU3VjA1ZzlMRUdJeG52ZkVvblRJalJNc1FtTTBIdk1Uak9p
SE42bkxzRkFzVlV0b3NkUVdqcHF0WnJIMC9qS2NiVUJOCjFRdkptcTdKR3NPcW1TU0xTTHFrRVVZ
RmdidUh6K3QrVnMvejFYSTZtQTIxM3ZEbllMeGNPWE9Jc3RFSTdSVlJrY0tpQWtGQ0RDV0QKVWRK
RENkRDY4UDQ4ZmxidHBPdUh4V3lwa2FQZU5jTE43R2FxQTdKc2FlV01iTUwrdXFXTVhNdXZjeU5K
eEpXQjN0M3o4dXl6Y3psZApUcDl1NjdlenE5WDRxcnQ2dXY0R1JDeUsrTEdJTjBDNG8yNmFFREZQ
RUVkeGhrVmhyOUUrdnV4c05kb25CODNXZHZ0ejYveXl2Wk5JCjJTWEF3Q29ick1TcTB1NXUyYVVS
Q21NVWpFaFMwdURWV1JiZkhsZEFveTZlUnJ3Q2dwR1lLQkt4V0lTTTRJQ0xIQnh2eERkMzdQQnAK
RnMzdEpNSnhPNVZJOElkMnNWb0VxeUJMak1IcW1ZS1JyRlYyeTBZWlZLdFFRekM0V1kzTmlYa3lY
SzVtODFuL2VUbjZlalcvdWJoNQp1UU1xNUY3VGpBVFFLQ2VJb2tCNVFqUWRDK0Y4RlA3Q3NuLzc0
R0ludkpISWR2NndRWkpWazFIMk5WYVdwWUltV1lhaTdqTTRVYWpCCmFxSk43aGMvNnJXdm85NWcz
Rjgramw1TzVqTm5NQWZHeFhsb0gwL3pLSTVIaVFpTjBERUJqYUNJRDhMaDhPYXJiTVByUzJwb0Zp
eGYKenAyVCsrRnEybk9lQjQvRDhYUzVtQmhMY3pFRjFPY1dmTFNYcHNVWUhxQVlRUlFFR3ZGUWdT
alloL1oyKzFQOG9IRnVIelZQeVZSTApQRXpRWjVSZGhkZVFWbFZEajBCL05SN1hGODU0NVN4dkp0
WnRyLzh3Y1I3TmJyY1BCT3JGUGJRWThBVFpnSUFLSHBHTDBVeUl3dHpRCjJqcCswMGxrOXo3RW00
ZU5ldmg5cmxOTlZ4T245aUhVRExhY0J5VlpydVd4U3NGRVRFWFJaYTFnNmRCOXZCMnZldjN4dzNU
eW41KzkKd2EzVnV4OTJIL1Q1RGZqUndOcHFwQ2ZxNWxCYThHT295MHRoaEFzUHdMYmRPRXVSMldL
RFRHMFd0NFdURDhKeHU5cmVPRHFEZ3B5UgprRjBYd3hxS2dWczRnVWdSYTEvQjFRdzhqQWJmdnYz
b2Yxd09sMVAxZHpsQTFPTmxvbWdvOW84OWd0YkJPL0xrcU5TNStOVHliL3BQClM2ZVgyYmVIcCts
cUZSakNVQkJOTCsvWHltdmVETVcwTEFXWGRFS0h2N2pUbWQvVUswNXZQUHplK3dsa0tDaXU1MkY1
dHhobGVTL2gKQ1pJaFlHaU1oV0s2ZGJDVlRtVGo4VlFqMi9sUXY2aWVsMW83eDZjdFVNQ3FXUmxG
clJBeXpySnFoRjJINXJHQ3BrQzlPK3g5WEF4dgpsb3ZueGNuTC9INHh1YmtiZDd2TE1RaE1NT1lQ
eFNnUkV5bWNRcmtvaFFVQ2ZqeUVRZFcyMzZBdHU1bjduM0NxSGJ2WjJUck9wZHZaCkZCaEpRaXZV
S2xDUnpYSjUzMlZKaEdiV2FvcUp3V0s4dkwrZmpRWjN2NGJ6L3VMYU1idVBqcldZM0g4SG5ndUZX
RDVDbzBUSUF4d2wKdW4xdUNnR2E1YUgrdGxucWZNbnR2VHRzMm8zT1JtT3IySHpEYjFQcEQ1RFVr
eG0xbkVudUE2SEtpTXVLN0ZvVlhWRk5HUjVmdElVNQp0TTR0MVhBbXk4cnR4YmZSRCt0MitMQ0Fk
VWlRNVdMLzFDa2tMa3ZObzNiTzNxaW5qejQzcTZYNEgrSEQwei9iNlQxZzlScUdGSFJKCkxtUk1p
N0FzMmNpWUdVUlRNUGcxSDU3LytIcDlkelVaTElkbkgxZnE5WHd5ZXZsMk5RWWN4V051ZjRBSnJn
VkhrZ1RRbEova2ZiVEEKd04vUGFQWkxxcDNhTG9rblVLNVlPcFozbVd4bVY0bG8reldOV0V0VlRh
b3NEQytjWlcvZ3pDNTczYWZCeGROSWZaak9yNjd2UnovZwpiL0lVT1pHSnNFTFVRMEc4S2pST2ly
bnRUL0ZjWStzMGpkcWxqZmhSdkgzY2hJaHV5TXkrYTdkbTVDMFRxeGtWV2ROeFE5VU5HRDhQCi85
MS9taXdHWTcxN05YaTV1WnRPWjVPcnlkUUJsa2NGUCtseHN5UVByRzhOSFU5eGlGOGsvR0RIYlNI
Y2VTVU5NbVhKa1BBQ1c1RloKdWFBWENtcFpMa2htWHNKaDlQWC9FQWVpR01Fb1VRZ0tRaWpFaTdS
QTQxNVBWUFFFQ09oOEpnKy8yL1pad2o1dm5QOE9CZUE2cHJFRgppMDB5Q0tGSXU4aXVYSlBMWlRP
VGhMT3JteCtqODE5UHk3dXZmejFGRUJNUnprdHpMcC9YVFpBaG41dWgvSlNIRllJRVZNbmo2bUZ1
Ckw3N1hDaWYrUE0xbVU5U0hvNVN2VkV5QVNjaUdnak9nbDVPeW9paTcrVjNFM00rNHBBejgxa2hs
OWJNM3VmbzE3MDI3bitvVEVIQTIKeFBCaTBNOEdDSTRPc1F5RUJEZnREU0Z3R20rK2FXVlRHOS90
OXdkYnY4c2JDdm15S2UzcWN0NnlRRE5WZzVFWUpHSXdsZ3NXdDVQcAp3M1RsUEkvdm5tZnJ0MkE2
dnV2MzV4OTc1K0FGbXVBQ1hnSU5vaWpPQlVVeXlyTTh6ZmxvS0g0dXRocXZTUTZJU3VWMUpmd1hi
N2I5CjRDNjVwNUFBQUFBQVNVVk9SSzVDWUlJPQoKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90
Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1l
LXR5cGUgPSBpbWFnZS9wbmcKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVu
cmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Jv
d2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZv
cm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24v
YmcucG5nCShyZXZpc2lvbiAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9Ob3RDb21wbGV0ZWx5VW5y
ZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9qcXVlcnkvYm93
ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcJKHdvcmtpbmcgY29weSkKClByb3Bl
cnR5IGNoYW5nZXMgb246IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGlj
RE9NQmVuY2gvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvanF1ZXJ5L2Jvd2VyX2NvbXBv
bmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjptaW1lLXR5
cGUKIyMgLTAsMCArMSAjIworaW1hZ2UvcG5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVy
dHkKCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFHUUFBQUJrQWdNQUFBQU5qSDNIQUFBQURGQk1W
RVh1N3U3cjYrdm01dWJmMzkrdDN6WnoKQUFBSC9VbEVRVlI0WG5XVzBXcmlpaGFHbDBIRlNLY2tR
U1VKclpoZ0pBbldaMmk4bWoxVXFibmFVNm9ZNzZaVW4wRURaNWdPVXpGaAp6akFXbFNUTUdkcWll
WVk2dEtYMVNzVks5YW9WbGNhbk9KNjcyWHYzUE1IUDR2L1d0eGIwcHBmZDhXTHhkUE92MjZ2NXJE
dVpQenZPCmkvTnJXZ2RhOEhBK2tmY2liczZGb1NFUlIvQVlobmw1R3Q3dVpPMjlqYjNtdTdmaHkr
Tk9ZeU94MTJtVEo4MzZJYkNZcTFDVERDWFAKWUhrSlk4cVZ2SkkzZEt1TXdPMW9lRDIvbnVxci9z
M0Q0RjU3bnQyWFY0dlY4NU1GbmxnQUNJRm5VUzlIdThpQW14VUVGOFNFYUJEKwpQTnFKYnpiYjVN
V1gxc1Zacm5YY2FWSzVSR0t6RXdhcm91Vk54Y3dyU1JsbkpWbVI4Vm8rWTJvNkFYUG52ank3L200
K2ZGMm4vTHp1CmpjeUhkZkxqNHhBQTV6MCttbVlwb0dqQlIzSWNSOUVCM2h1S3dZYnRTKzhrU20v
akY1c2J4VlE4dlplNlNIUTJzdGt0MENVc285UXcKQ1ZGd3BxSXdlVU0xb0tCYkVRU1cwN3RCZnp4
eUZ1YjFiREg4ZFQyNW1ZN3JaOTlYSDRIM2MySUlEYm9JVHFSNTBSTVRJNEVZNXhVaQpNZWdjYlor
UnpVVEpUcVIzTnNQRlAvWTI5dzRhdVM5ZkxrRFhqRWhHU3liTHV1cktRM2svcjhoTXpiV3I1bUU1
dWhvNkw3T1QyOFcwCit6aTZ0aHluZTdWMDVnOUxFR0l4bnZmRW9uVElqUk1zUW1NMEh2TVRqT2lI
TjZuTHNGQXNWVXRvc2RRV2pwcXRackgwL2pLY2JVQk4KMVF2Sm1xN0pHc09xbVNTTFNMcWtFVVlG
Z2J1SHordCtWcy96MVhJNm1BMjEzdkRuWUx4Y09YT0lzdEVJN1JWUmtjS2lBa0ZDRENXRApVZEpE
Q2RENjhQNDhmbGJ0cE91SHhXeXBrYVBlTmNMTjdHYXFBN0pzYWVXTWJNTCt1cVdNWE11dmN5Tkp4
SldCM3Qzejh1eXpjemxkClRwOXU2N2V6cTlYNHFydDZ1djRHUkN5SytMR0lOMEM0bzI2YUVERlBF
RWR4aGtWaHI5RSt2dXhzTmRvbkI4M1dkdnR6Ni95eXZaTkkKMlNYQXdDb2JyTVNxMHU1dTJhVVJD
bU1VakVoUzB1RFZXUmJmSGxkQW95NmVScndDZ3BHWUtCS3hXSVNNNElDTEhCeHZ4RGQzN1BCcApG
czN0Sk1KeE81Vkk4SWQyc1ZvRXF5QkxqTUhxbVlLUnJGVjJ5MFlaVkt0UVF6QzRXWTNOaVhreVhL
NW04MW4vZVRuNmVqVy91Ymg1CnVRTXE1RjdUakFUUUtDZUlva0I1UWpRZEMrRjhGUDdDc24vNzRH
SW52SkhJZHY2d1FaSlZrMUgyTlZhV3BZSW1XWWFpN2pNNFVhakIKYXFKTjdoYy82cld2bzk1ZzNG
OCtqbDVPNWpObk1BZkd4WGxvSDAvektJNUhpUWlOMERFQmphQ0lEOExoOE9hcmJNUHJTMnBvRml4
Zgp6cDJUKytGcTJuT2VCNC9EOFhTNW1CaExjekVGMU9jV2ZMU1hwc1VZSHFBWVFSUUVHdkZRZ1Nq
WWgvWjIrMVA4b0hGdUh6VlB5VlJMClBFelFaNVJkaGRlUVZsVkRqMEIvTlI3WEY4NTQ1U3h2SnRa
dHIvOHdjUjdOYnJjUEJPckZQYlFZOEFUWmdJQUtIcEdMMFV5SXd0elEKMmpwKzAwbGs5ejdFbTRl
TmV2aDlybE5OVnhPbjlpSFVETGFjQnlWWnJ1V3hTc0ZFVEVYUlphMWc2ZEI5dkIydmV2M3h3M1R5
bjUrOQp3YTNWdXg5MkgvVDVEZmpSd05wcXBDZnE1bEJhOEdPb3kwdGhoQXNQd0xiZE9FdVIyV0tE
VEcwV3Q0V1REOEp4dTlyZU9EcURncHlSCmtGMFh3eHFLZ1ZzNGdVZ1JhMS9CMVF3OGpBYmZ2djNv
ZjF3T2wxUDFkemxBMU9ObG9tZ285bzg5Z3RiQk8vTGtxTlM1K05UeWIvcFAKUzZlWDJiZUhwK2xx
RlJqQ1VCQk5MKy9YeW12ZURNVzBMQVdYZEVLSHY3alRtZC9VSzA1dlBQemUrd2xrS0NpdTUyRjV0
eGhsZVMvaApDWkloWUdpTWhXSzZkYkNWVG1UajhWUWoyL2xRdjZpZWwxbzd4NmN0VU1DcVdSbEZy
UkF5enJKcWhGMkg1ckdDcGtDOU8reDlYQXh2Cmxvdm54Y25ML0g0eHVia2JkN3ZMTVFoTU1PWVB4
U2dSRXltY1Fya29oUVVDZmp5RVFkVzIzNkF0dTVuN24zQ3FIYnZaMlRyT3BkdloKRkJoSlFpdlVL
bENSelhKNTMyVkpoR2JXYW9xSndXSzh2TCtmalFaM3Y0YnovdUxhTWJ1UGpyV1kzSDhIbmd1RldE
NUNvMFRJQXh3bAp1bjF1Q2dHYTVhSCt0bG5xZk1udHZUdHMybzNPUm1PcjJIekRiMVBwRDVEVWt4
bTFuRW51QTZIS2lNdUs3Rm9WWFZGTkdSNWZ0SVU1CnRNNHQxWEFteThydHhiZlJEK3QyK0xDQWRV
aVE1V0wvMUNra0xrdk5vM2JPM3Fpbmp6NDNxNlg0SCtIRDB6L2I2VDFnOVJxR0ZIUkoKTG1STWk3
QXMyY2lZR1VSVE1QZzFINTcvK0hwOWR6VVpMSWRuSDFmcTlYd3lldmwyTlFZY3hXTnVmNEFKcmdW
SGtnVFFsSi9rZmJUQQp3Ti9QYVBaTHFwM2FMb2tuVUs1WU9wWjNtV3htVjRsbyt6V05XRXRWVGFv
c0RDK2NaVy9nekM1NzNhZkJ4ZE5JZlpqT3I2N3ZSei9nCmIvSVVPWkdKc0VMVVEwRzhLalJPaXJu
dFQvRmNZK3MwamRxbGpmaFJ2SDNjaElodXlNeSthN2RtNUMwVHF4a1ZXZE54UTlVTkdEOFAKLzkx
L21pd0dZNzE3TlhpNXVadE9aNU9yeWRRQmxrY0ZQK2x4c3lRUHJHOE5IVTl4aUY4ay9HREhiU0hj
ZVNVTk1tWEprUEFDVzVGWgp1YUFYQ21wWkxraG1Yc0poOVBYL0VBZWlHTUVvVVFnS1FpakVpN1JB
NDE1UFZQUUVDT2g4SmcrLzIvWlp3ajV2blA4T0JlQTZwckVGCmkwMHlDS0ZJdThpdVhKUExaVE9U
aExPcm14K2o4MTlQeTd1dmZ6MUZFQk1Semt0ekxwL1hUWkFobjV1aC9KU0hGWUlFVk1uajZtRnUK
TDc3WENpZitQTTFtVTlTSG81U3ZWRXlBU2NpR2dqT2dsNU95b2lpNytWM0UzTSs0cEF6ODFraGw5
Yk0zdWZvMTcwMjduK29URUhBMgp4UEJpME04R0NJNE9zUXlFQkRmdERTRndHbSsrYVdWVEc5L3Q5
d2RidjhzYkN2bXlLZTNxY3Q2eVFETlZnNUVZSkdJd2xnc1d0NVBwCnczVGxQSS92bm1mcnQyQTZ2
dXYzNXg5NzUrQUZtdUFDWGdJTm9pak9CVVV5eXJNOHpmbG9LSDR1dGhxdlNRNklTdVYxSmZ3WGI3
YjkKNEM2NXA1QUFBQUFBU1VWT1JLNUNZSUk9CgpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9Ob3RD
b21wbGV0ZWx5VW5yZWFsaXN0aWNET01CZW5jaC90b2RvbXZjL3ZhbmlsbGEtZXhhbXBsZXMvdmFu
aWxsYWpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
Q2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5
cGUgPSBpbWFnZS9wbmcKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVh
bGlzdGljRE9NQmVuY2gvdG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9ib3dlcl9j
b21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2JnLnBuZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5j
ZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3RpY0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxsYS1l
eGFtcGxlcy92YW5pbGxhanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcJ
KHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL05vdENvbXBsZXRlbHlVbnJlYWxpc3Rp
Y0RPTUJlbmNoL3RvZG9tdmMvdmFuaWxsYS1leGFtcGxlcy92YW5pbGxhanMvYm93ZXJfY29tcG9u
ZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcJKHdvcmtpbmcgY29weSkKClByb3BlcnR5IGNoYW5n
ZXMgb246IFBlcmZvcm1hbmNlVGVzdHMvTm90Q29tcGxldGVseVVucmVhbGlzdGljRE9NQmVuY2gv
dG9kb212Yy92YW5pbGxhLWV4YW1wbGVzL3ZhbmlsbGFqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9t
dmMtY29tbW9uL2JnLnBuZwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46bWltZS10eXBlCiMjIC0wLDAg
KzEgIyMKK2ltYWdlL3BuZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5CgppVkJPUncw
S0dnb0FBQUFOU1VoRVVnQUFBR1FBQUFCa0FnTUFBQUFOakgzSEFBQUFERkJNVkVYdTd1N3I2K3Zt
NXViZjM5K3Qzelp6CkFBQUgvVWxFUVZSNFhuV1cwV3JpaWhhR2wwSEZTS2NrUVNVSnJaaGdKQW5X
WjJpOG1qMVVxYm5hVTZvWTc2WlVuMEVEWjVnT1V6RmgKempBV2xTVE1HZHFpZVlZNnRLWDFTc1ZL
OWFvVmxjYW5PSjY3Mlh2M1BNSFA0di9XdHhiMHBwZmQ4V0x4ZFBPdjI2djVyRHVaUHp2TwppL05y
V2dkYThIQStrZmNpYnM2Rm9TRVJSL0FZaG5sNUd0N3VaTzI5amIzbXU3Zmh5K05PWXlPeDEybVRK
ODM2SWJDWXExQ1REQ1hQCllIa0pZOHFWdkpJM2RLdU13TzFvZUQyL251cXIvczNENEY1N250MlhW
NHZWODVNRm5sZ0FDSUZuVVM5SHU4aUFteFVFRjhTRWFCRCsKUE5xSmJ6YmI1TVdYMXNWWnJuWGNh
Vks1UkdLekV3YXJvdVZOeGN3clNSbG5KVm1SOFZvK1kybzZBWFBudmp5Ny9tNCtmRjJuL0x6dQpq
Y3lIZGZMajR4QUE1ejArbW1ZcG9HakJSM0ljUjlFQjNodUt3WWJ0Uys4a1NtL2pGNXNieFZROHZa
ZTZTSFEyc3RrdDBDVXNvOVF3CkNWRndwcUl3ZVVNMW9LQmJFUVNXMDd0QmZ6eHlGdWIxYkRIOGRU
MjVtWTdyWjk5WEg0SDNjMklJRGJvSVRxUjUwUk1USTRFWTV4VWkKTWVnY2JaK1J6VVRKVHFSM05z
UEZQL1kyOXc0YXVTOWZMa0RYakVoR1N5Ykx1dXJLUTNrL3I4aE16YldyNW1FNXVobzZMN09UMjhX
MAoremk2dGh5bmU3VjA1ZzlMRUdJeG52ZkVvblRJalJNc1FtTTBIdk1Uak9pSE42bkxzRkFzVlV0
b3NkUVdqcHF0WnJIMC9qS2NiVUJOCjFRdkptcTdKR3NPcW1TU0xTTHFrRVVZRmdidUh6K3QrVnMv
ejFYSTZtQTIxM3ZEbllMeGNPWE9Jc3RFSTdSVlJrY0tpQWtGQ0RDV0QKVWRKRENkRDY4UDQ4Zmxi
dHBPdUh4V3lwa2FQZU5jTE43R2FxQTdKc2FlV01iTUwrdXFXTVhNdXZjeU5KeEpXQjN0M3o4dXl6
Y3psZApUcDl1NjdlenE5WDRxcnQ2dXY0R1JDeUsrTEdJTjBDNG8yNmFFREZQRUVkeGhrVmhyOUUr
dnV4c05kb25CODNXZHZ0ejYveXl2Wk5JCjJTWEF3Q29ick1TcTB1NXUyYVVSQ21NVWpFaFMwdURW
V1JiZkhsZEFveTZlUnJ3Q2dwR1lLQkt4V0lTTTRJQ0xIQnh2eERkMzdQQnAKRnMzdEpNSnhPNVZJ
OElkMnNWb0VxeUJMak1IcW1ZS1JyRlYyeTBZWlZLdFFRekM0V1kzTmlYa3lYSzVtODFuL2VUbjZl
alcvdWJoNQp1UU1xNUY3VGpBVFFLQ2VJb2tCNVFqUWRDK0Y4RlA3Q3NuLzc0R0ludkpISWR2NndR
WkpWazFIMk5WYVdwWUltV1lhaTdqTTRVYWpCCmFxSk43aGMvNnJXdm85NWczRjgramw1TzVqTm5N
QWZHeFhsb0gwL3pLSTVIaVFpTjBERUJqYUNJRDhMaDhPYXJiTVByUzJwb0ZpeGYKenAyVCsrRnEy
bk9lQjQvRDhYUzVtQmhMY3pFRjFPY1dmTFNYcHNVWUhxQVlRUlFFR3ZGUWdTalloL1oyKzFQOG9I
RnVIelZQeVZSTApQRXpRWjVSZGhkZVFWbFZEajBCL05SN1hGODU0NVN4dkp0WnRyLzh3Y1I3TmJy
Y1BCT3JGUGJRWThBVFpnSUFLSHBHTDBVeUl3dHpRCjJqcCswMGxrOXo3RW00ZU5ldmg5cmxOTlZ4
T245aUhVRExhY0J5VlpydVd4U3NGRVRFWFJaYTFnNmRCOXZCMnZldjN4dzNUeW41KzkKd2EzVnV4
OTJIL1Q1RGZqUndOcHFwQ2ZxNWxCYThHT295MHRoaEFzUHdMYmRPRXVSMldLRFRHMFd0NFdURDhK
eHU5cmVPRHFEZ3B5UgprRjBYd3hxS2dWczRnVWdSYTEvQjFRdzhqQWJmdnYzb2Yxd09sMVAxZHps
QTFPTmxvbWdvOW84OWd0YkJPL0xrcU5TNStOVHliL3BQClM2ZVgyYmVIcCtscUZSakNVQkJOTCsv
WHltdmVETVcwTEFXWGRFS0h2N2pUbWQvVUswNXZQUHplK3dsa0tDaXU1MkY1dHhobGVTL2gKQ1pJ
aFlHaU1oV0s2ZGJDVlRtVGo4VlFqMi9sUXY2aWVsMW83eDZjdFVNQ3FXUmxGclJBeXpySnFoRjJI
NXJHQ3BrQzlPK3g5WEF4dgpsb3ZueGNuTC9INHh1YmtiZDd2TE1RaE1NT1lQeFNnUkV5bWNRcmtv
aFFVQ2ZqeUVRZFcyMzZBdHU1bjduM0NxSGJ2WjJUck9wZHZaCkZCaEpRaXZVS2xDUnpYSjUzMlZK
aEdiV2FvcUp3V0s4dkwrZmpRWjN2NGJ6L3VMYU1idVBqcldZM0g4SG5ndUZXRDVDbzBUSUF4d2wK
dW4xdUNnR2E1YUgrdGxucWZNbnR2VHRzMm8zT1JtT3IySHpEYjFQcEQ1RFVreG0xbkVudUE2SEtp
TXVLN0ZvVlhWRk5HUjVmdElVNQp0TTR0MVhBbXk4cnR4YmZSRCt0MitMQ0FkVWlRNVdMLzFDa2tM
a3ZObzNiTzNxaW5qejQzcTZYNEgrSEQwei9iNlQxZzlScUdGSFJKCkxtUk1pN0FzMmNpWUdVUlRN
UGcxSDU3LytIcDlkelVaTElkbkgxZnE5WHd5ZXZsMk5RWWN4V051ZjRBSnJnVkhrZ1RRbEova2Zi
VEEKd04vUGFQWkxxcDNhTG9rblVLNVlPcFozbVd4bVY0bG8reldOV0V0VlRhb3NEQytjWlcvZ3pD
NTczYWZCeGROSWZaak9yNjd2UnovZwpiL0lVT1pHSnNFTFVRMEc4S2pST2lybnRUL0ZjWStzMGpk
cWxqZmhSdkgzY2hJaHV5TXkrYTdkbTVDMFRxeGtWV2ROeFE5VU5HRDhQCi85MS9taXdHWTcxN05Y
aTV1WnRPWjVPcnlkUUJsa2NGUCtseHN5UVByRzhOSFU5eGlGOGsvR0RIYlNIY2VTVU5NbVhKa1BB
Q1c1RloKdWFBWENtcFpMa2htWHNKaDlQWC9FQWVpR01Fb1VRZ0tRaWpFaTdSQTQxNVBWUFFFQ09o
OEpnKy8yL1pad2o1dm5QOE9CZUE2cHJFRgppMDB5Q0tGSXU4aXVYSlBMWlRPVGhMT3JteCtqODE5
UHk3dXZmejFGRUJNUnprdHpMcC9YVFpBaG41dWgvSlNIRllJRVZNbmo2bUZ1Ckw3N1hDaWYrUE0x
bVU5U0hvNVN2VkV5QVNjaUdnak9nbDVPeW9paTcrVjNFM00rNHBBejgxa2hsOWJNM3VmbzE3MDI3
bitvVEVIQTIKeFBCaTBNOEdDSTRPc1F5RUJEZnREU0Z3R20rK2FXVlRHOS90OXdkYnY4c2JDdm15
S2UzcWN0NnlRRE5WZzVFWUpHSXdsZ3NXdDVQcAp3M1RsUEkvdm5tZnJ0MkE2dnV2MzV4OTc1K0FG
bXVBQ1hnSU5vaWpPQlVVeXlyTTh6ZmxvS0g0dXRocXZTUTZJU3VWMUpmd1hiN2I5CjRDNjVwNUFB
QUFBQVNVVk9SSzVDWUlJPQoK
</data>
<flag name="review"
          id="234116"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>